]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
pinctrl: rockchip: rk3588: Fix support for rockchip_get_mux()
authorJonas Karlman <jonas@kwiboo.se>
Sun, 12 May 2024 12:16:16 +0000 (12:16 +0000)
committerKever Yang <kever.yang@rock-chips.com>
Fri, 14 Jun 2024 09:02:49 +0000 (17:02 +0800)
GPIO IOMUX control is located at PMU2_IOC or BUS_IOC offset on RK3588.

Based on Linux commit fdc33eba11c5 ("pinctrl/rockchip: add rk3588
support").

Compared to the Linux commit, this include a fix so that the iomux of
GPIO0_B4-D7 is reported correctly.

Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
drivers/pinctrl/rockchip/pinctrl-rockchip-core.c

index ca93b52ecc7aa2c4a54b60bc82ce9070d7daaadf..8245b854e63c425df97dc65984584eb3364f1707 100644 (file)
 #include <linux/libfdt.h>
 
 #include "pinctrl-rockchip.h"
+#include <dt-bindings/pinctrl/rockchip.h>
 
 #define MAX_ROCKCHIP_PINS_ENTRIES      30
 #define MAX_ROCKCHIP_GPIO_PER_BANK      32
-#define RK_FUNC_GPIO                    0
 
 static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
 {
@@ -147,6 +147,28 @@ static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
        if (bank->recalced_mask & BIT(pin))
                rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
 
+       if (IS_ENABLED(CONFIG_ROCKCHIP_RK3588)) {
+               if (bank->bank_num == 0) {
+                       if (pin >= RK_PB4 && pin <= RK_PD7) {
+                               u32 reg0 = 0;
+
+                               reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
+                               ret = regmap_read(regmap, reg0, &val);
+                               if (ret)
+                                       return ret;
+
+                               ret = ((val >> bit) & mask);
+                               if (ret != 8)
+                                       return ret;
+
+                               reg = reg + 0x8000; /* BUS_IOC_BASE */
+                               regmap = priv->regmap_base;
+                       }
+               } else if (bank->bank_num > 0) {
+                       reg += 0x8000; /* BUS_IOC_BASE */
+               }
+       }
+
        ret = regmap_read(regmap, reg, &val);
        if (ret)
                return ret;