46 lines
1.8 KiB
Diff
46 lines
1.8 KiB
Diff
|
From fa898d9eee5dd77af8d536ad85351f80fb3c41a0 Mon Sep 17 00:00:00 2001
|
||
|
From: Henrik Grimler <henrik@grimler.se>
|
||
|
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 <wolfgit@wiedmeyer.de>
|
||
|
Signed-off-by: Henrik Grimler <henrik@grimler.se>
|
||
|
---
|
||
|
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
|
||
|
|