| From 272053fb8f993a14bf7a1657dec77df1ddf13f36 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 12 Jan 2022 11:47:27 +0300 |
| Subject: power: supply: axp20x_battery: properly report current when |
| discharging |
| |
| From: Evgeny Boger <boger@wirenboard.com> |
| |
| [ Upstream commit d4f408cdcd26921c1268cb8dcbe8ffb6faf837f3 ] |
| |
| As stated in [1], negative current values are used for discharging |
| batteries. |
| |
| AXP PMICs internally have two different ADC channels for shunt current |
| measurement: one used during charging and one during discharging. |
| The values reported by these ADCs are unsigned. |
| While the driver properly selects ADC channel to get the data from, |
| it doesn't apply negative sign when reporting discharging current. |
| |
| [1] Documentation/ABI/testing/sysfs-class-power |
| |
| Signed-off-by: Evgeny Boger <boger@wirenboard.com> |
| Acked-by: Chen-Yu Tsai <wens@csie.org> |
| Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/power/supply/axp20x_battery.c | 13 ++++++------- |
| 1 file changed, 6 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c |
| index 18a9db0df4b1..335e12cc5e2f 100644 |
| --- a/drivers/power/supply/axp20x_battery.c |
| +++ b/drivers/power/supply/axp20x_battery.c |
| @@ -186,7 +186,6 @@ static int axp20x_battery_get_prop(struct power_supply *psy, |
| union power_supply_propval *val) |
| { |
| struct axp20x_batt_ps *axp20x_batt = power_supply_get_drvdata(psy); |
| - struct iio_channel *chan; |
| int ret = 0, reg, val1; |
| |
| switch (psp) { |
| @@ -266,12 +265,12 @@ static int axp20x_battery_get_prop(struct power_supply *psy, |
| if (ret) |
| return ret; |
| |
| - if (reg & AXP20X_PWR_STATUS_BAT_CHARGING) |
| - chan = axp20x_batt->batt_chrg_i; |
| - else |
| - chan = axp20x_batt->batt_dischrg_i; |
| - |
| - ret = iio_read_channel_processed(chan, &val->intval); |
| + if (reg & AXP20X_PWR_STATUS_BAT_CHARGING) { |
| + ret = iio_read_channel_processed(axp20x_batt->batt_chrg_i, &val->intval); |
| + } else { |
| + ret = iio_read_channel_processed(axp20x_batt->batt_dischrg_i, &val1); |
| + val->intval = -val1; |
| + } |
| if (ret) |
| return ret; |
| |
| -- |
| 2.35.1 |
| |