GPIOs > 31 require special handling. This patch fixes both the
initialisation (defaulting to input) and direction get/set operations.

Runtime-tested on D-Link DGS-1210-10P-R1 which has "reset" button on
GPIO[33].

Signed-off-by: Paul Fertser <fercer...@gmail.com>
---
 .../realtek/files-5.4/drivers/gpio/gpio-rtl8231.c      | 10 +++++-----
 1 file changed, 5 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..ddb8894663ec 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);
@@ -253,9 +252,10 @@ 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-15, 16-31 and 32-34 */
        rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(0), 0xffff);
        rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(16), 0xffff);
+       rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(32), 7 | (7 << 5));
 
        return 0;
 }
-- 
2.17.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to