• Hans de Goede's avatar
    power: supply: bq24190_charger: Add disable-reset device-property · 6cf62a3b
    Hans de Goede authored
    Allow platform-code to disable the reset on probe and suspend/resume
    by setting a "disable-reset" boolean device property on the device.
    
    There are several reasons why the platform-code may want to disable
    the reset on probe and suspend/resume:
    
    1) Resetting the charger should never be necessary it should always have
    sane values programmed. If it is running with invalid values while we
    are not running (system turned off or suspended) there is a big problem
    as that may lead to overcharging the battery.
    
    2) The reset in suspend() is meant to put the charger back into default
    mode, but this is not necessary and not a good idea. If the charger has
    been programmed with a higher max charge_current / charge_voltage then
    putting it back in default-mode will reset those to the safe power-on
    defaults, leading to slower charging, or charging to a lower voltage
    (and thus not using the full capacity) while suspended which is
    undesirable. Reprogramming the max charge_current / charge_voltage
    after the reset will not help here as that will put the charger back
    in host mode and start the i2c watchdog if the host then does not do
    anything for 40s (iow if we're suspended for more then 40s) the watchdog
    expires resetting the device to default-mode, including resetting all
    the registers to there safe power-on defaults. So the only way to keep
    using custom charge settings while suspending is to keep the charger in
    its normal running state with the i2c watchdog disabled. This is fine
    as the charger will still automatically switch from constant current
    to constant voltage and stop charging when the battery is full.
    
    3) Besides never being necessary resetting the charger also causes
    problems on systems where the charge voltage limit is set higher then the
    reset value, if this is the case and the charger is reset while charging
    and the battery voltage is between the 2 voltages, then about half the
    time the charger gets confused and claims to be charging (REG08 contains
    0x64) but in reality the charger has decoupled itself from VBUS (Q1 off)
    and is drawing 0A from VBUS, leaving the system running from the battery.
    
    This last problem is happening on a GPD-win mini PC with a bq24292i
    charger chip combined with a max17047 fuel-gauge and a LiHV battery.
    I've checked and TI does not list any errata for the bq24292i which
    could explain this (there are no errata at all).
    
    Cc: Liam Breck <kernel@networkimprov.net>
    Cc: Tony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarLiam Breck <kernel@networkimprov.net>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
    6cf62a3b
bq24190_charger.c 45.2 KB