With the addition of the device_nodes to use to link suppliers and
supplicants, its useful to add logic to handle the creation of
the list in a common place so as to be common for all drivers.

As of now, as long as the supply's device_node is supplied, the core
will attempt to parse the list of supplies and store it in the
power_supply structure. In this way, it shouldn't break existing
drivers, but allow for transition cleanly.

Signed-off-by: Rhyland Klein <rkl...@nvidia.com>
---
v2:
  - Simplified and renamed the logic to parse dt for the charger list.
  - Tied the dt parsing directly to power_supply_register to make fewer
    changes required for converting existing chargers/supplies.

 drivers/power/power_supply_core.c |   35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/drivers/power/power_supply_core.c 
b/drivers/power/power_supply_core.c
index a87c5b8..05e2031 100644
--- a/drivers/power/power_supply_core.c
+++ b/drivers/power/power_supply_core.c
@@ -86,6 +86,39 @@ void power_supply_changed(struct power_supply *psy)
 }
 EXPORT_SYMBOL_GPL(power_supply_changed);
 
+#ifdef CONFIG_OF
+#include <linux/of.h>
+
+int power_supply_register_supplicant(struct power_supply *psy)
+{
+       struct device_node *np;
+       int i = 0;
+
+       if (!psy->supplies.node)
+               return -EINVAL;
+
+       do {
+               struct power_supply_supplies *lst;
+
+               np = of_parse_phandle(psy->supplies.node, "power-supply", i++);
+               if (!np)
+                       continue;
+
+               lst = devm_kzalloc(psy->dev->parent, sizeof(*lst), GFP_KERNEL);
+               if (!lst) {
+                       dev_warn(psy->dev->parent,
+                                "Failed to alloc mem for supplies list\n");
+                       return -ENOMEM;
+               }
+
+               lst->node = np;
+               list_add(&(lst->list), &(psy->supplies.list));
+       } while (np);
+
+       return 0;
+}
+#endif
+
 static int __power_supply_am_i_supplied(struct device *dev, void *data)
 {
        union power_supply_propval ret = {0,};
@@ -355,6 +388,8 @@ int power_supply_register(struct device *parent, struct 
power_supply *psy)
 
 #ifdef CONFIG_OF
        INIT_LIST_HEAD(&psy->supplies.list);
+
+       power_supply_register_supplicant(psy);
 #endif
        INIT_WORK(&psy->changed_work, power_supply_changed_work);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to