* Return -ENODATA instead of confusing rough values * Calculate percentage using charge_full value provided Signed-off-by: Arthur Demchenkov <spinal.by@xxxxxxxxx> --- drivers/power/supply/cpcap-battery.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c index 669ed1513201..f712a3bda315 100644 --- a/drivers/power/supply/cpcap-battery.c +++ b/drivers/power/supply/cpcap-battery.c @@ -573,10 +573,10 @@ static int cpcap_battery_get_property(struct power_supply *psy, union power_supply_propval *val) { struct cpcap_battery_ddata *ddata = power_supply_get_drvdata(psy); - struct cpcap_battery_state_data *latest, *previous, *low, *high; + struct cpcap_battery_state_data *latest, *previous, *low; u32 sample; s32 accumulator; - int cached, delta, est; + int cached; s64 tmp; cached = cpcap_battery_update_status(ddata); @@ -654,25 +654,12 @@ static int cpcap_battery_get_property(struct power_supply *psy, val->intval = div64_s64(tmp, 100); break; case POWER_SUPPLY_PROP_CAPACITY: - est = cpcap_battery_get_rough_percentage(ddata); - high = cpcap_battery_get_highest(ddata); - if (high->voltage) { - delta = latest->counter_uah - high->counter_uah; - val->intval = (ddata->config.info.charge_full_design - - delta) * 100; - val->intval /= ddata->config.info.charge_full_design; - delta = abs(val->intval - est); - break; - } low = cpcap_battery_get_lowest(ddata); - if (low->voltage) { - delta = low->counter_uah - latest->counter_uah; - val->intval = (delta * 100) / - ddata->config.info.charge_full_design; - delta = abs(val->intval - est); - break; - } - val->intval = est; + if (!low->voltage || !ddata->charge_full) + return -ENODATA; + val->intval = (low->counter_uah - + latest->counter_uah) * 100; + val->intval /= ddata->charge_full; break; case POWER_SUPPLY_PROP_CAPACITY_LEVEL: val->intval = cpcap_battery_get_rough_capacity(ddata); -- 2.11.0