[PATCH 4/4] power_supply: Add power supply type property to uevent env

From: Mathew King
Date: Fri Apr 24 2020 - 13:35:58 EST


Add POWER_SUPPLY_TYPE to the uevent env for power supply. Type is a
property of all power supplies and there is a sysfs entry for it but it
is not included in the properties array of the power supply so
explicitly add it to the udev env.

Signed-off-by: Mathew King <mathewk@xxxxxxxxxxxx>
---
drivers/power/supply/power_supply_sysfs.c | 61 ++++++++++++++---------
1 file changed, 37 insertions(+), 24 deletions(-)

diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c
index fbb05466b9a5..c7087cd7ffe3 100644
--- a/drivers/power/supply/power_supply_sysfs.c
+++ b/drivers/power/supply/power_supply_sysfs.c
@@ -448,6 +448,37 @@ void power_supply_destroy_attrs(void)
}
}

+static int add_prop_uevent(struct device *dev, struct kobj_uevent_env *env,
+ enum power_supply_property prop, char *prop_buf)
+{
+ int ret = 0;
+ struct power_supply_attr *pwr_attr;
+ struct device_attribute *dev_attr;
+ char *line;
+
+ pwr_attr = &power_supply_attrs[prop];
+ dev_attr = &pwr_attr->dev_attr;
+
+ ret = power_supply_show_property(dev, dev_attr, prop_buf);
+ if (ret == -ENODEV || ret == -ENODATA) {
+ /*
+ * When a battery is absent, we expect -ENODEV. Don't abort;
+ * send the uevent with at least the the PRESENT=0 property
+ */
+ return 0;
+ }
+
+ if (ret < 0)
+ return ret;
+
+ line = strchr(prop_buf, '\n');
+ if (line)
+ *line = 0;
+
+ return add_uevent_var(env, "POWER_SUPPLY_%s=%s",
+ pwr_attr->upper_name, prop_buf);
+}
+
int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env)
{
struct power_supply *psy = dev_get_drvdata(dev);
@@ -467,31 +498,13 @@ int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env)
if (!prop_buf)
return -ENOMEM;

- for (j = 0; j < psy->desc->num_properties; j++) {
- struct power_supply_attr *pwr_attr;
- struct device_attribute *dev_attr;
- char *line;
-
- pwr_attr = &power_supply_attrs[psy->desc->properties[j]];
- dev_attr = &pwr_attr->dev_attr;
-
- ret = power_supply_show_property(dev, dev_attr, prop_buf);
- if (ret == -ENODEV || ret == -ENODATA) {
- /* When a battery is absent, we expect -ENODEV. Don't abort;
- send the uevent with at least the the PRESENT=0 property */
- ret = 0;
- continue;
- }
-
- if (ret < 0)
- goto out;
-
- line = strchr(prop_buf, '\n');
- if (line)
- *line = 0;
+ ret = add_prop_uevent(dev, env, POWER_SUPPLY_PROP_TYPE, prop_buf);
+ if (ret)
+ goto out;

- ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s",
- pwr_attr->upper_name, prop_buf);
+ for (j = 0; j < psy->desc->num_properties; j++) {
+ ret = add_prop_uevent(dev, env, psy->desc->properties[j],
+ prop_buf);
if (ret)
goto out;
}
--
2.26.2.303.gf8c07b1a785-goog