From 68d2414d201083904dad83af4ebb2c35fc850b79 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sun, 8 Jun 2025 21:18:11 +0200 Subject: [PATCH 04/10] fixup! power: supply: core: battery-info: fully switch to fwnode After ("power: supply: core: battery-info: fully switch to fwnode") power_supply_get_battery_info() will always fail for battery fwnodes which do not define a "resistance-temp-table". Fix this by cleanly exiting on both 0 and EINVAL returns from fwnode_property_count_u32(fwnode, "resistance-temp-table") which indicates that the property is empty or not there. While at it also fix: 1. The weird -ENOMEM return for other errors. For other errors propagate the existing error or -EINVAL for an odd proplen. 2. Wrongly using "goto out_ret_pointer" on errors, out_ret_pointer should only be used on success, error paths should use out_put_node; Signed-off-by: Hans de Goede --- drivers/power/supply/power_supply_core.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index a8d1fe66e248..9bbc3be2e483 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -795,19 +795,20 @@ int power_supply_get_battery_info(struct power_supply *psy, } proplen = fwnode_property_count_u32(fwnode, "resistance-temp-table"); - if (proplen < 0 || proplen % 2 != 0) { + if (proplen == 0 || proplen == -EINVAL) { + err = 0; + goto out_ret_pointer; + } else if (proplen < 0 || proplen % 2 != 0) { power_supply_put_battery_info(psy, info); - err = -ENOMEM; - goto out_ret_pointer; - } else if (proplen == 0) { - goto out_ret_pointer; + err = (proplen < 0) ? proplen : -EINVAL; + goto out_put_node; } propdata = kcalloc(proplen, sizeof(*propdata), GFP_KERNEL); if (!propdata) { power_supply_put_battery_info(psy, info); err = -ENOMEM; - goto out_ret_pointer; + goto out_put_node; } err = fwnode_property_read_u32_array(fwnode, "resistance-temp-table", -- 2.49.0