forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
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
....@@ -725,17 +701,15 @@
725701 };
726702
727703 static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
728
- RK_MUXROUTE_GRF(3, RK_PD1, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_RX_M0 */
729
- RK_MUXROUTE_GRF(3, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_TX_M0 */
730
- RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_RX_M1 */
731
- RK_MUXROUTE_GRF(3, RK_PA4, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_TX_M1 */
704
+ RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
705
+ RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
732706
733
- RK_MUXROUTE_GRF(1, RK_PA1, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_SCLK_M0 */
734
- RK_MUXROUTE_GRF(1, RK_PD6, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_SCLK_M1 */
735
- RK_MUXROUTE_GRF(2, RK_PD1, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_SCLK_M2 */
707
+ RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
708
+ RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
709
+ RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
736710
737
- RK_MUXROUTE_GRF(1, RK_PC6, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_SCLK_M0 */
738
- RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_SCLK_M1 */
711
+ RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
712
+ RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
739713
740714 RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
741715 RK_MUXROUTE_GRF(3, RK_PC0, 3, 0x10260, WRITE_MASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
....@@ -916,22 +890,6 @@
916890 RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
917891 RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
918892 RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
919
- RK_MUXROUTE_SAME(0, RK_PC7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */
920
- RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */
921
- RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
922
- RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
923
- RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
924
- RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
925
- RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
926
- RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
927
- RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
928
- RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
929
-};
930
-
931
-static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
932
- RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
933
- RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
934
- RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
935893 RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
936894 RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
937895 RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
....@@ -1055,24 +1013,12 @@
10551013 RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
10561014 RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
10571015 RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
1058
- RK_MUXROUTE_GRF(1, RK_PA3, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk tx M0 */
1059
- RK_MUXROUTE_GRF(1, RK_PA4, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk rx M0 */
10601016 RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
1061
- RK_MUXROUTE_GRF(3, RK_PC7, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk tx M1 */
1062
- RK_MUXROUTE_GRF(4, RK_PA6, 5, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk rx M1 */
10631017 RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
1064
- RK_MUXROUTE_GRF(2, RK_PD1, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk tx M2 */
1065
- RK_MUXROUTE_GRF(3, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk rx M2 */
10661018 RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
1067
- RK_MUXROUTE_GRF(2, RK_PC2, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk tx M0 */
1068
- RK_MUXROUTE_GRF(2, RK_PB7, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk rx M0 */
10691019 RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
1070
- RK_MUXROUTE_GRF(4, RK_PB7, 4, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk tx M1 */
1071
- RK_MUXROUTE_GRF(4, RK_PC1, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk rx M1 */
10721020 RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
1073
- RK_MUXROUTE_GRF(3, RK_PA3, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux sclk M0 */
10741021 RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
1075
- RK_MUXROUTE_GRF(4, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux sclk M1 */
10761022 RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10771023 RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10781024 RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
....@@ -1117,6 +1063,7 @@
11171063 static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
11181064 {
11191065 struct rockchip_pinctrl *info = bank->drvdata;
1066
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
11201067 int iomux_num = (pin / 8);
11211068 struct regmap *regmap;
11221069 unsigned int val;
....@@ -1162,6 +1109,27 @@
11621109 if (bank->recalced_mask & BIT(pin))
11631110 rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
11641111
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
+
11651133 ret = regmap_read(regmap, reg, &val);
11661134 if (ret)
11671135 return ret;
....@@ -1173,20 +1141,20 @@
11731141 int pin, int mux)
11741142 {
11751143 struct rockchip_pinctrl *info = bank->drvdata;
1144
+ struct device *dev = info->dev;
11761145 int iomux_num = (pin / 8);
11771146
11781147 if (iomux_num > 3)
11791148 return -EINVAL;
11801149
11811150 if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1182
- dev_err(info->dev, "pin %d is unrouted\n", pin);
1151
+ dev_err(dev, "pin %d is unrouted\n", pin);
11831152 return -EINVAL;
11841153 }
11851154
11861155 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
11871156 if (mux != RK_FUNC_GPIO) {
1188
- dev_err(info->dev,
1189
- "pin %d only supports a gpio mux\n", pin);
1157
+ dev_err(dev, "pin %d only supports a gpio mux\n", pin);
11901158 return -ENOTSUPP;
11911159 }
11921160 }
....@@ -1210,6 +1178,8 @@
12101178 static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
12111179 {
12121180 struct rockchip_pinctrl *info = bank->drvdata;
1181
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
1182
+ struct device *dev = info->dev;
12131183 int iomux_num = (pin / 8);
12141184 struct regmap *regmap;
12151185 int reg, ret, mask, mux_type;
....@@ -1223,8 +1193,7 @@
12231193 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
12241194 return 0;
12251195
1226
- dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",
1227
- bank->bank_num, pin, mux);
1196
+ dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
12281197
12291198 if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
12301199 regmap = info->regmap_pmu;
....@@ -1253,6 +1222,64 @@
12531222
12541223 if (bank->recalced_mask & BIT(pin))
12551224 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
+ }
12561283
12571284 if (mux > mask)
12581285 return -EINVAL;
....@@ -1302,9 +1329,9 @@
13021329 #define PX30_PULL_PINS_PER_REG 8
13031330 #define PX30_PULL_BANK_STRIDE 16
13041331
1305
-static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1306
- int pin_num, struct regmap **regmap,
1307
- 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)
13081335 {
13091336 struct rockchip_pinctrl *info = bank->drvdata;
13101337
....@@ -1324,6 +1351,8 @@
13241351 *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
13251352 *bit = (pin_num % PX30_PULL_PINS_PER_REG);
13261353 *bit *= PX30_PULL_BITS_PER_PIN;
1354
+
1355
+ return 0;
13271356 }
13281357
13291358 #define PX30_DRV_PMU_OFFSET 0x20
....@@ -1332,9 +1361,9 @@
13321361 #define PX30_DRV_PINS_PER_REG 8
13331362 #define PX30_DRV_BANK_STRIDE 16
13341363
1335
-static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1336
- int pin_num, struct regmap **regmap,
1337
- 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)
13381367 {
13391368 struct rockchip_pinctrl *info = bank->drvdata;
13401369
....@@ -1354,6 +1383,8 @@
13541383 *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
13551384 *bit = (pin_num % PX30_DRV_PINS_PER_REG);
13561385 *bit *= PX30_DRV_BITS_PER_PIN;
1386
+
1387
+ return 0;
13571388 }
13581389
13591390 #define PX30_SCHMITT_PMU_OFFSET 0x38
....@@ -1387,15 +1418,175 @@
13871418 return 0;
13881419 }
13891420
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
+
13901581 #define RV1108_PULL_PMU_OFFSET 0x10
13911582 #define RV1108_PULL_OFFSET 0x110
13921583 #define RV1108_PULL_PINS_PER_REG 8
13931584 #define RV1108_PULL_BITS_PER_PIN 2
13941585 #define RV1108_PULL_BANK_STRIDE 16
13951586
1396
-static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1397
- int pin_num, struct regmap **regmap,
1398
- 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)
13991590 {
14001591 struct rockchip_pinctrl *info = bank->drvdata;
14011592
....@@ -1414,6 +1605,8 @@
14141605 *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
14151606 *bit = (pin_num % RV1108_PULL_PINS_PER_REG);
14161607 *bit *= RV1108_PULL_BITS_PER_PIN;
1608
+
1609
+ return 0;
14171610 }
14181611
14191612 #define RV1108_DRV_PMU_OFFSET 0x20
....@@ -1422,9 +1615,9 @@
14221615 #define RV1108_DRV_PINS_PER_REG 8
14231616 #define RV1108_DRV_BANK_STRIDE 16
14241617
1425
-static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1426
- int pin_num, struct regmap **regmap,
1427
- 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)
14281621 {
14291622 struct rockchip_pinctrl *info = bank->drvdata;
14301623
....@@ -1444,6 +1637,8 @@
14441637 *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
14451638 *bit = pin_num % RV1108_DRV_PINS_PER_REG;
14461639 *bit *= RV1108_DRV_BITS_PER_PIN;
1640
+
1641
+ return 0;
14471642 }
14481643
14491644 #define RV1108_SCHMITT_PMU_OFFSET 0x30
....@@ -1483,9 +1678,9 @@
14831678 #define RV1126_PULL_BANK_STRIDE 16
14841679 #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
14851680
1486
-static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1487
- int pin_num, struct regmap **regmap,
1488
- 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)
14891684 {
14901685 struct rockchip_pinctrl *info = bank->drvdata;
14911686
....@@ -1497,7 +1692,7 @@
14971692 *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
14981693 *bit = pin_num % RV1126_PULL_PINS_PER_REG;
14991694 *bit *= RV1126_PULL_BITS_PER_PIN;
1500
- return;
1695
+ return 0;
15011696 }
15021697 *regmap = info->regmap_pmu;
15031698 *reg = RV1126_PULL_PMU_OFFSET;
....@@ -1510,6 +1705,8 @@
15101705 *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
15111706 *bit = (pin_num % RV1126_PULL_PINS_PER_REG);
15121707 *bit *= RV1126_PULL_BITS_PER_PIN;
1708
+
1709
+ return 0;
15131710 }
15141711
15151712 #define RV1126_DRV_PMU_OFFSET 0x20
....@@ -1518,9 +1715,9 @@
15181715 #define RV1126_DRV_PINS_PER_REG 4
15191716 #define RV1126_DRV_BANK_STRIDE 32
15201717
1521
-static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1522
- int pin_num, struct regmap **regmap,
1523
- 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)
15241721 {
15251722 struct rockchip_pinctrl *info = bank->drvdata;
15261723
....@@ -1533,7 +1730,7 @@
15331730 *reg -= 0x4;
15341731 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15351732 *bit *= RV1126_DRV_BITS_PER_PIN;
1536
- return;
1733
+ return 0;
15371734 }
15381735 *regmap = info->regmap_pmu;
15391736 *reg = RV1126_DRV_PMU_OFFSET;
....@@ -1546,6 +1743,8 @@
15461743 *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
15471744 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15481745 *bit *= RV1126_DRV_BITS_PER_PIN;
1746
+
1747
+ return 0;
15491748 }
15501749
15511750 #define RV1126_SCHMITT_PMU_OFFSET 0x60
....@@ -1585,15 +1784,35 @@
15851784 return 0;
15861785 }
15871786
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
+
15881807 #define RK1808_PULL_PMU_OFFSET 0x10
15891808 #define RK1808_PULL_GRF_OFFSET 0x80
15901809 #define RK1808_PULL_PINS_PER_REG 8
15911810 #define RK1808_PULL_BITS_PER_PIN 2
15921811 #define RK1808_PULL_BANK_STRIDE 16
15931812
1594
-static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1595
- int pin_num, struct regmap **regmap,
1596
- 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)
15971816 {
15981817 struct rockchip_pinctrl *info = bank->drvdata;
15991818
....@@ -1609,6 +1828,8 @@
16091828 *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
16101829 *bit = (pin_num % RK1808_PULL_PINS_PER_REG);
16111830 *bit *= RK1808_PULL_BITS_PER_PIN;
1831
+
1832
+ return 0;
16121833 }
16131834
16141835 #define RK1808_DRV_PMU_OFFSET 0x20
....@@ -1617,10 +1838,10 @@
16171838 #define RK1808_DRV_PINS_PER_REG 8
16181839 #define RK1808_DRV_BANK_STRIDE 16
16191840
1620
-static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1621
- int pin_num,
1622
- struct regmap **regmap,
1623
- 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)
16241845 {
16251846 struct rockchip_pinctrl *info = bank->drvdata;
16261847
....@@ -1636,6 +1857,8 @@
16361857 *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
16371858 *bit = pin_num % RK1808_DRV_PINS_PER_REG;
16381859 *bit *= RK1808_DRV_BITS_PER_PIN;
1860
+
1861
+ return 0;
16391862 }
16401863
16411864 #define RK1808_SR_PMU_OFFSET 0x0030
....@@ -1694,9 +1917,9 @@
16941917 #define RK2928_PULL_PINS_PER_REG 16
16951918 #define RK2928_PULL_BANK_STRIDE 8
16961919
1697
-static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1698
- int pin_num, struct regmap **regmap,
1699
- 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)
17001923 {
17011924 struct rockchip_pinctrl *info = bank->drvdata;
17021925
....@@ -1706,13 +1929,15 @@
17061929 *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
17071930
17081931 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1932
+
1933
+ return 0;
17091934 };
17101935
17111936 #define RK3128_PULL_OFFSET 0x118
17121937
1713
-static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1714
- int pin_num, struct regmap **regmap,
1715
- 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)
17161941 {
17171942 struct rockchip_pinctrl *info = bank->drvdata;
17181943
....@@ -1722,6 +1947,8 @@
17221947 *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
17231948
17241949 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1950
+
1951
+ return 0;
17251952 }
17261953
17271954 #define RK3188_PULL_OFFSET 0x164
....@@ -1730,9 +1957,9 @@
17301957 #define RK3188_PULL_BANK_STRIDE 16
17311958 #define RK3188_PULL_PMU_OFFSET 0x64
17321959
1733
-static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1734
- int pin_num, struct regmap **regmap,
1735
- 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)
17361963 {
17371964 struct rockchip_pinctrl *info = bank->drvdata;
17381965
....@@ -1762,12 +1989,14 @@
17621989 *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
17631990 *bit *= RK3188_PULL_BITS_PER_PIN;
17641991 }
1992
+
1993
+ return 0;
17651994 }
17661995
17671996 #define RK3288_PULL_OFFSET 0x140
1768
-static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1769
- int pin_num, struct regmap **regmap,
1770
- 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)
17712000 {
17722001 struct rockchip_pinctrl *info = bank->drvdata;
17732002
....@@ -1791,6 +2020,8 @@
17912020 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
17922021 *bit *= RK3188_PULL_BITS_PER_PIN;
17932022 }
2023
+
2024
+ return 0;
17942025 }
17952026
17962027 #define RK3288_DRV_PMU_OFFSET 0x70
....@@ -1799,9 +2030,9 @@
17992030 #define RK3288_DRV_PINS_PER_REG 8
18002031 #define RK3288_DRV_BANK_STRIDE 16
18012032
1802
-static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1803
- int pin_num, struct regmap **regmap,
1804
- 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)
18052036 {
18062037 struct rockchip_pinctrl *info = bank->drvdata;
18072038
....@@ -1825,13 +2056,15 @@
18252056 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18262057 *bit *= RK3288_DRV_BITS_PER_PIN;
18272058 }
2059
+
2060
+ return 0;
18282061 }
18292062
18302063 #define RK3228_PULL_OFFSET 0x100
18312064
1832
-static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1833
- int pin_num, struct regmap **regmap,
1834
- 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)
18352068 {
18362069 struct rockchip_pinctrl *info = bank->drvdata;
18372070
....@@ -1842,13 +2075,15 @@
18422075
18432076 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18442077 *bit *= RK3188_PULL_BITS_PER_PIN;
2078
+
2079
+ return 0;
18452080 }
18462081
18472082 #define RK3228_DRV_GRF_OFFSET 0x200
18482083
1849
-static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1850
- int pin_num, struct regmap **regmap,
1851
- 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)
18522087 {
18532088 struct rockchip_pinctrl *info = bank->drvdata;
18542089
....@@ -1859,13 +2094,15 @@
18592094
18602095 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18612096 *bit *= RK3288_DRV_BITS_PER_PIN;
2097
+
2098
+ return 0;
18622099 }
18632100
18642101 #define RK3308_PULL_OFFSET 0xa0
18652102
1866
-static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1867
- int pin_num, struct regmap **regmap,
1868
- 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)
18692106 {
18702107 struct rockchip_pinctrl *info = bank->drvdata;
18712108
....@@ -1876,13 +2113,15 @@
18762113
18772114 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18782115 *bit *= RK3188_PULL_BITS_PER_PIN;
2116
+
2117
+ return 0;
18792118 }
18802119
18812120 #define RK3308_DRV_GRF_OFFSET 0x100
18822121
1883
-static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1884
- int pin_num, struct regmap **regmap,
1885
- 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)
18862125 {
18872126 struct rockchip_pinctrl *info = bank->drvdata;
18882127
....@@ -1893,14 +2132,39 @@
18932132
18942133 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18952134 *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;
18962160 }
18972161
18982162 #define RK3368_PULL_GRF_OFFSET 0x100
18992163 #define RK3368_PULL_PMU_OFFSET 0x10
19002164
1901
-static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1902
- int pin_num, struct regmap **regmap,
1903
- 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)
19042168 {
19052169 struct rockchip_pinctrl *info = bank->drvdata;
19062170
....@@ -1924,14 +2188,16 @@
19242188 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19252189 *bit *= RK3188_PULL_BITS_PER_PIN;
19262190 }
2191
+
2192
+ return 0;
19272193 }
19282194
19292195 #define RK3368_DRV_PMU_OFFSET 0x20
19302196 #define RK3368_DRV_GRF_OFFSET 0x200
19312197
1932
-static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1933
- int pin_num, struct regmap **regmap,
1934
- 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)
19352201 {
19362202 struct rockchip_pinctrl *info = bank->drvdata;
19372203
....@@ -1955,15 +2221,17 @@
19552221 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
19562222 *bit *= RK3288_DRV_BITS_PER_PIN;
19572223 }
2224
+
2225
+ return 0;
19582226 }
19592227
19602228 #define RK3399_PULL_GRF_OFFSET 0xe040
19612229 #define RK3399_PULL_PMU_OFFSET 0x40
19622230 #define RK3399_DRV_3BITS_PER_PIN 3
19632231
1964
-static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1965
- int pin_num, struct regmap **regmap,
1966
- 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)
19672235 {
19682236 struct rockchip_pinctrl *info = bank->drvdata;
19692237
....@@ -1989,11 +2257,13 @@
19892257 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19902258 *bit *= RK3188_PULL_BITS_PER_PIN;
19912259 }
2260
+
2261
+ return 0;
19922262 }
19932263
1994
-static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1995
- int pin_num, struct regmap **regmap,
1996
- 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)
19972267 {
19982268 struct rockchip_pinctrl *info = bank->drvdata;
19992269 int drv_num = (pin_num / 8);
....@@ -2010,6 +2280,8 @@
20102280 *bit = (pin_num % 8) * 3;
20112281 else
20122282 *bit = (pin_num % 8) * 2;
2283
+
2284
+ return 0;
20132285 }
20142286
20152287 #define RK3528_DRV_BITS_PER_PIN 8
....@@ -2020,9 +2292,9 @@
20202292 #define RK3528_DRV_GPIO3_OFFSET 0x20190
20212293 #define RK3528_DRV_GPIO4_OFFSET 0x101C0
20222294
2023
-static void rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2024
- int pin_num, struct regmap **regmap,
2025
- int *reg, u8 *bit)
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)
20262298 {
20272299 struct rockchip_pinctrl *info = bank->drvdata;
20282300
....@@ -2056,6 +2328,8 @@
20562328 *reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
20572329 *bit = pin_num % RK3528_DRV_PINS_PER_REG;
20582330 *bit *= RK3528_DRV_BITS_PER_PIN;
2331
+
2332
+ return 0;
20592333 }
20602334
20612335 #define RK3528_PULL_BITS_PER_PIN 2
....@@ -2066,9 +2340,9 @@
20662340 #define RK3528_PULL_GPIO3_OFFSET 0x20230
20672341 #define RK3528_PULL_GPIO4_OFFSET 0x10240
20682342
2069
-static void rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2070
- int pin_num, struct regmap **regmap,
2071
- int *reg, u8 *bit)
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)
20722346 {
20732347 struct rockchip_pinctrl *info = bank->drvdata;
20742348
....@@ -2102,6 +2376,8 @@
21022376 *reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
21032377 *bit = pin_num % RK3528_PULL_PINS_PER_REG;
21042378 *bit *= RK3528_PULL_BITS_PER_PIN;
2379
+
2380
+ return 0;
21052381 }
21062382
21072383 #define RK3528_SMT_BITS_PER_PIN 1
....@@ -2152,6 +2428,151 @@
21522428 return 0;
21532429 }
21542430
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;
2574
+}
2575
+
21552576 #define RK3568_SR_PMU_OFFSET 0x60
21562577 #define RK3568_SR_GRF_OFFSET 0x0180
21572578 #define RK3568_SR_BANK_STRIDE 0x10
....@@ -2186,9 +2607,9 @@
21862607 #define RK3568_PULL_PINS_PER_REG 8
21872608 #define RK3568_PULL_BANK_STRIDE 0x10
21882609
2189
-static void rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2190
- int pin_num, struct regmap **regmap,
2191
- 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)
21922613 {
21932614 struct rockchip_pinctrl *info = bank->drvdata;
21942615
....@@ -2209,6 +2630,8 @@
22092630 *bit = (pin_num % RK3568_PULL_PINS_PER_REG);
22102631 *bit *= RK3568_PULL_BITS_PER_PIN;
22112632 }
2633
+
2634
+ return 0;
22122635 }
22132636
22142637 #define RK3568_DRV_PMU_OFFSET 0x70
....@@ -2217,9 +2640,9 @@
22172640 #define RK3568_DRV_PINS_PER_REG 2
22182641 #define RK3568_DRV_BANK_STRIDE 0x40
22192642
2220
-static void rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2221
- int pin_num, struct regmap **regmap,
2222
- 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)
22232646 {
22242647 struct rockchip_pinctrl *info = bank->drvdata;
22252648
....@@ -2246,6 +2669,197 @@
22462669 ((bank->bank_num == 2 || bank->bank_num == 3 || bank->bank_num == 4) &&
22472670 (pin_num == 7 || pin_num == 15 || pin_num == 23 || pin_num == 31)))
22482671 *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;
22492863 }
22502864
22512865 static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
....@@ -2262,13 +2876,16 @@
22622876 {
22632877 struct rockchip_pinctrl *info = bank->drvdata;
22642878 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2879
+ struct device *dev = info->dev;
22652880 struct regmap *regmap;
22662881 int reg, ret;
22672882 u32 data, temp, rmask_bits;
22682883 u8 bit;
22692884 int drv_type = bank->drv[pin_num / 8].drv_type;
22702885
2271
- 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;
22722889
22732890 switch (drv_type) {
22742891 case DRV_TYPE_IO_1V8_3V0_AUTO:
....@@ -2307,7 +2924,7 @@
23072924 bit -= 16;
23082925 break;
23092926 default:
2310
- 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",
23112928 bit, drv_type);
23122929 return -EINVAL;
23132930 }
....@@ -2320,8 +2937,7 @@
23202937 rmask_bits = RK3288_DRV_BITS_PER_PIN;
23212938 break;
23222939 default:
2323
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2324
- drv_type);
2940
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
23252941 return -EINVAL;
23262942 }
23272943
....@@ -2354,21 +2970,28 @@
23542970 {
23552971 struct rockchip_pinctrl *info = bank->drvdata;
23562972 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2973
+ struct device *dev = info->dev;
23572974 struct regmap *regmap;
23582975 int reg, ret, i, err;
23592976 u32 data, rmask, rmask_bits, temp;
23602977 u8 bit;
23612978 int drv_type = bank->drv[pin_num / 8].drv_type;
23622979
2363
- 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",
23642981 bank->bank_num, pin_num, strength);
23652982
2366
- ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2367
- 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) {
23682988 rmask_bits = RV1126_DRV_BITS_PER_PIN;
23692989 ret = strength;
23702990 goto config;
2371
- } else if (ctrl->type == RK3568 || ctrl->type == RK3528) {
2991
+ } else if (ctrl->type == RV1106 ||
2992
+ ctrl->type == RK3528 ||
2993
+ ctrl->type == RK3562 ||
2994
+ ctrl->type == RK3568) {
23722995 rmask_bits = RK3568_DRV_BITS_PER_PIN;
23732996 ret = (1 << (strength + 1)) - 1;
23742997 goto config;
....@@ -2386,8 +3009,7 @@
23863009 }
23873010
23883011 if (ret < 0) {
2389
- dev_err(info->dev, "unsupported driver strength %d\n",
2390
- strength);
3012
+ dev_err(dev, "unsupported driver strength %d\n", strength);
23913013 return ret;
23923014 }
23933015
....@@ -2426,7 +3048,7 @@
24263048 bit -= 16;
24273049 break;
24283050 default:
2429
- 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",
24303052 bit, drv_type);
24313053 return -EINVAL;
24323054 }
....@@ -2438,8 +3060,7 @@
24383060 rmask_bits = RK3288_DRV_BITS_PER_PIN;
24393061 break;
24403062 default:
2441
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2442
- drv_type);
3063
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
24433064 return -EINVAL;
24443065 }
24453066
....@@ -2508,6 +3129,7 @@
25083129 {
25093130 struct rockchip_pinctrl *info = bank->drvdata;
25103131 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3132
+ struct device *dev = info->dev;
25113133 struct regmap *regmap;
25123134 int reg, ret, pull_type;
25133135 u8 bit;
....@@ -2517,7 +3139,9 @@
25173139 if (ctrl->type == RK3066B)
25183140 return PIN_CONFIG_BIAS_DISABLE;
25193141
2520
- 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;
25213145
25223146 ret = regmap_read(regmap, reg, &data);
25233147 if (ret)
....@@ -2530,6 +3154,7 @@
25303154 ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
25313155 : PIN_CONFIG_BIAS_DISABLE;
25323156 case PX30:
3157
+ case RV1106:
25333158 case RV1108:
25343159 case RV1126:
25353160 case RK1808:
....@@ -2539,14 +3164,16 @@
25393164 case RK3368:
25403165 case RK3399:
25413166 case RK3528:
3167
+ case RK3562:
25423168 case RK3568:
3169
+ case RK3588:
25433170 pull_type = bank->pull_type[pin_num / 8];
25443171 data >>= bit;
25453172 data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
25463173
25473174 return rockchip_pull_list[pull_type][data];
25483175 default:
2549
- dev_err(info->dev, "unsupported pinctrl type\n");
3176
+ dev_err(dev, "unsupported pinctrl type\n");
25503177 return -EINVAL;
25513178 };
25523179 }
....@@ -2556,19 +3183,21 @@
25563183 {
25573184 struct rockchip_pinctrl *info = bank->drvdata;
25583185 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3186
+ struct device *dev = info->dev;
25593187 struct regmap *regmap;
25603188 int reg, ret, i, pull_type;
25613189 u8 bit;
25623190 u32 data, rmask;
25633191
2564
- dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n",
2565
- 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);
25663193
25673194 /* rk3066b does support any pulls */
25683195 if (ctrl->type == RK3066B)
25693196 return pull ? -EINVAL : 0;
25703197
2571
- 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;
25723201
25733202 switch (ctrl->type) {
25743203 case RK2928:
....@@ -2579,6 +3208,7 @@
25793208 ret = regmap_write(regmap, reg, data);
25803209 break;
25813210 case PX30:
3211
+ case RV1106:
25823212 case RV1108:
25833213 case RV1126:
25843214 case RK1808:
....@@ -2588,7 +3218,9 @@
25883218 case RK3368:
25893219 case RK3399:
25903220 case RK3528:
3221
+ case RK3562:
25913222 case RK3568:
3223
+ case RK3588:
25923224 pull_type = bank->pull_type[pin_num / 8];
25933225 ret = -EINVAL;
25943226 for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
....@@ -2599,7 +3231,7 @@
25993231 }
26003232 }
26013233 /*
2602
- * 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,
26033235 * where that pull up value becomes 3.
26043236 */
26053237 if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
....@@ -2608,8 +3240,7 @@
26083240 }
26093241
26103242 if (ret < 0) {
2611
- dev_err(info->dev, "unsupported pull setting %d\n",
2612
- pull);
3243
+ dev_err(dev, "unsupported pull setting %d\n", pull);
26133244 return ret;
26143245 }
26153246
....@@ -2621,32 +3252,11 @@
26213252 ret = regmap_update_bits(regmap, reg, rmask, data);
26223253 break;
26233254 default:
2624
- dev_err(info->dev, "unsupported pinctrl type\n");
3255
+ dev_err(dev, "unsupported pinctrl type\n");
26253256 return -EINVAL;
26263257 }
26273258
26283259 return ret;
2629
-}
2630
-
2631
-#define RK3308_SCHMITT_PINS_PER_REG 8
2632
-#define RK3308_SCHMITT_BANK_STRIDE 16
2633
-#define RK3308_SCHMITT_GRF_OFFSET 0x1a0
2634
-
2635
-static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2636
- int pin_num,
2637
- struct regmap **regmap,
2638
- int *reg, u8 *bit)
2639
-{
2640
- struct rockchip_pinctrl *info = bank->drvdata;
2641
-
2642
- *regmap = info->regmap_base;
2643
- *reg = RK3308_SCHMITT_GRF_OFFSET;
2644
-
2645
- *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2646
- *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2647
- *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2648
-
2649
- return 0;
26503260 }
26513261
26523262 #define RK3328_SCHMITT_BITS_PER_PIN 1
....@@ -2719,6 +3329,7 @@
27193329
27203330 data >>= bit;
27213331 switch (ctrl->type) {
3332
+ case RK3562:
27223333 case RK3568:
27233334 return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
27243335 default:
....@@ -2733,12 +3344,13 @@
27333344 {
27343345 struct rockchip_pinctrl *info = bank->drvdata;
27353346 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3347
+ struct device *dev = info->dev;
27363348 struct regmap *regmap;
27373349 int reg, ret;
27383350 u8 bit;
27393351 u32 data, rmask;
27403352
2741
- 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",
27423354 bank->bank_num, pin_num, enable);
27433355
27443356 ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
....@@ -2747,6 +3359,7 @@
27473359
27483360 /* enable the write to the equivalent lower bits */
27493361 switch (ctrl->type) {
3362
+ case RK3562:
27503363 case RK3568:
27513364 data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
27523365 rmask = data | (data >> 16);
....@@ -2881,10 +3494,11 @@
28813494 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
28823495 const unsigned int *pins = info->groups[group].pins;
28833496 const struct rockchip_pin_config *data = info->groups[group].data;
3497
+ struct device *dev = info->dev;
28843498 struct rockchip_pin_bank *bank;
28853499 int cnt, ret = 0;
28863500
2887
- dev_dbg(info->dev, "enable function %s group %s\n",
3501
+ dev_dbg(dev, "enable function %s group %s\n",
28883502 info->functions[selector].name, info->groups[group].name);
28893503
28903504 /*
....@@ -2932,6 +3546,7 @@
29323546 case RK3066B:
29333547 return pull ? false : true;
29343548 case PX30:
3549
+ case RV1106:
29353550 case RV1108:
29363551 case RV1126:
29373552 case RK1808:
....@@ -2941,11 +3556,31 @@
29413556 case RK3368:
29423557 case RK3399:
29433558 case RK3528:
3559
+ case RK3562:
29443560 case RK3568:
3561
+ case RK3588:
29453562 return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
29463563 }
29473564
29483565 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;
29493584 }
29503585
29513586 /* set the pin config settings for a specified pin */
....@@ -2963,6 +3598,25 @@
29633598 for (i = 0; i < num_configs; i++) {
29643599 param = pinconf_to_config_param(configs[i]);
29653600 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
+ }
29663620
29673621 switch (param) {
29683622 case PIN_CONFIG_BIAS_DISABLE:
....@@ -2989,10 +3643,8 @@
29893643 case PIN_CONFIG_OUTPUT:
29903644 rc = rockchip_set_mux(bank, pin - bank->pin_base,
29913645 RK_FUNC_GPIO);
2992
- if (rc != RK_FUNC_GPIO) {
2993
- dev_err(info->dev, "pin-%d fail to mux to gpio, %d\n", pin, rc);
3646
+ if (rc != RK_FUNC_GPIO)
29943647 return -EINVAL;
2995
- }
29963648
29973649 rc = gpio->direction_output(gpio, pin - bank->pin_base,
29983650 arg);
....@@ -3077,13 +3729,13 @@
30773729 break;
30783730 case PIN_CONFIG_OUTPUT:
30793731 rc = rockchip_get_mux(bank, pin - bank->pin_base);
3080
- if (rc != 0)
3732
+ if (rc != RK_FUNC_GPIO)
30813733 return -EINVAL;
30823734
3083
- /* 0 for output, 1 for input */
3084
- rc = gpio->get_direction(gpio, pin - bank->pin_base);
3085
- if (rc)
3086
- return -EINVAL;
3735
+ if (!gpio || !gpio->get) {
3736
+ arg = 0;
3737
+ break;
3738
+ }
30873739
30883740 rc = gpio->get(gpio, pin - bank->pin_base);
30893741 if (rc < 0)
....@@ -3143,24 +3795,13 @@
31433795 {},
31443796 };
31453797
3146
-static bool is_function_node(const struct device_node *np)
3147
-{
3148
- if (of_match_node(rockchip_bank_match, np))
3149
- return false;
3150
-
3151
- if (!strncmp(np->name, "pcfg", 4))
3152
- return false;
3153
-
3154
- return true;
3155
-}
3156
-
31573798 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
31583799 struct device_node *np)
31593800 {
31603801 struct device_node *child;
31613802
31623803 for_each_child_of_node(np, child) {
3163
- if (!is_function_node(child))
3804
+ if (of_match_node(rockchip_bank_match, child))
31643805 continue;
31653806
31663807 info->nfunctions++;
....@@ -3173,6 +3814,7 @@
31733814 struct rockchip_pinctrl *info,
31743815 u32 index)
31753816 {
3817
+ struct device *dev = info->dev;
31763818 struct rockchip_pin_bank *bank;
31773819 int size;
31783820 const __be32 *list;
....@@ -3180,7 +3822,7 @@
31803822 int i, j;
31813823 int ret;
31823824
3183
- dev_dbg(info->dev, "group(%d): %pOFn\n", index, np);
3825
+ dev_dbg(dev, "group(%d): %pOFn\n", index, np);
31843826
31853827 /* Initialise group */
31863828 grp->name = np->name;
....@@ -3192,19 +3834,13 @@
31923834 list = of_get_property(np, "rockchip,pins", &size);
31933835 /* we do not check return since it's safe node passed down */
31943836 size /= sizeof(*list);
3195
- if (!size || size % 4) {
3196
- dev_err(info->dev, "wrong pins number or pins and configs should be by 4\n");
3197
- return -EINVAL;
3198
- }
3837
+ if (!size || size % 4)
3838
+ return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
31993839
32003840 grp->npins = size / 4;
32013841
3202
- grp->pins = devm_kcalloc(info->dev, grp->npins, sizeof(unsigned int),
3203
- GFP_KERNEL);
3204
- grp->data = devm_kcalloc(info->dev,
3205
- grp->npins,
3206
- sizeof(struct rockchip_pin_config),
3207
- 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);
32083844 if (!grp->pins || !grp->data)
32093845 return -ENOMEM;
32103846
....@@ -3238,6 +3874,7 @@
32383874 struct rockchip_pinctrl *info,
32393875 u32 index)
32403876 {
3877
+ struct device *dev = info->dev;
32413878 struct device_node *child;
32423879 struct rockchip_pmx_func *func;
32433880 struct rockchip_pin_group *grp;
....@@ -3245,7 +3882,7 @@
32453882 static u32 grp_index;
32463883 u32 i = 0;
32473884
3248
- dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np);
3885
+ dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
32493886
32503887 func = &info->functions[index];
32513888
....@@ -3255,8 +3892,7 @@
32553892 if (func->ngroups <= 0)
32563893 return 0;
32573894
3258
- func->groups = devm_kcalloc(info->dev,
3259
- func->ngroups, sizeof(char *), GFP_KERNEL);
3895
+ func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
32603896 if (!func->groups)
32613897 return -ENOMEM;
32623898
....@@ -3284,32 +3920,26 @@
32843920
32853921 rockchip_pinctrl_child_count(info, np);
32863922
3287
- dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions);
3288
- 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);
32893925
3290
- info->functions = devm_kcalloc(dev,
3291
- info->nfunctions,
3292
- sizeof(struct rockchip_pmx_func),
3293
- GFP_KERNEL);
3926
+ info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
32943927 if (!info->functions)
32953928 return -ENOMEM;
32963929
3297
- info->groups = devm_kcalloc(dev,
3298
- info->ngroups,
3299
- sizeof(struct rockchip_pin_group),
3300
- GFP_KERNEL);
3930
+ info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
33013931 if (!info->groups)
33023932 return -ENOMEM;
33033933
33043934 i = 0;
33053935
33063936 for_each_child_of_node(np, child) {
3307
- if (!is_function_node(child))
3937
+ if (of_match_node(rockchip_bank_match, child))
33083938 continue;
33093939
33103940 ret = rockchip_pinctrl_parse_functions(child, info, i++);
33113941 if (ret) {
3312
- dev_err(&pdev->dev, "failed to parse function\n");
3942
+ dev_err(dev, "failed to parse function\n");
33133943 of_node_put(child);
33143944 return ret;
33153945 }
....@@ -3324,6 +3954,7 @@
33243954 struct pinctrl_desc *ctrldesc = &info->pctl;
33253955 struct pinctrl_pin_desc *pindesc, *pdesc;
33263956 struct rockchip_pin_bank *pin_bank;
3957
+ struct device *dev = &pdev->dev;
33273958 int pin, bank, ret;
33283959 int k;
33293960
....@@ -3333,9 +3964,7 @@
33333964 ctrldesc->pmxops = &rockchip_pmx_ops;
33343965 ctrldesc->confops = &rockchip_pinconf_ops;
33353966
3336
- pindesc = devm_kcalloc(&pdev->dev,
3337
- info->ctrl->nr_pins, sizeof(*pindesc),
3338
- GFP_KERNEL);
3967
+ pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
33393968 if (!pindesc)
33403969 return -ENOMEM;
33413970
....@@ -3351,41 +3980,24 @@
33513980 pin_bank->name, pin);
33523981 pdesc++;
33533982 }
3983
+
3984
+ INIT_LIST_HEAD(&pin_bank->deferred_pins);
3985
+ mutex_init(&pin_bank->deferred_lock);
33543986 }
33553987
33563988 ret = rockchip_pinctrl_parse_dt(pdev, info);
33573989 if (ret)
33583990 return ret;
33593991
3360
- info->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc, info);
3361
- if (IS_ERR(info->pctl_dev)) {
3362
- dev_err(&pdev->dev, "could not register pinctrl driver\n");
3363
- return PTR_ERR(info->pctl_dev);
3364
- }
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");
33653995
33663996 return 0;
33673997 }
33683998
33693999 static const struct of_device_id rockchip_pinctrl_dt_match[];
3370
-
3371
-/* Ctrl data specially handle */
3372
-static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl)
3373
-{
3374
- /*
3375
- * Special for rk3308b, where we need to replace the recalced
3376
- * and routed arrays.
3377
- */
3378
- if (soc_is_rk3308b()) {
3379
- ctrl->iomux_recalced = rk3308b_mux_recalced_data;
3380
- ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data);
3381
- ctrl->iomux_routes = rk3308b_mux_route_data;
3382
- ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data);
3383
-
3384
- }
3385
-
3386
- return 0;
3387
-}
3388
-
4000
+static struct rockchip_pin_bank rk3308bs_pin_banks[];
33894001 static struct rockchip_pin_bank px30s_pin_banks[];
33904002
33914003 /* retrieve the soc specific data */
....@@ -3393,22 +4005,19 @@
33934005 struct rockchip_pinctrl *d,
33944006 struct platform_device *pdev)
33954007 {
4008
+ struct device *dev = &pdev->dev;
4009
+ struct device_node *node = dev->of_node;
33964010 const struct of_device_id *match;
3397
- struct device_node *node = pdev->dev.of_node;
33984011 struct rockchip_pin_ctrl *ctrl;
33994012 struct rockchip_pin_bank *bank;
34004013 int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
34014014
34024015 match = of_match_node(rockchip_pinctrl_dt_match, node);
34034016 ctrl = (struct rockchip_pin_ctrl *)match->data;
4017
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && soc_is_rk3308bs())
4018
+ ctrl->pin_banks = rk3308bs_pin_banks;
34044019 if (IS_ENABLED(CONFIG_CPU_PX30) && soc_is_px30s())
34054020 ctrl->pin_banks = px30s_pin_banks;
3406
-
3407
- /* Ctrl data re-initialize for some Socs */
3408
- if (ctrl->ctrl_data_re_init) {
3409
- if (ctrl->ctrl_data_re_init(ctrl))
3410
- return NULL;
3411
- }
34124021
34134022 grf_offs = ctrl->grf_mux_offset;
34144023 pmu_offs = ctrl->pmu_mux_offset;
....@@ -3455,7 +4064,7 @@
34554064 drv_pmu_offs : drv_grf_offs;
34564065 }
34574066
3458
- 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",
34594068 i, j, iom->offset, drv->offset);
34604069
34614070 /*
....@@ -3562,60 +4171,56 @@
35624171
35634172 /* SoC data specially handle */
35644173
3565
-/* rk3308b SoC data initialize */
3566
-#define RK3308B_GRF_SOC_CON13 0x608
3567
-#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
35684177
3569
-/* RK3308B_GRF_SOC_CON13 */
3570
-#define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
3571
-#define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
3572
-#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))
35734182
3574
-/* RK3308B_GRF_SOC_CON15 */
3575
-#define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
3576
-#define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
3577
-#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))
35784187
3579
-static int rk3308b_soc_data_init(struct rockchip_pinctrl *info)
4188
+static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
35804189 {
35814190 int ret;
35824191
35834192 /*
35844193 * Enable the special ctrl of selected sources.
35854194 */
3586
- if (soc_is_rk3308b()) {
3587
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON13,
3588
- RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3589
- RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3590
- RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3591
- if (ret)
3592
- return ret;
35934195
3594
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON15,
3595
- RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3596
- RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3597
- RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3598
- if (ret)
3599
- return ret;
3600
- }
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;
36014202
3602
- 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
+
36034210 }
36044211
36054212 static int rockchip_pinctrl_probe(struct platform_device *pdev)
36064213 {
36074214 struct rockchip_pinctrl *info;
36084215 struct device *dev = &pdev->dev;
4216
+ struct device_node *np = dev->of_node, *node;
36094217 struct rockchip_pin_ctrl *ctrl;
3610
- struct device_node *np = pdev->dev.of_node, *node;
36114218 struct resource *res;
36124219 void __iomem *base;
36134220 int ret;
36144221
3615
- if (!dev->of_node) {
3616
- dev_err(dev, "device tree node not found\n");
3617
- return -ENODEV;
3618
- }
4222
+ if (!dev->of_node)
4223
+ return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
36194224
36204225 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
36214226 if (!info)
....@@ -3624,44 +4229,39 @@
36244229 info->dev = dev;
36254230
36264231 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
3627
- if (!ctrl) {
3628
- dev_err(dev, "driver data not available\n");
3629
- return -EINVAL;
3630
- }
4232
+ if (!ctrl)
4233
+ return dev_err_probe(dev, -EINVAL, "driver data not available\n");
36314234 info->ctrl = ctrl;
36324235
36334236 node = of_parse_phandle(np, "rockchip,grf", 0);
36344237 if (node) {
36354238 info->regmap_base = syscon_node_to_regmap(node);
4239
+ of_node_put(node);
36364240 if (IS_ERR(info->regmap_base))
36374241 return PTR_ERR(info->regmap_base);
36384242 } else {
3639
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3640
- base = devm_ioremap_resource(&pdev->dev, res);
4243
+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
36414244 if (IS_ERR(base))
36424245 return PTR_ERR(base);
36434246
36444247 rockchip_regmap_config.max_register = resource_size(res) - 4;
36454248 rockchip_regmap_config.name = "rockchip,pinctrl";
3646
- info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base,
3647
- &rockchip_regmap_config);
4249
+ info->regmap_base =
4250
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
36484251
36494252 /* to check for the old dt-bindings */
36504253 info->reg_size = resource_size(res);
36514254
36524255 /* Honor the old binding, with pull registers as 2nd resource */
36534256 if (ctrl->type == RK3188 && info->reg_size < 0x200) {
3654
- res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
3655
- base = devm_ioremap_resource(&pdev->dev, res);
4257
+ base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
36564258 if (IS_ERR(base))
36574259 return PTR_ERR(base);
36584260
3659
- rockchip_regmap_config.max_register =
3660
- resource_size(res) - 4;
4261
+ rockchip_regmap_config.max_register = resource_size(res) - 4;
36614262 rockchip_regmap_config.name = "rockchip,pinctrl-pull";
3662
- info->regmap_pull = devm_regmap_init_mmio(&pdev->dev,
3663
- base,
3664
- &rockchip_regmap_config);
4263
+ info->regmap_pull =
4264
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
36654265 }
36664266 }
36674267
....@@ -3669,13 +4269,13 @@
36694269 node = of_parse_phandle(np, "rockchip,pmu", 0);
36704270 if (node) {
36714271 info->regmap_pmu = syscon_node_to_regmap(node);
4272
+ of_node_put(node);
36724273 if (IS_ERR(info->regmap_pmu))
36734274 return PTR_ERR(info->regmap_pmu);
36744275 }
36754276
3676
- /* Special handle for some Socs */
3677
- if (ctrl->soc_data_init) {
3678
- ret = ctrl->soc_data_init(info);
4277
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
4278
+ ret = rk3308_soc_data_init(info);
36794279 if (ret)
36804280 return ret;
36814281 }
....@@ -3685,16 +4285,49 @@
36854285 return ret;
36864286
36874287 platform_set_drvdata(pdev, info);
4288
+ g_pctldev = info->pctl_dev;
36884289
3689
- ret = of_platform_populate(np, rockchip_bank_match, NULL, NULL);
3690
- if (ret) {
3691
- dev_err(&pdev->dev, "failed to register gpio device\n");
3692
- return ret;
3693
- }
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
+
36944294 dev_info(dev, "probed %s\n", dev_name(dev));
36954295
36964296 return 0;
36974297 }
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
+};
36984331
36994332 static struct rockchip_pin_bank px30_pin_banks[] = {
37004333 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
....@@ -3719,13 +4352,6 @@
37194352 ),
37204353 };
37214354
3722
-static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
3723
- PX30S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
3724
- PX30S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3725
- PX30S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3726
- PX30S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3727
-};
3728
-
37294355 static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
37304356 .pin_banks = px30_pin_banks,
37314357 .nr_banks = ARRAY_SIZE(px30_pin_banks),
....@@ -3739,6 +4365,48 @@
37394365 .drv_calc_reg = px30_calc_drv_reg_and_bit,
37404366 .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
37414367 .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,
37424410 };
37434411
37444412 static struct rockchip_pin_bank rv1108_pin_banks[] = {
....@@ -4011,6 +4679,14 @@
40114679 .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
40124680 };
40134681
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
+
40144690 static struct rockchip_pin_bank rk3308_pin_banks[] = {
40154691 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
40164692 IOMUX_WIDTH_2BIT,
....@@ -4044,11 +4720,10 @@
40444720 .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
40454721 .iomux_routes = rk3308_mux_route_data,
40464722 .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data),
4047
- .ctrl_data_re_init = rk3308b_ctrl_data_re_init,
4048
- .soc_data_init = rk3308b_soc_data_init,
40494723 .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
40504724 .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
40514725 .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
4726
+ .slew_rate_calc_reg = rk3308_calc_slew_rate_reg_and_bit,
40524727 };
40534728
40544729 static struct rockchip_pin_bank rk3328_pin_banks[] = {
....@@ -4213,6 +4888,49 @@
42134888 .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit,
42144889 };
42154890
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
+
42164934 static struct rockchip_pin_bank rk3568_pin_banks[] = {
42174935 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
42184936 IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
....@@ -4253,12 +4971,39 @@
42534971 .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
42544972 };
42554973
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
+
42564997 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
42574998 #ifdef CONFIG_CPU_PX30
42584999 { .compatible = "rockchip,px30-pinctrl",
42595000 .data = &px30_pin_ctrl },
42605001 #endif
4261
-#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
42625007 { .compatible = "rockchip,rv1108-pinctrl",
42635008 .data = &rv1108_pin_ctrl },
42645009 #endif
....@@ -4320,15 +5065,24 @@
43205065 { .compatible = "rockchip,rk3528-pinctrl",
43215066 .data = &rk3528_pin_ctrl },
43225067 #endif
5068
+#ifdef CONFIG_CPU_RK3562
5069
+ { .compatible = "rockchip,rk3562-pinctrl",
5070
+ .data = &rk3562_pin_ctrl },
5071
+#endif
43235072 #ifdef CONFIG_CPU_RK3568
43245073 { .compatible = "rockchip,rk3568-pinctrl",
43255074 .data = &rk3568_pin_ctrl },
5075
+#endif
5076
+#ifdef CONFIG_CPU_RK3588
5077
+ { .compatible = "rockchip,rk3588-pinctrl",
5078
+ .data = &rk3588_pin_ctrl },
43265079 #endif
43275080 {},
43285081 };
43295082
43305083 static struct platform_driver rockchip_pinctrl_driver = {
43315084 .probe = rockchip_pinctrl_probe,
5085
+ .remove = rockchip_pinctrl_remove,
43325086 .driver = {
43335087 .name = "rockchip-pinctrl",
43345088 .pm = &rockchip_pinctrl_dev_pm_ops,
....@@ -4348,6 +5102,103 @@
43485102 }
43495103 module_exit(rockchip_pinctrl_drv_unregister);
43505104
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
+
43515202 MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
43525203 MODULE_LICENSE("GPL");
43535204 MODULE_ALIAS("platform:pinctrl-rockchip");