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 <math...@chromium.org>
---
v2: - Fixup with patches in series
---
 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 8f90daff0003..d856aed8cb41 100644
--- a/drivers/power/supply/power_supply_sysfs.c
+++ b/drivers/power/supply/power_supply_sysfs.c
@@ -410,6 +410,37 @@ void power_supply_init_attrs(struct device_type *dev_type)
        }
 }
 
+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->prop_name, prop_buf);
+}
+
 int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct power_supply *psy = dev_get_drvdata(dev);
@@ -429,31 +460,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->prop_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.526.g744177e7f7-goog

Reply via email to