power: supply: cpcap-battery: invalidate config when incompatible measurements are read
This invalidates empty->counter_uah and charge_full when charge_now indicates that they are grossly wrong and adds some tolerance to POWER_SUPPLY_PROP_CHARGE_FULL to allow for inaccuracies in the charge counter and manufacturing tolerances in the battery. Signed-off-by: Carl Philipp Klemm <philipp@uvos.xyz> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
This commit is contained in:
parent
6a0fcc87c9
commit
aecd127b45
@ -667,10 +667,23 @@ static int cpcap_battery_get_property(struct power_supply *psy,
|
||||
if (!empty->voltage)
|
||||
return -ENODATA;
|
||||
val->intval = empty->counter_uah - latest->counter_uah;
|
||||
if (val->intval < 0)
|
||||
if (val->intval < 0) {
|
||||
/* Assume invalid config if CHARGE_NOW is -20% */
|
||||
if (ddata->charge_full && abs(val->intval) > ddata->charge_full/5) {
|
||||
empty->voltage = 0;
|
||||
ddata->charge_full = 0;
|
||||
return -ENODATA;
|
||||
}
|
||||
val->intval = 0;
|
||||
else if (ddata->charge_full && ddata->charge_full < val->intval)
|
||||
} else if (ddata->charge_full && ddata->charge_full < val->intval) {
|
||||
/* Assume invalid config if CHARGE_NOW exceeds CHARGE_FULL by 20% */
|
||||
if (val->intval > (6*ddata->charge_full)/5) {
|
||||
empty->voltage = 0;
|
||||
ddata->charge_full = 0;
|
||||
return -ENODATA;
|
||||
}
|
||||
val->intval = ddata->charge_full;
|
||||
}
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CHARGE_FULL:
|
||||
if (!ddata->charge_full)
|
||||
@ -747,7 +760,7 @@ static int cpcap_battery_set_property(struct power_supply *psy,
|
||||
case POWER_SUPPLY_PROP_CHARGE_FULL:
|
||||
if (val->intval < 0)
|
||||
return -EINVAL;
|
||||
if (val->intval > ddata->config.info.charge_full_design)
|
||||
if (val->intval > (6*ddata->config.info.charge_full_design)/5)
|
||||
return -EINVAL;
|
||||
|
||||
ddata->charge_full = val->intval;
|
||||
|
Loading…
x
Reference in New Issue
Block a user