diff mbox series

[v2] realtek: ensure output drivers are enabled in RTL8231

Message ID 20210930171541.13804-1-fercerpav@gmail.com
State Superseded
Headers show
Series [v2] realtek: ensure output drivers are enabled in RTL8231 | expand

Commit Message

Paul Fertser Sept. 30, 2021, 5:15 p.m. UTC
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.

Signed-off-by: Paul Fertser <fercerpav@gmail.com>
---

Notes:
    Changes from v1:
     - Fix comment to mention we affect two extra GPIOs
     - Remove unused "v" declaration.

 .../realtek/files-5.4/drivers/gpio/gpio-rtl8231.c    | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Sander Vanheule Sept. 30, 2021, 6:09 p.m. UTC | #1
Hi Paul,

Thanks for the update, looks good to me.

On Thu, 2021-09-30 at 20:15 +0300, Paul Fertser wrote:
> 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.
> 
> Signed-off-by: Paul Fertser <fercerpav@gmail.com>

Reviewed-by: Sander Vanheule <sander@svanheule.net>

Best,
Sander
diff mbox series

Patch

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;
 }