• Hans de Goede's avatar
    iio: adc: axp288: Fix TS-pin handling · 9bcf15f7
    Hans de Goede authored
    Prior to this commit there were 3 issues with our handling of the TS-pin:
    
    1) There are 2 ways how the firmware can disable monitoring of the TS-pin
    for designs which do not have a temperature-sensor for the battery:
    a) Clearing bit 0 of the AXP20X_ADC_EN1 register
    b) Setting bit 2 of the AXP288_ADC_TS_PIN_CTRL monitoring
    
    Prior to this commit we were unconditionally setting both bits to the
    value used on devices with a TS. This causes the temperature protection to
    kick in on devices without a TS, such as the Jumper ezbook v2, causing
    them to not charge under Linux.
    
    This commit fixes this by using regmap_update_bits when updating these 2
    registers, leaving the 2 mentioned bits alone.
    
    The next 2 problems are related to our handling of the current-source
    for the TS-pin. The current-source used for the battery temp-sensor (TS)
    is shared with the GPADC. For proper fuel-gauge and charger operation the
    TS current-source needs to be permanently on. But to read the GPADC we
    need to temporary switch the TS current-source to ondemand, so that the
    GPADC can use it, otherwise we will always read an all 0 value.
    
    2) Problem 2 is we were writing hardcoded values to the ADC TS pin-ctrl
    register, overwriting various other unrelated bits. Specifically we were
    overwriting the current-source setting for the TS and GPIO0 pins, forcing
    it to 80ųA independent of its original setting. On a Chuwi Vi10 tablet
    this was causing us to get a too high adc value (due to a too high
    current-source) resulting in the following errors being logged:
    
    ACPI Error: AE_ERROR, Returned by Handler for [UserDefinedRegion]
    ACPI Error: Method parse/execution failed \_SB.SXP1._TMP, AE_ERROR
    
    This commit fixes this by using regmap_update_bits to change only the
    relevant bits.
    
    3) After reading the GPADC channel we were unconditionally enabling the
    TS current-source even on devices where the TS-pin is not used and the
    current-source thus was off before axp288_adc_read_raw call.
    
    This commit fixes this by making axp288_adc_set_ts a nop on devices where
    the ADC is not enabled for the TS-pin.
    
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1610545
    Fixes: 3091141d ("iio: adc: axp288: Fix the GPADC pin ...")
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    9bcf15f7
axp288_adc.c 8 KB