power: supply: cpcap-battery: invalidate config when incompatible measurements are...
authorCarl Philipp Klemm <philipp@uvos.xyz>
Fri, 23 Apr 2021 12:58:31 +0000 (14:58 +0200)
committerSebastian Reichel <sre@kernel.org>
Fri, 4 Jun 2021 12:28:31 +0000 (14:28 +0200)
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>
drivers/power/supply/cpcap-battery.c

index a3fc0084cda00d0a65f48e0b52d699a7a20fc4fc..8d62d4241da3d261fc9b5048ae2256294136daf2 100644 (file)
@@ -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;