summaryrefslogtreecommitdiffstats
path: root/drivers/power/supply
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2017-12-26 13:59:12 +0100
committerSebastian Reichel <sre@kernel.org>2018-01-09 17:45:08 +0100
commitceb40831c94115134581ee6eaaa26001e00def5f (patch)
treebdf2b7a99ef32c7d3cbd0393b2afad703f6b55cf /drivers/power/supply
parent2b5a4b4bf2224f4f6b6631091bd51cb08d3094be (diff)
downloadlinux-ceb40831c94115134581ee6eaaa26001e00def5f.tar.bz2
power: supply: axp288_fuel_gauge: Optimize get_current()
First check the discharge current, and when that is non 0 use that without also checking the charge current (which will be 0 then). This makes get_current() do only 1 i2c read instead of 2 when on battery. This is esp. important given the pmic i2c bus mutex stuff used on boards with an axp288 because the SoC's own punit also may access the axp288, which makes i2c accesses more expensive then normal. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Chen-Yu Tsai <wens@csie.org> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Diffstat (limited to 'drivers/power/supply')
-rw-r--r--drivers/power/supply/axp288_fuel_gauge.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c
index c0b5e40b23e1..e0f3965b6964 100644
--- a/drivers/power/supply/axp288_fuel_gauge.c
+++ b/drivers/power/supply/axp288_fuel_gauge.c
@@ -386,24 +386,19 @@ vbatt_read_fail:
static int fuel_gauge_get_current(struct axp288_fg_info *info, int *cur)
{
- int ret, value = 0;
- int charge, discharge;
+ int ret, discharge;
- ret = iio_read_channel_raw(info->iio_channel[BAT_CHRG_CURR], &charge);
- if (ret < 0)
- goto current_read_fail;
+ /* First check discharge current, so that we do only 1 read on bat. */
ret = iio_read_channel_raw(info->iio_channel[BAT_D_CURR], &discharge);
if (ret < 0)
- goto current_read_fail;
+ return ret;
- if (charge > 0)
- value = charge;
- else if (discharge > 0)
- value = -1 * discharge;
+ if (discharge > 0) {
+ *cur = -1 * discharge;
+ return 0;
+ }
- *cur = value;
-current_read_fail:
- return ret;
+ return iio_read_channel_raw(info->iio_channel[BAT_CHRG_CURR], cur);
}
static int fuel_gauge_get_vocv(struct axp288_fg_info *info, int *vocv)