Commit aecd127b authored by Carl Philipp Klemm's avatar Carl Philipp Klemm Committed by Sebastian Reichel
Browse files

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: default avatarCarl Philipp Klemm <philipp@uvos.xyz>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 6a0fcc87
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -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;