• Hans de Goede's avatar
    power: supply: axp288_charger: Add special handling for HP Pavilion x2 10 · 9c80662a
    Hans de Goede authored
    Some HP Pavilion x2 10 models use an AXP288 for charging and fuel-gauge.
    We use a native power_supply / PMIC driver in this case, because on most
    models with an AXP288 the ACPI AC / Battery code is either completely
    missing or relies on custom / proprietary ACPI OpRegions which Linux
    does not implement.
    
    The native drivers mostly work fine, but there are 2 problems:
    
    1. These model uses a Type-C connector for charging which the AXP288 does
    not support. As long as a Type-A charger (which uses the USB data pins for
    charger type detection) is used everything is fine. But if a Type-C
    charger is used (such as the charger shipped with the device) then the
    charger is not recognized.
    
    So we end up slowly discharging the device even though a charger is
    connected, because we are limiting the current from the charger to 500mA.
    To make things worse this happens with the device's official charger.
    
    Looking at the ACPI tables HP has "solved" the problem of the AXP288 not
    being able to recognize Type-C chargers by simply always programming the
    input-current-limit at 3000mA and relying on a Vhold setting of 4.7V
    (normally 4.4V) to limit the current intake if the charger cannot handle
    this.
    
    2. If no charger is connected when the machine boots then it boots with the
    vbus-path disabled. On other devices this is done when a 5V boost converter
    is active to avoid the PMIC trying to charge from the 5V boost output.
    This is done when an OTG host cable is inserted and the ID pin on the
    micro-B receptacle is pulled low, the ID pin has an ACPI event handler
    associated with it which re-enables the vbus-path when the ID pin is pulled
    high when the OTG cable is removed. The Type-C connector has no ID pin,
    there is no ID pin handler and there appears to be no 5V boost converter,
    so we end up not charging because the vbus-path is disabled, until we
    unplug the charger which automatically clears the vbus-path disable bit and
    then on the second plug-in of the adapter we start charging.
    
    The HP Pavilion x2 10 models with an AXP288 do have mostly working ACPI
    AC / Battery code which does not rely on custom / proprietary ACPI
    OpRegions. So one possible solution would be to blacklist the AXP288
    native power_supply drivers and add the HP Pavilion x2 10 with AXP288
    DMI ids to the list of devices which should use the ACPI AC / Battery
    code even though they have an AXP288 PMIC. This would require changes to
    4 files: drivers/acpi/ac.c, drivers/power/supply/axp288_charger.c,
    drivers/acpi/battery.c and drivers/power/supply/axp288_fuel_gauge.c.
    
    Beside needing adding the same DMI matches to 4 different files, this
    approach also triggers problem 2. from above, but then when suspended,
    during suspend the machine will not wakeup because the vbus path is
    disabled by the AML code when not charging, so the Vbus low-to-high
    IRQ is not triggered, the CPU never wakes up and the device does not
    charge even though the user likely things it is charging, esp. since
    the charge status LED is directly coupled to an adapter being plugged
    in and does not reflect actual charging.
    
    This could be worked by enabling vbus-path explicitly from say the
    axp288_charger driver's suspend handler.
    
    So neither situation is ideal, in both cased we need to explicitly enable
    the vbus-path to work around different variants of problem 2 above, this
    requires a quirk in the axp288_charger code.
    
    If we go the route of using the ACPI AC / Battery drivers then we need
    modifications to 3 other drivers; and we need to partially disable the
    axp288_charger code, while at the same time keeping it around to enable
    vbus-path on suspend.
    
    OTOH we can copy the hardcoding of 3A input-current-limit (we never touch
    Vhold, so that would stay at 4.7V) to the axp288_charger code, which needs
    changes regardless, then we concentrate all special handling of this
    interesting device model in the axp288_charger code. That is what this
    commit does.
    
    Cc: stable@vger.kernel.org
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1791098Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
    9c80662a
axp288_charger.c 25.3 KB