diff options
author | Hans de Goede <hdegoede@redhat.com> | 2022-02-06 19:35:37 +0100 |
---|---|---|
committer | Sebastian Reichel <sebastian.reichel@collabora.com> | 2022-02-11 19:08:34 +0100 |
commit | c76787b0d8d2b8660e880d17fbe6fac22e8d35f5 (patch) | |
tree | 241ba334a1f0f3cd5d26458a2ed2af8b002e8a9d /drivers/power/supply/power_supply_core.c | |
parent | 7562ccd85ffb3fac15d731df1ea5c8974485626e (diff) |
power: supply: core: Add support for generic fwnodes to power_supply_get_battery_info()
Add support to power_supply_get_battery_info() to read the properties from
other fwnode types such as swnodes added by platform code on x86 devices.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Diffstat (limited to 'drivers/power/supply/power_supply_core.c')
-rw-r--r-- | drivers/power/supply/power_supply_core.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index fd08c018c18e..1a2440e212a7 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -571,7 +571,8 @@ int power_supply_get_battery_info(struct power_supply *psy, { struct power_supply_resistance_temp_table *resist_table; struct power_supply_battery_info *info; - struct device_node *battery_np; + struct device_node *battery_np = NULL; + struct fwnode_reference_args args; struct fwnode_handle *fwnode; const char *value; int err, len, index; @@ -610,17 +611,21 @@ int power_supply_get_battery_info(struct power_supply *psy, info->ocv_table_size[index] = -EINVAL; } - if (!psy->of_node) { - dev_warn(&psy->dev, "%s currently only supports devicetree\n", - __func__); - return -ENXIO; - } + if (psy->of_node) { + battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); + if (!battery_np) + return -ENODEV; - battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); - if (!battery_np) - return -ENODEV; + fwnode = fwnode_handle_get(of_fwnode_handle(battery_np)); + } else { + err = fwnode_property_get_reference_args( + dev_fwnode(psy->dev.parent), + "monitored-battery", NULL, 0, 0, &args); + if (err) + return err; - fwnode = of_fwnode_handle(battery_np); + fwnode = args.fwnode; + } err = fwnode_property_read_string(fwnode, "compatible", &value); if (err) @@ -778,6 +783,7 @@ out_ret_pointer: *info_out = info; out_put_node: + fwnode_handle_put(fwnode); of_node_put(battery_np); return err; } |