summaryrefslogtreecommitdiff
path: root/drivers/power/supply/power_supply_core.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2022-02-06 19:35:37 +0100
committerSebastian Reichel <sebastian.reichel@collabora.com>2022-02-11 19:08:34 +0100
commitc76787b0d8d2b8660e880d17fbe6fac22e8d35f5 (patch)
tree241ba334a1f0f3cd5d26458a2ed2af8b002e8a9d /drivers/power/supply/power_supply_core.c
parent7562ccd85ffb3fac15d731df1ea5c8974485626e (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.c26
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;
}