Re: [PATCH] pinctrl: cherryview: Preserve CHV_PADCTRL1_INVRXTX_TXDATA flag on GPIOs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Sep 04, 2020 at 07:21:41PM +0200, Hans de Goede wrote:
> 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.

Makes sense!
I'll wait for Mika tag, while pushing to my review and testing queue, thanks!

> Fixes: a7d4b171660c ("Input: goodix - add support for getting IRQ + reset GPIOs on Cherry Trail devices")
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
>  drivers/pinctrl/intel/pinctrl-cherryview.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c
> index 33862bb1e0e2..41ee77bf893e 100644
> --- a/drivers/pinctrl/intel/pinctrl-cherryview.c
> +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
> @@ -64,6 +64,7 @@
>  #define CHV_PADCTRL1_CFGLOCK		BIT(31)
>  #define CHV_PADCTRL1_INVRXTX_SHIFT	4
>  #define CHV_PADCTRL1_INVRXTX_MASK	GENMASK(7, 4)
> +#define CHV_PADCTRL1_INVRXTX_TXDATA	BIT(7)
>  #define CHV_PADCTRL1_INVRXTX_RXDATA	BIT(6)
>  #define CHV_PADCTRL1_INVRXTX_TXENABLE	BIT(5)
>  #define CHV_PADCTRL1_ODEN		BIT(3)
> @@ -798,11 +799,22 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev,
>  static void chv_gpio_clear_triggering(struct chv_pinctrl *pctrl,
>  				      unsigned int offset)
>  {
> +	u32 invrxtx_mask = CHV_PADCTRL1_INVRXTX_MASK;
>  	u32 value;
>  
> +	/*
> +	 * One some devices the GPIO should output the inverted value from what
> +	 * device-drivers / ACPI code expects (inverted external buffer?). The
> +	 * BIOS makes this work by setting the CHV_PADCTRL1_INVRXTX_TXDATA flag,
> +	 * preserve this flag if the pin is already setup as GPIO.
> +	 */
> +	value = chv_readl(pctrl, offset, CHV_PADCTRL0);
> +	if (value & CHV_PADCTRL0_GPIOEN)
> +		invrxtx_mask &= ~CHV_PADCTRL1_INVRXTX_TXDATA;
> +
>  	value = chv_readl(pctrl, offset, CHV_PADCTRL1);
>  	value &= ~CHV_PADCTRL1_INTWAKECFG_MASK;
> -	value &= ~CHV_PADCTRL1_INVRXTX_MASK;
> +	value &= ~invrxtx_mask;
>  	chv_writel(pctrl, offset, CHV_PADCTRL1, value);
>  }
>  
> -- 
> 2.28.0
> 

-- 
With Best Regards,
Andy Shevchenko





[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux