mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 13:59:45 -04:00
power: supply: sysfs: rework uevent property loop
Instead of looping through all properties known to be supported by the psy, loop over all known properties and decide based on the return value of power_supply_get_property() whether the property existed. This makes the code shorter now and even more so when power supply extensions are added. It also simplifies the locking, as it can all happen inside power_supply_get_property(). Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Armin Wolf <W_Armin@gmx.de> Link: https://lore.kernel.org/r/20241111-power-supply-extensions-v4-6-7240144daa8e@weissschuh.net Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
committed by
Sebastian Reichel
parent
5c2141f2c7
commit
f29a749d01
@@ -289,7 +289,7 @@ static ssize_t power_supply_format_property(struct device *dev,
|
||||
dev_dbg_ratelimited(dev,
|
||||
"driver has no data for `%s' property\n",
|
||||
attr->attr.name);
|
||||
else if (ret != -ENODEV && ret != -EAGAIN)
|
||||
else if (ret != -ENODEV && ret != -EAGAIN && ret != -EINVAL)
|
||||
dev_err_ratelimited(dev,
|
||||
"driver failed to report `%s' property: %zd\n",
|
||||
attr->attr.name, ret);
|
||||
@@ -441,7 +441,7 @@ static int add_prop_uevent(const struct device *dev, struct kobj_uevent_env *env
|
||||
dev_attr = &pwr_attr->dev_attr;
|
||||
|
||||
ret = power_supply_format_property((struct device *)dev, true, dev_attr, prop_buf);
|
||||
if (ret == -ENODEV || ret == -ENODATA) {
|
||||
if (ret == -ENODEV || ret == -ENODATA || ret == -EINVAL) {
|
||||
/*
|
||||
* When a battery is absent, we expect -ENODEV. Don't abort;
|
||||
* send the uevent with at least the PRESENT=0 property
|
||||
@@ -462,11 +462,7 @@ static int add_prop_uevent(const struct device *dev, struct kobj_uevent_env *env
|
||||
|
||||
int power_supply_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
const struct power_supply *psy = dev_get_drvdata(dev);
|
||||
const enum power_supply_property *battery_props =
|
||||
power_supply_battery_info_properties;
|
||||
unsigned long psy_drv_properties[POWER_SUPPLY_ATTR_CNT /
|
||||
sizeof(unsigned long) + 1] = {0};
|
||||
struct power_supply *psy = dev_get_drvdata(dev);
|
||||
int ret = 0, j;
|
||||
char *prop_buf;
|
||||
|
||||
@@ -494,22 +490,8 @@ int power_supply_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
for (j = 0; j < psy->desc->num_properties; j++) {
|
||||
set_bit(psy->desc->properties[j], psy_drv_properties);
|
||||
ret = add_prop_uevent(dev, env, psy->desc->properties[j],
|
||||
prop_buf);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (j = 0; j < power_supply_battery_info_properties_size; j++) {
|
||||
if (test_bit(battery_props[j], psy_drv_properties))
|
||||
continue;
|
||||
if (!power_supply_battery_info_has_prop(psy->battery_info,
|
||||
battery_props[j]))
|
||||
continue;
|
||||
ret = add_prop_uevent(dev, env, battery_props[j],
|
||||
prop_buf);
|
||||
for (j = 0; j < POWER_SUPPLY_ATTR_CNT; j++) {
|
||||
ret = add_prop_uevent(dev, env, j, prop_buf);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user