• Hans de Goede's avatar
    pinctrl: cherryview: Preserve CHV_PADCTRL1_INVRXTX_TXDATA flag on GPIOs · 921daeec
    Hans de Goede authored
    One some devices the GPIO should output the inverted value from what
    device-drivers / ACPI code expects. The reason for this is unknown,
    perhaps these systems use an external buffer chip on the GPIO which
    inverts the signal. The BIOS makes this work by setting the
    CHV_PADCTRL1_INVRXTX_TXDATA flag.
    
    Before this commit we would unconditionally clear all INVRXTX flags,
    including the CHV_PADCTRL1_INVRXTX_TXDATA flag when a GPIO is requested
    by a driver (from chv_gpio_request_enable()).
    
    This breaks systems using this setup. Specifically it is causing
    problems for systems with a goodix touchscreen, where the BIOS sets the
    INVRXTX_TXDATA flag on the GPIO used for the touchscreen's reset pin.
    
    The goodix touchscreen driver by defaults configures this pin as input
    (relying on the pull-up to keep it high), but the clearing of the
    INVRXTX_TXDATA flag done by chv_gpio_request_enable() causes it to be
    driven low for a brief time before the GPIO gets set to input mode.
    
    This causes the touchscreen controller to get reset. On most CHT devs
    with this touchscreen this leads to:
    
    [   31.596534] Goodix-TS i2c-GDIX1001:00: i2c test failed attempt 1: -121
    
    The driver retries this though and then everything is fine. But during
    reset the touchscreen uses its interrupt pin as bootstrap to determine
    which i2c address to use and on the Acer One S1003 the spurious reset
    caused by the clearing of the INVRXTX_TXDATA flag causes the controller
    to come back up again on the wrong i2c address, breaking things.
    
    This commit fixes both the -121 errors, as well as the total breakage
    on the Acer One S1003, by making chv_gpio_clear_triggering() not clear
    the INVRXTX_TXDATA flag if the pin is already configured as a GPIO.
    
    Note that chv_pinmux_set_mux() does still unconditionally clear the
    flag, so this only affects GPIO usage.
    
    Fixes: a7d4b171 ("Input: goodix - add support for getting IRQ + reset GPIOs on Cherry Trail devices")
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    921daeec
pinctrl-cherryview.c 51.5 KB