Message ID | 20210920171335.27816-1-fercerpav@gmail.com |
---|---|
State | Accepted |
Delegated to: | Adrian Schmutzler |
Headers | show |
Series | [v2] realtek: fix RTL8231 gpio expander for high GPIOs | expand |
On Mon, 2021-09-20 at 20:13 +0300, Paul Fertser wrote: > GPIOs > 31 require special handling. This patch fixes both the > initialisation and direction get/set operations. > > Signed-off-by: Paul Fertser <fercerpav@gmail.com> > --- > > Notes: > Changes from v1: > - Do not modify high GPIOs direction bits on init Thanks for the update. Reviewed-by: Sander Vanheule <sander@svanheule.net> > > .../realtek/files-5.4/drivers/gpio/gpio-rtl8231.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > 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 031f60f5307c..a8ffcdc31368 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 > @@ -106,12 +106,11 @@ static int rtl8231_pin_dir(struct rtl8231_gpios *gpios, u32 gpio, > u32 dir) > u32 v; > int pin_sel_addr = RTL8231_GPIO_PIN_SEL(gpio); > int pin_dir_addr = RTL8231_GPIO_DIR(gpio); > - int pin = gpio % 16; > - int dpin = pin; > + int dpin = gpio % 16; > > if (gpio > 31) { > pr_debug("WARNING: HIGH pin\n"); > - dpin = pin << 5; > + dpin += 5; > pin_dir_addr = pin_sel_addr; > } > > @@ -140,7 +139,7 @@ static int rtl8231_pin_dir_get(struct rtl8231_gpios *gpios, u32 > gpio, u32 *dir) > > if (gpio > 31) { > pin_dir_addr = RTL8231_GPIO_PIN_SEL(gpio); > - pin = pin << 5; > + pin += 5; > } > > v = rtl8231_read(gpios, pin_dir_addr); > @@ -240,6 +239,8 @@ 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; > @@ -253,9 +254,11 @@ int rtl8231_init(struct rtl8231_gpios *gpios) > sw_w32_mask(3, 1, RTL838X_DMY_REG5); > } > > - /*Select GPIO functionality for pins 0-15, 16-31 and 32-37 */ > + /* Select GPIO functionality for pins 0-34 */ > rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(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); > > 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 031f60f5307c..a8ffcdc31368 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 @@ -106,12 +106,11 @@ static int rtl8231_pin_dir(struct rtl8231_gpios *gpios, u32 gpio, u32 dir) u32 v; int pin_sel_addr = RTL8231_GPIO_PIN_SEL(gpio); int pin_dir_addr = RTL8231_GPIO_DIR(gpio); - int pin = gpio % 16; - int dpin = pin; + int dpin = gpio % 16; if (gpio > 31) { pr_debug("WARNING: HIGH pin\n"); - dpin = pin << 5; + dpin += 5; pin_dir_addr = pin_sel_addr; } @@ -140,7 +139,7 @@ static int rtl8231_pin_dir_get(struct rtl8231_gpios *gpios, u32 gpio, u32 *dir) if (gpio > 31) { pin_dir_addr = RTL8231_GPIO_PIN_SEL(gpio); - pin = pin << 5; + pin += 5; } v = rtl8231_read(gpios, pin_dir_addr); @@ -240,6 +239,8 @@ 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; @@ -253,9 +254,11 @@ int rtl8231_init(struct rtl8231_gpios *gpios) sw_w32_mask(3, 1, RTL838X_DMY_REG5); } - /*Select GPIO functionality for pins 0-15, 16-31 and 32-37 */ + /* Select GPIO functionality for pins 0-34 */ rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(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); return 0; }
GPIOs > 31 require special handling. This patch fixes both the initialisation and direction get/set operations. Signed-off-by: Paul Fertser <fercerpav@gmail.com> --- Notes: Changes from v1: - Do not modify high GPIOs direction bits on init .../realtek/files-5.4/drivers/gpio/gpio-rtl8231.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)