• Hans de Goede's avatar
    power: supply: axp288_fuel_gauge: Rework get_status() · 2b5a4b4b
    Hans de Goede authored
    Relying on the (dis)charge current reporting for reporting FULL back to
    userspace does not work really well and often leads to the reported status
    getting stuck at e.g. 98/99% (the fuelgauge is not perfect) for hours.
    
    What happens is that when the battery is full the axp288 keeps charging it
    with a very low current. Until it is really really full and once really
    really full, some inaccuracies in the adc lead to it then sometimes
    reporting a small discharging rate, even though an external pwr source is
    used. So we end up with a status of "charging" for hours after the battery
    is actually already full and sometimes this then flip-flops to discharging.
    
    This commit fixes this by first checking if a valid Vbus is present and if
    it is present using the fuel-gauge's reported percentage to check for a
    full battery.
    
    This commit also changes how get_status() determines if the battery is
    charging or discharging when not reporting it as full. We still use the
    current direction for this, but instead of reading 4 extra registers for
    this (2 16 bit regs), simplify things by using the current-direction bit
    in the power-status register, which already gets read anyways.
    
    This also reduces the amount of i2c reads to 1 when on battery and 2
    when a valid Vbus is present.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarChen-Yu Tsai <wens@csie.org>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
    2b5a4b4b
axp288_fuel_gauge.c 21.5 KB