> -----Original Message----- > From: openwrt-devel [mailto:openwrt-devel-boun...@lists.openwrt.org] > On Behalf Of Paul Fertser > Sent: Freitag, 1. Oktober 2021 11:37 > To: openwrt-devel@lists.openwrt.org > Cc: Sander Vanheule <san...@svanheule.net>; Paul Fertser > <fercer...@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 <san...@svanheule.net> > Signed-off-by: Paul Fertser <fercer...@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@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel