Commit 3a3acf83 authored by Artur Weber's avatar Artur Weber Committed by Sebastian Reichel

power: supply: max17042_battery: Fix SOC threshold calc w/ no current sense

Commit 223a3b82 ("power: supply: max17042_battery: use VFSOC for
capacity when no rsns") made it so that capacity on systems without
current sensing would be read from VFSOC instead of RepSOC. However,
the SOC threshold calculation still read RepSOC to get the SOC
regardless of the current sensing option state.

Fix this by applying the same conditional to determine which register
should be read.

This also seems to be the intended behavior as per the datasheet - SOC
alert config value in MiscCFG on setups without current sensing is set
to a value of 0b11, indicating SOC alerts being generated based on
VFSOC, instead of 0b00 which indicates SOC alerts being generated based
on RepSOC.

This fixes an issue on the Galaxy S3/Midas boards, where the alert
interrupt would be constantly retriggered, causing high CPU usage
on idle (around ~12%-15%).

Fixes: e5f3872d ("max17042: Add support for signalling change in SOC")
Signed-off-by: default avatarArtur Weber <aweber.kernel@gmail.com>
Reviewed-by: default avatarHenrik Grimler <henrik@grimler.se>
Reviewed-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20240817-max17042-soc-threshold-fix-v1-1-72b45899c3cc@gmail.comSigned-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent dc123a1a
...@@ -853,7 +853,10 @@ static void max17042_set_soc_threshold(struct max17042_chip *chip, u16 off) ...@@ -853,7 +853,10 @@ static void max17042_set_soc_threshold(struct max17042_chip *chip, u16 off)
/* program interrupt thresholds such that we should /* program interrupt thresholds such that we should
* get interrupt for every 'off' perc change in the soc * get interrupt for every 'off' perc change in the soc
*/ */
if (chip->pdata->enable_current_sense)
regmap_read(map, MAX17042_RepSOC, &soc); regmap_read(map, MAX17042_RepSOC, &soc);
else
regmap_read(map, MAX17042_VFSOC, &soc);
soc >>= 8; soc >>= 8;
soc_tr = (soc + off) << 8; soc_tr = (soc + off) << 8;
if (off < soc) if (off < soc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment