[PATCH v3] realtek: ensure output drivers are enabled in RTL8231

Adrian Schmutzler mail at adrianschmutzler.de
Sat Oct 2 09:37:22 PDT 2021


> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces at lists.openwrt.org]
> On Behalf Of Paul Fertser
> Sent: Freitag, 1. Oktober 2021 11:37
> To: openwrt-devel at lists.openwrt.org
> Cc: Sander Vanheule <sander at svanheule.net>; Paul Fertser
> <fercerpav at gmail.com>
> Subject: [PATCH v3] realtek: ensure output drivers are enabled in RTL8231
> 
> The bootloader can leave the GPIO expander in a state which doesn't have
> output drivers enabled so GPIOs will properly work for input but output
> operations will have no effect.
> 
> To avoid disrupting the boot in case the bootloader left direction and
data
> registers in an inconsistent state (e.g. pulling SoC's reset to 0)
reconfigure
> everything as input.
> 
> Reviewed-by: Sander Vanheule <sander at svanheule.net>
> Signed-off-by: Paul Fertser <fercerpav at gmail.com>

I added

Fixes: 16ae56b4f9ec ("realtek: fix RTL8231 gpio expander for high GPIOs")

and will merge this later tonight.

Best

Adrian

> ---
> 
> Notes:
>     Changes from v2:
>      - Fix 5.10 as well
> 
>     Changes from v1:
>      - Fix comment to mention we affect two extra GPIOs
>      - Remove unused "v" declaration.
> 
>  .../realtek/files-5.10/drivers/gpio/gpio-rtl8231.c   | 12 +++++++-----
>  .../realtek/files-5.4/drivers/gpio/gpio-rtl8231.c    | 12 +++++++-----
>  2 files changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl8231.c
> b/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl8231.c
> index a8ffcdc31368..f4f5621e0c1b 100644
> --- a/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl8231.c
> +++ b/target/linux/realtek/files-5.10/drivers/gpio/gpio-rtl8231.c
> @@ -239,8 +239,6 @@ void rtl8231_gpio_set(struct gpio_chip *gc, unsigned
> int offset, int value)
> 
>  int rtl8231_init(struct rtl8231_gpios *gpios)  {
> -	u32 v;
> -
>  	pr_info("%s called, MDIO bus ID: %d\n", __func__, gpios-
> >smi_bus_id);
> 
>  	gpios->reg_cached = 0;
> @@ -254,11 +252,15 @@ int rtl8231_init(struct rtl8231_gpios *gpios)
>  		sw_w32_mask(3, 1, RTL838X_DMY_REG5);
>  	}
> 
> -	/* Select GPIO functionality for pins 0-34 */
> +	/* Select GPIO functionality and force input direction for pins 0-36
> +*/
>  	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(0), 0xffff);
> +	rtl8231_write(gpios, RTL8231_GPIO_DIR(0), 0xffff);
>  	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(16), 0xffff);
> -	v = rtl8231_read(gpios, RTL8231_GPIO_PIN_SEL(32));
> -	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(32), v | 0x7);
> +	rtl8231_write(gpios, RTL8231_GPIO_DIR(16), 0xffff);
> +	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(32), 0x03ff);
> +
> +	/* Set LED_Start to enable drivers for output mode */
> +	rtl8231_write(gpios, RTL8231_LED_FUNC0, 1 << 1);
> 
>  	return 0;
>  }
> diff --git a/target/linux/realtek/files-5.4/drivers/gpio/gpio-rtl8231.c
> b/target/linux/realtek/files-5.4/drivers/gpio/gpio-rtl8231.c
> index a8ffcdc31368..f4f5621e0c1b 100644
> --- a/target/linux/realtek/files-5.4/drivers/gpio/gpio-rtl8231.c
> +++ b/target/linux/realtek/files-5.4/drivers/gpio/gpio-rtl8231.c
> @@ -239,8 +239,6 @@ void rtl8231_gpio_set(struct gpio_chip *gc, unsigned
> int offset, int value)
> 
>  int rtl8231_init(struct rtl8231_gpios *gpios)  {
> -	u32 v;
> -
>  	pr_info("%s called, MDIO bus ID: %d\n", __func__, gpios-
> >smi_bus_id);
> 
>  	gpios->reg_cached = 0;
> @@ -254,11 +252,15 @@ int rtl8231_init(struct rtl8231_gpios *gpios)
>  		sw_w32_mask(3, 1, RTL838X_DMY_REG5);
>  	}
> 
> -	/* Select GPIO functionality for pins 0-34 */
> +	/* Select GPIO functionality and force input direction for pins 0-36
> +*/
>  	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(0), 0xffff);
> +	rtl8231_write(gpios, RTL8231_GPIO_DIR(0), 0xffff);
>  	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(16), 0xffff);
> -	v = rtl8231_read(gpios, RTL8231_GPIO_PIN_SEL(32));
> -	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(32), v | 0x7);
> +	rtl8231_write(gpios, RTL8231_GPIO_DIR(16), 0xffff);
> +	rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(32), 0x03ff);
> +
> +	/* Set LED_Start to enable drivers for output mode */
> +	rtl8231_write(gpios, RTL8231_LED_FUNC0, 1 << 1);
> 
>  	return 0;
>  }
> --
> 2.17.1
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel




More information about the openwrt-devel mailing list