forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4
kernel/drivers/pinctrl/pinctrl-rockchip.c
....@@ -20,10 +20,10 @@
2020 #include <linux/platform_device.h>
2121 #include <linux/io.h>
2222 #include <linux/bitops.h>
23
-#include <linux/gpio.h>
23
+#include <linux/gpio/driver.h>
2424 #include <linux/of_address.h>
25
-#include <linux/of_irq.h>
2625 #include <linux/of_device.h>
26
+#include <linux/of_irq.h>
2727 #include <linux/pinctrl/machine.h>
2828 #include <linux/pinctrl/pinconf.h>
2929 #include <linux/pinctrl/pinctrl.h>
....@@ -40,7 +40,7 @@
4040 #include "pinconf.h"
4141 #include "pinctrl-rockchip.h"
4242
43
-/**
43
+/*
4444 * Generate a bitmask for setting a value (v) with a write mask bit in hiword
4545 * register 31:16 area.
4646 */
....@@ -117,6 +117,25 @@
117117 { .drv_type = type2, .offset = -1 }, \
118118 { .drv_type = type3, .offset = -1 }, \
119119 }, \
120
+ }
121
+
122
+#define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(id, pins, label, iom0, iom1, \
123
+ iom2, iom3, pull0, pull1, \
124
+ pull2, pull3) \
125
+ { \
126
+ .bank_num = id, \
127
+ .nr_pins = pins, \
128
+ .name = label, \
129
+ .iomux = { \
130
+ { .type = iom0, .offset = -1 }, \
131
+ { .type = iom1, .offset = -1 }, \
132
+ { .type = iom2, .offset = -1 }, \
133
+ { .type = iom3, .offset = -1 }, \
134
+ }, \
135
+ .pull_type[0] = pull0, \
136
+ .pull_type[1] = pull1, \
137
+ .pull_type[2] = pull2, \
138
+ .pull_type[3] = pull3, \
120139 }
121140
122141 #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \
....@@ -204,7 +223,7 @@
204223 .route_location = FLAG, \
205224 }
206225
207
-#define PX30S_PIN_BANK_FLAGS(ID, PIN, LABEL, MTYPE, DTYPE) \
226
+#define S_PIN_BANK_FLAGS(ID, PIN, LABEL, MTYPE, DTYPE) \
208227 PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(ID, PIN, LABEL, \
209228 MTYPE, MTYPE, MTYPE, MTYPE, \
210229 DTYPE, DTYPE, DTYPE, DTYPE, \
....@@ -218,6 +237,12 @@
218237
219238 #define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) \
220239 PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU)
240
+
241
+#define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P) \
242
+ PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
243
+
244
+static struct pinctrl_dev *g_pctldev;
245
+static DEFINE_MUTEX(iomux_lock);
221246
222247 static struct regmap_config rockchip_regmap_config = {
223248 .reg_bits = 32,
....@@ -309,6 +334,7 @@
309334 {
310335 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
311336 const struct rockchip_pin_group *grp;
337
+ struct device *dev = info->dev;
312338 struct pinctrl_map *new_map;
313339 struct device_node *parent;
314340 int map_num = 1;
....@@ -320,8 +346,7 @@
320346 */
321347 grp = pinctrl_name_to_group(info, np->name);
322348 if (!grp) {
323
- dev_err(info->dev, "unable to find group for node %pOFn\n",
324
- np);
349
+ dev_err(dev, "unable to find group for node %pOFn\n", np);
325350 return -EINVAL;
326351 }
327352
....@@ -355,7 +380,7 @@
355380 new_map[i].data.configs.num_configs = grp->data[i].nconfigs;
356381 }
357382
358
- dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n",
383
+ dev_dbg(dev, "maps: function %s group %s num %d\n",
359384 (*map)->data.mux.function, (*map)->data.mux.group, map_num);
360385
361386 return 0;
....@@ -510,159 +535,110 @@
510535
511536 static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
512537 {
538
+ /* gpio1b6_sel */
513539 .num = 1,
514540 .pin = 14,
515541 .reg = 0x28,
516542 .bit = 12,
517543 .mask = 0xf
518544 }, {
545
+ /* gpio1b7_sel */
519546 .num = 1,
520547 .pin = 15,
521548 .reg = 0x2c,
522549 .bit = 0,
523550 .mask = 0x3
524551 }, {
552
+ /* gpio1c2_sel */
525553 .num = 1,
526554 .pin = 18,
527555 .reg = 0x30,
528556 .bit = 4,
529557 .mask = 0xf
530558 }, {
559
+ /* gpio1c3_sel */
531560 .num = 1,
532561 .pin = 19,
533562 .reg = 0x30,
534563 .bit = 8,
535564 .mask = 0xf
536565 }, {
566
+ /* gpio1c4_sel */
537567 .num = 1,
538568 .pin = 20,
539569 .reg = 0x30,
540570 .bit = 12,
541571 .mask = 0xf
542572 }, {
573
+ /* gpio1c5_sel */
543574 .num = 1,
544575 .pin = 21,
545576 .reg = 0x34,
546577 .bit = 0,
547578 .mask = 0xf
548579 }, {
580
+ /* gpio1c6_sel */
549581 .num = 1,
550582 .pin = 22,
551583 .reg = 0x34,
552584 .bit = 4,
553585 .mask = 0xf
554586 }, {
587
+ /* gpio1c7_sel */
555588 .num = 1,
556589 .pin = 23,
557590 .reg = 0x34,
558591 .bit = 8,
559592 .mask = 0xf
560593 }, {
561
- .num = 3,
562
- .pin = 12,
563
- .reg = 0x68,
564
- .bit = 8,
565
- .mask = 0xf
566
- }, {
567
- .num = 3,
568
- .pin = 13,
569
- .reg = 0x68,
570
- .bit = 12,
571
- .mask = 0xf
572
- },
573
-};
574
-
575
-static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
576
- {
577
- .num = 1,
578
- .pin = 14,
579
- .reg = 0x28,
580
- .bit = 12,
581
- .mask = 0xf
582
- }, {
583
- .num = 1,
584
- .pin = 15,
585
- .reg = 0x2c,
586
- .bit = 0,
587
- .mask = 0x3
588
- }, {
589
- .num = 1,
590
- .pin = 18,
591
- .reg = 0x30,
592
- .bit = 4,
593
- .mask = 0xf
594
- }, {
595
- .num = 1,
596
- .pin = 19,
597
- .reg = 0x30,
598
- .bit = 8,
599
- .mask = 0xf
600
- }, {
601
- .num = 1,
602
- .pin = 20,
603
- .reg = 0x30,
604
- .bit = 12,
605
- .mask = 0xf
606
- }, {
607
- .num = 1,
608
- .pin = 21,
609
- .reg = 0x34,
610
- .bit = 0,
611
- .mask = 0xf
612
- }, {
613
- .num = 1,
614
- .pin = 22,
615
- .reg = 0x34,
616
- .bit = 4,
617
- .mask = 0xf
618
- }, {
619
- .num = 1,
620
- .pin = 23,
621
- .reg = 0x34,
622
- .bit = 8,
623
- .mask = 0xf
624
- }, {
625
- .num = 3,
626
- .pin = 12,
627
- .reg = 0x68,
628
- .bit = 8,
629
- .mask = 0xf
630
- }, {
631
- .num = 3,
632
- .pin = 13,
633
- .reg = 0x68,
634
- .bit = 12,
635
- .mask = 0xf
636
- }, {
594
+ /* gpio2a2_sel_plus */
637595 .num = 2,
638596 .pin = 2,
639597 .reg = 0x608,
640598 .bit = 0,
641599 .mask = 0x7
642600 }, {
601
+ /* gpio2a3_sel_plus */
643602 .num = 2,
644603 .pin = 3,
645604 .reg = 0x608,
646605 .bit = 4,
647606 .mask = 0x7
648607 }, {
608
+ /* gpio2c0_sel_plus */
649609 .num = 2,
650610 .pin = 16,
651611 .reg = 0x610,
652612 .bit = 8,
653613 .mask = 0x7
654614 }, {
615
+ /* gpio3b2_sel_plus */
655616 .num = 3,
656617 .pin = 10,
657618 .reg = 0x610,
658619 .bit = 0,
659620 .mask = 0x7
660621 }, {
622
+ /* gpio3b3_sel_plus */
661623 .num = 3,
662624 .pin = 11,
663625 .reg = 0x610,
664626 .bit = 4,
665627 .mask = 0x7
628
+ }, {
629
+ /* gpio3b4_sel */
630
+ .num = 3,
631
+ .pin = 12,
632
+ .reg = 0x68,
633
+ .bit = 8,
634
+ .mask = 0xf
635
+ }, {
636
+ /* gpio3b5_sel */
637
+ .num = 3,
638
+ .pin = 13,
639
+ .reg = 0x68,
640
+ .bit = 12,
641
+ .mask = 0xf
666642 },
667643 };
668644
....@@ -914,22 +890,6 @@
914890 RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
915891 RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
916892 RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
917
- RK_MUXROUTE_SAME(0, RK_PC7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */
918
- RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */
919
- RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
920
- RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
921
- RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
922
- RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
923
- RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
924
- RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
925
- RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
926
- RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
927
-};
928
-
929
-static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
930
- RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
931
- RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
932
- RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
933893 RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
934894 RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
935895 RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
....@@ -1053,24 +1013,12 @@
10531013 RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
10541014 RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
10551015 RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
1056
- RK_MUXROUTE_GRF(1, RK_PA3, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk tx M0 */
1057
- RK_MUXROUTE_GRF(1, RK_PA4, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk rx M0 */
10581016 RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
1059
- RK_MUXROUTE_GRF(3, RK_PC7, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk tx M1 */
1060
- RK_MUXROUTE_GRF(4, RK_PA6, 5, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk rx M1 */
10611017 RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
1062
- RK_MUXROUTE_GRF(2, RK_PD1, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk tx M2 */
1063
- RK_MUXROUTE_GRF(3, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk rx M2 */
10641018 RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
1065
- RK_MUXROUTE_GRF(2, RK_PC2, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk tx M0 */
1066
- RK_MUXROUTE_GRF(2, RK_PB7, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk rx M0 */
10671019 RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
1068
- RK_MUXROUTE_GRF(4, RK_PB7, 4, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk tx M1 */
1069
- RK_MUXROUTE_GRF(4, RK_PC1, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk rx M1 */
10701020 RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
1071
- RK_MUXROUTE_GRF(3, RK_PA3, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux sclk M0 */
10721021 RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
1073
- RK_MUXROUTE_GRF(4, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux sclk M1 */
10741022 RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10751023 RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10761024 RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
....@@ -1115,6 +1063,7 @@
11151063 static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
11161064 {
11171065 struct rockchip_pinctrl *info = bank->drvdata;
1066
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
11181067 int iomux_num = (pin / 8);
11191068 struct regmap *regmap;
11201069 unsigned int val;
....@@ -1160,6 +1109,27 @@
11601109 if (bank->recalced_mask & BIT(pin))
11611110 rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
11621111
1112
+ if (ctrl->type == RK3588) {
1113
+ if (bank->bank_num == 0) {
1114
+ if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
1115
+ u32 reg0 = 0;
1116
+
1117
+ reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1118
+ ret = regmap_read(regmap, reg0, &val);
1119
+ if (ret)
1120
+ return ret;
1121
+
1122
+ if (((val >> bit) & mask) != 8)
1123
+ return ((val >> bit) & mask);
1124
+
1125
+ reg = reg + 0x8000; /* BUS_IOC_BASE */
1126
+ regmap = info->regmap_base;
1127
+ }
1128
+ } else if (bank->bank_num > 0) {
1129
+ reg += 0x8000; /* BUS_IOC_BASE */
1130
+ }
1131
+ }
1132
+
11631133 ret = regmap_read(regmap, reg, &val);
11641134 if (ret)
11651135 return ret;
....@@ -1171,20 +1141,20 @@
11711141 int pin, int mux)
11721142 {
11731143 struct rockchip_pinctrl *info = bank->drvdata;
1144
+ struct device *dev = info->dev;
11741145 int iomux_num = (pin / 8);
11751146
11761147 if (iomux_num > 3)
11771148 return -EINVAL;
11781149
11791150 if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1180
- dev_err(info->dev, "pin %d is unrouted\n", pin);
1151
+ dev_err(dev, "pin %d is unrouted\n", pin);
11811152 return -EINVAL;
11821153 }
11831154
11841155 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
11851156 if (mux != RK_FUNC_GPIO) {
1186
- dev_err(info->dev,
1187
- "pin %d only supports a gpio mux\n", pin);
1157
+ dev_err(dev, "pin %d only supports a gpio mux\n", pin);
11881158 return -ENOTSUPP;
11891159 }
11901160 }
....@@ -1208,6 +1178,8 @@
12081178 static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
12091179 {
12101180 struct rockchip_pinctrl *info = bank->drvdata;
1181
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
1182
+ struct device *dev = info->dev;
12111183 int iomux_num = (pin / 8);
12121184 struct regmap *regmap;
12131185 int reg, ret, mask, mux_type;
....@@ -1221,8 +1193,7 @@
12211193 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
12221194 return 0;
12231195
1224
- dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",
1225
- bank->bank_num, pin, mux);
1196
+ dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
12261197
12271198 if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
12281199 regmap = info->regmap_pmu;
....@@ -1251,6 +1222,64 @@
12511222
12521223 if (bank->recalced_mask & BIT(pin))
12531224 rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
1225
+
1226
+ /* rk3562 force jtag m1 */
1227
+ if (ctrl->type == RK3562) {
1228
+ if (bank->bank_num == 1) {
1229
+ if ((pin == RK_PB5) || (pin == RK_PB6)) {
1230
+ if (mux == 1) {
1231
+ regmap_update_bits(regmap, 0x504, 0x10001, 0x10001);
1232
+ } else {
1233
+ regmap_update_bits(regmap, 0x504, 0x10001, 0x10000);
1234
+ }
1235
+ }
1236
+ }
1237
+ }
1238
+
1239
+ if (ctrl->type == RK3588) {
1240
+ if (bank->bank_num == 0) {
1241
+ if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
1242
+ if (mux < 8) {
1243
+ u32 reg0 = 0;
1244
+
1245
+ reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1246
+ data = (mask << (bit + 16));
1247
+ rmask = data | (data >> 16);
1248
+ data |= (mux & mask) << bit;
1249
+ ret = regmap_update_bits(regmap, reg0, rmask, data);
1250
+
1251
+ reg0 = reg + 0x8000; /* BUS_IOC_BASE */
1252
+ data = (mask << (bit + 16));
1253
+ rmask = data | (data >> 16);
1254
+ regmap = info->regmap_base;
1255
+ ret |= regmap_update_bits(regmap, reg0, rmask, data);
1256
+ } else {
1257
+ u32 reg0 = 0;
1258
+
1259
+ reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1260
+ data = (mask << (bit + 16));
1261
+ rmask = data | (data >> 16);
1262
+ data |= 8 << bit;
1263
+ ret = regmap_update_bits(regmap, reg0, rmask, data);
1264
+
1265
+ reg0 = reg + 0x8000; /* BUS_IOC_BASE */
1266
+ data = (mask << (bit + 16));
1267
+ rmask = data | (data >> 16);
1268
+ data |= (mux & mask) << bit;
1269
+ regmap = info->regmap_base;
1270
+ ret |= regmap_update_bits(regmap, reg0, rmask, data);
1271
+ }
1272
+ } else {
1273
+ data = (mask << (bit + 16));
1274
+ rmask = data | (data >> 16);
1275
+ data |= (mux & mask) << bit;
1276
+ ret = regmap_update_bits(regmap, reg, rmask, data);
1277
+ }
1278
+ return ret;
1279
+ } else if (bank->bank_num > 0) {
1280
+ reg += 0x8000; /* BUS_IOC_BASE */
1281
+ }
1282
+ }
12541283
12551284 if (mux > mask)
12561285 return -EINVAL;
....@@ -1300,9 +1329,9 @@
13001329 #define PX30_PULL_PINS_PER_REG 8
13011330 #define PX30_PULL_BANK_STRIDE 16
13021331
1303
-static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1304
- int pin_num, struct regmap **regmap,
1305
- int *reg, u8 *bit)
1332
+static int px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1333
+ int pin_num, struct regmap **regmap,
1334
+ int *reg, u8 *bit)
13061335 {
13071336 struct rockchip_pinctrl *info = bank->drvdata;
13081337
....@@ -1322,6 +1351,8 @@
13221351 *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
13231352 *bit = (pin_num % PX30_PULL_PINS_PER_REG);
13241353 *bit *= PX30_PULL_BITS_PER_PIN;
1354
+
1355
+ return 0;
13251356 }
13261357
13271358 #define PX30_DRV_PMU_OFFSET 0x20
....@@ -1330,9 +1361,9 @@
13301361 #define PX30_DRV_PINS_PER_REG 8
13311362 #define PX30_DRV_BANK_STRIDE 16
13321363
1333
-static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1334
- int pin_num, struct regmap **regmap,
1335
- int *reg, u8 *bit)
1364
+static int px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1365
+ int pin_num, struct regmap **regmap,
1366
+ int *reg, u8 *bit)
13361367 {
13371368 struct rockchip_pinctrl *info = bank->drvdata;
13381369
....@@ -1352,6 +1383,8 @@
13521383 *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
13531384 *bit = (pin_num % PX30_DRV_PINS_PER_REG);
13541385 *bit *= PX30_DRV_BITS_PER_PIN;
1386
+
1387
+ return 0;
13551388 }
13561389
13571390 #define PX30_SCHMITT_PMU_OFFSET 0x38
....@@ -1385,15 +1418,175 @@
13851418 return 0;
13861419 }
13871420
1421
+#define RV1106_DRV_BITS_PER_PIN 8
1422
+#define RV1106_DRV_PINS_PER_REG 2
1423
+#define RV1106_DRV_GPIO0_OFFSET 0x10
1424
+#define RV1106_DRV_GPIO1_OFFSET 0x80
1425
+#define RV1106_DRV_GPIO2_OFFSET 0x100C0
1426
+#define RV1106_DRV_GPIO3_OFFSET 0x20100
1427
+#define RV1106_DRV_GPIO4_OFFSET 0x30020
1428
+
1429
+static int rv1106_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1430
+ int pin_num, struct regmap **regmap,
1431
+ int *reg, u8 *bit)
1432
+{
1433
+ struct rockchip_pinctrl *info = bank->drvdata;
1434
+
1435
+ /* GPIO0_IOC is located in PMU */
1436
+ switch (bank->bank_num) {
1437
+ case 0:
1438
+ *regmap = info->regmap_pmu;
1439
+ *reg = RV1106_DRV_GPIO0_OFFSET;
1440
+ break;
1441
+
1442
+ case 1:
1443
+ *regmap = info->regmap_base;
1444
+ *reg = RV1106_DRV_GPIO1_OFFSET;
1445
+ break;
1446
+
1447
+ case 2:
1448
+ *regmap = info->regmap_base;
1449
+ *reg = RV1106_DRV_GPIO2_OFFSET;
1450
+ break;
1451
+
1452
+ case 3:
1453
+ *regmap = info->regmap_base;
1454
+ *reg = RV1106_DRV_GPIO3_OFFSET;
1455
+ break;
1456
+
1457
+ case 4:
1458
+ *regmap = info->regmap_base;
1459
+ *reg = RV1106_DRV_GPIO4_OFFSET;
1460
+ break;
1461
+
1462
+ default:
1463
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1464
+ break;
1465
+ }
1466
+
1467
+ *reg += ((pin_num / RV1106_DRV_PINS_PER_REG) * 4);
1468
+ *bit = pin_num % RV1106_DRV_PINS_PER_REG;
1469
+ *bit *= RV1106_DRV_BITS_PER_PIN;
1470
+
1471
+ return 0;
1472
+}
1473
+
1474
+#define RV1106_PULL_BITS_PER_PIN 2
1475
+#define RV1106_PULL_PINS_PER_REG 8
1476
+#define RV1106_PULL_GPIO0_OFFSET 0x38
1477
+#define RV1106_PULL_GPIO1_OFFSET 0x1C0
1478
+#define RV1106_PULL_GPIO2_OFFSET 0x101D0
1479
+#define RV1106_PULL_GPIO3_OFFSET 0x201E0
1480
+#define RV1106_PULL_GPIO4_OFFSET 0x30070
1481
+
1482
+static int rv1106_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1483
+ int pin_num, struct regmap **regmap,
1484
+ int *reg, u8 *bit)
1485
+{
1486
+ struct rockchip_pinctrl *info = bank->drvdata;
1487
+
1488
+ /* GPIO0_IOC is located in PMU */
1489
+ switch (bank->bank_num) {
1490
+ case 0:
1491
+ *regmap = info->regmap_pmu;
1492
+ *reg = RV1106_PULL_GPIO0_OFFSET;
1493
+ break;
1494
+
1495
+ case 1:
1496
+ *regmap = info->regmap_base;
1497
+ *reg = RV1106_PULL_GPIO1_OFFSET;
1498
+ break;
1499
+
1500
+ case 2:
1501
+ *regmap = info->regmap_base;
1502
+ *reg = RV1106_PULL_GPIO2_OFFSET;
1503
+ break;
1504
+
1505
+ case 3:
1506
+ *regmap = info->regmap_base;
1507
+ *reg = RV1106_PULL_GPIO3_OFFSET;
1508
+ break;
1509
+
1510
+ case 4:
1511
+ *regmap = info->regmap_base;
1512
+ *reg = RV1106_PULL_GPIO4_OFFSET;
1513
+ break;
1514
+
1515
+ default:
1516
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1517
+ break;
1518
+ }
1519
+
1520
+ *reg += ((pin_num / RV1106_PULL_PINS_PER_REG) * 4);
1521
+ *bit = pin_num % RV1106_PULL_PINS_PER_REG;
1522
+ *bit *= RV1106_PULL_BITS_PER_PIN;
1523
+
1524
+ return 0;
1525
+}
1526
+
1527
+#define RV1106_SMT_BITS_PER_PIN 1
1528
+#define RV1106_SMT_PINS_PER_REG 8
1529
+#define RV1106_SMT_GPIO0_OFFSET 0x40
1530
+#define RV1106_SMT_GPIO1_OFFSET 0x280
1531
+#define RV1106_SMT_GPIO2_OFFSET 0x10290
1532
+#define RV1106_SMT_GPIO3_OFFSET 0x202A0
1533
+#define RV1106_SMT_GPIO4_OFFSET 0x300A0
1534
+
1535
+static int rv1106_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1536
+ int pin_num,
1537
+ struct regmap **regmap,
1538
+ int *reg, u8 *bit)
1539
+{
1540
+ struct rockchip_pinctrl *info = bank->drvdata;
1541
+
1542
+ /* GPIO0_IOC is located in PMU */
1543
+ switch (bank->bank_num) {
1544
+ case 0:
1545
+ *regmap = info->regmap_pmu;
1546
+ *reg = RV1106_SMT_GPIO0_OFFSET;
1547
+ break;
1548
+
1549
+ case 1:
1550
+ *regmap = info->regmap_base;
1551
+ *reg = RV1106_SMT_GPIO1_OFFSET;
1552
+ break;
1553
+
1554
+ case 2:
1555
+ *regmap = info->regmap_base;
1556
+ *reg = RV1106_SMT_GPIO2_OFFSET;
1557
+ break;
1558
+
1559
+ case 3:
1560
+ *regmap = info->regmap_base;
1561
+ *reg = RV1106_SMT_GPIO3_OFFSET;
1562
+ break;
1563
+
1564
+ case 4:
1565
+ *regmap = info->regmap_base;
1566
+ *reg = RV1106_SMT_GPIO4_OFFSET;
1567
+ break;
1568
+
1569
+ default:
1570
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1571
+ break;
1572
+ }
1573
+
1574
+ *reg += ((pin_num / RV1106_SMT_PINS_PER_REG) * 4);
1575
+ *bit = pin_num % RV1106_SMT_PINS_PER_REG;
1576
+ *bit *= RV1106_SMT_BITS_PER_PIN;
1577
+
1578
+ return 0;
1579
+}
1580
+
13881581 #define RV1108_PULL_PMU_OFFSET 0x10
13891582 #define RV1108_PULL_OFFSET 0x110
13901583 #define RV1108_PULL_PINS_PER_REG 8
13911584 #define RV1108_PULL_BITS_PER_PIN 2
13921585 #define RV1108_PULL_BANK_STRIDE 16
13931586
1394
-static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1395
- int pin_num, struct regmap **regmap,
1396
- int *reg, u8 *bit)
1587
+static int rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1588
+ int pin_num, struct regmap **regmap,
1589
+ int *reg, u8 *bit)
13971590 {
13981591 struct rockchip_pinctrl *info = bank->drvdata;
13991592
....@@ -1412,6 +1605,8 @@
14121605 *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
14131606 *bit = (pin_num % RV1108_PULL_PINS_PER_REG);
14141607 *bit *= RV1108_PULL_BITS_PER_PIN;
1608
+
1609
+ return 0;
14151610 }
14161611
14171612 #define RV1108_DRV_PMU_OFFSET 0x20
....@@ -1420,9 +1615,9 @@
14201615 #define RV1108_DRV_PINS_PER_REG 8
14211616 #define RV1108_DRV_BANK_STRIDE 16
14221617
1423
-static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1424
- int pin_num, struct regmap **regmap,
1425
- int *reg, u8 *bit)
1618
+static int rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1619
+ int pin_num, struct regmap **regmap,
1620
+ int *reg, u8 *bit)
14261621 {
14271622 struct rockchip_pinctrl *info = bank->drvdata;
14281623
....@@ -1442,6 +1637,8 @@
14421637 *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
14431638 *bit = pin_num % RV1108_DRV_PINS_PER_REG;
14441639 *bit *= RV1108_DRV_BITS_PER_PIN;
1640
+
1641
+ return 0;
14451642 }
14461643
14471644 #define RV1108_SCHMITT_PMU_OFFSET 0x30
....@@ -1481,9 +1678,9 @@
14811678 #define RV1126_PULL_BANK_STRIDE 16
14821679 #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
14831680
1484
-static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1485
- int pin_num, struct regmap **regmap,
1486
- int *reg, u8 *bit)
1681
+static int rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1682
+ int pin_num, struct regmap **regmap,
1683
+ int *reg, u8 *bit)
14871684 {
14881685 struct rockchip_pinctrl *info = bank->drvdata;
14891686
....@@ -1495,7 +1692,7 @@
14951692 *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
14961693 *bit = pin_num % RV1126_PULL_PINS_PER_REG;
14971694 *bit *= RV1126_PULL_BITS_PER_PIN;
1498
- return;
1695
+ return 0;
14991696 }
15001697 *regmap = info->regmap_pmu;
15011698 *reg = RV1126_PULL_PMU_OFFSET;
....@@ -1508,6 +1705,8 @@
15081705 *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
15091706 *bit = (pin_num % RV1126_PULL_PINS_PER_REG);
15101707 *bit *= RV1126_PULL_BITS_PER_PIN;
1708
+
1709
+ return 0;
15111710 }
15121711
15131712 #define RV1126_DRV_PMU_OFFSET 0x20
....@@ -1516,9 +1715,9 @@
15161715 #define RV1126_DRV_PINS_PER_REG 4
15171716 #define RV1126_DRV_BANK_STRIDE 32
15181717
1519
-static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1520
- int pin_num, struct regmap **regmap,
1521
- int *reg, u8 *bit)
1718
+static int rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1719
+ int pin_num, struct regmap **regmap,
1720
+ int *reg, u8 *bit)
15221721 {
15231722 struct rockchip_pinctrl *info = bank->drvdata;
15241723
....@@ -1531,7 +1730,7 @@
15311730 *reg -= 0x4;
15321731 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15331732 *bit *= RV1126_DRV_BITS_PER_PIN;
1534
- return;
1733
+ return 0;
15351734 }
15361735 *regmap = info->regmap_pmu;
15371736 *reg = RV1126_DRV_PMU_OFFSET;
....@@ -1544,6 +1743,8 @@
15441743 *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
15451744 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15461745 *bit *= RV1126_DRV_BITS_PER_PIN;
1746
+
1747
+ return 0;
15471748 }
15481749
15491750 #define RV1126_SCHMITT_PMU_OFFSET 0x60
....@@ -1583,15 +1784,35 @@
15831784 return 0;
15841785 }
15851786
1787
+#define RK3308_SCHMITT_PINS_PER_REG 8
1788
+#define RK3308_SCHMITT_BANK_STRIDE 16
1789
+#define RK3308_SCHMITT_GRF_OFFSET 0x1a0
1790
+
1791
+static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1792
+ int pin_num, struct regmap **regmap,
1793
+ int *reg, u8 *bit)
1794
+{
1795
+ struct rockchip_pinctrl *info = bank->drvdata;
1796
+
1797
+ *regmap = info->regmap_base;
1798
+ *reg = RK3308_SCHMITT_GRF_OFFSET;
1799
+
1800
+ *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
1801
+ *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
1802
+ *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
1803
+
1804
+ return 0;
1805
+}
1806
+
15861807 #define RK1808_PULL_PMU_OFFSET 0x10
15871808 #define RK1808_PULL_GRF_OFFSET 0x80
15881809 #define RK1808_PULL_PINS_PER_REG 8
15891810 #define RK1808_PULL_BITS_PER_PIN 2
15901811 #define RK1808_PULL_BANK_STRIDE 16
15911812
1592
-static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1593
- int pin_num, struct regmap **regmap,
1594
- int *reg, u8 *bit)
1813
+static int rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1814
+ int pin_num, struct regmap **regmap,
1815
+ int *reg, u8 *bit)
15951816 {
15961817 struct rockchip_pinctrl *info = bank->drvdata;
15971818
....@@ -1607,6 +1828,8 @@
16071828 *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
16081829 *bit = (pin_num % RK1808_PULL_PINS_PER_REG);
16091830 *bit *= RK1808_PULL_BITS_PER_PIN;
1831
+
1832
+ return 0;
16101833 }
16111834
16121835 #define RK1808_DRV_PMU_OFFSET 0x20
....@@ -1615,10 +1838,10 @@
16151838 #define RK1808_DRV_PINS_PER_REG 8
16161839 #define RK1808_DRV_BANK_STRIDE 16
16171840
1618
-static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1619
- int pin_num,
1620
- struct regmap **regmap,
1621
- int *reg, u8 *bit)
1841
+static int rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1842
+ int pin_num,
1843
+ struct regmap **regmap,
1844
+ int *reg, u8 *bit)
16221845 {
16231846 struct rockchip_pinctrl *info = bank->drvdata;
16241847
....@@ -1634,6 +1857,8 @@
16341857 *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
16351858 *bit = pin_num % RK1808_DRV_PINS_PER_REG;
16361859 *bit *= RK1808_DRV_BITS_PER_PIN;
1860
+
1861
+ return 0;
16371862 }
16381863
16391864 #define RK1808_SR_PMU_OFFSET 0x0030
....@@ -1692,9 +1917,9 @@
16921917 #define RK2928_PULL_PINS_PER_REG 16
16931918 #define RK2928_PULL_BANK_STRIDE 8
16941919
1695
-static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1696
- int pin_num, struct regmap **regmap,
1697
- int *reg, u8 *bit)
1920
+static int rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1921
+ int pin_num, struct regmap **regmap,
1922
+ int *reg, u8 *bit)
16981923 {
16991924 struct rockchip_pinctrl *info = bank->drvdata;
17001925
....@@ -1704,13 +1929,15 @@
17041929 *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
17051930
17061931 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1932
+
1933
+ return 0;
17071934 };
17081935
17091936 #define RK3128_PULL_OFFSET 0x118
17101937
1711
-static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1712
- int pin_num, struct regmap **regmap,
1713
- int *reg, u8 *bit)
1938
+static int rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1939
+ int pin_num, struct regmap **regmap,
1940
+ int *reg, u8 *bit)
17141941 {
17151942 struct rockchip_pinctrl *info = bank->drvdata;
17161943
....@@ -1720,6 +1947,8 @@
17201947 *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
17211948
17221949 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1950
+
1951
+ return 0;
17231952 }
17241953
17251954 #define RK3188_PULL_OFFSET 0x164
....@@ -1728,9 +1957,9 @@
17281957 #define RK3188_PULL_BANK_STRIDE 16
17291958 #define RK3188_PULL_PMU_OFFSET 0x64
17301959
1731
-static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1732
- int pin_num, struct regmap **regmap,
1733
- int *reg, u8 *bit)
1960
+static int rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1961
+ int pin_num, struct regmap **regmap,
1962
+ int *reg, u8 *bit)
17341963 {
17351964 struct rockchip_pinctrl *info = bank->drvdata;
17361965
....@@ -1760,12 +1989,14 @@
17601989 *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
17611990 *bit *= RK3188_PULL_BITS_PER_PIN;
17621991 }
1992
+
1993
+ return 0;
17631994 }
17641995
17651996 #define RK3288_PULL_OFFSET 0x140
1766
-static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1767
- int pin_num, struct regmap **regmap,
1768
- int *reg, u8 *bit)
1997
+static int rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1998
+ int pin_num, struct regmap **regmap,
1999
+ int *reg, u8 *bit)
17692000 {
17702001 struct rockchip_pinctrl *info = bank->drvdata;
17712002
....@@ -1789,6 +2020,8 @@
17892020 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
17902021 *bit *= RK3188_PULL_BITS_PER_PIN;
17912022 }
2023
+
2024
+ return 0;
17922025 }
17932026
17942027 #define RK3288_DRV_PMU_OFFSET 0x70
....@@ -1797,9 +2030,9 @@
17972030 #define RK3288_DRV_PINS_PER_REG 8
17982031 #define RK3288_DRV_BANK_STRIDE 16
17992032
1800
-static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1801
- int pin_num, struct regmap **regmap,
1802
- int *reg, u8 *bit)
2033
+static int rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2034
+ int pin_num, struct regmap **regmap,
2035
+ int *reg, u8 *bit)
18032036 {
18042037 struct rockchip_pinctrl *info = bank->drvdata;
18052038
....@@ -1823,13 +2056,15 @@
18232056 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18242057 *bit *= RK3288_DRV_BITS_PER_PIN;
18252058 }
2059
+
2060
+ return 0;
18262061 }
18272062
18282063 #define RK3228_PULL_OFFSET 0x100
18292064
1830
-static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1831
- int pin_num, struct regmap **regmap,
1832
- int *reg, u8 *bit)
2065
+static int rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2066
+ int pin_num, struct regmap **regmap,
2067
+ int *reg, u8 *bit)
18332068 {
18342069 struct rockchip_pinctrl *info = bank->drvdata;
18352070
....@@ -1840,13 +2075,15 @@
18402075
18412076 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18422077 *bit *= RK3188_PULL_BITS_PER_PIN;
2078
+
2079
+ return 0;
18432080 }
18442081
18452082 #define RK3228_DRV_GRF_OFFSET 0x200
18462083
1847
-static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1848
- int pin_num, struct regmap **regmap,
1849
- int *reg, u8 *bit)
2084
+static int rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2085
+ int pin_num, struct regmap **regmap,
2086
+ int *reg, u8 *bit)
18502087 {
18512088 struct rockchip_pinctrl *info = bank->drvdata;
18522089
....@@ -1857,13 +2094,15 @@
18572094
18582095 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18592096 *bit *= RK3288_DRV_BITS_PER_PIN;
2097
+
2098
+ return 0;
18602099 }
18612100
18622101 #define RK3308_PULL_OFFSET 0xa0
18632102
1864
-static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1865
- int pin_num, struct regmap **regmap,
1866
- int *reg, u8 *bit)
2103
+static int rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2104
+ int pin_num, struct regmap **regmap,
2105
+ int *reg, u8 *bit)
18672106 {
18682107 struct rockchip_pinctrl *info = bank->drvdata;
18692108
....@@ -1874,13 +2113,15 @@
18742113
18752114 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18762115 *bit *= RK3188_PULL_BITS_PER_PIN;
2116
+
2117
+ return 0;
18772118 }
18782119
18792120 #define RK3308_DRV_GRF_OFFSET 0x100
18802121
1881
-static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1882
- int pin_num, struct regmap **regmap,
1883
- int *reg, u8 *bit)
2122
+static int rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2123
+ int pin_num, struct regmap **regmap,
2124
+ int *reg, u8 *bit)
18842125 {
18852126 struct rockchip_pinctrl *info = bank->drvdata;
18862127
....@@ -1891,14 +2132,39 @@
18912132
18922133 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18932134 *bit *= RK3288_DRV_BITS_PER_PIN;
2135
+
2136
+ return 0;
2137
+}
2138
+
2139
+#define RK3308_SLEW_RATE_GRF_OFFSET 0x150
2140
+#define RK3308_SLEW_RATE_BANK_STRIDE 16
2141
+#define RK3308_SLEW_RATE_PINS_PER_GRF_REG 8
2142
+
2143
+static int rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2144
+ int pin_num,
2145
+ struct regmap **regmap,
2146
+ int *reg, u8 *bit)
2147
+{
2148
+ struct rockchip_pinctrl *info = bank->drvdata;
2149
+ int pins_per_reg;
2150
+
2151
+ *regmap = info->regmap_base;
2152
+ *reg = RK3308_SLEW_RATE_GRF_OFFSET;
2153
+ *reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE;
2154
+ pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG;
2155
+
2156
+ *reg += ((pin_num / pins_per_reg) * 4);
2157
+ *bit = pin_num % pins_per_reg;
2158
+
2159
+ return 0;
18942160 }
18952161
18962162 #define RK3368_PULL_GRF_OFFSET 0x100
18972163 #define RK3368_PULL_PMU_OFFSET 0x10
18982164
1899
-static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1900
- int pin_num, struct regmap **regmap,
1901
- int *reg, u8 *bit)
2165
+static int rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2166
+ int pin_num, struct regmap **regmap,
2167
+ int *reg, u8 *bit)
19022168 {
19032169 struct rockchip_pinctrl *info = bank->drvdata;
19042170
....@@ -1922,14 +2188,16 @@
19222188 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19232189 *bit *= RK3188_PULL_BITS_PER_PIN;
19242190 }
2191
+
2192
+ return 0;
19252193 }
19262194
19272195 #define RK3368_DRV_PMU_OFFSET 0x20
19282196 #define RK3368_DRV_GRF_OFFSET 0x200
19292197
1930
-static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1931
- int pin_num, struct regmap **regmap,
1932
- int *reg, u8 *bit)
2198
+static int rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2199
+ int pin_num, struct regmap **regmap,
2200
+ int *reg, u8 *bit)
19332201 {
19342202 struct rockchip_pinctrl *info = bank->drvdata;
19352203
....@@ -1953,15 +2221,17 @@
19532221 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
19542222 *bit *= RK3288_DRV_BITS_PER_PIN;
19552223 }
2224
+
2225
+ return 0;
19562226 }
19572227
19582228 #define RK3399_PULL_GRF_OFFSET 0xe040
19592229 #define RK3399_PULL_PMU_OFFSET 0x40
19602230 #define RK3399_DRV_3BITS_PER_PIN 3
19612231
1962
-static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1963
- int pin_num, struct regmap **regmap,
1964
- int *reg, u8 *bit)
2232
+static int rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2233
+ int pin_num, struct regmap **regmap,
2234
+ int *reg, u8 *bit)
19652235 {
19662236 struct rockchip_pinctrl *info = bank->drvdata;
19672237
....@@ -1987,11 +2257,13 @@
19872257 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19882258 *bit *= RK3188_PULL_BITS_PER_PIN;
19892259 }
2260
+
2261
+ return 0;
19902262 }
19912263
1992
-static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1993
- int pin_num, struct regmap **regmap,
1994
- int *reg, u8 *bit)
2264
+static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2265
+ int pin_num, struct regmap **regmap,
2266
+ int *reg, u8 *bit)
19952267 {
19962268 struct rockchip_pinctrl *info = bank->drvdata;
19972269 int drv_num = (pin_num / 8);
....@@ -2008,6 +2280,297 @@
20082280 *bit = (pin_num % 8) * 3;
20092281 else
20102282 *bit = (pin_num % 8) * 2;
2283
+
2284
+ return 0;
2285
+}
2286
+
2287
+#define RK3528_DRV_BITS_PER_PIN 8
2288
+#define RK3528_DRV_PINS_PER_REG 2
2289
+#define RK3528_DRV_GPIO0_OFFSET 0x100
2290
+#define RK3528_DRV_GPIO1_OFFSET 0x20120
2291
+#define RK3528_DRV_GPIO2_OFFSET 0x30160
2292
+#define RK3528_DRV_GPIO3_OFFSET 0x20190
2293
+#define RK3528_DRV_GPIO4_OFFSET 0x101C0
2294
+
2295
+static int rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2296
+ int pin_num, struct regmap **regmap,
2297
+ int *reg, u8 *bit)
2298
+{
2299
+ struct rockchip_pinctrl *info = bank->drvdata;
2300
+
2301
+ *regmap = info->regmap_base;
2302
+ switch (bank->bank_num) {
2303
+ case 0:
2304
+ *reg = RK3528_DRV_GPIO0_OFFSET;
2305
+ break;
2306
+
2307
+ case 1:
2308
+ *reg = RK3528_DRV_GPIO1_OFFSET;
2309
+ break;
2310
+
2311
+ case 2:
2312
+ *reg = RK3528_DRV_GPIO2_OFFSET;
2313
+ break;
2314
+
2315
+ case 3:
2316
+ *reg = RK3528_DRV_GPIO3_OFFSET;
2317
+ break;
2318
+
2319
+ case 4:
2320
+ *reg = RK3528_DRV_GPIO4_OFFSET;
2321
+ break;
2322
+
2323
+ default:
2324
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2325
+ break;
2326
+ }
2327
+
2328
+ *reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
2329
+ *bit = pin_num % RK3528_DRV_PINS_PER_REG;
2330
+ *bit *= RK3528_DRV_BITS_PER_PIN;
2331
+
2332
+ return 0;
2333
+}
2334
+
2335
+#define RK3528_PULL_BITS_PER_PIN 2
2336
+#define RK3528_PULL_PINS_PER_REG 8
2337
+#define RK3528_PULL_GPIO0_OFFSET 0x200
2338
+#define RK3528_PULL_GPIO1_OFFSET 0x20210
2339
+#define RK3528_PULL_GPIO2_OFFSET 0x30220
2340
+#define RK3528_PULL_GPIO3_OFFSET 0x20230
2341
+#define RK3528_PULL_GPIO4_OFFSET 0x10240
2342
+
2343
+static int rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2344
+ int pin_num, struct regmap **regmap,
2345
+ int *reg, u8 *bit)
2346
+{
2347
+ struct rockchip_pinctrl *info = bank->drvdata;
2348
+
2349
+ *regmap = info->regmap_base;
2350
+ switch (bank->bank_num) {
2351
+ case 0:
2352
+ *reg = RK3528_PULL_GPIO0_OFFSET;
2353
+ break;
2354
+
2355
+ case 1:
2356
+ *reg = RK3528_PULL_GPIO1_OFFSET;
2357
+ break;
2358
+
2359
+ case 2:
2360
+ *reg = RK3528_PULL_GPIO2_OFFSET;
2361
+ break;
2362
+
2363
+ case 3:
2364
+ *reg = RK3528_PULL_GPIO3_OFFSET;
2365
+ break;
2366
+
2367
+ case 4:
2368
+ *reg = RK3528_PULL_GPIO4_OFFSET;
2369
+ break;
2370
+
2371
+ default:
2372
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2373
+ break;
2374
+ }
2375
+
2376
+ *reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
2377
+ *bit = pin_num % RK3528_PULL_PINS_PER_REG;
2378
+ *bit *= RK3528_PULL_BITS_PER_PIN;
2379
+
2380
+ return 0;
2381
+}
2382
+
2383
+#define RK3528_SMT_BITS_PER_PIN 1
2384
+#define RK3528_SMT_PINS_PER_REG 8
2385
+#define RK3528_SMT_GPIO0_OFFSET 0x400
2386
+#define RK3528_SMT_GPIO1_OFFSET 0x20410
2387
+#define RK3528_SMT_GPIO2_OFFSET 0x30420
2388
+#define RK3528_SMT_GPIO3_OFFSET 0x20430
2389
+#define RK3528_SMT_GPIO4_OFFSET 0x10440
2390
+
2391
+static int rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2392
+ int pin_num,
2393
+ struct regmap **regmap,
2394
+ int *reg, u8 *bit)
2395
+{
2396
+ struct rockchip_pinctrl *info = bank->drvdata;
2397
+
2398
+ *regmap = info->regmap_base;
2399
+ switch (bank->bank_num) {
2400
+ case 0:
2401
+ *reg = RK3528_SMT_GPIO0_OFFSET;
2402
+ break;
2403
+
2404
+ case 1:
2405
+ *reg = RK3528_SMT_GPIO1_OFFSET;
2406
+ break;
2407
+
2408
+ case 2:
2409
+ *reg = RK3528_SMT_GPIO2_OFFSET;
2410
+ break;
2411
+
2412
+ case 3:
2413
+ *reg = RK3528_SMT_GPIO3_OFFSET;
2414
+ break;
2415
+
2416
+ case 4:
2417
+ *reg = RK3528_SMT_GPIO4_OFFSET;
2418
+ break;
2419
+
2420
+ default:
2421
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2422
+ break;
2423
+ }
2424
+
2425
+ *reg += ((pin_num / RK3528_SMT_PINS_PER_REG) * 4);
2426
+ *bit = pin_num % RK3528_SMT_PINS_PER_REG;
2427
+ *bit *= RK3528_SMT_BITS_PER_PIN;
2428
+ return 0;
2429
+}
2430
+
2431
+#define RK3562_DRV_BITS_PER_PIN 8
2432
+#define RK3562_DRV_PINS_PER_REG 2
2433
+#define RK3562_DRV_GPIO0_OFFSET 0x20070
2434
+#define RK3562_DRV_GPIO1_OFFSET 0x200
2435
+#define RK3562_DRV_GPIO2_OFFSET 0x240
2436
+#define RK3562_DRV_GPIO3_OFFSET 0x10280
2437
+#define RK3562_DRV_GPIO4_OFFSET 0x102C0
2438
+
2439
+static int rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2440
+ int pin_num, struct regmap **regmap,
2441
+ int *reg, u8 *bit)
2442
+{
2443
+ struct rockchip_pinctrl *info = bank->drvdata;
2444
+
2445
+ *regmap = info->regmap_base;
2446
+ switch (bank->bank_num) {
2447
+ case 0:
2448
+ *reg = RK3562_DRV_GPIO0_OFFSET;
2449
+ break;
2450
+
2451
+ case 1:
2452
+ *reg = RK3562_DRV_GPIO1_OFFSET;
2453
+ break;
2454
+
2455
+ case 2:
2456
+ *reg = RK3562_DRV_GPIO2_OFFSET;
2457
+ break;
2458
+
2459
+ case 3:
2460
+ *reg = RK3562_DRV_GPIO3_OFFSET;
2461
+ break;
2462
+
2463
+ case 4:
2464
+ *reg = RK3562_DRV_GPIO4_OFFSET;
2465
+ break;
2466
+
2467
+ default:
2468
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2469
+ break;
2470
+ }
2471
+
2472
+ *reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4);
2473
+ *bit = pin_num % RK3562_DRV_PINS_PER_REG;
2474
+ *bit *= RK3562_DRV_BITS_PER_PIN;
2475
+
2476
+ return 0;
2477
+}
2478
+
2479
+#define RK3562_PULL_BITS_PER_PIN 2
2480
+#define RK3562_PULL_PINS_PER_REG 8
2481
+#define RK3562_PULL_GPIO0_OFFSET 0x20020
2482
+#define RK3562_PULL_GPIO1_OFFSET 0x80
2483
+#define RK3562_PULL_GPIO2_OFFSET 0x90
2484
+#define RK3562_PULL_GPIO3_OFFSET 0x100A0
2485
+#define RK3562_PULL_GPIO4_OFFSET 0x100B0
2486
+
2487
+static int rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2488
+ int pin_num, struct regmap **regmap,
2489
+ int *reg, u8 *bit)
2490
+{
2491
+ struct rockchip_pinctrl *info = bank->drvdata;
2492
+
2493
+ *regmap = info->regmap_base;
2494
+ switch (bank->bank_num) {
2495
+ case 0:
2496
+ *reg = RK3562_PULL_GPIO0_OFFSET;
2497
+ break;
2498
+
2499
+ case 1:
2500
+ *reg = RK3562_PULL_GPIO1_OFFSET;
2501
+ break;
2502
+
2503
+ case 2:
2504
+ *reg = RK3562_PULL_GPIO2_OFFSET;
2505
+ break;
2506
+
2507
+ case 3:
2508
+ *reg = RK3562_PULL_GPIO3_OFFSET;
2509
+ break;
2510
+
2511
+ case 4:
2512
+ *reg = RK3562_PULL_GPIO4_OFFSET;
2513
+ break;
2514
+
2515
+ default:
2516
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2517
+ break;
2518
+ }
2519
+
2520
+ *reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4);
2521
+ *bit = pin_num % RK3562_PULL_PINS_PER_REG;
2522
+ *bit *= RK3562_PULL_BITS_PER_PIN;
2523
+
2524
+ return 0;
2525
+}
2526
+
2527
+#define RK3562_SMT_BITS_PER_PIN 2
2528
+#define RK3562_SMT_PINS_PER_REG 8
2529
+#define RK3562_SMT_GPIO0_OFFSET 0x20030
2530
+#define RK3562_SMT_GPIO1_OFFSET 0xC0
2531
+#define RK3562_SMT_GPIO2_OFFSET 0xD0
2532
+#define RK3562_SMT_GPIO3_OFFSET 0x100E0
2533
+#define RK3562_SMT_GPIO4_OFFSET 0x100F0
2534
+
2535
+static int rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2536
+ int pin_num,
2537
+ struct regmap **regmap,
2538
+ int *reg, u8 *bit)
2539
+{
2540
+ struct rockchip_pinctrl *info = bank->drvdata;
2541
+
2542
+ *regmap = info->regmap_base;
2543
+ switch (bank->bank_num) {
2544
+ case 0:
2545
+ *reg = RK3562_SMT_GPIO0_OFFSET;
2546
+ break;
2547
+
2548
+ case 1:
2549
+ *reg = RK3562_SMT_GPIO1_OFFSET;
2550
+ break;
2551
+
2552
+ case 2:
2553
+ *reg = RK3562_SMT_GPIO2_OFFSET;
2554
+ break;
2555
+
2556
+ case 3:
2557
+ *reg = RK3562_SMT_GPIO3_OFFSET;
2558
+ break;
2559
+
2560
+ case 4:
2561
+ *reg = RK3562_SMT_GPIO4_OFFSET;
2562
+ break;
2563
+
2564
+ default:
2565
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2566
+ break;
2567
+ }
2568
+
2569
+ *reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4);
2570
+ *bit = pin_num % RK3562_SMT_PINS_PER_REG;
2571
+ *bit *= RK3562_SMT_BITS_PER_PIN;
2572
+
2573
+ return 0;
20112574 }
20122575
20132576 #define RK3568_SR_PMU_OFFSET 0x60
....@@ -2044,9 +2607,9 @@
20442607 #define RK3568_PULL_PINS_PER_REG 8
20452608 #define RK3568_PULL_BANK_STRIDE 0x10
20462609
2047
-static void rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2048
- int pin_num, struct regmap **regmap,
2049
- int *reg, u8 *bit)
2610
+static int rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2611
+ int pin_num, struct regmap **regmap,
2612
+ int *reg, u8 *bit)
20502613 {
20512614 struct rockchip_pinctrl *info = bank->drvdata;
20522615
....@@ -2067,6 +2630,8 @@
20672630 *bit = (pin_num % RK3568_PULL_PINS_PER_REG);
20682631 *bit *= RK3568_PULL_BITS_PER_PIN;
20692632 }
2633
+
2634
+ return 0;
20702635 }
20712636
20722637 #define RK3568_DRV_PMU_OFFSET 0x70
....@@ -2075,9 +2640,9 @@
20752640 #define RK3568_DRV_PINS_PER_REG 2
20762641 #define RK3568_DRV_BANK_STRIDE 0x40
20772642
2078
-static void rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2079
- int pin_num, struct regmap **regmap,
2080
- int *reg, u8 *bit)
2643
+static int rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2644
+ int pin_num, struct regmap **regmap,
2645
+ int *reg, u8 *bit)
20812646 {
20822647 struct rockchip_pinctrl *info = bank->drvdata;
20832648
....@@ -2104,6 +2669,197 @@
21042669 ((bank->bank_num == 2 || bank->bank_num == 3 || bank->bank_num == 4) &&
21052670 (pin_num == 7 || pin_num == 15 || pin_num == 23 || pin_num == 31)))
21062671 *bit -= RK3568_DRV_BITS_PER_PIN;
2672
+
2673
+ return 0;
2674
+}
2675
+
2676
+#define RK3588_PMU1_IOC_REG (0x0000)
2677
+#define RK3588_PMU2_IOC_REG (0x4000)
2678
+#define RK3588_BUS_IOC_REG (0x8000)
2679
+#define RK3588_VCCIO1_4_IOC_REG (0x9000)
2680
+#define RK3588_VCCIO3_5_IOC_REG (0xA000)
2681
+#define RK3588_VCCIO2_IOC_REG (0xB000)
2682
+#define RK3588_VCCIO6_IOC_REG (0xC000)
2683
+#define RK3588_EMMC_IOC_REG (0xD000)
2684
+
2685
+static const u32 rk3588_ds_regs[][2] = {
2686
+ {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0010},
2687
+ {RK_GPIO0_A4, RK3588_PMU1_IOC_REG + 0x0014},
2688
+ {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0018},
2689
+ {RK_GPIO0_B4, RK3588_PMU2_IOC_REG + 0x0014},
2690
+ {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0018},
2691
+ {RK_GPIO0_C4, RK3588_PMU2_IOC_REG + 0x001C},
2692
+ {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0020},
2693
+ {RK_GPIO0_D4, RK3588_PMU2_IOC_REG + 0x0024},
2694
+ {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0020},
2695
+ {RK_GPIO1_A4, RK3588_VCCIO1_4_IOC_REG + 0x0024},
2696
+ {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0028},
2697
+ {RK_GPIO1_B4, RK3588_VCCIO1_4_IOC_REG + 0x002C},
2698
+ {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0030},
2699
+ {RK_GPIO1_C4, RK3588_VCCIO1_4_IOC_REG + 0x0034},
2700
+ {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x0038},
2701
+ {RK_GPIO1_D4, RK3588_VCCIO1_4_IOC_REG + 0x003C},
2702
+ {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0040},
2703
+ {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0044},
2704
+ {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0048},
2705
+ {RK_GPIO2_B4, RK3588_VCCIO3_5_IOC_REG + 0x004C},
2706
+ {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0050},
2707
+ {RK_GPIO2_C4, RK3588_VCCIO3_5_IOC_REG + 0x0054},
2708
+ {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x0058},
2709
+ {RK_GPIO2_D4, RK3588_EMMC_IOC_REG + 0x005C},
2710
+ {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0060},
2711
+ {RK_GPIO3_A4, RK3588_VCCIO3_5_IOC_REG + 0x0064},
2712
+ {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0068},
2713
+ {RK_GPIO3_B4, RK3588_VCCIO3_5_IOC_REG + 0x006C},
2714
+ {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0070},
2715
+ {RK_GPIO3_C4, RK3588_VCCIO3_5_IOC_REG + 0x0074},
2716
+ {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x0078},
2717
+ {RK_GPIO3_D4, RK3588_VCCIO3_5_IOC_REG + 0x007C},
2718
+ {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0080},
2719
+ {RK_GPIO4_A4, RK3588_VCCIO6_IOC_REG + 0x0084},
2720
+ {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0088},
2721
+ {RK_GPIO4_B4, RK3588_VCCIO6_IOC_REG + 0x008C},
2722
+ {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0090},
2723
+ {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0090},
2724
+ {RK_GPIO4_C4, RK3588_VCCIO3_5_IOC_REG + 0x0094},
2725
+ {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x0098},
2726
+};
2727
+
2728
+static const u32 rk3588_p_regs[][2] = {
2729
+ {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0020},
2730
+ {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0024},
2731
+ {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0028},
2732
+ {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x002C},
2733
+ {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0030},
2734
+ {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0110},
2735
+ {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0114},
2736
+ {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0118},
2737
+ {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x011C},
2738
+ {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0120},
2739
+ {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0120},
2740
+ {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0124},
2741
+ {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0128},
2742
+ {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x012C},
2743
+ {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0130},
2744
+ {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0134},
2745
+ {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0138},
2746
+ {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x013C},
2747
+ {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0140},
2748
+ {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0144},
2749
+ {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0148},
2750
+ {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0148},
2751
+ {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x014C},
2752
+};
2753
+
2754
+static const u32 rk3588_smt_regs[][2] = {
2755
+ {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0030},
2756
+ {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0034},
2757
+ {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0040},
2758
+ {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0044},
2759
+ {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0048},
2760
+ {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0210},
2761
+ {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0214},
2762
+ {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0218},
2763
+ {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x021C},
2764
+ {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0220},
2765
+ {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0220},
2766
+ {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0224},
2767
+ {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0228},
2768
+ {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x022C},
2769
+ {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0230},
2770
+ {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0234},
2771
+ {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0238},
2772
+ {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x023C},
2773
+ {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0240},
2774
+ {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0244},
2775
+ {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0248},
2776
+ {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0248},
2777
+ {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x024C},
2778
+};
2779
+
2780
+#define RK3588_PULL_BITS_PER_PIN 2
2781
+#define RK3588_PULL_PINS_PER_REG 8
2782
+
2783
+static int rk3588_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2784
+ int pin_num, struct regmap **regmap,
2785
+ int *reg, u8 *bit)
2786
+{
2787
+ struct rockchip_pinctrl *info = bank->drvdata;
2788
+ u8 bank_num = bank->bank_num;
2789
+ u32 pin = bank_num * 32 + pin_num;
2790
+ int i;
2791
+
2792
+ for (i = ARRAY_SIZE(rk3588_p_regs) - 1; i >= 0; i--) {
2793
+ if (pin >= rk3588_p_regs[i][0]) {
2794
+ *reg = rk3588_p_regs[i][1];
2795
+ break;
2796
+ }
2797
+ BUG_ON(i == 0);
2798
+ }
2799
+
2800
+ *regmap = info->regmap_base;
2801
+ *reg += ((pin - rk3588_p_regs[i][0]) / RK3588_PULL_PINS_PER_REG) * 4;
2802
+ *bit = pin_num % RK3588_PULL_PINS_PER_REG;
2803
+ *bit *= RK3588_PULL_BITS_PER_PIN;
2804
+
2805
+ return 0;
2806
+}
2807
+
2808
+#define RK3588_DRV_BITS_PER_PIN 4
2809
+#define RK3588_DRV_PINS_PER_REG 4
2810
+
2811
+static int rk3588_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2812
+ int pin_num, struct regmap **regmap,
2813
+ int *reg, u8 *bit)
2814
+{
2815
+ struct rockchip_pinctrl *info = bank->drvdata;
2816
+ u8 bank_num = bank->bank_num;
2817
+ u32 pin = bank_num * 32 + pin_num;
2818
+ int i;
2819
+
2820
+ for (i = ARRAY_SIZE(rk3588_ds_regs) - 1; i >= 0; i--) {
2821
+ if (pin >= rk3588_ds_regs[i][0]) {
2822
+ *reg = rk3588_ds_regs[i][1];
2823
+ break;
2824
+ }
2825
+ BUG_ON(i == 0);
2826
+ }
2827
+
2828
+ *regmap = info->regmap_base;
2829
+ *reg += ((pin - rk3588_ds_regs[i][0]) / RK3588_DRV_PINS_PER_REG) * 4;
2830
+ *bit = pin_num % RK3588_DRV_PINS_PER_REG;
2831
+ *bit *= RK3588_DRV_BITS_PER_PIN;
2832
+
2833
+ return 0;
2834
+}
2835
+
2836
+#define RK3588_SMT_BITS_PER_PIN 1
2837
+#define RK3588_SMT_PINS_PER_REG 8
2838
+
2839
+static int rk3588_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2840
+ int pin_num,
2841
+ struct regmap **regmap,
2842
+ int *reg, u8 *bit)
2843
+{
2844
+ struct rockchip_pinctrl *info = bank->drvdata;
2845
+ u8 bank_num = bank->bank_num;
2846
+ u32 pin = bank_num * 32 + pin_num;
2847
+ int i;
2848
+
2849
+ for (i = ARRAY_SIZE(rk3588_smt_regs) - 1; i >= 0; i--) {
2850
+ if (pin >= rk3588_smt_regs[i][0]) {
2851
+ *reg = rk3588_smt_regs[i][1];
2852
+ break;
2853
+ }
2854
+ BUG_ON(i == 0);
2855
+ }
2856
+
2857
+ *regmap = info->regmap_base;
2858
+ *reg += ((pin - rk3588_smt_regs[i][0]) / RK3588_SMT_PINS_PER_REG) * 4;
2859
+ *bit = pin_num % RK3588_SMT_PINS_PER_REG;
2860
+ *bit *= RK3588_SMT_BITS_PER_PIN;
2861
+
2862
+ return 0;
21072863 }
21082864
21092865 static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
....@@ -2120,13 +2876,16 @@
21202876 {
21212877 struct rockchip_pinctrl *info = bank->drvdata;
21222878 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2879
+ struct device *dev = info->dev;
21232880 struct regmap *regmap;
21242881 int reg, ret;
21252882 u32 data, temp, rmask_bits;
21262883 u8 bit;
21272884 int drv_type = bank->drv[pin_num / 8].drv_type;
21282885
2129
- ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2886
+ ret = ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2887
+ if (ret)
2888
+ return ret;
21302889
21312890 switch (drv_type) {
21322891 case DRV_TYPE_IO_1V8_3V0_AUTO:
....@@ -2165,7 +2924,7 @@
21652924 bit -= 16;
21662925 break;
21672926 default:
2168
- dev_err(info->dev, "unsupported bit: %d for pinctrl drive type: %d\n",
2927
+ dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
21692928 bit, drv_type);
21702929 return -EINVAL;
21712930 }
....@@ -2178,8 +2937,7 @@
21782937 rmask_bits = RK3288_DRV_BITS_PER_PIN;
21792938 break;
21802939 default:
2181
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2182
- drv_type);
2940
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
21832941 return -EINVAL;
21842942 }
21852943
....@@ -2212,21 +2970,28 @@
22122970 {
22132971 struct rockchip_pinctrl *info = bank->drvdata;
22142972 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2973
+ struct device *dev = info->dev;
22152974 struct regmap *regmap;
22162975 int reg, ret, i, err;
22172976 u32 data, rmask, rmask_bits, temp;
22182977 u8 bit;
22192978 int drv_type = bank->drv[pin_num / 8].drv_type;
22202979
2221
- dev_dbg(info->dev, "setting drive of GPIO%d-%d to %d\n",
2980
+ dev_dbg(dev, "setting drive of GPIO%d-%d to %d\n",
22222981 bank->bank_num, pin_num, strength);
22232982
2224
- ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2225
- if (ctrl->type == RV1126) {
2983
+ ret = ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2984
+ if (ret)
2985
+ return ret;
2986
+
2987
+ if (ctrl->type == RV1126 || ctrl->type == RK3588) {
22262988 rmask_bits = RV1126_DRV_BITS_PER_PIN;
22272989 ret = strength;
22282990 goto config;
2229
- } else if (ctrl->type == RK3568) {
2991
+ } else if (ctrl->type == RV1106 ||
2992
+ ctrl->type == RK3528 ||
2993
+ ctrl->type == RK3562 ||
2994
+ ctrl->type == RK3568) {
22302995 rmask_bits = RK3568_DRV_BITS_PER_PIN;
22312996 ret = (1 << (strength + 1)) - 1;
22322997 goto config;
....@@ -2244,8 +3009,7 @@
22443009 }
22453010
22463011 if (ret < 0) {
2247
- dev_err(info->dev, "unsupported driver strength %d\n",
2248
- strength);
3012
+ dev_err(dev, "unsupported driver strength %d\n", strength);
22493013 return ret;
22503014 }
22513015
....@@ -2284,7 +3048,7 @@
22843048 bit -= 16;
22853049 break;
22863050 default:
2287
- dev_err(info->dev, "unsupported bit: %d for pinctrl drive type: %d\n",
3051
+ dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
22883052 bit, drv_type);
22893053 return -EINVAL;
22903054 }
....@@ -2296,8 +3060,7 @@
22963060 rmask_bits = RK3288_DRV_BITS_PER_PIN;
22973061 break;
22983062 default:
2299
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2300
- drv_type);
3063
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
23013064 return -EINVAL;
23023065 }
23033066
....@@ -2366,6 +3129,7 @@
23663129 {
23673130 struct rockchip_pinctrl *info = bank->drvdata;
23683131 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3132
+ struct device *dev = info->dev;
23693133 struct regmap *regmap;
23703134 int reg, ret, pull_type;
23713135 u8 bit;
....@@ -2375,7 +3139,9 @@
23753139 if (ctrl->type == RK3066B)
23763140 return PIN_CONFIG_BIAS_DISABLE;
23773141
2378
- ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3142
+ ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3143
+ if (ret)
3144
+ return ret;
23793145
23803146 ret = regmap_read(regmap, reg, &data);
23813147 if (ret)
....@@ -2388,6 +3154,7 @@
23883154 ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
23893155 : PIN_CONFIG_BIAS_DISABLE;
23903156 case PX30:
3157
+ case RV1106:
23913158 case RV1108:
23923159 case RV1126:
23933160 case RK1808:
....@@ -2396,14 +3163,17 @@
23963163 case RK3308:
23973164 case RK3368:
23983165 case RK3399:
3166
+ case RK3528:
3167
+ case RK3562:
23993168 case RK3568:
3169
+ case RK3588:
24003170 pull_type = bank->pull_type[pin_num / 8];
24013171 data >>= bit;
24023172 data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
24033173
24043174 return rockchip_pull_list[pull_type][data];
24053175 default:
2406
- dev_err(info->dev, "unsupported pinctrl type\n");
3176
+ dev_err(dev, "unsupported pinctrl type\n");
24073177 return -EINVAL;
24083178 };
24093179 }
....@@ -2413,19 +3183,21 @@
24133183 {
24143184 struct rockchip_pinctrl *info = bank->drvdata;
24153185 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3186
+ struct device *dev = info->dev;
24163187 struct regmap *regmap;
24173188 int reg, ret, i, pull_type;
24183189 u8 bit;
24193190 u32 data, rmask;
24203191
2421
- dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n",
2422
- bank->bank_num, pin_num, pull);
3192
+ dev_dbg(dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull);
24233193
24243194 /* rk3066b does support any pulls */
24253195 if (ctrl->type == RK3066B)
24263196 return pull ? -EINVAL : 0;
24273197
2428
- ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3198
+ ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3199
+ if (ret)
3200
+ return ret;
24293201
24303202 switch (ctrl->type) {
24313203 case RK2928:
....@@ -2436,6 +3208,7 @@
24363208 ret = regmap_write(regmap, reg, data);
24373209 break;
24383210 case PX30:
3211
+ case RV1106:
24393212 case RV1108:
24403213 case RV1126:
24413214 case RK1808:
....@@ -2444,7 +3217,10 @@
24443217 case RK3308:
24453218 case RK3368:
24463219 case RK3399:
3220
+ case RK3528:
3221
+ case RK3562:
24473222 case RK3568:
3223
+ case RK3588:
24483224 pull_type = bank->pull_type[pin_num / 8];
24493225 ret = -EINVAL;
24503226 for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
....@@ -2455,7 +3231,7 @@
24553231 }
24563232 }
24573233 /*
2458
- * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6,
3234
+ * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
24593235 * where that pull up value becomes 3.
24603236 */
24613237 if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
....@@ -2464,8 +3240,7 @@
24643240 }
24653241
24663242 if (ret < 0) {
2467
- dev_err(info->dev, "unsupported pull setting %d\n",
2468
- pull);
3243
+ dev_err(dev, "unsupported pull setting %d\n", pull);
24693244 return ret;
24703245 }
24713246
....@@ -2477,32 +3252,11 @@
24773252 ret = regmap_update_bits(regmap, reg, rmask, data);
24783253 break;
24793254 default:
2480
- dev_err(info->dev, "unsupported pinctrl type\n");
3255
+ dev_err(dev, "unsupported pinctrl type\n");
24813256 return -EINVAL;
24823257 }
24833258
24843259 return ret;
2485
-}
2486
-
2487
-#define RK3308_SCHMITT_PINS_PER_REG 8
2488
-#define RK3308_SCHMITT_BANK_STRIDE 16
2489
-#define RK3308_SCHMITT_GRF_OFFSET 0x1a0
2490
-
2491
-static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2492
- int pin_num,
2493
- struct regmap **regmap,
2494
- int *reg, u8 *bit)
2495
-{
2496
- struct rockchip_pinctrl *info = bank->drvdata;
2497
-
2498
- *regmap = info->regmap_base;
2499
- *reg = RK3308_SCHMITT_GRF_OFFSET;
2500
-
2501
- *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2502
- *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2503
- *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2504
-
2505
- return 0;
25063260 }
25073261
25083262 #define RK3328_SCHMITT_BITS_PER_PIN 1
....@@ -2575,6 +3329,7 @@
25753329
25763330 data >>= bit;
25773331 switch (ctrl->type) {
3332
+ case RK3562:
25783333 case RK3568:
25793334 return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
25803335 default:
....@@ -2589,12 +3344,13 @@
25893344 {
25903345 struct rockchip_pinctrl *info = bank->drvdata;
25913346 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3347
+ struct device *dev = info->dev;
25923348 struct regmap *regmap;
25933349 int reg, ret;
25943350 u8 bit;
25953351 u32 data, rmask;
25963352
2597
- dev_dbg(info->dev, "setting input schmitt of GPIO%d-%d to %d\n",
3353
+ dev_dbg(dev, "setting input schmitt of GPIO%d-%d to %d\n",
25983354 bank->bank_num, pin_num, enable);
25993355
26003356 ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
....@@ -2603,6 +3359,7 @@
26033359
26043360 /* enable the write to the equivalent lower bits */
26053361 switch (ctrl->type) {
3362
+ case RK3562:
26063363 case RK3568:
26073364 data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
26083365 rmask = data | (data >> 16);
....@@ -2737,10 +3494,11 @@
27373494 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
27383495 const unsigned int *pins = info->groups[group].pins;
27393496 const struct rockchip_pin_config *data = info->groups[group].data;
3497
+ struct device *dev = info->dev;
27403498 struct rockchip_pin_bank *bank;
27413499 int cnt, ret = 0;
27423500
2743
- dev_dbg(info->dev, "enable function %s group %s\n",
3501
+ dev_dbg(dev, "enable function %s group %s\n",
27443502 info->functions[selector].name, info->groups[group].name);
27453503
27463504 /*
....@@ -2788,6 +3546,7 @@
27883546 case RK3066B:
27893547 return pull ? false : true;
27903548 case PX30:
3549
+ case RV1106:
27913550 case RV1108:
27923551 case RV1126:
27933552 case RK1808:
....@@ -2796,11 +3555,32 @@
27963555 case RK3308:
27973556 case RK3368:
27983557 case RK3399:
3558
+ case RK3528:
3559
+ case RK3562:
27993560 case RK3568:
3561
+ case RK3588:
28003562 return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
28013563 }
28023564
28033565 return false;
3566
+}
3567
+
3568
+static int rockchip_pinconf_defer_pin(struct rockchip_pin_bank *bank,
3569
+ unsigned int pin, u32 param, u32 arg)
3570
+{
3571
+ struct rockchip_pin_deferred *cfg;
3572
+
3573
+ cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
3574
+ if (!cfg)
3575
+ return -ENOMEM;
3576
+
3577
+ cfg->pin = pin;
3578
+ cfg->param = param;
3579
+ cfg->arg = arg;
3580
+
3581
+ list_add_tail(&cfg->head, &bank->deferred_pins);
3582
+
3583
+ return 0;
28043584 }
28053585
28063586 /* set the pin config settings for a specified pin */
....@@ -2818,6 +3598,25 @@
28183598 for (i = 0; i < num_configs; i++) {
28193599 param = pinconf_to_config_param(configs[i]);
28203600 arg = pinconf_to_config_argument(configs[i]);
3601
+
3602
+ if (param == PIN_CONFIG_OUTPUT || param == PIN_CONFIG_INPUT_ENABLE) {
3603
+ /*
3604
+ * Check for gpio driver not being probed yet.
3605
+ * The lock makes sure that either gpio-probe has completed
3606
+ * or the gpio driver hasn't probed yet.
3607
+ */
3608
+ mutex_lock(&bank->deferred_lock);
3609
+ if (!gpio || !gpio->direction_output) {
3610
+ rc = rockchip_pinconf_defer_pin(bank, pin - bank->pin_base, param,
3611
+ arg);
3612
+ mutex_unlock(&bank->deferred_lock);
3613
+ if (rc)
3614
+ return rc;
3615
+
3616
+ break;
3617
+ }
3618
+ mutex_unlock(&bank->deferred_lock);
3619
+ }
28213620
28223621 switch (param) {
28233622 case PIN_CONFIG_BIAS_DISABLE:
....@@ -2844,10 +3643,8 @@
28443643 case PIN_CONFIG_OUTPUT:
28453644 rc = rockchip_set_mux(bank, pin - bank->pin_base,
28463645 RK_FUNC_GPIO);
2847
- if (rc != RK_FUNC_GPIO) {
2848
- dev_err(info->dev, "pin-%d fail to mux to gpio, %d\n", pin, rc);
3646
+ if (rc != RK_FUNC_GPIO)
28493647 return -EINVAL;
2850
- }
28513648
28523649 rc = gpio->direction_output(gpio, pin - bank->pin_base,
28533650 arg);
....@@ -2932,13 +3729,13 @@
29323729 break;
29333730 case PIN_CONFIG_OUTPUT:
29343731 rc = rockchip_get_mux(bank, pin - bank->pin_base);
2935
- if (rc != 0)
3732
+ if (rc != RK_FUNC_GPIO)
29363733 return -EINVAL;
29373734
2938
- /* 0 for output, 1 for input */
2939
- rc = gpio->get_direction(gpio, pin - bank->pin_base);
2940
- if (rc)
2941
- return -EINVAL;
3735
+ if (!gpio || !gpio->get) {
3736
+ arg = 0;
3737
+ break;
3738
+ }
29423739
29433740 rc = gpio->get(gpio, pin - bank->pin_base);
29443741 if (rc < 0)
....@@ -2998,24 +3795,13 @@
29983795 {},
29993796 };
30003797
3001
-static bool is_function_node(const struct device_node *np)
3002
-{
3003
- if (of_match_node(rockchip_bank_match, np))
3004
- return false;
3005
-
3006
- if (!strncmp(np->name, "pcfg", 4))
3007
- return false;
3008
-
3009
- return true;
3010
-}
3011
-
30123798 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
30133799 struct device_node *np)
30143800 {
30153801 struct device_node *child;
30163802
30173803 for_each_child_of_node(np, child) {
3018
- if (!is_function_node(child))
3804
+ if (of_match_node(rockchip_bank_match, child))
30193805 continue;
30203806
30213807 info->nfunctions++;
....@@ -3028,6 +3814,7 @@
30283814 struct rockchip_pinctrl *info,
30293815 u32 index)
30303816 {
3817
+ struct device *dev = info->dev;
30313818 struct rockchip_pin_bank *bank;
30323819 int size;
30333820 const __be32 *list;
....@@ -3035,7 +3822,7 @@
30353822 int i, j;
30363823 int ret;
30373824
3038
- dev_dbg(info->dev, "group(%d): %pOFn\n", index, np);
3825
+ dev_dbg(dev, "group(%d): %pOFn\n", index, np);
30393826
30403827 /* Initialise group */
30413828 grp->name = np->name;
....@@ -3047,19 +3834,13 @@
30473834 list = of_get_property(np, "rockchip,pins", &size);
30483835 /* we do not check return since it's safe node passed down */
30493836 size /= sizeof(*list);
3050
- if (!size || size % 4) {
3051
- dev_err(info->dev, "wrong pins number or pins and configs should be by 4\n");
3052
- return -EINVAL;
3053
- }
3837
+ if (!size || size % 4)
3838
+ return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
30543839
30553840 grp->npins = size / 4;
30563841
3057
- grp->pins = devm_kcalloc(info->dev, grp->npins, sizeof(unsigned int),
3058
- GFP_KERNEL);
3059
- grp->data = devm_kcalloc(info->dev,
3060
- grp->npins,
3061
- sizeof(struct rockchip_pin_config),
3062
- GFP_KERNEL);
3842
+ grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
3843
+ grp->data = devm_kcalloc(dev, grp->npins, sizeof(*grp->data), GFP_KERNEL);
30633844 if (!grp->pins || !grp->data)
30643845 return -ENOMEM;
30653846
....@@ -3093,6 +3874,7 @@
30933874 struct rockchip_pinctrl *info,
30943875 u32 index)
30953876 {
3877
+ struct device *dev = info->dev;
30963878 struct device_node *child;
30973879 struct rockchip_pmx_func *func;
30983880 struct rockchip_pin_group *grp;
....@@ -3100,7 +3882,7 @@
31003882 static u32 grp_index;
31013883 u32 i = 0;
31023884
3103
- dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np);
3885
+ dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
31043886
31053887 func = &info->functions[index];
31063888
....@@ -3110,8 +3892,7 @@
31103892 if (func->ngroups <= 0)
31113893 return 0;
31123894
3113
- func->groups = devm_kcalloc(info->dev,
3114
- func->ngroups, sizeof(char *), GFP_KERNEL);
3895
+ func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
31153896 if (!func->groups)
31163897 return -ENOMEM;
31173898
....@@ -3139,32 +3920,26 @@
31393920
31403921 rockchip_pinctrl_child_count(info, np);
31413922
3142
- dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions);
3143
- dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups);
3923
+ dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
3924
+ dev_dbg(dev, "ngroups = %d\n", info->ngroups);
31443925
3145
- info->functions = devm_kcalloc(dev,
3146
- info->nfunctions,
3147
- sizeof(struct rockchip_pmx_func),
3148
- GFP_KERNEL);
3926
+ info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
31493927 if (!info->functions)
31503928 return -ENOMEM;
31513929
3152
- info->groups = devm_kcalloc(dev,
3153
- info->ngroups,
3154
- sizeof(struct rockchip_pin_group),
3155
- GFP_KERNEL);
3930
+ info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
31563931 if (!info->groups)
31573932 return -ENOMEM;
31583933
31593934 i = 0;
31603935
31613936 for_each_child_of_node(np, child) {
3162
- if (!is_function_node(child))
3937
+ if (of_match_node(rockchip_bank_match, child))
31633938 continue;
31643939
31653940 ret = rockchip_pinctrl_parse_functions(child, info, i++);
31663941 if (ret) {
3167
- dev_err(&pdev->dev, "failed to parse function\n");
3942
+ dev_err(dev, "failed to parse function\n");
31683943 of_node_put(child);
31693944 return ret;
31703945 }
....@@ -3179,6 +3954,7 @@
31793954 struct pinctrl_desc *ctrldesc = &info->pctl;
31803955 struct pinctrl_pin_desc *pindesc, *pdesc;
31813956 struct rockchip_pin_bank *pin_bank;
3957
+ struct device *dev = &pdev->dev;
31823958 int pin, bank, ret;
31833959 int k;
31843960
....@@ -3188,9 +3964,7 @@
31883964 ctrldesc->pmxops = &rockchip_pmx_ops;
31893965 ctrldesc->confops = &rockchip_pinconf_ops;
31903966
3191
- pindesc = devm_kcalloc(&pdev->dev,
3192
- info->ctrl->nr_pins, sizeof(*pindesc),
3193
- GFP_KERNEL);
3967
+ pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
31943968 if (!pindesc)
31953969 return -ENOMEM;
31963970
....@@ -3206,41 +3980,24 @@
32063980 pin_bank->name, pin);
32073981 pdesc++;
32083982 }
3983
+
3984
+ INIT_LIST_HEAD(&pin_bank->deferred_pins);
3985
+ mutex_init(&pin_bank->deferred_lock);
32093986 }
32103987
32113988 ret = rockchip_pinctrl_parse_dt(pdev, info);
32123989 if (ret)
32133990 return ret;
32143991
3215
- info->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc, info);
3216
- if (IS_ERR(info->pctl_dev)) {
3217
- dev_err(&pdev->dev, "could not register pinctrl driver\n");
3218
- return PTR_ERR(info->pctl_dev);
3219
- }
3992
+ info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
3993
+ if (IS_ERR(info->pctl_dev))
3994
+ return dev_err_probe(dev, PTR_ERR(info->pctl_dev), "could not register pinctrl driver\n");
32203995
32213996 return 0;
32223997 }
32233998
32243999 static const struct of_device_id rockchip_pinctrl_dt_match[];
3225
-
3226
-/* Ctrl data specially handle */
3227
-static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl)
3228
-{
3229
- /*
3230
- * Special for rk3308b, where we need to replace the recalced
3231
- * and routed arrays.
3232
- */
3233
- if (soc_is_rk3308b()) {
3234
- ctrl->iomux_recalced = rk3308b_mux_recalced_data;
3235
- ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data);
3236
- ctrl->iomux_routes = rk3308b_mux_route_data;
3237
- ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data);
3238
-
3239
- }
3240
-
3241
- return 0;
3242
-}
3243
-
4000
+static struct rockchip_pin_bank rk3308bs_pin_banks[];
32444001 static struct rockchip_pin_bank px30s_pin_banks[];
32454002
32464003 /* retrieve the soc specific data */
....@@ -3248,22 +4005,19 @@
32484005 struct rockchip_pinctrl *d,
32494006 struct platform_device *pdev)
32504007 {
4008
+ struct device *dev = &pdev->dev;
4009
+ struct device_node *node = dev->of_node;
32514010 const struct of_device_id *match;
3252
- struct device_node *node = pdev->dev.of_node;
32534011 struct rockchip_pin_ctrl *ctrl;
32544012 struct rockchip_pin_bank *bank;
32554013 int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
32564014
32574015 match = of_match_node(rockchip_pinctrl_dt_match, node);
32584016 ctrl = (struct rockchip_pin_ctrl *)match->data;
4017
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && soc_is_rk3308bs())
4018
+ ctrl->pin_banks = rk3308bs_pin_banks;
32594019 if (IS_ENABLED(CONFIG_CPU_PX30) && soc_is_px30s())
32604020 ctrl->pin_banks = px30s_pin_banks;
3261
-
3262
- /* Ctrl data re-initialize for some Socs */
3263
- if (ctrl->ctrl_data_re_init) {
3264
- if (ctrl->ctrl_data_re_init(ctrl))
3265
- return NULL;
3266
- }
32674021
32684022 grf_offs = ctrl->grf_mux_offset;
32694023 pmu_offs = ctrl->pmu_mux_offset;
....@@ -3310,7 +4064,7 @@
33104064 drv_pmu_offs : drv_grf_offs;
33114065 }
33124066
3313
- dev_dbg(d->dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
4067
+ dev_dbg(dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
33144068 i, j, iom->offset, drv->offset);
33154069
33164070 /*
....@@ -3417,60 +4171,56 @@
34174171
34184172 /* SoC data specially handle */
34194173
3420
-/* rk3308b SoC data initialize */
3421
-#define RK3308B_GRF_SOC_CON13 0x608
3422
-#define RK3308B_GRF_SOC_CON15 0x610
4174
+/* rk3308 SoC data initialize */
4175
+#define RK3308_GRF_SOC_CON13 0x608
4176
+#define RK3308_GRF_SOC_CON15 0x610
34234177
3424
-/* RK3308B_GRF_SOC_CON13 */
3425
-#define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
3426
-#define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
3427
-#define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
4178
+/* RK3308_GRF_SOC_CON13 */
4179
+#define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
4180
+#define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4181
+#define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
34284182
3429
-/* RK3308B_GRF_SOC_CON15 */
3430
-#define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
3431
-#define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
3432
-#define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
4183
+/* RK3308_GRF_SOC_CON15 */
4184
+#define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
4185
+#define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4186
+#define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
34334187
3434
-static int rk3308b_soc_data_init(struct rockchip_pinctrl *info)
4188
+static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
34354189 {
34364190 int ret;
34374191
34384192 /*
34394193 * Enable the special ctrl of selected sources.
34404194 */
3441
- if (soc_is_rk3308b()) {
3442
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON13,
3443
- RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3444
- RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3445
- RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3446
- if (ret)
3447
- return ret;
34484195
3449
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON15,
3450
- RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3451
- RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3452
- RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3453
- if (ret)
3454
- return ret;
3455
- }
4196
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13,
4197
+ RK3308_GRF_I2C3_IOFUNC_SRC_CTRL |
4198
+ RK3308_GRF_GPIO2A3_SEL_SRC_CTRL |
4199
+ RK3308_GRF_GPIO2A2_SEL_SRC_CTRL);
4200
+ if (ret)
4201
+ return ret;
34564202
3457
- return 0;
4203
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15,
4204
+ RK3308_GRF_GPIO2C0_SEL_SRC_CTRL |
4205
+ RK3308_GRF_GPIO3B3_SEL_SRC_CTRL |
4206
+ RK3308_GRF_GPIO3B2_SEL_SRC_CTRL);
4207
+
4208
+ return ret;
4209
+
34584210 }
34594211
34604212 static int rockchip_pinctrl_probe(struct platform_device *pdev)
34614213 {
34624214 struct rockchip_pinctrl *info;
34634215 struct device *dev = &pdev->dev;
4216
+ struct device_node *np = dev->of_node, *node;
34644217 struct rockchip_pin_ctrl *ctrl;
3465
- struct device_node *np = pdev->dev.of_node, *node;
34664218 struct resource *res;
34674219 void __iomem *base;
34684220 int ret;
34694221
3470
- if (!dev->of_node) {
3471
- dev_err(dev, "device tree node not found\n");
3472
- return -ENODEV;
3473
- }
4222
+ if (!dev->of_node)
4223
+ return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
34744224
34754225 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
34764226 if (!info)
....@@ -3479,44 +4229,39 @@
34794229 info->dev = dev;
34804230
34814231 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
3482
- if (!ctrl) {
3483
- dev_err(dev, "driver data not available\n");
3484
- return -EINVAL;
3485
- }
4232
+ if (!ctrl)
4233
+ return dev_err_probe(dev, -EINVAL, "driver data not available\n");
34864234 info->ctrl = ctrl;
34874235
34884236 node = of_parse_phandle(np, "rockchip,grf", 0);
34894237 if (node) {
34904238 info->regmap_base = syscon_node_to_regmap(node);
4239
+ of_node_put(node);
34914240 if (IS_ERR(info->regmap_base))
34924241 return PTR_ERR(info->regmap_base);
34934242 } else {
3494
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3495
- base = devm_ioremap_resource(&pdev->dev, res);
4243
+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
34964244 if (IS_ERR(base))
34974245 return PTR_ERR(base);
34984246
34994247 rockchip_regmap_config.max_register = resource_size(res) - 4;
35004248 rockchip_regmap_config.name = "rockchip,pinctrl";
3501
- info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base,
3502
- &rockchip_regmap_config);
4249
+ info->regmap_base =
4250
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
35034251
35044252 /* to check for the old dt-bindings */
35054253 info->reg_size = resource_size(res);
35064254
35074255 /* Honor the old binding, with pull registers as 2nd resource */
35084256 if (ctrl->type == RK3188 && info->reg_size < 0x200) {
3509
- res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
3510
- base = devm_ioremap_resource(&pdev->dev, res);
4257
+ base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
35114258 if (IS_ERR(base))
35124259 return PTR_ERR(base);
35134260
3514
- rockchip_regmap_config.max_register =
3515
- resource_size(res) - 4;
4261
+ rockchip_regmap_config.max_register = resource_size(res) - 4;
35164262 rockchip_regmap_config.name = "rockchip,pinctrl-pull";
3517
- info->regmap_pull = devm_regmap_init_mmio(&pdev->dev,
3518
- base,
3519
- &rockchip_regmap_config);
4263
+ info->regmap_pull =
4264
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
35204265 }
35214266 }
35224267
....@@ -3524,13 +4269,13 @@
35244269 node = of_parse_phandle(np, "rockchip,pmu", 0);
35254270 if (node) {
35264271 info->regmap_pmu = syscon_node_to_regmap(node);
4272
+ of_node_put(node);
35274273 if (IS_ERR(info->regmap_pmu))
35284274 return PTR_ERR(info->regmap_pmu);
35294275 }
35304276
3531
- /* Special handle for some Socs */
3532
- if (ctrl->soc_data_init) {
3533
- ret = ctrl->soc_data_init(info);
4277
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
4278
+ ret = rk3308_soc_data_init(info);
35344279 if (ret)
35354280 return ret;
35364281 }
....@@ -3540,16 +4285,49 @@
35404285 return ret;
35414286
35424287 platform_set_drvdata(pdev, info);
4288
+ g_pctldev = info->pctl_dev;
35434289
3544
- ret = of_platform_populate(np, rockchip_bank_match, NULL, NULL);
3545
- if (ret) {
3546
- dev_err(&pdev->dev, "failed to register gpio device\n");
3547
- return ret;
3548
- }
4290
+ ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
4291
+ if (ret)
4292
+ return dev_err_probe(dev, ret, "failed to register gpio device\n");
4293
+
35494294 dev_info(dev, "probed %s\n", dev_name(dev));
35504295
35514296 return 0;
35524297 }
4298
+
4299
+static int rockchip_pinctrl_remove(struct platform_device *pdev)
4300
+{
4301
+ struct rockchip_pinctrl *info = platform_get_drvdata(pdev);
4302
+ struct rockchip_pin_bank *bank;
4303
+ struct rockchip_pin_deferred *cfg;
4304
+ int i;
4305
+
4306
+ g_pctldev = NULL;
4307
+ of_platform_depopulate(&pdev->dev);
4308
+
4309
+ for (i = 0; i < info->ctrl->nr_banks; i++) {
4310
+ bank = &info->ctrl->pin_banks[i];
4311
+
4312
+ mutex_lock(&bank->deferred_lock);
4313
+ while (!list_empty(&bank->deferred_pins)) {
4314
+ cfg = list_first_entry(&bank->deferred_pins,
4315
+ struct rockchip_pin_deferred, head);
4316
+ list_del(&cfg->head);
4317
+ kfree(cfg);
4318
+ }
4319
+ mutex_unlock(&bank->deferred_lock);
4320
+ }
4321
+
4322
+ return 0;
4323
+}
4324
+
4325
+static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
4326
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
4327
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4328
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4329
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4330
+};
35534331
35544332 static struct rockchip_pin_bank px30_pin_banks[] = {
35554333 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
....@@ -3574,13 +4352,6 @@
35744352 ),
35754353 };
35764354
3577
-static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
3578
- PX30S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
3579
- PX30S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3580
- PX30S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3581
- PX30S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3582
-};
3583
-
35844355 static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
35854356 .pin_banks = px30_pin_banks,
35864357 .nr_banks = ARRAY_SIZE(px30_pin_banks),
....@@ -3594,6 +4365,48 @@
35944365 .drv_calc_reg = px30_calc_drv_reg_and_bit,
35954366 .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
35964367 .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit,
4368
+};
4369
+
4370
+static struct rockchip_pin_bank rv1106_pin_banks[] = {
4371
+ PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
4372
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4373
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4374
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4375
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU),
4376
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4377
+ IOMUX_WIDTH_4BIT,
4378
+ IOMUX_WIDTH_4BIT,
4379
+ IOMUX_WIDTH_4BIT,
4380
+ IOMUX_WIDTH_4BIT,
4381
+ 0, 0x08, 0x10, 0x18),
4382
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4383
+ IOMUX_WIDTH_4BIT,
4384
+ IOMUX_WIDTH_4BIT,
4385
+ IOMUX_WIDTH_4BIT,
4386
+ IOMUX_WIDTH_4BIT,
4387
+ 0x10020, 0x10028, 0, 0),
4388
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4389
+ IOMUX_WIDTH_4BIT,
4390
+ IOMUX_WIDTH_4BIT,
4391
+ IOMUX_WIDTH_4BIT,
4392
+ IOMUX_WIDTH_4BIT,
4393
+ 0x20040, 0x20048, 0x20050, 0x20058),
4394
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 24, "gpio4",
4395
+ IOMUX_WIDTH_4BIT,
4396
+ IOMUX_WIDTH_4BIT,
4397
+ IOMUX_WIDTH_4BIT,
4398
+ 0,
4399
+ 0x30000, 0x30008, 0x30010, 0),
4400
+};
4401
+
4402
+static struct rockchip_pin_ctrl rv1106_pin_ctrl __maybe_unused = {
4403
+ .pin_banks = rv1106_pin_banks,
4404
+ .nr_banks = ARRAY_SIZE(rv1106_pin_banks),
4405
+ .label = "RV1106-GPIO",
4406
+ .type = RV1106,
4407
+ .pull_calc_reg = rv1106_calc_pull_reg_and_bit,
4408
+ .drv_calc_reg = rv1106_calc_drv_reg_and_bit,
4409
+ .schmitt_calc_reg = rv1106_calc_schmitt_reg_and_bit,
35974410 };
35984411
35994412 static struct rockchip_pin_bank rv1108_pin_banks[] = {
....@@ -3866,6 +4679,14 @@
38664679 .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
38674680 };
38684681
4682
+static struct rockchip_pin_bank rk3308bs_pin_banks[] __maybe_unused = {
4683
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4684
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4685
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4686
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4687
+ S_PIN_BANK_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4688
+};
4689
+
38694690 static struct rockchip_pin_bank rk3308_pin_banks[] = {
38704691 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
38714692 IOMUX_WIDTH_2BIT,
....@@ -3899,11 +4720,10 @@
38994720 .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
39004721 .iomux_routes = rk3308_mux_route_data,
39014722 .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data),
3902
- .ctrl_data_re_init = rk3308b_ctrl_data_re_init,
3903
- .soc_data_init = rk3308b_soc_data_init,
39044723 .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
39054724 .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
39064725 .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
4726
+ .slew_rate_calc_reg = rk3308_calc_slew_rate_reg_and_bit,
39074727 };
39084728
39094729 static struct rockchip_pin_bank rk3328_pin_banks[] = {
....@@ -4025,6 +4845,92 @@
40254845 .drv_calc_reg = rk3399_calc_drv_reg_and_bit,
40264846 };
40274847
4848
+static struct rockchip_pin_bank rk3528_pin_banks[] = {
4849
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4850
+ IOMUX_WIDTH_4BIT,
4851
+ IOMUX_WIDTH_4BIT,
4852
+ IOMUX_WIDTH_4BIT,
4853
+ IOMUX_WIDTH_4BIT,
4854
+ 0, 0, 0, 0),
4855
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4856
+ IOMUX_WIDTH_4BIT,
4857
+ IOMUX_WIDTH_4BIT,
4858
+ IOMUX_WIDTH_4BIT,
4859
+ IOMUX_WIDTH_4BIT,
4860
+ 0x20020, 0x20028, 0x20030, 0x20038),
4861
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4862
+ IOMUX_WIDTH_4BIT,
4863
+ IOMUX_WIDTH_4BIT,
4864
+ IOMUX_WIDTH_4BIT,
4865
+ IOMUX_WIDTH_4BIT,
4866
+ 0x30040, 0, 0, 0),
4867
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4868
+ IOMUX_WIDTH_4BIT,
4869
+ IOMUX_WIDTH_4BIT,
4870
+ IOMUX_WIDTH_4BIT,
4871
+ IOMUX_WIDTH_4BIT,
4872
+ 0x20060, 0x20068, 0x20070, 0),
4873
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4",
4874
+ IOMUX_WIDTH_4BIT,
4875
+ IOMUX_WIDTH_4BIT,
4876
+ IOMUX_WIDTH_4BIT,
4877
+ IOMUX_WIDTH_4BIT,
4878
+ 0x10080, 0x10088, 0x10090, 0x10098),
4879
+};
4880
+
4881
+static struct rockchip_pin_ctrl rk3528_pin_ctrl __maybe_unused = {
4882
+ .pin_banks = rk3528_pin_banks,
4883
+ .nr_banks = ARRAY_SIZE(rk3528_pin_banks),
4884
+ .label = "RK3528-GPIO",
4885
+ .type = RK3528,
4886
+ .pull_calc_reg = rk3528_calc_pull_reg_and_bit,
4887
+ .drv_calc_reg = rk3528_calc_drv_reg_and_bit,
4888
+ .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit,
4889
+};
4890
+
4891
+static struct rockchip_pin_bank rk3562_pin_banks[] = {
4892
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4893
+ IOMUX_WIDTH_4BIT,
4894
+ IOMUX_WIDTH_4BIT,
4895
+ IOMUX_WIDTH_4BIT,
4896
+ IOMUX_WIDTH_4BIT,
4897
+ 0x20000, 0x20008, 0x20010, 0x20018),
4898
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4899
+ IOMUX_WIDTH_4BIT,
4900
+ IOMUX_WIDTH_4BIT,
4901
+ IOMUX_WIDTH_4BIT,
4902
+ IOMUX_WIDTH_4BIT,
4903
+ 0, 0x08, 0x10, 0x18),
4904
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4905
+ IOMUX_WIDTH_4BIT,
4906
+ IOMUX_WIDTH_4BIT,
4907
+ IOMUX_WIDTH_4BIT,
4908
+ IOMUX_WIDTH_4BIT,
4909
+ 0x20, 0, 0, 0),
4910
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4911
+ IOMUX_WIDTH_4BIT,
4912
+ IOMUX_WIDTH_4BIT,
4913
+ IOMUX_WIDTH_4BIT,
4914
+ IOMUX_WIDTH_4BIT,
4915
+ 0x10040, 0x10048, 0x10050, 0x10058),
4916
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
4917
+ IOMUX_WIDTH_4BIT,
4918
+ IOMUX_WIDTH_4BIT,
4919
+ 0,
4920
+ 0,
4921
+ 0x10060, 0x10068, 0, 0),
4922
+};
4923
+
4924
+static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = {
4925
+ .pin_banks = rk3562_pin_banks,
4926
+ .nr_banks = ARRAY_SIZE(rk3562_pin_banks),
4927
+ .label = "RK3562-GPIO",
4928
+ .type = RK3562,
4929
+ .pull_calc_reg = rk3562_calc_pull_reg_and_bit,
4930
+ .drv_calc_reg = rk3562_calc_drv_reg_and_bit,
4931
+ .schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit,
4932
+};
4933
+
40284934 static struct rockchip_pin_bank rk3568_pin_banks[] = {
40294935 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
40304936 IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
....@@ -4065,12 +4971,39 @@
40654971 .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
40664972 };
40674973
4974
+static struct rockchip_pin_bank rk3588_pin_banks[] = {
4975
+ RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
4976
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4977
+ RK3588_PIN_BANK_FLAGS(1, 32, "gpio1",
4978
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4979
+ RK3588_PIN_BANK_FLAGS(2, 32, "gpio2",
4980
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4981
+ RK3588_PIN_BANK_FLAGS(3, 32, "gpio3",
4982
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4983
+ RK3588_PIN_BANK_FLAGS(4, 32, "gpio4",
4984
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4985
+};
4986
+
4987
+static struct rockchip_pin_ctrl rk3588_pin_ctrl __maybe_unused = {
4988
+ .pin_banks = rk3588_pin_banks,
4989
+ .nr_banks = ARRAY_SIZE(rk3588_pin_banks),
4990
+ .label = "RK3588-GPIO",
4991
+ .type = RK3588,
4992
+ .pull_calc_reg = rk3588_calc_pull_reg_and_bit,
4993
+ .drv_calc_reg = rk3588_calc_drv_reg_and_bit,
4994
+ .schmitt_calc_reg = rk3588_calc_schmitt_reg_and_bit,
4995
+};
4996
+
40684997 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
40694998 #ifdef CONFIG_CPU_PX30
40704999 { .compatible = "rockchip,px30-pinctrl",
40715000 .data = &px30_pin_ctrl },
40725001 #endif
4073
-#ifdef CONFIG_CPU_RV110X
5002
+#ifdef CONFIG_CPU_RV1106
5003
+ { .compatible = "rockchip,rv1106-pinctrl",
5004
+ .data = &rv1106_pin_ctrl },
5005
+#endif
5006
+#ifdef CONFIG_CPU_RV1108
40745007 { .compatible = "rockchip,rv1108-pinctrl",
40755008 .data = &rv1108_pin_ctrl },
40765009 #endif
....@@ -4128,15 +5061,28 @@
41285061 { .compatible = "rockchip,rk3399-pinctrl",
41295062 .data = &rk3399_pin_ctrl },
41305063 #endif
5064
+#ifdef CONFIG_CPU_RK3528
5065
+ { .compatible = "rockchip,rk3528-pinctrl",
5066
+ .data = &rk3528_pin_ctrl },
5067
+#endif
5068
+#ifdef CONFIG_CPU_RK3562
5069
+ { .compatible = "rockchip,rk3562-pinctrl",
5070
+ .data = &rk3562_pin_ctrl },
5071
+#endif
41315072 #ifdef CONFIG_CPU_RK3568
41325073 { .compatible = "rockchip,rk3568-pinctrl",
41335074 .data = &rk3568_pin_ctrl },
5075
+#endif
5076
+#ifdef CONFIG_CPU_RK3588
5077
+ { .compatible = "rockchip,rk3588-pinctrl",
5078
+ .data = &rk3588_pin_ctrl },
41345079 #endif
41355080 {},
41365081 };
41375082
41385083 static struct platform_driver rockchip_pinctrl_driver = {
41395084 .probe = rockchip_pinctrl_probe,
5085
+ .remove = rockchip_pinctrl_remove,
41405086 .driver = {
41415087 .name = "rockchip-pinctrl",
41425088 .pm = &rockchip_pinctrl_dev_pm_ops,
....@@ -4156,6 +5102,103 @@
41565102 }
41575103 module_exit(rockchip_pinctrl_drv_unregister);
41585104
5105
+/**
5106
+ * rk_iomux_set - set the rockchip iomux by pin number.
5107
+ *
5108
+ * @bank: the gpio bank index, from 0 to the max bank num.
5109
+ * @pin: the gpio pin index, from 0 to 31.
5110
+ * @mux: the pointer to store mux value.
5111
+ *
5112
+ * Return 0 if set success, else return error code.
5113
+ */
5114
+int rk_iomux_set(int bank, int pin, int mux)
5115
+{
5116
+ struct pinctrl_dev *pctldev = g_pctldev;
5117
+ struct rockchip_pinctrl *info;
5118
+ struct rockchip_pin_bank *gpio;
5119
+ struct rockchip_pin_group *grp = NULL;
5120
+ struct rockchip_pin_config *cfg = NULL;
5121
+ int i, j, ret;
5122
+
5123
+ if (!g_pctldev)
5124
+ return -ENODEV;
5125
+
5126
+ info = pinctrl_dev_get_drvdata(pctldev);
5127
+ if (bank >= info->ctrl->nr_banks)
5128
+ return -EINVAL;
5129
+
5130
+ if (pin > 31 || pin < 0)
5131
+ return -EINVAL;
5132
+
5133
+ gpio = &info->ctrl->pin_banks[bank];
5134
+
5135
+ mutex_lock(&iomux_lock);
5136
+ for (i = 0; i < info->ngroups; i++) {
5137
+ grp = &info->groups[i];
5138
+ for (j = 0; j < grp->npins; i++) {
5139
+ if (grp->pins[i] == (gpio->pin_base + pin)) {
5140
+ cfg = grp->data;
5141
+ break;
5142
+ }
5143
+ }
5144
+ }
5145
+
5146
+ ret = rockchip_set_mux(gpio, pin, mux);
5147
+ if (ret) {
5148
+ dev_err(info->dev, "mux GPIO%d-%d %d fail\n", bank, pin, mux);
5149
+ goto out;
5150
+ }
5151
+
5152
+ if (cfg && (cfg->func != mux))
5153
+ cfg->func = mux;
5154
+
5155
+out:
5156
+ mutex_unlock(&iomux_lock);
5157
+
5158
+ return ret;
5159
+}
5160
+EXPORT_SYMBOL_GPL(rk_iomux_set);
5161
+
5162
+/**
5163
+ * rk_iomux_get - get the rockchip iomux by pin number.
5164
+ *
5165
+ * @bank: the gpio bank index, from 0 to the max bank num.
5166
+ * @pin: the gpio pin index, from 0 to 31.
5167
+ * @mux: the pointer to store mux value.
5168
+ *
5169
+ * Return 0 if get success, else return error code.
5170
+ */
5171
+int rk_iomux_get(int bank, int pin, int *mux)
5172
+{
5173
+ struct pinctrl_dev *pctldev = g_pctldev;
5174
+ struct rockchip_pinctrl *info;
5175
+ struct rockchip_pin_bank *gpio;
5176
+ int ret;
5177
+
5178
+ if (!g_pctldev)
5179
+ return -ENODEV;
5180
+ if (!mux)
5181
+ return -EINVAL;
5182
+
5183
+ info = pinctrl_dev_get_drvdata(pctldev);
5184
+ if (bank >= info->ctrl->nr_banks)
5185
+ return -EINVAL;
5186
+
5187
+ if (pin > 31 || pin < 0)
5188
+ return -EINVAL;
5189
+
5190
+ gpio = &info->ctrl->pin_banks[bank];
5191
+
5192
+ mutex_lock(&iomux_lock);
5193
+ ret = rockchip_get_mux(gpio, pin);
5194
+ mutex_unlock(&iomux_lock);
5195
+
5196
+ *mux = ret;
5197
+
5198
+ return (ret >= 0) ? 0 : ret;
5199
+}
5200
+EXPORT_SYMBOL_GPL(rk_iomux_get);
5201
+
41595202 MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
41605203 MODULE_LICENSE("GPL");
41615204 MODULE_ALIAS("platform:pinctrl-rockchip");