* [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support
@ 2025-12-06 5:08 Ye Zhang
2025-12-06 5:08 ` [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support Ye Zhang
` (7 more replies)
0 siblings, 8 replies; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
This series adds pinctrl support for the Rockchip RK3506 and RV1126B SoC,
and adds support for RMIO (Rockchip Matrix I/O).
The series includes:
- RK3506 pinctrl driver implementation
- RV1126B pinctrl driver implementation
- RMIO controller binding and driver support
- GPIO driver update to support new version GPIO
Changes in v2:
- Added RV1126B pinctrl support (patches 3 and 4)
- Updated GPIO driver to support new version GPIO (patch 5)
- Added header file for RK3506 RMIO (patch 6)
- RMIO is now implemented as a separate pinctrl device (patches 7, 8)
Ye Zhang (8):
dt-bindings: pinctrl: Add rk3506 pinctrl support
pinctrl: rockchip: Add rk3506 pinctrl support
dt-bindings: pinctrl: Add rv1126b pinctrl support
pinctrl: rockchip: Add rv1126b pinctrl support
gpio: rockchip: support new version GPIO
dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO
dt-bindings: pinctrl: rockchip: Add RMIO controller binding
pinctrl: rockchip: add rmio support
.../bindings/pinctrl/rockchip,pinctrl.yaml | 11 +
.../bindings/pinctrl/rockchip,rmio.yaml | 130 ++
drivers/gpio/gpio-rockchip.c | 2 +
drivers/pinctrl/pinctrl-rockchip.c | 1188 +++++++++++++++--
drivers/pinctrl/pinctrl-rockchip.h | 47 +
.../pinctrl/rockchip,rk3506-rmio.h | 143 ++
6 files changed, 1427 insertions(+), 94 deletions(-)
create mode 100644 Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
create mode 100644 include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
--
2.34.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-08 6:26 ` Krzysztof Kozlowski
2025-12-09 12:35 ` Heiko Stübner
2025-12-06 5:08 ` [PATCH v2 2/8] pinctrl: rockchip: " Ye Zhang
` (6 subsequent siblings)
7 siblings, 2 replies; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang, Krzysztof Kozlowski
Add the compatible string for the rk3506 SoC.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
index 125af766b992..76e607281716 100644
--- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
@@ -44,6 +44,7 @@ properties:
- rockchip,rk3328-pinctrl
- rockchip,rk3368-pinctrl
- rockchip,rk3399-pinctrl
+ - rockchip,rk3506-pinctrl
- rockchip,rk3528-pinctrl
- rockchip,rk3562-pinctrl
- rockchip,rk3568-pinctrl
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 2/8] pinctrl: rockchip: Add rk3506 pinctrl support
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
2025-12-06 5:08 ` [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-06 5:08 ` [PATCH v2 3/8] dt-bindings: pinctrl: Add rv1126b " Ye Zhang
` (5 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Add support for the 5 rk3506 GPIO banks.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
---
drivers/pinctrl/pinctrl-rockchip.c | 442 ++++++++++++++++++++++++++++-
drivers/pinctrl/pinctrl-rockchip.h | 4 +
2 files changed, 438 insertions(+), 8 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 7a68a6237649..e44ef262beec 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -105,6 +105,29 @@
.pull_type[3] = pull3, \
}
+#define PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(id, pins, label, iom0, \
+ iom1, iom2, iom3, \
+ offset0, offset1, \
+ offset2, offset3, drv0, \
+ drv1, drv2, drv3) \
+ { \
+ .bank_num = id, \
+ .nr_pins = pins, \
+ .name = label, \
+ .iomux = { \
+ { .type = iom0, .offset = offset0 }, \
+ { .type = iom1, .offset = offset1 }, \
+ { .type = iom2, .offset = offset2 }, \
+ { .type = iom3, .offset = offset3 }, \
+ }, \
+ .drv = { \
+ { .drv_type = drv0, .offset = -1 }, \
+ { .drv_type = drv1, .offset = -1 }, \
+ { .drv_type = drv2, .offset = -1 }, \
+ { .drv_type = drv3, .offset = -1 }, \
+ }, \
+ }
+
#define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
{ \
.bank_num = id, \
@@ -233,6 +256,35 @@
.pull_type[3] = pull3, \
}
+#define PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS_PULL_FLAGS(id, pins, \
+ label, iom0, iom1, \
+ iom2, iom3, offset0, \
+ offset1, offset2, \
+ offset3, drv0, drv1, \
+ drv2, drv3, pull0, \
+ pull1, pull2, pull3) \
+ { \
+ .bank_num = id, \
+ .nr_pins = pins, \
+ .name = label, \
+ .iomux = { \
+ { .type = iom0, .offset = offset0 }, \
+ { .type = iom1, .offset = offset1 }, \
+ { .type = iom2, .offset = offset2 }, \
+ { .type = iom3, .offset = offset3 }, \
+ }, \
+ .drv = { \
+ { .drv_type = drv0, .offset = -1 }, \
+ { .drv_type = drv1, .offset = -1 }, \
+ { .drv_type = drv2, .offset = -1 }, \
+ { .drv_type = drv3, .offset = -1 }, \
+ }, \
+ .pull_type[0] = pull0, \
+ .pull_type[1] = pull1, \
+ .pull_type[2] = pull2, \
+ .pull_type[3] = pull3, \
+ }
+
#define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \
{ \
.bank_num = ID, \
@@ -1120,6 +1172,13 @@ static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
else
regmap = info->regmap_base;
+ if (ctrl->type == RK3506) {
+ if (bank->bank_num == 1)
+ regmap = info->regmap_ioc1;
+ else if (bank->bank_num == 4)
+ return 0;
+ }
+
/* get basic quadrupel of mux registers and the correct reg inside */
mux_type = bank->iomux[iomux_num].type;
reg = bank->iomux[iomux_num].offset;
@@ -1239,6 +1298,13 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
else
regmap = info->regmap_base;
+ if (ctrl->type == RK3506) {
+ if (bank->bank_num == 1)
+ regmap = info->regmap_ioc1;
+ else if (bank->bank_num == 4)
+ return 0;
+ }
+
/* get basic quadrupel of mux registers and the correct reg inside */
mux_type = bank->iomux[iomux_num].type;
reg = bank->iomux[iomux_num].offset;
@@ -2003,6 +2069,262 @@ static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
return 0;
}
+#define RK3506_DRV_BITS_PER_PIN 8
+#define RK3506_DRV_PINS_PER_REG 2
+#define RK3506_DRV_GPIO0_A_OFFSET 0x100
+#define RK3506_DRV_GPIO0_D_OFFSET 0x830
+#define RK3506_DRV_GPIO1_OFFSET 0x140
+#define RK3506_DRV_GPIO2_OFFSET 0x180
+#define RK3506_DRV_GPIO3_OFFSET 0x1c0
+#define RK3506_DRV_GPIO4_OFFSET 0x840
+
+static int rk3506_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
+ int pin_num, struct regmap **regmap,
+ int *reg, u8 *bit)
+{
+ struct rockchip_pinctrl *info = bank->drvdata;
+ int ret = 0;
+
+ switch (bank->bank_num) {
+ case 0:
+ *regmap = info->regmap_pmu;
+ if (pin_num > 24) {
+ ret = -EINVAL;
+ } else if (pin_num < 24) {
+ *reg = RK3506_DRV_GPIO0_A_OFFSET;
+ } else {
+ *reg = RK3506_DRV_GPIO0_D_OFFSET;
+ *bit = 3;
+
+ return 0;
+ }
+ break;
+
+ case 1:
+ *regmap = info->regmap_ioc1;
+ if (pin_num < 28)
+ *reg = RK3506_DRV_GPIO1_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 2:
+ *regmap = info->regmap_base;
+ if (pin_num < 17)
+ *reg = RK3506_DRV_GPIO2_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 3:
+ *regmap = info->regmap_base;
+ if (pin_num < 15)
+ *reg = RK3506_DRV_GPIO3_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 4:
+ *regmap = info->regmap_base;
+ if (pin_num < 8 || pin_num > 11) {
+ ret = -EINVAL;
+ } else {
+ *reg = RK3506_DRV_GPIO4_OFFSET;
+ *bit = 10;
+
+ return 0;
+ }
+ break;
+
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ if (ret) {
+ dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
+
+ return ret;
+ }
+
+ *reg += ((pin_num / RK3506_DRV_PINS_PER_REG) * 4);
+ *bit = pin_num % RK3506_DRV_PINS_PER_REG;
+ *bit *= RK3506_DRV_BITS_PER_PIN;
+
+ return 0;
+}
+
+#define RK3506_PULL_BITS_PER_PIN 2
+#define RK3506_PULL_PINS_PER_REG 8
+#define RK3506_PULL_GPIO0_A_OFFSET 0x200
+#define RK3506_PULL_GPIO0_D_OFFSET 0x830
+#define RK3506_PULL_GPIO1_OFFSET 0x210
+#define RK3506_PULL_GPIO2_OFFSET 0x220
+#define RK3506_PULL_GPIO3_OFFSET 0x230
+#define RK3506_PULL_GPIO4_OFFSET 0x840
+
+static int rk3506_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
+ int pin_num, struct regmap **regmap,
+ int *reg, u8 *bit)
+{
+ struct rockchip_pinctrl *info = bank->drvdata;
+ int ret = 0;
+
+ switch (bank->bank_num) {
+ case 0:
+ *regmap = info->regmap_pmu;
+ if (pin_num > 24) {
+ ret = -EINVAL;
+ } else if (pin_num < 24) {
+ *reg = RK3506_PULL_GPIO0_A_OFFSET;
+ } else {
+ *reg = RK3506_PULL_GPIO0_D_OFFSET;
+ *bit = 5;
+
+ return 0;
+ }
+ break;
+
+ case 1:
+ *regmap = info->regmap_ioc1;
+ if (pin_num < 28)
+ *reg = RK3506_PULL_GPIO1_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 2:
+ *regmap = info->regmap_base;
+ if (pin_num < 17)
+ *reg = RK3506_PULL_GPIO2_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 3:
+ *regmap = info->regmap_base;
+ if (pin_num < 15)
+ *reg = RK3506_PULL_GPIO3_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 4:
+ *regmap = info->regmap_base;
+ if (pin_num < 8 || pin_num > 11) {
+ ret = -EINVAL;
+ } else {
+ *reg = RK3506_PULL_GPIO4_OFFSET;
+ *bit = 13;
+
+ return 0;
+ }
+ break;
+
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ if (ret) {
+ dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
+
+ return ret;
+ }
+
+ *reg += ((pin_num / RK3506_PULL_PINS_PER_REG) * 4);
+ *bit = pin_num % RK3506_PULL_PINS_PER_REG;
+ *bit *= RK3506_PULL_BITS_PER_PIN;
+
+ return 0;
+}
+
+#define RK3506_SMT_BITS_PER_PIN 1
+#define RK3506_SMT_PINS_PER_REG 8
+#define RK3506_SMT_GPIO0_A_OFFSET 0x400
+#define RK3506_SMT_GPIO0_D_OFFSET 0x830
+#define RK3506_SMT_GPIO1_OFFSET 0x410
+#define RK3506_SMT_GPIO2_OFFSET 0x420
+#define RK3506_SMT_GPIO3_OFFSET 0x430
+#define RK3506_SMT_GPIO4_OFFSET 0x840
+
+static int rk3506_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
+ int pin_num,
+ struct regmap **regmap,
+ int *reg, u8 *bit)
+{
+ struct rockchip_pinctrl *info = bank->drvdata;
+ int ret = 0;
+
+ switch (bank->bank_num) {
+ case 0:
+ *regmap = info->regmap_pmu;
+ if (pin_num > 24) {
+ ret = -EINVAL;
+ } else if (pin_num < 24) {
+ *reg = RK3506_SMT_GPIO0_A_OFFSET;
+ } else {
+ *reg = RK3506_SMT_GPIO0_D_OFFSET;
+ *bit = 9;
+
+ return 0;
+ }
+ break;
+
+ case 1:
+ *regmap = info->regmap_ioc1;
+ if (pin_num < 28)
+ *reg = RK3506_SMT_GPIO1_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 2:
+ *regmap = info->regmap_base;
+ if (pin_num < 17)
+ *reg = RK3506_SMT_GPIO2_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 3:
+ *regmap = info->regmap_base;
+ if (pin_num < 15)
+ *reg = RK3506_SMT_GPIO3_OFFSET;
+ else
+ ret = -EINVAL;
+ break;
+
+ case 4:
+ *regmap = info->regmap_base;
+ if (pin_num < 8 || pin_num > 11) {
+ ret = -EINVAL;
+ } else {
+ *reg = RK3506_SMT_GPIO4_OFFSET;
+ *bit = 8;
+
+ return 0;
+ }
+ break;
+
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ if (ret) {
+ dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
+
+ return ret;
+ }
+
+ *reg += ((pin_num / RK3506_SMT_PINS_PER_REG) * 4);
+ *bit = pin_num % RK3506_SMT_PINS_PER_REG;
+ *bit *= RK3506_SMT_BITS_PER_PIN;
+
+ return 0;
+}
+
#define RK3528_DRV_BITS_PER_PIN 8
#define RK3528_DRV_PINS_PER_REG 2
#define RK3528_DRV_GPIO0_OFFSET 0x100
@@ -2749,7 +3071,8 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
rmask_bits = RK3588_DRV_BITS_PER_PIN;
ret = strength;
goto config;
- } else if (ctrl->type == RK3528 ||
+ } else if (ctrl->type == RK3506 ||
+ ctrl->type == RK3528 ||
ctrl->type == RK3562 ||
ctrl->type == RK3568) {
rmask_bits = RK3568_DRV_BITS_PER_PIN;
@@ -2828,12 +3151,37 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
case DRV_TYPE_IO_1V8_ONLY:
rmask_bits = RK3288_DRV_BITS_PER_PIN;
break;
+ case DRV_TYPE_IO_LEVEL_2_BIT:
+ ret = regmap_read(regmap, reg, &data);
+ if (ret)
+ return ret;
+ data >>= bit;
+
+ return data & 0x3;
+ case DRV_TYPE_IO_LEVEL_8_BIT:
+ ret = regmap_read(regmap, reg, &data);
+ if (ret)
+ return ret;
+ data >>= bit;
+ data &= (1 << 8) - 1;
+
+ ret = hweight8(data);
+ if (ret > 0)
+ return ret - 1;
+ else
+ return -EINVAL;
default:
dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
return -EINVAL;
}
config:
+ if (ctrl->type == RK3506) {
+ if ((bank->bank_num == 0 && pin_num == 24) || bank->bank_num == 4) {
+ rmask_bits = 2;
+ ret = strength;
+ }
+ }
/* enable the write to the equivalent lower bits */
data = ((1 << rmask_bits) - 1) << (bit + 16);
rmask = data | (data >> 16);
@@ -2957,6 +3305,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
case RK3328:
case RK3368:
case RK3399:
+ case RK3506:
case RK3528:
case RK3562:
case RK3568:
@@ -3077,6 +3426,10 @@ static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num)
break;
}
+ if (ctrl->type == RK3506)
+ if ((bank->bank_num == 0 && pin_num == 24) || bank->bank_num == 4)
+ return data & 0x3;
+
return data & 0x1;
}
@@ -3112,6 +3465,14 @@ static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
break;
}
+ if (ctrl->type == RK3506) {
+ if ((bank->bank_num == 0 && pin_num == 24) || bank->bank_num == 4) {
+ data = 0x3 << (bit + 16);
+ rmask = data | (data >> 16);
+ data |= ((enable ? 0x3 : 0) << bit);
+ }
+ }
+
return regmap_update_bits(regmap, reg, rmask, data);
}
@@ -3227,6 +3588,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
case RK3328:
case RK3368:
case RK3399:
+ case RK3506:
case RK3528:
case RK3562:
case RK3568:
@@ -3880,13 +4242,10 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
}
/* try to find the optional reference to the pmu syscon */
- node = of_parse_phandle(np, "rockchip,pmu", 0);
- if (node) {
- info->regmap_pmu = syscon_node_to_regmap(node);
- of_node_put(node);
- if (IS_ERR(info->regmap_pmu))
- return PTR_ERR(info->regmap_pmu);
- }
+ info->regmap_pmu = syscon_regmap_lookup_by_phandle_optional(np, "rockchip,pmu");
+
+ /* try to find the optional reference to the ioc1 syscon */
+ info->regmap_ioc1 = syscon_regmap_lookup_by_phandle_optional(np, "rockchip,ioc1");
ret = rockchip_pinctrl_register(pdev, info);
if (ret)
@@ -4350,6 +4709,71 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
.drv_calc_reg = rk3399_calc_drv_reg_and_bit,
};
+static struct rockchip_pin_bank rk3506_pin_banks[] = {
+ PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS_PULL_FLAGS(0, 32, "gpio0",
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
+ IOMUX_WIDTH_2BIT | IOMUX_SOURCE_PMU,
+ 0x0, 0x8, 0x10, 0x830,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_2_BIT,
+ 0, 0, 0, 1),
+ PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(1, 32, "gpio1",
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ 0x20, 0x28, 0x30, 0x38,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT),
+ PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(2, 32, "gpio2",
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ 0x40, 0x48, 0x50, 0x58,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT),
+ PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(3, 32, "gpio3",
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ 0x60, 0x68, 0x70, 0x78,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT),
+ PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS_PULL_FLAGS(4, 32, "gpio4",
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ IOMUX_WIDTH_4BIT,
+ 0x80, 0x88, 0x90, 0x98,
+ DRV_TYPE_IO_LEVEL_2_BIT,
+ DRV_TYPE_IO_LEVEL_2_BIT,
+ DRV_TYPE_IO_LEVEL_2_BIT,
+ DRV_TYPE_IO_LEVEL_2_BIT,
+ 1, 1, 1, 1),
+};
+
+static struct rockchip_pin_ctrl rk3506_pin_ctrl __maybe_unused = {
+ .pin_banks = rk3506_pin_banks,
+ .nr_banks = ARRAY_SIZE(rk3506_pin_banks),
+ .label = "RK3506-GPIO",
+ .type = RK3506,
+ .pull_calc_reg = rk3506_calc_pull_reg_and_bit,
+ .drv_calc_reg = rk3506_calc_drv_reg_and_bit,
+ .schmitt_calc_reg = rk3506_calc_schmitt_reg_and_bit,
+};
+
static struct rockchip_pin_bank rk3528_pin_banks[] = {
PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
IOMUX_WIDTH_4BIT,
@@ -4560,6 +4984,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
.data = &rk3368_pin_ctrl },
{ .compatible = "rockchip,rk3399-pinctrl",
.data = &rk3399_pin_ctrl },
+ { .compatible = "rockchip,rk3506-pinctrl",
+ .data = &rk3506_pin_ctrl },
{ .compatible = "rockchip,rk3528-pinctrl",
.data = &rk3528_pin_ctrl },
{ .compatible = "rockchip,rk3562-pinctrl",
diff --git a/drivers/pinctrl/pinctrl-rockchip.h b/drivers/pinctrl/pinctrl-rockchip.h
index 35cd38079d1e..4f4aff42a80a 100644
--- a/drivers/pinctrl/pinctrl-rockchip.h
+++ b/drivers/pinctrl/pinctrl-rockchip.h
@@ -196,6 +196,7 @@ enum rockchip_pinctrl_type {
RK3328,
RK3368,
RK3399,
+ RK3506,
RK3528,
RK3562,
RK3568,
@@ -260,6 +261,8 @@ enum rockchip_pin_drv_type {
DRV_TYPE_IO_1V8_ONLY,
DRV_TYPE_IO_1V8_3V0_AUTO,
DRV_TYPE_IO_3V3_ONLY,
+ DRV_TYPE_IO_LEVEL_2_BIT,
+ DRV_TYPE_IO_LEVEL_8_BIT,
DRV_TYPE_MAX
};
@@ -458,6 +461,7 @@ struct rockchip_pinctrl {
int reg_size;
struct regmap *regmap_pull;
struct regmap *regmap_pmu;
+ struct regmap *regmap_ioc1;
struct device *dev;
struct rockchip_pin_ctrl *ctrl;
struct pinctrl_desc pctl;
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 3/8] dt-bindings: pinctrl: Add rv1126b pinctrl support
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
2025-12-06 5:08 ` [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support Ye Zhang
2025-12-06 5:08 ` [PATCH v2 2/8] pinctrl: rockchip: " Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-08 6:25 ` Krzysztof Kozlowski
2025-12-06 5:08 ` [PATCH v2 4/8] pinctrl: rockchip: " Ye Zhang
` (4 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Add the compatible string for the rv1126b SoC.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
---
Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
index 76e607281716..93bf8f352e48 100644
--- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
@@ -52,6 +52,7 @@ properties:
- rockchip,rk3588-pinctrl
- rockchip,rv1108-pinctrl
- rockchip,rv1126-pinctrl
+ - rockchip,rv1126b-pinctrl
rockchip,grf:
$ref: /schemas/types.yaml#/definitions/phandle
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 4/8] pinctrl: rockchip: Add rv1126b pinctrl support
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
` (2 preceding siblings ...)
2025-12-06 5:08 ` [PATCH v2 3/8] dt-bindings: pinctrl: Add rv1126b " Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-06 5:08 ` [PATCH v2 5/8] gpio: rockchip: support new version GPIO Ye Zhang
` (3 subsequent siblings)
7 siblings, 0 replies; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Add support for the 8 rv1126b GPIO banks.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
---
drivers/pinctrl/pinctrl-rockchip.c | 181 ++++++++++++++++++++++++++++-
drivers/pinctrl/pinctrl-rockchip.h | 1 +
2 files changed, 181 insertions(+), 1 deletion(-)
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index e44ef262beec..dc7ef12dfcb0 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -307,6 +307,20 @@
#define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P) \
PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
+#define PIN_BANK_IOMUX_4_OFFSET_DRV_8(id, pins, label, offset0, \
+ offset1, offset2, offset3) \
+ PIN_BANK_IOMUX_FLAGS_OFFSET_DRV_FLAGS(id, pins, label, \
+ IOMUX_WIDTH_4BIT, \
+ IOMUX_WIDTH_4BIT, \
+ IOMUX_WIDTH_4BIT, \
+ IOMUX_WIDTH_4BIT, \
+ offset0, offset1, \
+ offset2, offset3, \
+ DRV_TYPE_IO_LEVEL_8_BIT, \
+ DRV_TYPE_IO_LEVEL_8_BIT, \
+ DRV_TYPE_IO_LEVEL_8_BIT, \
+ DRV_TYPE_IO_LEVEL_8_BIT)
+
static struct regmap_config rockchip_regmap_config = {
.reg_bits = 32,
.val_bits = 32,
@@ -1701,6 +1715,136 @@ static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
return 0;
}
+#define RV1126B_DRV_BITS_PER_PIN 8
+#define RV1126B_DRV_PINS_PER_REG 2
+#define RV1126B_DRV_GPIO0_A_OFFSET 0x100
+#define RV1126B_DRV_GPIO0_C_OFFSET 0x8120
+#define RV1126B_DRV_GPIO_OFFSET(GPION) (0x8100 + GPION * 0x8040)
+
+static int rv1126b_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
+ int pin_num, struct regmap **regmap,
+ int *reg, u8 *bit)
+{
+ struct rockchip_pinctrl *info = bank->drvdata;
+
+ *regmap = info->regmap_base;
+ switch (bank->bank_num) {
+ case 0:
+ if (pin_num < 16)
+ *reg = RV1126B_DRV_GPIO0_A_OFFSET;
+ else
+ *reg = RV1126B_DRV_GPIO0_C_OFFSET - 0x20;
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ *reg = RV1126B_DRV_GPIO_OFFSET(bank->bank_num);
+ break;
+
+ default:
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
+ break;
+ }
+
+ *reg += ((pin_num / RV1126B_DRV_PINS_PER_REG) * 4);
+ *bit = pin_num % RV1126B_DRV_PINS_PER_REG;
+ *bit *= RV1126B_DRV_BITS_PER_PIN;
+
+ return 0;
+}
+
+#define RV1126B_PULL_BITS_PER_PIN 2
+#define RV1126B_PULL_PINS_PER_REG 8
+#define RV1126B_PULL_GPIO0_A_OFFSET 0x300
+#define RV1126B_PULL_GPIO0_C_OFFSET 0x8308
+#define RV1126B_PULL_GPIO_OFFSET(GPION) (0x8300 + GPION * 0x8010)
+
+static int rv1126b_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
+ int pin_num, struct regmap **regmap,
+ int *reg, u8 *bit)
+{
+ struct rockchip_pinctrl *info = bank->drvdata;
+
+ *regmap = info->regmap_base;
+ switch (bank->bank_num) {
+ case 0:
+ if (pin_num < 16)
+ *reg = RV1126B_PULL_GPIO0_A_OFFSET;
+ else
+ *reg = RV1126B_PULL_GPIO0_C_OFFSET - 0x8;
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ *reg = RV1126B_PULL_GPIO_OFFSET(bank->bank_num);
+ break;
+
+ default:
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
+ break;
+ }
+
+ *reg += ((pin_num / RV1126B_PULL_PINS_PER_REG) * 4);
+ *bit = pin_num % RV1126B_PULL_PINS_PER_REG;
+ *bit *= RV1126B_PULL_BITS_PER_PIN;
+
+ return 0;
+}
+
+#define RV1126B_SMT_BITS_PER_PIN 1
+#define RV1126B_SMT_PINS_PER_REG 8
+#define RV1126B_SMT_GPIO0_A_OFFSET 0x500
+#define RV1126B_SMT_GPIO0_C_OFFSET 0x8508
+#define RV1126B_SMT_GPIO_OFFSET(GPION) (0x8500 + GPION * 0x8010)
+
+static int rv1126b_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
+ int pin_num,
+ struct regmap **regmap,
+ int *reg, u8 *bit)
+{
+ struct rockchip_pinctrl *info = bank->drvdata;
+
+ *regmap = info->regmap_base;
+ switch (bank->bank_num) {
+ case 0:
+ if (pin_num < 16)
+ *reg = RV1126B_SMT_GPIO0_A_OFFSET;
+ else
+ *reg = RV1126B_SMT_GPIO0_C_OFFSET - 0x8;
+ break;
+
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ *reg = RV1126B_SMT_GPIO_OFFSET(bank->bank_num);
+ break;
+
+ default:
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
+ break;
+ }
+
+ *reg += ((pin_num / RV1126B_SMT_PINS_PER_REG) * 4);
+ *bit = pin_num % RV1126B_SMT_PINS_PER_REG;
+ *bit *= RV1126B_SMT_BITS_PER_PIN;
+
+ return 0;
+}
+
#define RK3308_SCHMITT_PINS_PER_REG 8
#define RK3308_SCHMITT_BANK_STRIDE 16
#define RK3308_SCHMITT_GRF_OFFSET 0x1a0
@@ -3071,7 +3215,8 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
rmask_bits = RK3588_DRV_BITS_PER_PIN;
ret = strength;
goto config;
- } else if (ctrl->type == RK3506 ||
+ } else if (ctrl->type == RV1126B ||
+ ctrl->type == RK3506 ||
ctrl->type == RK3528 ||
ctrl->type == RK3562 ||
ctrl->type == RK3568) {
@@ -3237,6 +3382,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
: PIN_CONFIG_BIAS_DISABLE;
case PX30:
case RV1108:
+ case RV1126B:
case RK3188:
case RK3288:
case RK3308:
@@ -3299,6 +3445,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
case PX30:
case RV1108:
case RV1126:
+ case RV1126B:
case RK3188:
case RK3288:
case RK3308:
@@ -3582,6 +3729,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
case PX30:
case RV1108:
case RV1126:
+ case RV1126B:
case RK3188:
case RK3288:
case RK3308:
@@ -4386,6 +4534,35 @@ static struct rockchip_pin_ctrl rv1126_pin_ctrl = {
.schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit,
};
+static struct rockchip_pin_bank rv1126b_pin_banks[] = {
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(0, 32, "gpio0",
+ 0x0, 0x8, 0x8010, 0x8018),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(1, 32, "gpio1",
+ 0x10020, 0x10028, 0x10030, 0x10038),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(2, 32, "gpio2",
+ 0x18040, 0x18048, 0x18050, 0x18058),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(3, 32, "gpio3",
+ 0x20060, 0x20068, 0x20070, 0x20078),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(4, 32, "gpio4",
+ 0x28080, 0x28088, 0x28090, 0x28098),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(5, 32, "gpio5",
+ 0x300a0, 0x300a8, 0x300b0, 0x300b8),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(6, 32, "gpio6",
+ 0x380c0, 0x380c8, 0x380d0, 0x380d8),
+ PIN_BANK_IOMUX_4_OFFSET_DRV_8(7, 32, "gpio7",
+ 0x400e0, 0x400e8, 0x400f0, 0x400f8),
+};
+
+static struct rockchip_pin_ctrl rv1126b_pin_ctrl __maybe_unused = {
+ .pin_banks = rv1126b_pin_banks,
+ .nr_banks = ARRAY_SIZE(rv1126b_pin_banks),
+ .label = "RV1126B-GPIO",
+ .type = RV1126B,
+ .pull_calc_reg = rv1126b_calc_pull_reg_and_bit,
+ .drv_calc_reg = rv1126b_calc_drv_reg_and_bit,
+ .schmitt_calc_reg = rv1126b_calc_schmitt_reg_and_bit,
+};
+
static struct rockchip_pin_bank rk2928_pin_banks[] = {
PIN_BANK(0, 32, "gpio0"),
PIN_BANK(1, 32, "gpio1"),
@@ -4960,6 +5137,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
.data = &rv1108_pin_ctrl },
{ .compatible = "rockchip,rv1126-pinctrl",
.data = &rv1126_pin_ctrl },
+ { .compatible = "rockchip,rv1126b-pinctrl",
+ .data = &rv1126b_pin_ctrl },
{ .compatible = "rockchip,rk2928-pinctrl",
.data = &rk2928_pin_ctrl },
{ .compatible = "rockchip,rk3036-pinctrl",
diff --git a/drivers/pinctrl/pinctrl-rockchip.h b/drivers/pinctrl/pinctrl-rockchip.h
index 4f4aff42a80a..fe18b62ed994 100644
--- a/drivers/pinctrl/pinctrl-rockchip.h
+++ b/drivers/pinctrl/pinctrl-rockchip.h
@@ -187,6 +187,7 @@ enum rockchip_pinctrl_type {
PX30,
RV1108,
RV1126,
+ RV1126B,
RK2928,
RK3066B,
RK3128,
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 5/8] gpio: rockchip: support new version GPIO
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
` (3 preceding siblings ...)
2025-12-06 5:08 ` [PATCH v2 4/8] pinctrl: rockchip: " Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-06 11:04 ` Bartosz Golaszewski
2025-12-06 5:08 ` [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO Ye Zhang
` (2 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Support the next version GPIO controller on SoCs like rv1126b.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
---
drivers/gpio/gpio-rockchip.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c
index 47174eb3ba76..c3e831c6bcf1 100644
--- a/drivers/gpio/gpio-rockchip.c
+++ b/drivers/gpio/gpio-rockchip.c
@@ -36,6 +36,7 @@
#define GPIO_TYPE_V2 (0x01000C2B)
#define GPIO_TYPE_V2_1 (0x0101157C)
#define GPIO_TYPE_V2_2 (0x010219C8)
+#define GPIO_TYPE_V2_6 (0x01063F6E)
static const struct rockchip_gpio_regs gpio_regs_v1 = {
.port_dr = 0x00,
@@ -674,6 +675,7 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank)
case GPIO_TYPE_V2:
case GPIO_TYPE_V2_1:
case GPIO_TYPE_V2_2:
+ case GPIO_TYPE_V2_6:
bank->gpio_regs = &gpio_regs_v2;
bank->gpio_type = GPIO_TYPE_V2;
bank->db_clk = of_clk_get(bank->of_node, 1);
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
` (4 preceding siblings ...)
2025-12-06 5:08 ` [PATCH v2 5/8] gpio: rockchip: support new version GPIO Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-08 6:27 ` Krzysztof Kozlowski
2025-12-09 12:41 ` Heiko Stübner
2025-12-06 5:08 ` [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding Ye Zhang
2025-12-06 5:08 ` [PATCH v2 8/8] pinctrl: rockchip: add rmio support Ye Zhang
7 siblings, 2 replies; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Add header file with constants for RMIO pin and function IDs for the
Rockchip RK3506 SoC.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
---
.../pinctrl/rockchip,rk3506-rmio.h | 143 ++++++++++++++++++
1 file changed, 143 insertions(+)
create mode 100644 include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
diff --git a/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h b/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
new file mode 100644
index 000000000000..5d39690a0b28
--- /dev/null
+++ b/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
@@ -0,0 +1,143 @@
+/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
+/*
+ * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __DT_BINDINGS_PINCTRL_ROCKCHIP_RK3506_RMIO_H
+#define __DT_BINDINGS_PINCTRL_ROCKCHIP_RK3506_RMIO_H
+
+/* RMIO pins definetion */
+#define RMIO_PIN0 0
+#define RMIO_PIN1 1
+#define RMIO_PIN2 2
+#define RMIO_PIN3 3
+#define RMIO_PIN4 4
+#define RMIO_PIN5 5
+#define RMIO_PIN6 6
+#define RMIO_PIN7 7
+#define RMIO_PIN8 8
+#define RMIO_PIN9 9
+#define RMIO_PIN10 10
+#define RMIO_PIN11 11
+#define RMIO_PIN12 12
+#define RMIO_PIN13 13
+#define RMIO_PIN14 14
+#define RMIO_PIN15 15
+#define RMIO_PIN16 16
+#define RMIO_PIN17 17
+#define RMIO_PIN18 18
+#define RMIO_PIN19 19
+#define RMIO_PIN20 20
+#define RMIO_PIN21 21
+#define RMIO_PIN22 22
+#define RMIO_PIN23 23
+#define RMIO_PIN24 24
+#define RMIO_PIN25 25
+#define RMIO_PIN26 26
+#define RMIO_PIN27 27
+#define RMIO_PIN28 28
+#define RMIO_PIN29 29
+#define RMIO_PIN30 30
+#define RMIO_PIN31 31
+
+/* RMIO function definetion */
+#define RMIO_UART1_TX 1
+#define RMIO_UART1_RX 2
+#define RMIO_UART2_TX 3
+#define RMIO_UART2_RX 4
+#define RMIO_UART3_TX 5
+#define RMIO_UART3_RX 6
+#define RMIO_UART3_CTSN 7
+#define RMIO_UART3_RTSN 8
+#define RMIO_UART4_TX 9
+#define RMIO_UART4_RX 10
+#define RMIO_UART4_CTSN 11
+#define RMIO_UART4_RTSN 12
+#define RMIO_MIPITE 13
+#define RMIO_CLK_32K 14
+#define RMIO_I2C0_SCL 15
+#define RMIO_I2C0_SDA 16
+#define RMIO_I2C1_SCL 17
+#define RMIO_I2C1_SDA 18
+#define RMIO_I2C2_SCL 19
+#define RMIO_I2C2_SDA 20
+#define RMIO_PDM_CLK0 21
+#define RMIO_PDM_SDI0 22
+#define RMIO_PDM_SDI1 23
+#define RMIO_PDM_SDI2 24
+#define RMIO_PDM_SDI3 25
+#define RMIO_CAN1_TX 26
+#define RMIO_CAN1_RX 27
+#define RMIO_CAN0_TX 28
+#define RMIO_CAN0_RX 29
+#define RMIO_PWM0_CH0 30
+#define RMIO_PWM0_CH1 31
+#define RMIO_PWM0_CH2 32
+#define RMIO_PWM0_CH3 33
+#define RMIO_PWM1_CH0 34
+#define RMIO_PWM1_CH1 35
+#define RMIO_PWM1_CH2 36
+#define RMIO_PWM1_CH3 37
+#define RMIO_PWM1_CH4 38
+#define RMIO_PWM1_CH5 39
+#define RMIO_PWM1_CH6 40
+#define RMIO_PWM1_CH7 41
+#define RMIO_TOUCH_KEY_DRIVE 42
+#define RMIO_TOUCH_KEY_IN0 43
+#define RMIO_TOUCH_KEY_IN1 44
+#define RMIO_TOUCH_KEY_IN2 45
+#define RMIO_TOUCH_KEY_IN3 46
+#define RMIO_TOUCH_KEY_IN4 47
+#define RMIO_TOUCH_KEY_IN5 48
+#define RMIO_TOUCH_KEY_IN6 49
+#define RMIO_TOUCH_KEY_IN7 50
+#define RMIO_SAI0_MCLK 51
+#define RMIO_SAI0_SCLK 52
+#define RMIO_SAI0_LRCK 53
+#define RMIO_SAI0_SDI0 54
+#define RMIO_SAI0_SDI1 55
+#define RMIO_SAI0_SDI2 56
+#define RMIO_SAI0_SDI3 57
+#define RMIO_SAI0_SDO 58
+#define RMIO_SAI1_MCLK 59
+#define RMIO_SAI1_SCLK 60
+#define RMIO_SAI1_LRCK 61
+#define RMIO_SAI1_SDI 62
+#define RMIO_SAI1_SDO0 63
+#define RMIO_SAI1_SDO1 64
+#define RMIO_SAI1_SDO2 65
+#define RMIO_SAI1_SDO3 66
+#define RMIO_SPI0_CLK 67
+#define RMIO_SPI0_MOSI 68
+#define RMIO_SPI0_MISO 69
+#define RMIO_SPI0_CSN0 70
+#define RMIO_SPI0_CSN1 71
+#define RMIO_SPI1_CLK 72
+#define RMIO_SPI1_MOSI 73
+#define RMIO_SPI1_MISO 74
+#define RMIO_SPI1_CSN0 75
+#define RMIO_SPI1_CSN1 76
+#define RMIO_WDT_TSADC_SHUT 77
+#define RMIO_PMU_SLEEP 78
+#define RMIO_CORE_POWER_OFF 79
+#define RMIO_SPDIF_TX 80
+#define RMIO_SPDIF_RX 81
+#define RMIO_PWM1_BIP_CNTR_A0 82
+#define RMIO_PWM1_BIP_CNTR_A1 83
+#define RMIO_PWM1_BIP_CNTR_A2 84
+#define RMIO_PWM1_BIP_CNTR_A3 85
+#define RMIO_PWM1_BIP_CNTR_A4 86
+#define RMIO_PWM1_BIP_CNTR_A5 87
+#define RMIO_PWM1_BIP_CNTR_B0 88
+#define RMIO_PWM1_BIP_CNTR_B1 89
+#define RMIO_PWM1_BIP_CNTR_B2 90
+#define RMIO_PWM1_BIP_CNTR_B3 91
+#define RMIO_PWM1_BIP_CNTR_B4 92
+#define RMIO_PWM1_BIP_CNTR_B5 93
+#define RMIO_PDM_CLK1 94
+#define RMIO_ETH_RMII0_PPSCLK 95
+#define RMIO_ETH_RMII0_PPSTRIG 96
+#define RMIO_ETH_RMII1_PPSCLK 97
+#define RMIO_ETH_RMII1_PPSTRIG 98
+
+#endif /* __DT_BINDINGS_PINCTRL_ROCKCHIP_RK3506_RMIO_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
` (5 preceding siblings ...)
2025-12-06 5:08 ` [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
2025-12-08 6:29 ` Krzysztof Kozlowski
2025-12-06 5:08 ` [PATCH v2 8/8] pinctrl: rockchip: add rmio support Ye Zhang
7 siblings, 1 reply; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Add device tree binding for the RMIO (Rockchip Matrix I/O) controller
which is a sub-device of the main pinctrl on some Rockchip SoCs.
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
---
.../bindings/pinctrl/rockchip,pinctrl.yaml | 9 ++
.../bindings/pinctrl/rockchip,rmio.yaml | 130 ++++++++++++++++++
2 files changed, 139 insertions(+)
create mode 100644 Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
index 93bf8f352e48..01df0a51ff83 100644
--- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
@@ -83,6 +83,15 @@ required:
- rockchip,grf
patternProperties:
+ "rmio[0-9]*$":
+ type: object
+
+ $ref: "/schemas/pinctrl/rockchip,rmio.yaml#"
+
+ description:
+ The RMIO (Rockchip Matrix I/O) controller node which functions as a
+ sub-device of the main pinctrl to handle flexible function routing.
+
"gpio@[0-9a-f]+$":
type: object
diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
new file mode 100644
index 000000000000..28ec5ad62061
--- /dev/null
+++ b/Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
@@ -0,0 +1,130 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pinctrl/rockchip,rmio.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: RMIO (Rockchip Matrix I/O) Controller
+
+maintainers:
+ - Heiko Stuebner <heiko@sntech.de>
+
+description: |
+ The RMIO controller provides a flexible routing matrix that allows mapping
+ various internal peripheral functions (UART, SPI, PWM, etc.) to specific
+ physical pins. This block is typically a sub-block of the GRF
+ (General Register Files).
+
+properties:
+ compatible:
+ enum:
+ - rockchip,rmio
+
+ rockchip,grf:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description:
+ The phandle of the syscon node for the GRF registers.
+
+ rockchip,offset:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description:
+ The offset of the RMIO configuration registers within the GRF.
+
+ rockchip,pins-num:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description:
+ The number of physical pins supported by this RMIO instance.
+ Used for boundary checking and driver initialization.
+
+additionalProperties:
+ type: object
+ additionalProperties:
+ type: object
+ properties:
+ rockchip,rmio:
+ $ref: "/schemas/types.yaml#/definitions/uint32-matrix"
+ description: |
+ A list of pin-function pairs. The format is <pin_id function_id>.
+ - pin_id: The index of the RMIO pin (0 to pins-num - 1).
+ - function_id: The mux value selecting the peripheral function.
+ minItems: 1
+ items:
+ items:
+ - minimum: 0
+ maximum: 31
+ description:
+ RMIO Pin ID.
+ - minimum: 0
+ maximum: 98
+ description:
+ Function ID.
+
+ required:
+ - rockchip,rmio
+
+ additionalProperties: false
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - rockchip,grf
+ - rockchip,offset
+ - rockchip,pins-num
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/pinctrl/rockchip.h>
+ #include <dt-bindings/pinctrl/rockchip,rk3506-rmio.h>
+
+ pinctrl {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ rmio {
+ compatible = "rockchip,rmio";
+ rockchip,grf = <&grf_pmu>;
+ rockchip,offset = <0x80>;
+ rockchip,pins-num = <32>;
+
+ rmio-uart {
+ rmio_pin27_uart1_tx: rmio-pin27-uart1-tx {
+ rockchip,rmio = <RMIO_PIN27 RMIO_UART1_TX>;
+ };
+
+ rmio_pin28_uart1_rx: rmio-pin28-uart1-rx {
+ rockchip,rmio = <RMIO_PIN28 RMIO_UART1_RX>;
+ };
+ };
+ };
+
+ pcfg_pull_default: pcfg-pull-default {
+ bias-pull-pin-default;
+ };
+
+ rm {
+ rmio_pin27_pins: rmio-pin27-pins {
+ rockchip,pins = <1 RK_PC2 7 &pcfg-pull-default>;
+ };
+
+ rmio_pin28_pins: rmio-pin28-pins {
+ rockchip,pins = <1 RK_PC3 7 &pcfg-pull-default>;
+ };
+ };
+ };
+
+ uart1: serial@20064000 {
+ compatible = "snps,dw-apb-uart";
+ reg = <0x20064000 0x400>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&mux_uart2>;
+ pinctrl-0 = <&rmio_pin27_pins &rmio_pin27_uart1_tx
+ &rmio_pin28_pins &rmio_pin28_uart1_rx>;
+ pinctrl-names = "default";
+ reg-io-width = <1>;
+ reg-shift = <2>;
+ };
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 8/8] pinctrl: rockchip: add rmio support
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
` (6 preceding siblings ...)
2025-12-06 5:08 ` [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding Ye Zhang
@ 2025-12-06 5:08 ` Ye Zhang
7 siblings, 0 replies; 17+ messages in thread
From: Ye Zhang @ 2025-12-06 5:08 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Heiko Stuebner
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Support rockchip matrix io
Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
---
drivers/pinctrl/pinctrl-rockchip.c | 397 ++++++++++++++++++++++++++++-
drivers/pinctrl/pinctrl-rockchip.h | 42 +++
2 files changed, 438 insertions(+), 1 deletion(-)
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index dc7ef12dfcb0..66bd4a981f62 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -3961,6 +3961,11 @@ static const struct of_device_id rockchip_bank_match[] = {
{},
};
+static const struct of_device_id rockchip_rmio_dt_match[] = {
+ { .compatible = "rockchip,rmio" },
+ {},
+};
+
static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
struct device_node *np)
{
@@ -3969,6 +3974,8 @@ static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
for_each_child_of_node(np, child) {
if (of_match_node(rockchip_bank_match, child))
continue;
+ if (of_match_node(rockchip_rmio_dt_match, child))
+ continue;
info->nfunctions++;
info->ngroups += of_get_child_count(child);
@@ -4101,6 +4108,8 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
for_each_child_of_node_scoped(np, child) {
if (of_match_node(rockchip_bank_match, child))
continue;
+ if (of_match_node(rockchip_rmio_dt_match, child))
+ continue;
ret = rockchip_pinctrl_parse_functions(child, info, i++);
if (ret) {
@@ -4431,6 +4440,384 @@ static void rockchip_pinctrl_remove(struct platform_device *pdev)
}
}
+static int rockchip_rmio_set_mux(struct rockchip_rmio *info, int id, int func)
+{
+ struct device *dev = info->dev;
+
+ if (id >= info->nr_pins)
+ return -EINVAL;
+
+ dev_dbg(dev, "setting function of %s%d to %d\n", dev_name(dev), id, func);
+
+ return regmap_write(info->regmap, info->offset + id * 4,
+ RK_RMIO_WRITE_ENABLE_MASK | func);
+}
+
+static int rockchip_rmio_parse_groups(struct device_node *np,
+ struct rockchip_rmio_group *grp,
+ struct rockchip_rmio *info,
+ u32 index)
+{
+ struct device *dev = info->dev;
+ int count;
+ u32 *tmp;
+ int i;
+
+ dev_dbg(dev, "group(%d): %pOFn\n", index, np);
+
+ /*
+ * the binding format is rockchip,rmio = <pin func>,
+ * do sanity check and calculate pins number
+ */
+ count = of_property_count_u32_elems(np, "rockchip,rmio");
+ if (count <= 0 || count % 2 != 0)
+ return -EINVAL;
+
+ tmp = kcalloc(count, sizeof(u32), GFP_KERNEL);
+ if (!tmp)
+ return -ENOMEM;
+
+ of_property_read_u32_array(np, "rockchip,rmio", tmp, count);
+
+ /* Initialise group */
+ grp->name = np->name;
+ grp->npins = count / 2;
+ grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
+ grp->func = devm_kcalloc(dev, grp->npins, sizeof(*grp->func), GFP_KERNEL);
+ if (!grp->pins || !grp->func)
+ return -ENOMEM;
+
+ for (i = 0; i < grp->npins; i++) {
+ grp->pins[i] = tmp[2 * i];
+ grp->func[i] = tmp[2 * i + 1];
+ }
+ kfree(tmp);
+
+ return 0;
+}
+
+static int rockchip_rmio_parse_functions(struct device_node *np,
+ struct rockchip_rmio *info,
+ u32 index)
+{
+ struct device *dev = info->dev;
+ struct device_node *child;
+ struct rockchip_rmio_func *func;
+ struct rockchip_rmio_group *grp;
+ int ret;
+ u32 i, grp_index = 0;
+
+ dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
+
+ for (i = 0, func = info->functions; i < index; i++, func++)
+ grp_index += func->ngroups;
+
+ func = &info->functions[index];
+
+ /* Initialise function */
+ func->name = np->name;
+ func->ngroups = of_get_child_count(np);
+ if (func->ngroups <= 0)
+ return 0;
+
+ func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
+ if (!func->groups)
+ return -ENOMEM;
+
+ i = 0;
+ for_each_child_of_node(np, child) {
+ func->groups[i] = child->name;
+ grp = &info->groups[grp_index + i];
+ ret = rockchip_rmio_parse_groups(child, grp, info, i++);
+ if (ret) {
+ of_node_put(child);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static int rockchip_rmio_parse_dt(struct platform_device *pdev,
+ struct rockchip_rmio *info)
+{
+ struct device *dev = &pdev->dev;
+ struct device_node *np = dev->of_node;
+ struct device_node *child;
+ int ret;
+ int i = 0;
+
+ for_each_child_of_node(np, child) {
+ info->nfunctions++;
+ info->ngroups += of_get_child_count(child);
+ }
+
+ dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
+ dev_dbg(dev, "ngroups = %d\n", info->ngroups);
+
+ info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
+ if (!info->functions)
+ return -ENOMEM;
+
+ info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
+ if (!info->groups)
+ return -ENOMEM;
+
+ for_each_child_of_node(np, child) {
+ ret = rockchip_rmio_parse_functions(child, info, i++);
+ if (ret) {
+ dev_err(dev, "failed to parse function, ret = %d\n", ret);
+ of_node_put(child);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static int rockchip_rmio_get_groups_count(struct pinctrl_dev *pctldev)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+
+ return info->ngroups;
+}
+
+static const char *rockchip_rmio_get_group_name(struct pinctrl_dev *pctldev,
+ unsigned int selector)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+
+ return info->groups[selector].name;
+}
+
+static int rockchip_rmio_get_group_pins(struct pinctrl_dev *pctldev,
+ unsigned int selector,
+ const unsigned int **pins,
+ unsigned int *npins)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+
+ if (selector >= info->ngroups)
+ return -EINVAL;
+
+ *pins = info->groups[selector].pins;
+ *npins = info->groups[selector].npins;
+
+ return 0;
+}
+
+static int rockchip_rmio_dt_node_to_map(struct pinctrl_dev *pctldev,
+ struct device_node *np,
+ struct pinctrl_map **map,
+ unsigned int *num_maps)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+ struct device *dev = info->dev;
+ struct pinctrl_map *new_map;
+ struct device_node *parent;
+
+ new_map = kcalloc(1, sizeof(*new_map), GFP_KERNEL);
+ if (!new_map)
+ return -ENOMEM;
+
+ *map = new_map;
+ *num_maps = 1;
+
+ /* the rmio only need to create mux map */
+ parent = of_get_parent(np);
+ if (!parent) {
+ kfree(new_map);
+ return -EINVAL;
+ }
+ new_map->type = PIN_MAP_TYPE_MUX_GROUP;
+ new_map->data.mux.function = parent->name;
+ new_map->data.mux.group = np->name;
+ of_node_put(parent);
+
+ dev_dbg(dev, "maps: function %s group %s\n",
+ (*map)->data.mux.function, (*map)->data.mux.group);
+
+ return 0;
+}
+
+static void rockchip_rmio_dt_free_map(struct pinctrl_dev *pctldev,
+ struct pinctrl_map *map,
+ unsigned int num_maps)
+{
+ kfree(map);
+}
+
+static const struct pinctrl_ops rockchip_rmio_pctrl_ops = {
+ .get_groups_count = rockchip_rmio_get_groups_count,
+ .get_group_name = rockchip_rmio_get_group_name,
+ .get_group_pins = rockchip_rmio_get_group_pins,
+ .dt_node_to_map = rockchip_rmio_dt_node_to_map,
+ .dt_free_map = rockchip_rmio_dt_free_map,
+};
+
+static int rockchip_rmio_get_funcs_count(struct pinctrl_dev *pctldev)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+
+ return info->nfunctions;
+}
+
+static const char *rockchip_rmio_get_func_name(struct pinctrl_dev *pctldev,
+ unsigned int selector)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+
+ return info->functions[selector].name;
+}
+
+static int rockchip_rmio_get_groups(struct pinctrl_dev *pctldev,
+ unsigned int selector,
+ const char * const **groups,
+ unsigned int * const num_groups)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+
+ *groups = info->functions[selector].groups;
+ *num_groups = info->functions[selector].ngroups;
+
+ return 0;
+}
+
+static int rockchip_rmio_pmx_set(struct pinctrl_dev *pctldev,
+ unsigned int selector,
+ unsigned int group)
+{
+ struct rockchip_rmio *info = pinctrl_dev_get_drvdata(pctldev);
+ const unsigned int *pins = info->groups[group].pins;
+ const unsigned int *func = info->groups[group].func;
+ struct device *dev = info->dev;
+ int cnt, ret = 0;
+
+ dev_dbg(dev, "enable function %s group %s\n",
+ info->functions[selector].name, info->groups[group].name);
+
+ /*
+ * for each pin in the pin group selected, program the corresponding
+ * pin function number in the config register.
+ */
+ for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
+ ret = rockchip_rmio_set_mux(info, pins[cnt], func[cnt]);
+ if (ret)
+ break;
+ }
+
+ if (ret && cnt) {
+ /* revert the already done pin settings */
+ for (cnt--; cnt >= 0; cnt--)
+ rockchip_rmio_set_mux(info, pins[cnt], RK_RMIO_NC);
+
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct pinmux_ops rockchip_rmio_pmx_ops = {
+ .get_functions_count = rockchip_rmio_get_funcs_count,
+ .get_function_name = rockchip_rmio_get_func_name,
+ .get_function_groups = rockchip_rmio_get_groups,
+ .set_mux = rockchip_rmio_pmx_set,
+};
+
+static int rockchip_rmio_register(struct platform_device *pdev,
+ struct rockchip_rmio *info)
+{
+ struct pinctrl_desc *ctrldesc = &info->pctl;
+ struct pinctrl_pin_desc *pindesc, *pdesc;
+ struct device *dev = &pdev->dev;
+ char **pin_names;
+ int ret;
+ int i;
+ int nr_pins = info->nr_pins;
+
+ ctrldesc->name = dev_name(dev);
+ ctrldesc->owner = THIS_MODULE;
+ ctrldesc->pctlops = &rockchip_rmio_pctrl_ops;
+ ctrldesc->pmxops = &rockchip_rmio_pmx_ops;
+
+ pindesc = devm_kcalloc(dev, nr_pins, sizeof(*pindesc), GFP_KERNEL);
+ if (!pindesc)
+ return -ENOMEM;
+
+ ctrldesc->pins = pindesc;
+ ctrldesc->npins = nr_pins;
+
+ pdesc = pindesc;
+ pin_names = devm_kasprintf_strarray(dev, dev_name(dev), nr_pins);
+ if (IS_ERR(pin_names))
+ return PTR_ERR(pin_names);
+ for (i = 0; i < nr_pins; i++) {
+ pdesc->number = i;
+ pdesc->name = pin_names[i];
+ pdesc++;
+ }
+
+ ret = rockchip_rmio_parse_dt(pdev, info);
+ if (ret)
+ return ret;
+
+ info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
+ if (IS_ERR(info->pctl_dev))
+ return dev_err_probe(dev, PTR_ERR(info->pctl_dev),
+ "could not register pinctrl driver\n");
+
+ return 0;
+}
+
+static int rockchip_rmio_probe(struct platform_device *pdev)
+{
+ struct rockchip_rmio *info;
+ struct device *dev = &pdev->dev;
+ struct device_node *np = pdev->dev.of_node;
+ int ret;
+
+ info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
+ if (!info)
+ return -ENOMEM;
+
+ info->dev = dev;
+
+ info->regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
+ if (IS_ERR(info->regmap)) {
+ dev_err(&pdev->dev, "missing rockchip,grf property\n");
+ return PTR_ERR(info->regmap);
+ }
+
+ ret = of_property_read_u32(np, "rockchip,offset", &info->offset);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "missing rockchip,offset property\n");
+ return ret;
+ }
+
+ ret = of_property_read_u32(np, "rockchip,pins-num", &info->nr_pins);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "missing rockchip,pins-num property\n");
+ return ret;
+ }
+
+ ret = rockchip_rmio_register(pdev, info);
+ if (ret)
+ return ret;
+
+ platform_set_drvdata(pdev, info);
+ dev_info(dev, "probed %pfw\n", dev_fwnode(dev));
+
+ return 0;
+}
+
+static struct platform_driver rockchip_rmio_driver = {
+ .probe = rockchip_rmio_probe,
+ .driver = {
+ .name = "rockchip-rmio",
+ .of_match_table = rockchip_rmio_dt_match,
+ },
+};
+
static struct rockchip_pin_bank px30_pin_banks[] = {
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
IOMUX_SOURCE_PMU,
@@ -5190,12 +5577,19 @@ static struct platform_driver rockchip_pinctrl_driver = {
static int __init rockchip_pinctrl_drv_register(void)
{
- return platform_driver_register(&rockchip_pinctrl_driver);
+ int ret;
+
+ ret = platform_driver_register(&rockchip_pinctrl_driver);
+ if (ret)
+ return ret;
+
+ return platform_driver_register(&rockchip_rmio_driver);
}
postcore_initcall(rockchip_pinctrl_drv_register);
static void __exit rockchip_pinctrl_drv_unregister(void)
{
+ platform_driver_unregister(&rockchip_rmio_driver);
platform_driver_unregister(&rockchip_pinctrl_driver);
}
module_exit(rockchip_pinctrl_drv_unregister);
@@ -5204,3 +5598,4 @@ MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:pinctrl-rockchip");
MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);
+MODULE_DEVICE_TABLE(of, rockchip_rmio_dt_match);
diff --git a/drivers/pinctrl/pinctrl-rockchip.h b/drivers/pinctrl/pinctrl-rockchip.h
index fe18b62ed994..db875f7a3d2f 100644
--- a/drivers/pinctrl/pinctrl-rockchip.h
+++ b/drivers/pinctrl/pinctrl-rockchip.h
@@ -183,6 +183,9 @@
#define RK_GPIO4_D6 158
#define RK_GPIO4_D7 159
+#define RK_RMIO_NC 0
+#define RK_RMIO_WRITE_ENABLE_MASK 0xFFFF0000
+
enum rockchip_pinctrl_type {
PX30,
RV1108,
@@ -473,4 +476,43 @@ struct rockchip_pinctrl {
unsigned int nfunctions;
};
+/**
+ * struct rockchip_rmio_group: represent a group of pins in RMIO controller.
+ * @name: name of the pin group, used to lookup the group.
+ * @pins: array of pins included in this group.
+ * @npins: number of pins included in this group.
+ * @func: local pins function select
+ */
+struct rockchip_rmio_group {
+ const char *name;
+ unsigned int npins;
+ unsigned int *pins;
+ unsigned int *func;
+};
+
+/**
+ * struct rockchip_rmio_func: represent a RMIO pin function.
+ * @name: name of the RMIO function, used to lookup the function.
+ * @groups: array of group names that can provide this RMIO function.
+ * @ngroups: number of groups included in @groups.
+ */
+struct rockchip_rmio_func {
+ const char *name;
+ const char **groups;
+ u8 ngroups;
+};
+
+struct rockchip_rmio {
+ struct regmap *regmap;
+ u32 offset;
+ struct device *dev;
+ struct pinctrl_desc pctl;
+ struct pinctrl_dev *pctl_dev;
+ unsigned int nr_pins;
+ struct rockchip_rmio_group *groups;
+ unsigned int ngroups;
+ struct rockchip_rmio_func *functions;
+ unsigned int nfunctions;
+};
+
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 5/8] gpio: rockchip: support new version GPIO
2025-12-06 5:08 ` [PATCH v2 5/8] gpio: rockchip: support new version GPIO Ye Zhang
@ 2025-12-06 11:04 ` Bartosz Golaszewski
0 siblings, 0 replies; 17+ messages in thread
From: Bartosz Golaszewski @ 2025-12-06 11:04 UTC (permalink / raw)
To: Ye Zhang
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang, Linus Walleij,
Heiko Stuebner
On Sat, 6 Dec 2025 06:08:41 +0100, Ye Zhang <ye.zhang@rock-chips.com> said:
> Support the next version GPIO controller on SoCs like rv1126b.
>
> Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
> ---
> drivers/gpio/gpio-rockchip.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/gpio/gpio-rockchip.c b/drivers/gpio/gpio-rockchip.c
> index 47174eb3ba76..c3e831c6bcf1 100644
> --- a/drivers/gpio/gpio-rockchip.c
> +++ b/drivers/gpio/gpio-rockchip.c
> @@ -36,6 +36,7 @@
> #define GPIO_TYPE_V2 (0x01000C2B)
> #define GPIO_TYPE_V2_1 (0x0101157C)
> #define GPIO_TYPE_V2_2 (0x010219C8)
> +#define GPIO_TYPE_V2_6 (0x01063F6E)
>
> static const struct rockchip_gpio_regs gpio_regs_v1 = {
> .port_dr = 0x00,
> @@ -674,6 +675,7 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank)
> case GPIO_TYPE_V2:
> case GPIO_TYPE_V2_1:
> case GPIO_TYPE_V2_2:
> + case GPIO_TYPE_V2_6:
> bank->gpio_regs = &gpio_regs_v2;
> bank->gpio_type = GPIO_TYPE_V2;
> bank->db_clk = of_clk_get(bank->of_node, 1);
> --
> 2.34.1
>
>
Acked-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/8] dt-bindings: pinctrl: Add rv1126b pinctrl support
2025-12-06 5:08 ` [PATCH v2 3/8] dt-bindings: pinctrl: Add rv1126b " Ye Zhang
@ 2025-12-08 6:25 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-08 6:25 UTC (permalink / raw)
To: Ye Zhang
Cc: Linus Walleij, Heiko Stuebner, Bartosz Golaszewski, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-gpio, devicetree,
linux-arm-kernel, linux-rockchip, linux-kernel, tao.huang
On Sat, Dec 06, 2025 at 01:08:39PM +0800, Ye Zhang wrote:
> Add the compatible string for the rv1126b SoC.
Why? What is the difference against existing one? Please write useful
commit msgs, not something obvious being copy of the diff and subject.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support
2025-12-06 5:08 ` [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support Ye Zhang
@ 2025-12-08 6:26 ` Krzysztof Kozlowski
2025-12-09 12:35 ` Heiko Stübner
1 sibling, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-08 6:26 UTC (permalink / raw)
To: Ye Zhang
Cc: Linus Walleij, Heiko Stuebner, Bartosz Golaszewski, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-gpio, devicetree,
linux-arm-kernel, linux-rockchip, linux-kernel, tao.huang,
Krzysztof Kozlowski
On Sat, Dec 06, 2025 at 01:08:37PM +0800, Ye Zhang wrote:
> Add the compatible string for the rk3506 SoC.
>
> Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
> Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Squash it, it is really just churn to deal with one patch per
compatible. Especially without any explanation in commit msg justyfing
it.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO
2025-12-06 5:08 ` [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO Ye Zhang
@ 2025-12-08 6:27 ` Krzysztof Kozlowski
2025-12-09 12:41 ` Heiko Stübner
1 sibling, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-08 6:27 UTC (permalink / raw)
To: Ye Zhang
Cc: Linus Walleij, Heiko Stuebner, Bartosz Golaszewski, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-gpio, devicetree,
linux-arm-kernel, linux-rockchip, linux-kernel, tao.huang
On Sat, Dec 06, 2025 at 01:08:42PM +0800, Ye Zhang wrote:
> Add header file with constants for RMIO pin and function IDs for the
> Rockchip RK3506 SoC.
>
> Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
> ---
> .../pinctrl/rockchip,rk3506-rmio.h | 143 ++++++++++++++++++
That's not a separate commit. Don't inflate the patchset you just make
it more work to deal with it, this belongs to the binding.
> 1 file changed, 143 insertions(+)
> create mode 100644 include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
>
> diff --git a/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h b/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
> new file mode 100644
> index 000000000000..5d39690a0b28
> --- /dev/null
> +++ b/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
What is the compatible?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding
2025-12-06 5:08 ` [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding Ye Zhang
@ 2025-12-08 6:29 ` Krzysztof Kozlowski
[not found] ` <AGkAlwDSJz*Fj0POUP7xe4pV.3.1765201861250.Hmail.ye.zhang@rock-chips.com>
0 siblings, 1 reply; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-08 6:29 UTC (permalink / raw)
To: Ye Zhang
Cc: Linus Walleij, Heiko Stuebner, Bartosz Golaszewski, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, linux-gpio, devicetree,
linux-arm-kernel, linux-rockchip, linux-kernel, tao.huang
On Sat, Dec 06, 2025 at 01:08:43PM +0800, Ye Zhang wrote:
> Add device tree binding for the RMIO (Rockchip Matrix I/O) controller
> which is a sub-device of the main pinctrl on some Rockchip SoCs.
>
> Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
> ---
> .../bindings/pinctrl/rockchip,pinctrl.yaml | 9 ++
> .../bindings/pinctrl/rockchip,rmio.yaml | 130 ++++++++++++++++++
> 2 files changed, 139 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
>
> diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
> index 93bf8f352e48..01df0a51ff83 100644
> --- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
> +++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
> @@ -83,6 +83,15 @@ required:
> - rockchip,grf
>
> patternProperties:
> + "rmio[0-9]*$":
> + type: object
> +
> + $ref: "/schemas/pinctrl/rockchip,rmio.yaml#"
> +
> + description:
> + The RMIO (Rockchip Matrix I/O) controller node which functions as a
> + sub-device of the main pinctrl to handle flexible function routing.
> +
> "gpio@[0-9a-f]+$":
> type: object
>
> diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
> new file mode 100644
> index 000000000000..28ec5ad62061
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pinctrl/rockchip,rmio.yaml
> @@ -0,0 +1,130 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/pinctrl/rockchip,rmio.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: RMIO (Rockchip Matrix I/O) Controller
> +
> +maintainers:
> + - Heiko Stuebner <heiko@sntech.de>
> +
> +description: |
> + The RMIO controller provides a flexible routing matrix that allows mapping
> + various internal peripheral functions (UART, SPI, PWM, etc.) to specific
> + physical pins. This block is typically a sub-block of the GRF
> + (General Register Files).
> +
> +properties:
> + compatible:
> + enum:
> + - rockchip,rmio
Nope, you need Soc specific compatibles. Please see writing bindings
doc first.
> +
> + rockchip,grf:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description:
Huh? That's already in the parent, no?
> + The phandle of the syscon node for the GRF registers.
> +
> + rockchip,offset:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description:
> + The offset of the RMIO configuration registers within the GRF.
> +
> + rockchip,pins-num:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description:
> + The number of physical pins supported by this RMIO instance.
> + Used for boundary checking and driver initialization.
> +
> +additionalProperties:
> + type: object
> + additionalProperties:
> + type: object
> + properties:
> + rockchip,rmio:
> + $ref: "/schemas/types.yaml#/definitions/uint32-matrix"
> + description: |
> + A list of pin-function pairs. The format is <pin_id function_id>.
> + - pin_id: The index of the RMIO pin (0 to pins-num - 1).
> + - function_id: The mux value selecting the peripheral function.
> + minItems: 1
> + items:
> + items:
> + - minimum: 0
> + maximum: 31
> + description:
> + RMIO Pin ID.
> + - minimum: 0
> + maximum: 98
> + description:
> + Function ID.
> +
> + required:
> + - rockchip,rmio
> +
> + additionalProperties: false
> +
> + additionalProperties: false
> +
> +required:
> + - compatible
> + - rockchip,grf
> + - rockchip,offset
> + - rockchip,pins-num
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/pinctrl/rockchip.h>
> + #include <dt-bindings/pinctrl/rockchip,rk3506-rmio.h>
> +
> + pinctrl {
> + #address-cells = <1>;
> + #size-cells = <1>;
Drop all this and below. Parent node should have complete example.
> + ranges;
> +
> + rmio {
> + compatible = "rockchip,rmio";
> + rockchip,grf = <&grf_pmu>;
> + rockchip,offset = <0x80>;
> + rockchip,pins-num = <32>;
> +
> + rmio-uart {
> + rmio_pin27_uart1_tx: rmio-pin27-uart1-tx {
> + rockchip,rmio = <RMIO_PIN27 RMIO_UART1_TX>;
> + };
> +
> + rmio_pin28_uart1_rx: rmio-pin28-uart1-rx {
> + rockchip,rmio = <RMIO_PIN28 RMIO_UART1_RX>;
> + };
> + };
> + };
> +
> + pcfg_pull_default: pcfg-pull-default {
> + bias-pull-pin-default;
> + };
> +
> + rm {
> + rmio_pin27_pins: rmio-pin27-pins {
> + rockchip,pins = <1 RK_PC2 7 &pcfg-pull-default>;
> + };
> +
> + rmio_pin28_pins: rmio-pin28-pins {
> + rockchip,pins = <1 RK_PC3 7 &pcfg-pull-default>;
> + };
> + };
> + };
> +
> + uart1: serial@20064000 {
> + compatible = "snps,dw-apb-uart";
Do not add irrelevant examples. Please read carefully writing bindings,
writing schema and for example by talk for beginners in DT.
This patchset does not make me happy, too many trivial issues.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding
[not found] ` <AGkAlwDSJz*Fj0POUP7xe4pV.3.1765201861250.Hmail.ye.zhang@rock-chips.com>
@ 2025-12-09 6:04 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-12-09 6:04 UTC (permalink / raw)
To: 张烨
Cc: Linus Walleij, Heiko Stuebner, Bartosz Golaszewski, Rob Herring,
krzk+dt, conor+dt, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
On 08/12/2025 14:51, 张烨 wrote:
> Hi Krzysztof,
> First of all, I sincerely apologize for the low quality of this patchset and the extra workload it caused. I appreciate your detailed review and strict checks, which help improve the code.
>
>
> Regarding your comments, I have the following questions and a proposal for v3. Could you please check if this aligns with your expectations?
>
I have no clue what you are referring to. Please follow standard mailing
list discussion style. I am not reading the rest of whatever this is.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support
2025-12-06 5:08 ` [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support Ye Zhang
2025-12-08 6:26 ` Krzysztof Kozlowski
@ 2025-12-09 12:35 ` Heiko Stübner
1 sibling, 0 replies; 17+ messages in thread
From: Heiko Stübner @ 2025-12-09 12:35 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Ye Zhang
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang, Krzysztof Kozlowski
Hi Ye Zhang,
Am Samstag, 6. Dezember 2025, 06:08:37 Mitteleuropäische Normalzeit schrieb Ye Zhang:
> Add the compatible string for the rk3506 SoC.
>
> Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
> Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
This patch was already merged into the pinctrl tree in v1 and entered
the mainline kernel during the 6.19 merge-window [0]
Same for the actual rk3506 driver change. So please base future versions
of your work on top of that.
Thanks a lot
Heiko
[0] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=13064950339ffc73a0e55e9b4898df861b04848e
> ---
> Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
> index 125af766b992..76e607281716 100644
> --- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
> +++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
> @@ -44,6 +44,7 @@ properties:
> - rockchip,rk3328-pinctrl
> - rockchip,rk3368-pinctrl
> - rockchip,rk3399-pinctrl
> + - rockchip,rk3506-pinctrl
> - rockchip,rk3528-pinctrl
> - rockchip,rk3562-pinctrl
> - rockchip,rk3568-pinctrl
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO
2025-12-06 5:08 ` [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO Ye Zhang
2025-12-08 6:27 ` Krzysztof Kozlowski
@ 2025-12-09 12:41 ` Heiko Stübner
1 sibling, 0 replies; 17+ messages in thread
From: Heiko Stübner @ 2025-12-09 12:41 UTC (permalink / raw)
To: Ye Zhang, Linus Walleij, Ye Zhang
Cc: Bartosz Golaszewski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, linux-gpio, devicetree, linux-arm-kernel,
linux-rockchip, linux-kernel, tao.huang
Hi Ye Zhang,
Am Samstag, 6. Dezember 2025, 06:08:42 Mitteleuropäische Normalzeit schrieb Ye Zhang:
> Add header file with constants for RMIO pin and function IDs for the
> Rockchip RK3506 SoC.
>
> Signed-off-by: Ye Zhang <ye.zhang@rock-chips.com>
> ---
> .../pinctrl/rockchip,rk3506-rmio.h | 143 ++++++++++++++++++
> 1 file changed, 143 insertions(+)
> create mode 100644 include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
>
> diff --git a/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h b/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
> new file mode 100644
> index 000000000000..5d39690a0b28
> --- /dev/null
> +++ b/include/dt-bindings/pinctrl/rockchip,rk3506-rmio.h
> @@ -0,0 +1,143 @@
> +/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
> +/*
> + * Copyright (c) 2025 Rockchip Electronics Co., Ltd.
> + */
> +
> +#ifndef __DT_BINDINGS_PINCTRL_ROCKCHIP_RK3506_RMIO_H
> +#define __DT_BINDINGS_PINCTRL_ROCKCHIP_RK3506_RMIO_H
> +
> +/* RMIO pins definetion */
> +#define RMIO_PIN0 0
> +#define RMIO_PIN1 1
> +#define RMIO_PIN2 2
> +#define RMIO_PIN3 3
> +#define RMIO_PIN4 4
[...]
> +#define RMIO_PIN29 29
> +#define RMIO_PIN30 30
> +#define RMIO_PIN31 31
additionally to Krzysztof's comments, please also don't introduce
unhelpful mappings. Having constants mapping pin31 to 31 is not
helpful at all, as there is no value added.
We'll already know that it's pin31 by reading the 31 when used.
In contrast, the constants below add a lot of value, because you can't
infer the that the function "14" means the CLK_32K function without
consulting the TRM, so _those_ are helpful.
> +/* RMIO function definetion */
typeo "definition"
> +#define RMIO_UART1_TX 1
> +#define RMIO_UART1_RX 2
> +#define RMIO_UART2_TX 3
> +#define RMIO_UART2_RX 4
> +#define RMIO_UART3_TX 5
Thanks a lot
Heiko
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-12-09 12:43 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-06 5:08 [PATCH v2 0/8] pinctrl: rockchip: Add RK3506 and RV1126B pinctrl and RMIO support Ye Zhang
2025-12-06 5:08 ` [PATCH v2 1/8] dt-bindings: pinctrl: Add rk3506 pinctrl support Ye Zhang
2025-12-08 6:26 ` Krzysztof Kozlowski
2025-12-09 12:35 ` Heiko Stübner
2025-12-06 5:08 ` [PATCH v2 2/8] pinctrl: rockchip: " Ye Zhang
2025-12-06 5:08 ` [PATCH v2 3/8] dt-bindings: pinctrl: Add rv1126b " Ye Zhang
2025-12-08 6:25 ` Krzysztof Kozlowski
2025-12-06 5:08 ` [PATCH v2 4/8] pinctrl: rockchip: " Ye Zhang
2025-12-06 5:08 ` [PATCH v2 5/8] gpio: rockchip: support new version GPIO Ye Zhang
2025-12-06 11:04 ` Bartosz Golaszewski
2025-12-06 5:08 ` [PATCH v2 6/8] dt-bindings: pinctrl: Add header for Rockchip RK3506 RMIO Ye Zhang
2025-12-08 6:27 ` Krzysztof Kozlowski
2025-12-09 12:41 ` Heiko Stübner
2025-12-06 5:08 ` [PATCH v2 7/8] dt-bindings: pinctrl: rockchip: Add RMIO controller binding Ye Zhang
2025-12-08 6:29 ` Krzysztof Kozlowski
[not found] ` <AGkAlwDSJz*Fj0POUP7xe4pV.3.1765201861250.Hmail.ye.zhang@rock-chips.com>
2025-12-09 6:04 ` Krzysztof Kozlowski
2025-12-06 5:08 ` [PATCH v2 8/8] pinctrl: rockchip: add rmio support Ye Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).