@@ -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",
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 <hansg@kernel.org> --- drivers/power/supply/power_supply_core.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)