From fa898d9eee5dd77af8d536ad85351f80fb3c41a0 Mon Sep 17 00:00:00 2001 From: Henrik Grimler Date: Mon, 13 Sep 2021 11:30:16 +0200 Subject: [PATCH 08/10] power: supply: max17042_battery: use VFSOC for capacity when no rsns On Galaxy S3 (i9300/i9305), which has the max17047 fuel gauge and no current sense resistor (rsns), the RepSOC register does not provide an accurate state of charge value. The reported value is wrong, and does not change over time. VFSOC however, which uses the voltage fuel gauge to determine the state of charge, always shows an accurate value. At least one max170xx driver, found in Asus' Z00D kernel [1], chooses how to get the capacity based on if current sense is available or not. Lets change the mainline driver to match the Asus Z00D driver's behaviour and thereby fix so that correct state of charge values are obtained on Galaxy S3. [1] https://github.com/LineageOS/android_kernel_asus_Z00D/blob/c7ab0e3ec5b5/drivers/power/max17042_battery.c#L1103-L1105 Suggested-by: Wolfgang Wiedmeyer Signed-off-by: Henrik Grimler --- drivers/power/supply/max17042_battery.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c index 8dffae76b6a3..5809ba997093 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -313,7 +313,10 @@ static int max17042_get_property(struct power_supply *psy, val->intval = data * 625 / 8; break; case POWER_SUPPLY_PROP_CAPACITY: - ret = regmap_read(map, MAX17042_RepSOC, &data); + if (chip->pdata->enable_current_sense) + ret = regmap_read(map, MAX17042_RepSOC, &data); + else + ret = regmap_read(map, MAX17042_VFSOC, &data); if (ret < 0) return ret; -- 2.33.0