lkml.org 
[lkml]   [2013]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v2 3/3] power: power_supply: add support for getting supplied-nodes from dt
    Date
    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 <rklein@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


    \
     
     \ /
      Last update: 2013-02-22 00:41    [W:3.242 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site