hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
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,16 +701,23 @@
725701 };
726702
727703 static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
704
+ RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
728705 RK_MUXROUTE_GRF(3, RK_PD1, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_RX_M0 */
729706 RK_MUXROUTE_GRF(3, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_TX_M0 */
707
+ RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
730708 RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_RX_M1 */
731709 RK_MUXROUTE_GRF(3, RK_PA4, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_TX_M1 */
732710
711
+ RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
733712 RK_MUXROUTE_GRF(1, RK_PA1, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_SCLK_M0 */
713
+ RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
734714 RK_MUXROUTE_GRF(1, RK_PD6, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_SCLK_M1 */
715
+ RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
735716 RK_MUXROUTE_GRF(2, RK_PD1, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_SCLK_M2 */
736717
718
+ RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
737719 RK_MUXROUTE_GRF(1, RK_PC6, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_SCLK_M0 */
720
+ RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
738721 RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_SCLK_M1 */
739722
740723 RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
....@@ -916,22 +899,6 @@
916899 RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
917900 RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
918901 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 */
935902 RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
936903 RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
937904 RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
....@@ -965,7 +932,9 @@
965932 RK_MUXROUTE_SAME(2, RK_PC3, 2, 0x50, BIT(16 + 3)), /* pdm_sdi0m0 */
966933 RK_MUXROUTE_SAME(1, RK_PC7, 3, 0x50, BIT(16 + 3) | BIT(3)), /* pdm_sdi0m1 */
967934 RK_MUXROUTE_SAME(3, RK_PA2, 4, 0x50, BIT(16 + 4) | BIT(16 + 5) | BIT(5)), /* spi_rxdm2 */
935
+ RK_MUXROUTE_SAME(1, RK_PC6, 1, 0x50, BIT(16 + 6)), /* i2s2_sclkm0 */
968936 RK_MUXROUTE_SAME(1, RK_PD0, 1, 0x50, BIT(16 + 6)), /* i2s2_sdim0 */
937
+ RK_MUXROUTE_SAME(3, RK_PA0, 6, 0x50, BIT(16 + 6) | BIT(6)), /* i2s2_sclkm1 */
969938 RK_MUXROUTE_SAME(3, RK_PA2, 6, 0x50, BIT(16 + 6) | BIT(6)), /* i2s2_sdim1 */
970939 RK_MUXROUTE_SAME(2, RK_PC6, 3, 0x50, BIT(16 + 7) | BIT(7)), /* card_iom1 */
971940 RK_MUXROUTE_SAME(2, RK_PC0, 3, 0x50, BIT(16 + 8) | BIT(8)), /* tsp_d5m1 */
....@@ -1054,25 +1023,25 @@
10541023 RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */
10551024 RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
10561025 RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
1057
- 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 */
1060
- 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 */
1063
- 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 */
1066
- 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 */
1069
- 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 */
1072
- 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 */
1074
- 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 */
1026
+ RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 MCLK mux M0 */
1027
+ RK_MUXROUTE_GRF(1, RK_PA4, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 SCLKRX mux M0 */
1028
+ RK_MUXROUTE_GRF(1, RK_PA3, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 SCLKTX mux M0 */
1029
+ RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 MCLK mux M1 */
1030
+ RK_MUXROUTE_GRF(4, RK_PA6, 5, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 SCLKRX mux M1 */
1031
+ RK_MUXROUTE_GRF(3, RK_PC7, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 SCLKTX mux M1 */
1032
+ RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 MCLK mux M2 */
1033
+ RK_MUXROUTE_GRF(3, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 SCLKRX mux M2 */
1034
+ RK_MUXROUTE_GRF(2, RK_PD1, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 SCLKTX mux M2 */
1035
+ RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 MCLK mux M0 */
1036
+ RK_MUXROUTE_GRF(2, RK_PB7, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 SCLKRX mux M0 */
1037
+ RK_MUXROUTE_GRF(2, RK_PC2, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 SCLKTX mux M0 */
1038
+ RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 MCLK mux M1 */
1039
+ RK_MUXROUTE_GRF(4, RK_PC1, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 SCLKRX mux M1 */
1040
+ RK_MUXROUTE_GRF(4, RK_PB7, 4, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 SCLKTX mux M1 */
1041
+ RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 MCLK mux M0 */
1042
+ RK_MUXROUTE_GRF(3, RK_PA3, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 SCLK mux M0 */
1043
+ RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 MCLK mux M1 */
1044
+ RK_MUXROUTE_GRF(4, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 SCLK mux M1 */
10761045 RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10771046 RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10781047 RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
....@@ -1117,6 +1086,7 @@
11171086 static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
11181087 {
11191088 struct rockchip_pinctrl *info = bank->drvdata;
1089
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
11201090 int iomux_num = (pin / 8);
11211091 struct regmap *regmap;
11221092 unsigned int val;
....@@ -1162,6 +1132,27 @@
11621132 if (bank->recalced_mask & BIT(pin))
11631133 rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
11641134
1135
+ if (ctrl->type == RK3588) {
1136
+ if (bank->bank_num == 0) {
1137
+ if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
1138
+ u32 reg0 = 0;
1139
+
1140
+ reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1141
+ ret = regmap_read(regmap, reg0, &val);
1142
+ if (ret)
1143
+ return ret;
1144
+
1145
+ if (((val >> bit) & mask) != 8)
1146
+ return ((val >> bit) & mask);
1147
+
1148
+ reg = reg + 0x8000; /* BUS_IOC_BASE */
1149
+ regmap = info->regmap_base;
1150
+ }
1151
+ } else if (bank->bank_num > 0) {
1152
+ reg += 0x8000; /* BUS_IOC_BASE */
1153
+ }
1154
+ }
1155
+
11651156 ret = regmap_read(regmap, reg, &val);
11661157 if (ret)
11671158 return ret;
....@@ -1173,20 +1164,20 @@
11731164 int pin, int mux)
11741165 {
11751166 struct rockchip_pinctrl *info = bank->drvdata;
1167
+ struct device *dev = info->dev;
11761168 int iomux_num = (pin / 8);
11771169
11781170 if (iomux_num > 3)
11791171 return -EINVAL;
11801172
11811173 if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1182
- dev_err(info->dev, "pin %d is unrouted\n", pin);
1174
+ dev_err(dev, "pin %d is unrouted\n", pin);
11831175 return -EINVAL;
11841176 }
11851177
11861178 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
11871179 if (mux != RK_FUNC_GPIO) {
1188
- dev_err(info->dev,
1189
- "pin %d only supports a gpio mux\n", pin);
1180
+ dev_err(dev, "pin %d only supports a gpio mux\n", pin);
11901181 return -ENOTSUPP;
11911182 }
11921183 }
....@@ -1210,6 +1201,8 @@
12101201 static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
12111202 {
12121203 struct rockchip_pinctrl *info = bank->drvdata;
1204
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
1205
+ struct device *dev = info->dev;
12131206 int iomux_num = (pin / 8);
12141207 struct regmap *regmap;
12151208 int reg, ret, mask, mux_type;
....@@ -1223,8 +1216,7 @@
12231216 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
12241217 return 0;
12251218
1226
- dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",
1227
- bank->bank_num, pin, mux);
1219
+ dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
12281220
12291221 if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
12301222 regmap = info->regmap_pmu;
....@@ -1253,6 +1245,64 @@
12531245
12541246 if (bank->recalced_mask & BIT(pin))
12551247 rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
1248
+
1249
+ /* rk3562 force jtag m1 */
1250
+ if (ctrl->type == RK3562) {
1251
+ if (bank->bank_num == 1) {
1252
+ if ((pin == RK_PB5) || (pin == RK_PB6)) {
1253
+ if (mux == 1) {
1254
+ regmap_update_bits(regmap, 0x504, 0x10001, 0x10001);
1255
+ } else {
1256
+ regmap_update_bits(regmap, 0x504, 0x10001, 0x10000);
1257
+ }
1258
+ }
1259
+ }
1260
+ }
1261
+
1262
+ if (ctrl->type == RK3588) {
1263
+ if (bank->bank_num == 0) {
1264
+ if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
1265
+ if (mux < 8) {
1266
+ u32 reg0 = 0;
1267
+
1268
+ reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1269
+ data = (mask << (bit + 16));
1270
+ rmask = data | (data >> 16);
1271
+ data |= (mux & mask) << bit;
1272
+ ret = regmap_update_bits(regmap, reg0, rmask, data);
1273
+
1274
+ reg0 = reg + 0x8000; /* BUS_IOC_BASE */
1275
+ data = (mask << (bit + 16));
1276
+ rmask = data | (data >> 16);
1277
+ regmap = info->regmap_base;
1278
+ ret |= regmap_update_bits(regmap, reg0, rmask, data);
1279
+ } else {
1280
+ u32 reg0 = 0;
1281
+
1282
+ reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1283
+ data = (mask << (bit + 16));
1284
+ rmask = data | (data >> 16);
1285
+ data |= 8 << bit;
1286
+ ret = regmap_update_bits(regmap, reg0, rmask, data);
1287
+
1288
+ reg0 = reg + 0x8000; /* BUS_IOC_BASE */
1289
+ data = (mask << (bit + 16));
1290
+ rmask = data | (data >> 16);
1291
+ data |= (mux & mask) << bit;
1292
+ regmap = info->regmap_base;
1293
+ ret |= regmap_update_bits(regmap, reg0, rmask, data);
1294
+ }
1295
+ } else {
1296
+ data = (mask << (bit + 16));
1297
+ rmask = data | (data >> 16);
1298
+ data |= (mux & mask) << bit;
1299
+ ret = regmap_update_bits(regmap, reg, rmask, data);
1300
+ }
1301
+ return ret;
1302
+ } else if (bank->bank_num > 0) {
1303
+ reg += 0x8000; /* BUS_IOC_BASE */
1304
+ }
1305
+ }
12561306
12571307 if (mux > mask)
12581308 return -EINVAL;
....@@ -1302,9 +1352,9 @@
13021352 #define PX30_PULL_PINS_PER_REG 8
13031353 #define PX30_PULL_BANK_STRIDE 16
13041354
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)
1355
+static int px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1356
+ int pin_num, struct regmap **regmap,
1357
+ int *reg, u8 *bit)
13081358 {
13091359 struct rockchip_pinctrl *info = bank->drvdata;
13101360
....@@ -1324,6 +1374,8 @@
13241374 *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
13251375 *bit = (pin_num % PX30_PULL_PINS_PER_REG);
13261376 *bit *= PX30_PULL_BITS_PER_PIN;
1377
+
1378
+ return 0;
13271379 }
13281380
13291381 #define PX30_DRV_PMU_OFFSET 0x20
....@@ -1332,9 +1384,9 @@
13321384 #define PX30_DRV_PINS_PER_REG 8
13331385 #define PX30_DRV_BANK_STRIDE 16
13341386
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)
1387
+static int px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1388
+ int pin_num, struct regmap **regmap,
1389
+ int *reg, u8 *bit)
13381390 {
13391391 struct rockchip_pinctrl *info = bank->drvdata;
13401392
....@@ -1354,6 +1406,8 @@
13541406 *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
13551407 *bit = (pin_num % PX30_DRV_PINS_PER_REG);
13561408 *bit *= PX30_DRV_BITS_PER_PIN;
1409
+
1410
+ return 0;
13571411 }
13581412
13591413 #define PX30_SCHMITT_PMU_OFFSET 0x38
....@@ -1387,15 +1441,175 @@
13871441 return 0;
13881442 }
13891443
1444
+#define RV1106_DRV_BITS_PER_PIN 8
1445
+#define RV1106_DRV_PINS_PER_REG 2
1446
+#define RV1106_DRV_GPIO0_OFFSET 0x10
1447
+#define RV1106_DRV_GPIO1_OFFSET 0x80
1448
+#define RV1106_DRV_GPIO2_OFFSET 0x100C0
1449
+#define RV1106_DRV_GPIO3_OFFSET 0x20100
1450
+#define RV1106_DRV_GPIO4_OFFSET 0x30020
1451
+
1452
+static int rv1106_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1453
+ int pin_num, struct regmap **regmap,
1454
+ int *reg, u8 *bit)
1455
+{
1456
+ struct rockchip_pinctrl *info = bank->drvdata;
1457
+
1458
+ /* GPIO0_IOC is located in PMU */
1459
+ switch (bank->bank_num) {
1460
+ case 0:
1461
+ *regmap = info->regmap_pmu;
1462
+ *reg = RV1106_DRV_GPIO0_OFFSET;
1463
+ break;
1464
+
1465
+ case 1:
1466
+ *regmap = info->regmap_base;
1467
+ *reg = RV1106_DRV_GPIO1_OFFSET;
1468
+ break;
1469
+
1470
+ case 2:
1471
+ *regmap = info->regmap_base;
1472
+ *reg = RV1106_DRV_GPIO2_OFFSET;
1473
+ break;
1474
+
1475
+ case 3:
1476
+ *regmap = info->regmap_base;
1477
+ *reg = RV1106_DRV_GPIO3_OFFSET;
1478
+ break;
1479
+
1480
+ case 4:
1481
+ *regmap = info->regmap_base;
1482
+ *reg = RV1106_DRV_GPIO4_OFFSET;
1483
+ break;
1484
+
1485
+ default:
1486
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1487
+ break;
1488
+ }
1489
+
1490
+ *reg += ((pin_num / RV1106_DRV_PINS_PER_REG) * 4);
1491
+ *bit = pin_num % RV1106_DRV_PINS_PER_REG;
1492
+ *bit *= RV1106_DRV_BITS_PER_PIN;
1493
+
1494
+ return 0;
1495
+}
1496
+
1497
+#define RV1106_PULL_BITS_PER_PIN 2
1498
+#define RV1106_PULL_PINS_PER_REG 8
1499
+#define RV1106_PULL_GPIO0_OFFSET 0x38
1500
+#define RV1106_PULL_GPIO1_OFFSET 0x1C0
1501
+#define RV1106_PULL_GPIO2_OFFSET 0x101D0
1502
+#define RV1106_PULL_GPIO3_OFFSET 0x201E0
1503
+#define RV1106_PULL_GPIO4_OFFSET 0x30070
1504
+
1505
+static int rv1106_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1506
+ int pin_num, struct regmap **regmap,
1507
+ int *reg, u8 *bit)
1508
+{
1509
+ struct rockchip_pinctrl *info = bank->drvdata;
1510
+
1511
+ /* GPIO0_IOC is located in PMU */
1512
+ switch (bank->bank_num) {
1513
+ case 0:
1514
+ *regmap = info->regmap_pmu;
1515
+ *reg = RV1106_PULL_GPIO0_OFFSET;
1516
+ break;
1517
+
1518
+ case 1:
1519
+ *regmap = info->regmap_base;
1520
+ *reg = RV1106_PULL_GPIO1_OFFSET;
1521
+ break;
1522
+
1523
+ case 2:
1524
+ *regmap = info->regmap_base;
1525
+ *reg = RV1106_PULL_GPIO2_OFFSET;
1526
+ break;
1527
+
1528
+ case 3:
1529
+ *regmap = info->regmap_base;
1530
+ *reg = RV1106_PULL_GPIO3_OFFSET;
1531
+ break;
1532
+
1533
+ case 4:
1534
+ *regmap = info->regmap_base;
1535
+ *reg = RV1106_PULL_GPIO4_OFFSET;
1536
+ break;
1537
+
1538
+ default:
1539
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1540
+ break;
1541
+ }
1542
+
1543
+ *reg += ((pin_num / RV1106_PULL_PINS_PER_REG) * 4);
1544
+ *bit = pin_num % RV1106_PULL_PINS_PER_REG;
1545
+ *bit *= RV1106_PULL_BITS_PER_PIN;
1546
+
1547
+ return 0;
1548
+}
1549
+
1550
+#define RV1106_SMT_BITS_PER_PIN 1
1551
+#define RV1106_SMT_PINS_PER_REG 8
1552
+#define RV1106_SMT_GPIO0_OFFSET 0x40
1553
+#define RV1106_SMT_GPIO1_OFFSET 0x280
1554
+#define RV1106_SMT_GPIO2_OFFSET 0x10290
1555
+#define RV1106_SMT_GPIO3_OFFSET 0x202A0
1556
+#define RV1106_SMT_GPIO4_OFFSET 0x300A0
1557
+
1558
+static int rv1106_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1559
+ int pin_num,
1560
+ struct regmap **regmap,
1561
+ int *reg, u8 *bit)
1562
+{
1563
+ struct rockchip_pinctrl *info = bank->drvdata;
1564
+
1565
+ /* GPIO0_IOC is located in PMU */
1566
+ switch (bank->bank_num) {
1567
+ case 0:
1568
+ *regmap = info->regmap_pmu;
1569
+ *reg = RV1106_SMT_GPIO0_OFFSET;
1570
+ break;
1571
+
1572
+ case 1:
1573
+ *regmap = info->regmap_base;
1574
+ *reg = RV1106_SMT_GPIO1_OFFSET;
1575
+ break;
1576
+
1577
+ case 2:
1578
+ *regmap = info->regmap_base;
1579
+ *reg = RV1106_SMT_GPIO2_OFFSET;
1580
+ break;
1581
+
1582
+ case 3:
1583
+ *regmap = info->regmap_base;
1584
+ *reg = RV1106_SMT_GPIO3_OFFSET;
1585
+ break;
1586
+
1587
+ case 4:
1588
+ *regmap = info->regmap_base;
1589
+ *reg = RV1106_SMT_GPIO4_OFFSET;
1590
+ break;
1591
+
1592
+ default:
1593
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1594
+ break;
1595
+ }
1596
+
1597
+ *reg += ((pin_num / RV1106_SMT_PINS_PER_REG) * 4);
1598
+ *bit = pin_num % RV1106_SMT_PINS_PER_REG;
1599
+ *bit *= RV1106_SMT_BITS_PER_PIN;
1600
+
1601
+ return 0;
1602
+}
1603
+
13901604 #define RV1108_PULL_PMU_OFFSET 0x10
13911605 #define RV1108_PULL_OFFSET 0x110
13921606 #define RV1108_PULL_PINS_PER_REG 8
13931607 #define RV1108_PULL_BITS_PER_PIN 2
13941608 #define RV1108_PULL_BANK_STRIDE 16
13951609
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)
1610
+static int rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1611
+ int pin_num, struct regmap **regmap,
1612
+ int *reg, u8 *bit)
13991613 {
14001614 struct rockchip_pinctrl *info = bank->drvdata;
14011615
....@@ -1414,6 +1628,8 @@
14141628 *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
14151629 *bit = (pin_num % RV1108_PULL_PINS_PER_REG);
14161630 *bit *= RV1108_PULL_BITS_PER_PIN;
1631
+
1632
+ return 0;
14171633 }
14181634
14191635 #define RV1108_DRV_PMU_OFFSET 0x20
....@@ -1422,9 +1638,9 @@
14221638 #define RV1108_DRV_PINS_PER_REG 8
14231639 #define RV1108_DRV_BANK_STRIDE 16
14241640
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)
1641
+static int rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1642
+ int pin_num, struct regmap **regmap,
1643
+ int *reg, u8 *bit)
14281644 {
14291645 struct rockchip_pinctrl *info = bank->drvdata;
14301646
....@@ -1444,6 +1660,8 @@
14441660 *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
14451661 *bit = pin_num % RV1108_DRV_PINS_PER_REG;
14461662 *bit *= RV1108_DRV_BITS_PER_PIN;
1663
+
1664
+ return 0;
14471665 }
14481666
14491667 #define RV1108_SCHMITT_PMU_OFFSET 0x30
....@@ -1483,9 +1701,9 @@
14831701 #define RV1126_PULL_BANK_STRIDE 16
14841702 #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
14851703
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)
1704
+static int rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1705
+ int pin_num, struct regmap **regmap,
1706
+ int *reg, u8 *bit)
14891707 {
14901708 struct rockchip_pinctrl *info = bank->drvdata;
14911709
....@@ -1497,7 +1715,7 @@
14971715 *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
14981716 *bit = pin_num % RV1126_PULL_PINS_PER_REG;
14991717 *bit *= RV1126_PULL_BITS_PER_PIN;
1500
- return;
1718
+ return 0;
15011719 }
15021720 *regmap = info->regmap_pmu;
15031721 *reg = RV1126_PULL_PMU_OFFSET;
....@@ -1510,6 +1728,8 @@
15101728 *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
15111729 *bit = (pin_num % RV1126_PULL_PINS_PER_REG);
15121730 *bit *= RV1126_PULL_BITS_PER_PIN;
1731
+
1732
+ return 0;
15131733 }
15141734
15151735 #define RV1126_DRV_PMU_OFFSET 0x20
....@@ -1518,9 +1738,9 @@
15181738 #define RV1126_DRV_PINS_PER_REG 4
15191739 #define RV1126_DRV_BANK_STRIDE 32
15201740
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)
1741
+static int rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1742
+ int pin_num, struct regmap **regmap,
1743
+ int *reg, u8 *bit)
15241744 {
15251745 struct rockchip_pinctrl *info = bank->drvdata;
15261746
....@@ -1533,7 +1753,7 @@
15331753 *reg -= 0x4;
15341754 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15351755 *bit *= RV1126_DRV_BITS_PER_PIN;
1536
- return;
1756
+ return 0;
15371757 }
15381758 *regmap = info->regmap_pmu;
15391759 *reg = RV1126_DRV_PMU_OFFSET;
....@@ -1546,6 +1766,8 @@
15461766 *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
15471767 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15481768 *bit *= RV1126_DRV_BITS_PER_PIN;
1769
+
1770
+ return 0;
15491771 }
15501772
15511773 #define RV1126_SCHMITT_PMU_OFFSET 0x60
....@@ -1585,15 +1807,35 @@
15851807 return 0;
15861808 }
15871809
1810
+#define RK3308_SCHMITT_PINS_PER_REG 8
1811
+#define RK3308_SCHMITT_BANK_STRIDE 16
1812
+#define RK3308_SCHMITT_GRF_OFFSET 0x1a0
1813
+
1814
+static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1815
+ int pin_num, struct regmap **regmap,
1816
+ int *reg, u8 *bit)
1817
+{
1818
+ struct rockchip_pinctrl *info = bank->drvdata;
1819
+
1820
+ *regmap = info->regmap_base;
1821
+ *reg = RK3308_SCHMITT_GRF_OFFSET;
1822
+
1823
+ *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
1824
+ *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
1825
+ *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
1826
+
1827
+ return 0;
1828
+}
1829
+
15881830 #define RK1808_PULL_PMU_OFFSET 0x10
15891831 #define RK1808_PULL_GRF_OFFSET 0x80
15901832 #define RK1808_PULL_PINS_PER_REG 8
15911833 #define RK1808_PULL_BITS_PER_PIN 2
15921834 #define RK1808_PULL_BANK_STRIDE 16
15931835
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)
1836
+static int rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1837
+ int pin_num, struct regmap **regmap,
1838
+ int *reg, u8 *bit)
15971839 {
15981840 struct rockchip_pinctrl *info = bank->drvdata;
15991841
....@@ -1609,6 +1851,8 @@
16091851 *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
16101852 *bit = (pin_num % RK1808_PULL_PINS_PER_REG);
16111853 *bit *= RK1808_PULL_BITS_PER_PIN;
1854
+
1855
+ return 0;
16121856 }
16131857
16141858 #define RK1808_DRV_PMU_OFFSET 0x20
....@@ -1617,10 +1861,10 @@
16171861 #define RK1808_DRV_PINS_PER_REG 8
16181862 #define RK1808_DRV_BANK_STRIDE 16
16191863
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)
1864
+static int rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1865
+ int pin_num,
1866
+ struct regmap **regmap,
1867
+ int *reg, u8 *bit)
16241868 {
16251869 struct rockchip_pinctrl *info = bank->drvdata;
16261870
....@@ -1636,6 +1880,8 @@
16361880 *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
16371881 *bit = pin_num % RK1808_DRV_PINS_PER_REG;
16381882 *bit *= RK1808_DRV_BITS_PER_PIN;
1883
+
1884
+ return 0;
16391885 }
16401886
16411887 #define RK1808_SR_PMU_OFFSET 0x0030
....@@ -1694,9 +1940,9 @@
16941940 #define RK2928_PULL_PINS_PER_REG 16
16951941 #define RK2928_PULL_BANK_STRIDE 8
16961942
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)
1943
+static int rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1944
+ int pin_num, struct regmap **regmap,
1945
+ int *reg, u8 *bit)
17001946 {
17011947 struct rockchip_pinctrl *info = bank->drvdata;
17021948
....@@ -1706,13 +1952,15 @@
17061952 *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
17071953
17081954 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1955
+
1956
+ return 0;
17091957 };
17101958
17111959 #define RK3128_PULL_OFFSET 0x118
17121960
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)
1961
+static int rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1962
+ int pin_num, struct regmap **regmap,
1963
+ int *reg, u8 *bit)
17161964 {
17171965 struct rockchip_pinctrl *info = bank->drvdata;
17181966
....@@ -1722,6 +1970,8 @@
17221970 *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
17231971
17241972 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1973
+
1974
+ return 0;
17251975 }
17261976
17271977 #define RK3188_PULL_OFFSET 0x164
....@@ -1730,9 +1980,9 @@
17301980 #define RK3188_PULL_BANK_STRIDE 16
17311981 #define RK3188_PULL_PMU_OFFSET 0x64
17321982
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)
1983
+static int rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1984
+ int pin_num, struct regmap **regmap,
1985
+ int *reg, u8 *bit)
17361986 {
17371987 struct rockchip_pinctrl *info = bank->drvdata;
17381988
....@@ -1762,12 +2012,14 @@
17622012 *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
17632013 *bit *= RK3188_PULL_BITS_PER_PIN;
17642014 }
2015
+
2016
+ return 0;
17652017 }
17662018
17672019 #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)
2020
+static int rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2021
+ int pin_num, struct regmap **regmap,
2022
+ int *reg, u8 *bit)
17712023 {
17722024 struct rockchip_pinctrl *info = bank->drvdata;
17732025
....@@ -1791,6 +2043,8 @@
17912043 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
17922044 *bit *= RK3188_PULL_BITS_PER_PIN;
17932045 }
2046
+
2047
+ return 0;
17942048 }
17952049
17962050 #define RK3288_DRV_PMU_OFFSET 0x70
....@@ -1799,9 +2053,9 @@
17992053 #define RK3288_DRV_PINS_PER_REG 8
18002054 #define RK3288_DRV_BANK_STRIDE 16
18012055
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)
2056
+static int rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2057
+ int pin_num, struct regmap **regmap,
2058
+ int *reg, u8 *bit)
18052059 {
18062060 struct rockchip_pinctrl *info = bank->drvdata;
18072061
....@@ -1825,13 +2079,15 @@
18252079 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18262080 *bit *= RK3288_DRV_BITS_PER_PIN;
18272081 }
2082
+
2083
+ return 0;
18282084 }
18292085
18302086 #define RK3228_PULL_OFFSET 0x100
18312087
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)
2088
+static int rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2089
+ int pin_num, struct regmap **regmap,
2090
+ int *reg, u8 *bit)
18352091 {
18362092 struct rockchip_pinctrl *info = bank->drvdata;
18372093
....@@ -1842,13 +2098,15 @@
18422098
18432099 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18442100 *bit *= RK3188_PULL_BITS_PER_PIN;
2101
+
2102
+ return 0;
18452103 }
18462104
18472105 #define RK3228_DRV_GRF_OFFSET 0x200
18482106
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)
2107
+static int rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2108
+ int pin_num, struct regmap **regmap,
2109
+ int *reg, u8 *bit)
18522110 {
18532111 struct rockchip_pinctrl *info = bank->drvdata;
18542112
....@@ -1859,13 +2117,15 @@
18592117
18602118 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18612119 *bit *= RK3288_DRV_BITS_PER_PIN;
2120
+
2121
+ return 0;
18622122 }
18632123
18642124 #define RK3308_PULL_OFFSET 0xa0
18652125
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)
2126
+static int rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2127
+ int pin_num, struct regmap **regmap,
2128
+ int *reg, u8 *bit)
18692129 {
18702130 struct rockchip_pinctrl *info = bank->drvdata;
18712131
....@@ -1876,13 +2136,15 @@
18762136
18772137 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18782138 *bit *= RK3188_PULL_BITS_PER_PIN;
2139
+
2140
+ return 0;
18792141 }
18802142
18812143 #define RK3308_DRV_GRF_OFFSET 0x100
18822144
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)
2145
+static int rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2146
+ int pin_num, struct regmap **regmap,
2147
+ int *reg, u8 *bit)
18862148 {
18872149 struct rockchip_pinctrl *info = bank->drvdata;
18882150
....@@ -1893,14 +2155,39 @@
18932155
18942156 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18952157 *bit *= RK3288_DRV_BITS_PER_PIN;
2158
+
2159
+ return 0;
2160
+}
2161
+
2162
+#define RK3308_SLEW_RATE_GRF_OFFSET 0x150
2163
+#define RK3308_SLEW_RATE_BANK_STRIDE 16
2164
+#define RK3308_SLEW_RATE_PINS_PER_GRF_REG 8
2165
+
2166
+static int rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2167
+ int pin_num,
2168
+ struct regmap **regmap,
2169
+ int *reg, u8 *bit)
2170
+{
2171
+ struct rockchip_pinctrl *info = bank->drvdata;
2172
+ int pins_per_reg;
2173
+
2174
+ *regmap = info->regmap_base;
2175
+ *reg = RK3308_SLEW_RATE_GRF_OFFSET;
2176
+ *reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE;
2177
+ pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG;
2178
+
2179
+ *reg += ((pin_num / pins_per_reg) * 4);
2180
+ *bit = pin_num % pins_per_reg;
2181
+
2182
+ return 0;
18962183 }
18972184
18982185 #define RK3368_PULL_GRF_OFFSET 0x100
18992186 #define RK3368_PULL_PMU_OFFSET 0x10
19002187
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)
2188
+static int rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2189
+ int pin_num, struct regmap **regmap,
2190
+ int *reg, u8 *bit)
19042191 {
19052192 struct rockchip_pinctrl *info = bank->drvdata;
19062193
....@@ -1924,14 +2211,16 @@
19242211 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19252212 *bit *= RK3188_PULL_BITS_PER_PIN;
19262213 }
2214
+
2215
+ return 0;
19272216 }
19282217
19292218 #define RK3368_DRV_PMU_OFFSET 0x20
19302219 #define RK3368_DRV_GRF_OFFSET 0x200
19312220
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)
2221
+static int rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2222
+ int pin_num, struct regmap **regmap,
2223
+ int *reg, u8 *bit)
19352224 {
19362225 struct rockchip_pinctrl *info = bank->drvdata;
19372226
....@@ -1955,15 +2244,17 @@
19552244 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
19562245 *bit *= RK3288_DRV_BITS_PER_PIN;
19572246 }
2247
+
2248
+ return 0;
19582249 }
19592250
19602251 #define RK3399_PULL_GRF_OFFSET 0xe040
19612252 #define RK3399_PULL_PMU_OFFSET 0x40
19622253 #define RK3399_DRV_3BITS_PER_PIN 3
19632254
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)
2255
+static int rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2256
+ int pin_num, struct regmap **regmap,
2257
+ int *reg, u8 *bit)
19672258 {
19682259 struct rockchip_pinctrl *info = bank->drvdata;
19692260
....@@ -1989,11 +2280,13 @@
19892280 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19902281 *bit *= RK3188_PULL_BITS_PER_PIN;
19912282 }
2283
+
2284
+ return 0;
19922285 }
19932286
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)
2287
+static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2288
+ int pin_num, struct regmap **regmap,
2289
+ int *reg, u8 *bit)
19972290 {
19982291 struct rockchip_pinctrl *info = bank->drvdata;
19992292 int drv_num = (pin_num / 8);
....@@ -2010,6 +2303,8 @@
20102303 *bit = (pin_num % 8) * 3;
20112304 else
20122305 *bit = (pin_num % 8) * 2;
2306
+
2307
+ return 0;
20132308 }
20142309
20152310 #define RK3528_DRV_BITS_PER_PIN 8
....@@ -2020,9 +2315,9 @@
20202315 #define RK3528_DRV_GPIO3_OFFSET 0x20190
20212316 #define RK3528_DRV_GPIO4_OFFSET 0x101C0
20222317
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)
2318
+static int rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2319
+ int pin_num, struct regmap **regmap,
2320
+ int *reg, u8 *bit)
20262321 {
20272322 struct rockchip_pinctrl *info = bank->drvdata;
20282323
....@@ -2056,6 +2351,8 @@
20562351 *reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
20572352 *bit = pin_num % RK3528_DRV_PINS_PER_REG;
20582353 *bit *= RK3528_DRV_BITS_PER_PIN;
2354
+
2355
+ return 0;
20592356 }
20602357
20612358 #define RK3528_PULL_BITS_PER_PIN 2
....@@ -2066,9 +2363,9 @@
20662363 #define RK3528_PULL_GPIO3_OFFSET 0x20230
20672364 #define RK3528_PULL_GPIO4_OFFSET 0x10240
20682365
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)
2366
+static int rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2367
+ int pin_num, struct regmap **regmap,
2368
+ int *reg, u8 *bit)
20722369 {
20732370 struct rockchip_pinctrl *info = bank->drvdata;
20742371
....@@ -2102,6 +2399,8 @@
21022399 *reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
21032400 *bit = pin_num % RK3528_PULL_PINS_PER_REG;
21042401 *bit *= RK3528_PULL_BITS_PER_PIN;
2402
+
2403
+ return 0;
21052404 }
21062405
21072406 #define RK3528_SMT_BITS_PER_PIN 1
....@@ -2152,6 +2451,151 @@
21522451 return 0;
21532452 }
21542453
2454
+#define RK3562_DRV_BITS_PER_PIN 8
2455
+#define RK3562_DRV_PINS_PER_REG 2
2456
+#define RK3562_DRV_GPIO0_OFFSET 0x20070
2457
+#define RK3562_DRV_GPIO1_OFFSET 0x200
2458
+#define RK3562_DRV_GPIO2_OFFSET 0x240
2459
+#define RK3562_DRV_GPIO3_OFFSET 0x10280
2460
+#define RK3562_DRV_GPIO4_OFFSET 0x102C0
2461
+
2462
+static int rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2463
+ int pin_num, struct regmap **regmap,
2464
+ int *reg, u8 *bit)
2465
+{
2466
+ struct rockchip_pinctrl *info = bank->drvdata;
2467
+
2468
+ *regmap = info->regmap_base;
2469
+ switch (bank->bank_num) {
2470
+ case 0:
2471
+ *reg = RK3562_DRV_GPIO0_OFFSET;
2472
+ break;
2473
+
2474
+ case 1:
2475
+ *reg = RK3562_DRV_GPIO1_OFFSET;
2476
+ break;
2477
+
2478
+ case 2:
2479
+ *reg = RK3562_DRV_GPIO2_OFFSET;
2480
+ break;
2481
+
2482
+ case 3:
2483
+ *reg = RK3562_DRV_GPIO3_OFFSET;
2484
+ break;
2485
+
2486
+ case 4:
2487
+ *reg = RK3562_DRV_GPIO4_OFFSET;
2488
+ break;
2489
+
2490
+ default:
2491
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2492
+ break;
2493
+ }
2494
+
2495
+ *reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4);
2496
+ *bit = pin_num % RK3562_DRV_PINS_PER_REG;
2497
+ *bit *= RK3562_DRV_BITS_PER_PIN;
2498
+
2499
+ return 0;
2500
+}
2501
+
2502
+#define RK3562_PULL_BITS_PER_PIN 2
2503
+#define RK3562_PULL_PINS_PER_REG 8
2504
+#define RK3562_PULL_GPIO0_OFFSET 0x20020
2505
+#define RK3562_PULL_GPIO1_OFFSET 0x80
2506
+#define RK3562_PULL_GPIO2_OFFSET 0x90
2507
+#define RK3562_PULL_GPIO3_OFFSET 0x100A0
2508
+#define RK3562_PULL_GPIO4_OFFSET 0x100B0
2509
+
2510
+static int rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2511
+ int pin_num, struct regmap **regmap,
2512
+ int *reg, u8 *bit)
2513
+{
2514
+ struct rockchip_pinctrl *info = bank->drvdata;
2515
+
2516
+ *regmap = info->regmap_base;
2517
+ switch (bank->bank_num) {
2518
+ case 0:
2519
+ *reg = RK3562_PULL_GPIO0_OFFSET;
2520
+ break;
2521
+
2522
+ case 1:
2523
+ *reg = RK3562_PULL_GPIO1_OFFSET;
2524
+ break;
2525
+
2526
+ case 2:
2527
+ *reg = RK3562_PULL_GPIO2_OFFSET;
2528
+ break;
2529
+
2530
+ case 3:
2531
+ *reg = RK3562_PULL_GPIO3_OFFSET;
2532
+ break;
2533
+
2534
+ case 4:
2535
+ *reg = RK3562_PULL_GPIO4_OFFSET;
2536
+ break;
2537
+
2538
+ default:
2539
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2540
+ break;
2541
+ }
2542
+
2543
+ *reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4);
2544
+ *bit = pin_num % RK3562_PULL_PINS_PER_REG;
2545
+ *bit *= RK3562_PULL_BITS_PER_PIN;
2546
+
2547
+ return 0;
2548
+}
2549
+
2550
+#define RK3562_SMT_BITS_PER_PIN 2
2551
+#define RK3562_SMT_PINS_PER_REG 8
2552
+#define RK3562_SMT_GPIO0_OFFSET 0x20030
2553
+#define RK3562_SMT_GPIO1_OFFSET 0xC0
2554
+#define RK3562_SMT_GPIO2_OFFSET 0xD0
2555
+#define RK3562_SMT_GPIO3_OFFSET 0x100E0
2556
+#define RK3562_SMT_GPIO4_OFFSET 0x100F0
2557
+
2558
+static int rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2559
+ int pin_num,
2560
+ struct regmap **regmap,
2561
+ int *reg, u8 *bit)
2562
+{
2563
+ struct rockchip_pinctrl *info = bank->drvdata;
2564
+
2565
+ *regmap = info->regmap_base;
2566
+ switch (bank->bank_num) {
2567
+ case 0:
2568
+ *reg = RK3562_SMT_GPIO0_OFFSET;
2569
+ break;
2570
+
2571
+ case 1:
2572
+ *reg = RK3562_SMT_GPIO1_OFFSET;
2573
+ break;
2574
+
2575
+ case 2:
2576
+ *reg = RK3562_SMT_GPIO2_OFFSET;
2577
+ break;
2578
+
2579
+ case 3:
2580
+ *reg = RK3562_SMT_GPIO3_OFFSET;
2581
+ break;
2582
+
2583
+ case 4:
2584
+ *reg = RK3562_SMT_GPIO4_OFFSET;
2585
+ break;
2586
+
2587
+ default:
2588
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2589
+ break;
2590
+ }
2591
+
2592
+ *reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4);
2593
+ *bit = pin_num % RK3562_SMT_PINS_PER_REG;
2594
+ *bit *= RK3562_SMT_BITS_PER_PIN;
2595
+
2596
+ return 0;
2597
+}
2598
+
21552599 #define RK3568_SR_PMU_OFFSET 0x60
21562600 #define RK3568_SR_GRF_OFFSET 0x0180
21572601 #define RK3568_SR_BANK_STRIDE 0x10
....@@ -2186,9 +2630,9 @@
21862630 #define RK3568_PULL_PINS_PER_REG 8
21872631 #define RK3568_PULL_BANK_STRIDE 0x10
21882632
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)
2633
+static int rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2634
+ int pin_num, struct regmap **regmap,
2635
+ int *reg, u8 *bit)
21922636 {
21932637 struct rockchip_pinctrl *info = bank->drvdata;
21942638
....@@ -2209,6 +2653,8 @@
22092653 *bit = (pin_num % RK3568_PULL_PINS_PER_REG);
22102654 *bit *= RK3568_PULL_BITS_PER_PIN;
22112655 }
2656
+
2657
+ return 0;
22122658 }
22132659
22142660 #define RK3568_DRV_PMU_OFFSET 0x70
....@@ -2217,9 +2663,9 @@
22172663 #define RK3568_DRV_PINS_PER_REG 2
22182664 #define RK3568_DRV_BANK_STRIDE 0x40
22192665
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)
2666
+static int rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2667
+ int pin_num, struct regmap **regmap,
2668
+ int *reg, u8 *bit)
22232669 {
22242670 struct rockchip_pinctrl *info = bank->drvdata;
22252671
....@@ -2246,6 +2692,197 @@
22462692 ((bank->bank_num == 2 || bank->bank_num == 3 || bank->bank_num == 4) &&
22472693 (pin_num == 7 || pin_num == 15 || pin_num == 23 || pin_num == 31)))
22482694 *bit -= RK3568_DRV_BITS_PER_PIN;
2695
+
2696
+ return 0;
2697
+}
2698
+
2699
+#define RK3588_PMU1_IOC_REG (0x0000)
2700
+#define RK3588_PMU2_IOC_REG (0x4000)
2701
+#define RK3588_BUS_IOC_REG (0x8000)
2702
+#define RK3588_VCCIO1_4_IOC_REG (0x9000)
2703
+#define RK3588_VCCIO3_5_IOC_REG (0xA000)
2704
+#define RK3588_VCCIO2_IOC_REG (0xB000)
2705
+#define RK3588_VCCIO6_IOC_REG (0xC000)
2706
+#define RK3588_EMMC_IOC_REG (0xD000)
2707
+
2708
+static const u32 rk3588_ds_regs[][2] = {
2709
+ {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0010},
2710
+ {RK_GPIO0_A4, RK3588_PMU1_IOC_REG + 0x0014},
2711
+ {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0018},
2712
+ {RK_GPIO0_B4, RK3588_PMU2_IOC_REG + 0x0014},
2713
+ {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0018},
2714
+ {RK_GPIO0_C4, RK3588_PMU2_IOC_REG + 0x001C},
2715
+ {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0020},
2716
+ {RK_GPIO0_D4, RK3588_PMU2_IOC_REG + 0x0024},
2717
+ {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0020},
2718
+ {RK_GPIO1_A4, RK3588_VCCIO1_4_IOC_REG + 0x0024},
2719
+ {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0028},
2720
+ {RK_GPIO1_B4, RK3588_VCCIO1_4_IOC_REG + 0x002C},
2721
+ {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0030},
2722
+ {RK_GPIO1_C4, RK3588_VCCIO1_4_IOC_REG + 0x0034},
2723
+ {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x0038},
2724
+ {RK_GPIO1_D4, RK3588_VCCIO1_4_IOC_REG + 0x003C},
2725
+ {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0040},
2726
+ {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0044},
2727
+ {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0048},
2728
+ {RK_GPIO2_B4, RK3588_VCCIO3_5_IOC_REG + 0x004C},
2729
+ {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0050},
2730
+ {RK_GPIO2_C4, RK3588_VCCIO3_5_IOC_REG + 0x0054},
2731
+ {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x0058},
2732
+ {RK_GPIO2_D4, RK3588_EMMC_IOC_REG + 0x005C},
2733
+ {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0060},
2734
+ {RK_GPIO3_A4, RK3588_VCCIO3_5_IOC_REG + 0x0064},
2735
+ {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0068},
2736
+ {RK_GPIO3_B4, RK3588_VCCIO3_5_IOC_REG + 0x006C},
2737
+ {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0070},
2738
+ {RK_GPIO3_C4, RK3588_VCCIO3_5_IOC_REG + 0x0074},
2739
+ {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x0078},
2740
+ {RK_GPIO3_D4, RK3588_VCCIO3_5_IOC_REG + 0x007C},
2741
+ {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0080},
2742
+ {RK_GPIO4_A4, RK3588_VCCIO6_IOC_REG + 0x0084},
2743
+ {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0088},
2744
+ {RK_GPIO4_B4, RK3588_VCCIO6_IOC_REG + 0x008C},
2745
+ {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0090},
2746
+ {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0090},
2747
+ {RK_GPIO4_C4, RK3588_VCCIO3_5_IOC_REG + 0x0094},
2748
+ {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x0098},
2749
+};
2750
+
2751
+static const u32 rk3588_p_regs[][2] = {
2752
+ {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0020},
2753
+ {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0024},
2754
+ {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0028},
2755
+ {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x002C},
2756
+ {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0030},
2757
+ {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0110},
2758
+ {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0114},
2759
+ {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0118},
2760
+ {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x011C},
2761
+ {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0120},
2762
+ {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0120},
2763
+ {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0124},
2764
+ {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0128},
2765
+ {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x012C},
2766
+ {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0130},
2767
+ {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0134},
2768
+ {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0138},
2769
+ {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x013C},
2770
+ {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0140},
2771
+ {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0144},
2772
+ {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0148},
2773
+ {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0148},
2774
+ {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x014C},
2775
+};
2776
+
2777
+static const u32 rk3588_smt_regs[][2] = {
2778
+ {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0030},
2779
+ {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0034},
2780
+ {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0040},
2781
+ {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0044},
2782
+ {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0048},
2783
+ {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0210},
2784
+ {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0214},
2785
+ {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0218},
2786
+ {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x021C},
2787
+ {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0220},
2788
+ {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0220},
2789
+ {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0224},
2790
+ {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0228},
2791
+ {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x022C},
2792
+ {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0230},
2793
+ {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0234},
2794
+ {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0238},
2795
+ {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x023C},
2796
+ {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0240},
2797
+ {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0244},
2798
+ {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0248},
2799
+ {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0248},
2800
+ {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x024C},
2801
+};
2802
+
2803
+#define RK3588_PULL_BITS_PER_PIN 2
2804
+#define RK3588_PULL_PINS_PER_REG 8
2805
+
2806
+static int rk3588_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2807
+ int pin_num, struct regmap **regmap,
2808
+ int *reg, u8 *bit)
2809
+{
2810
+ struct rockchip_pinctrl *info = bank->drvdata;
2811
+ u8 bank_num = bank->bank_num;
2812
+ u32 pin = bank_num * 32 + pin_num;
2813
+ int i;
2814
+
2815
+ for (i = ARRAY_SIZE(rk3588_p_regs) - 1; i >= 0; i--) {
2816
+ if (pin >= rk3588_p_regs[i][0]) {
2817
+ *reg = rk3588_p_regs[i][1];
2818
+ break;
2819
+ }
2820
+ BUG_ON(i == 0);
2821
+ }
2822
+
2823
+ *regmap = info->regmap_base;
2824
+ *reg += ((pin - rk3588_p_regs[i][0]) / RK3588_PULL_PINS_PER_REG) * 4;
2825
+ *bit = pin_num % RK3588_PULL_PINS_PER_REG;
2826
+ *bit *= RK3588_PULL_BITS_PER_PIN;
2827
+
2828
+ return 0;
2829
+}
2830
+
2831
+#define RK3588_DRV_BITS_PER_PIN 4
2832
+#define RK3588_DRV_PINS_PER_REG 4
2833
+
2834
+static int rk3588_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2835
+ int pin_num, struct regmap **regmap,
2836
+ int *reg, u8 *bit)
2837
+{
2838
+ struct rockchip_pinctrl *info = bank->drvdata;
2839
+ u8 bank_num = bank->bank_num;
2840
+ u32 pin = bank_num * 32 + pin_num;
2841
+ int i;
2842
+
2843
+ for (i = ARRAY_SIZE(rk3588_ds_regs) - 1; i >= 0; i--) {
2844
+ if (pin >= rk3588_ds_regs[i][0]) {
2845
+ *reg = rk3588_ds_regs[i][1];
2846
+ break;
2847
+ }
2848
+ BUG_ON(i == 0);
2849
+ }
2850
+
2851
+ *regmap = info->regmap_base;
2852
+ *reg += ((pin - rk3588_ds_regs[i][0]) / RK3588_DRV_PINS_PER_REG) * 4;
2853
+ *bit = pin_num % RK3588_DRV_PINS_PER_REG;
2854
+ *bit *= RK3588_DRV_BITS_PER_PIN;
2855
+
2856
+ return 0;
2857
+}
2858
+
2859
+#define RK3588_SMT_BITS_PER_PIN 1
2860
+#define RK3588_SMT_PINS_PER_REG 8
2861
+
2862
+static int rk3588_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2863
+ int pin_num,
2864
+ struct regmap **regmap,
2865
+ int *reg, u8 *bit)
2866
+{
2867
+ struct rockchip_pinctrl *info = bank->drvdata;
2868
+ u8 bank_num = bank->bank_num;
2869
+ u32 pin = bank_num * 32 + pin_num;
2870
+ int i;
2871
+
2872
+ for (i = ARRAY_SIZE(rk3588_smt_regs) - 1; i >= 0; i--) {
2873
+ if (pin >= rk3588_smt_regs[i][0]) {
2874
+ *reg = rk3588_smt_regs[i][1];
2875
+ break;
2876
+ }
2877
+ BUG_ON(i == 0);
2878
+ }
2879
+
2880
+ *regmap = info->regmap_base;
2881
+ *reg += ((pin - rk3588_smt_regs[i][0]) / RK3588_SMT_PINS_PER_REG) * 4;
2882
+ *bit = pin_num % RK3588_SMT_PINS_PER_REG;
2883
+ *bit *= RK3588_SMT_BITS_PER_PIN;
2884
+
2885
+ return 0;
22492886 }
22502887
22512888 static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
....@@ -2262,13 +2899,16 @@
22622899 {
22632900 struct rockchip_pinctrl *info = bank->drvdata;
22642901 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2902
+ struct device *dev = info->dev;
22652903 struct regmap *regmap;
22662904 int reg, ret;
22672905 u32 data, temp, rmask_bits;
22682906 u8 bit;
22692907 int drv_type = bank->drv[pin_num / 8].drv_type;
22702908
2271
- ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2909
+ ret = ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2910
+ if (ret)
2911
+ return ret;
22722912
22732913 switch (drv_type) {
22742914 case DRV_TYPE_IO_1V8_3V0_AUTO:
....@@ -2307,7 +2947,7 @@
23072947 bit -= 16;
23082948 break;
23092949 default:
2310
- dev_err(info->dev, "unsupported bit: %d for pinctrl drive type: %d\n",
2950
+ dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
23112951 bit, drv_type);
23122952 return -EINVAL;
23132953 }
....@@ -2320,8 +2960,7 @@
23202960 rmask_bits = RK3288_DRV_BITS_PER_PIN;
23212961 break;
23222962 default:
2323
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2324
- drv_type);
2963
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
23252964 return -EINVAL;
23262965 }
23272966
....@@ -2354,21 +2993,28 @@
23542993 {
23552994 struct rockchip_pinctrl *info = bank->drvdata;
23562995 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2996
+ struct device *dev = info->dev;
23572997 struct regmap *regmap;
23582998 int reg, ret, i, err;
23592999 u32 data, rmask, rmask_bits, temp;
23603000 u8 bit;
23613001 int drv_type = bank->drv[pin_num / 8].drv_type;
23623002
2363
- dev_dbg(info->dev, "setting drive of GPIO%d-%d to %d\n",
3003
+ dev_dbg(dev, "setting drive of GPIO%d-%d to %d\n",
23643004 bank->bank_num, pin_num, strength);
23653005
2366
- ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2367
- if (ctrl->type == RV1126) {
3006
+ ret = ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3007
+ if (ret)
3008
+ return ret;
3009
+
3010
+ if (ctrl->type == RV1126 || ctrl->type == RK3588) {
23683011 rmask_bits = RV1126_DRV_BITS_PER_PIN;
23693012 ret = strength;
23703013 goto config;
2371
- } else if (ctrl->type == RK3568 || ctrl->type == RK3528) {
3014
+ } else if (ctrl->type == RV1106 ||
3015
+ ctrl->type == RK3528 ||
3016
+ ctrl->type == RK3562 ||
3017
+ ctrl->type == RK3568) {
23723018 rmask_bits = RK3568_DRV_BITS_PER_PIN;
23733019 ret = (1 << (strength + 1)) - 1;
23743020 goto config;
....@@ -2386,8 +3032,7 @@
23863032 }
23873033
23883034 if (ret < 0) {
2389
- dev_err(info->dev, "unsupported driver strength %d\n",
2390
- strength);
3035
+ dev_err(dev, "unsupported driver strength %d\n", strength);
23913036 return ret;
23923037 }
23933038
....@@ -2426,7 +3071,7 @@
24263071 bit -= 16;
24273072 break;
24283073 default:
2429
- dev_err(info->dev, "unsupported bit: %d for pinctrl drive type: %d\n",
3074
+ dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
24303075 bit, drv_type);
24313076 return -EINVAL;
24323077 }
....@@ -2438,8 +3083,7 @@
24383083 rmask_bits = RK3288_DRV_BITS_PER_PIN;
24393084 break;
24403085 default:
2441
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2442
- drv_type);
3086
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
24433087 return -EINVAL;
24443088 }
24453089
....@@ -2508,6 +3152,7 @@
25083152 {
25093153 struct rockchip_pinctrl *info = bank->drvdata;
25103154 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3155
+ struct device *dev = info->dev;
25113156 struct regmap *regmap;
25123157 int reg, ret, pull_type;
25133158 u8 bit;
....@@ -2517,7 +3162,9 @@
25173162 if (ctrl->type == RK3066B)
25183163 return PIN_CONFIG_BIAS_DISABLE;
25193164
2520
- ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3165
+ ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3166
+ if (ret)
3167
+ return ret;
25213168
25223169 ret = regmap_read(regmap, reg, &data);
25233170 if (ret)
....@@ -2530,6 +3177,7 @@
25303177 ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
25313178 : PIN_CONFIG_BIAS_DISABLE;
25323179 case PX30:
3180
+ case RV1106:
25333181 case RV1108:
25343182 case RV1126:
25353183 case RK1808:
....@@ -2539,14 +3187,24 @@
25393187 case RK3368:
25403188 case RK3399:
25413189 case RK3528:
3190
+ case RK3562:
25423191 case RK3568:
3192
+ case RK3588:
25433193 pull_type = bank->pull_type[pin_num / 8];
25443194 data >>= bit;
25453195 data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
3196
+ /*
3197
+ * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
3198
+ * where that pull up value becomes 3.
3199
+ */
3200
+ if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
3201
+ if (data == 3)
3202
+ data = 1;
3203
+ }
25463204
25473205 return rockchip_pull_list[pull_type][data];
25483206 default:
2549
- dev_err(info->dev, "unsupported pinctrl type\n");
3207
+ dev_err(dev, "unsupported pinctrl type\n");
25503208 return -EINVAL;
25513209 };
25523210 }
....@@ -2556,19 +3214,21 @@
25563214 {
25573215 struct rockchip_pinctrl *info = bank->drvdata;
25583216 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3217
+ struct device *dev = info->dev;
25593218 struct regmap *regmap;
25603219 int reg, ret, i, pull_type;
25613220 u8 bit;
25623221 u32 data, rmask;
25633222
2564
- dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n",
2565
- bank->bank_num, pin_num, pull);
3223
+ dev_dbg(dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull);
25663224
25673225 /* rk3066b does support any pulls */
25683226 if (ctrl->type == RK3066B)
25693227 return pull ? -EINVAL : 0;
25703228
2571
- ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3229
+ ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3230
+ if (ret)
3231
+ return ret;
25723232
25733233 switch (ctrl->type) {
25743234 case RK2928:
....@@ -2579,6 +3239,7 @@
25793239 ret = regmap_write(regmap, reg, data);
25803240 break;
25813241 case PX30:
3242
+ case RV1106:
25823243 case RV1108:
25833244 case RV1126:
25843245 case RK1808:
....@@ -2588,7 +3249,9 @@
25883249 case RK3368:
25893250 case RK3399:
25903251 case RK3528:
3252
+ case RK3562:
25913253 case RK3568:
3254
+ case RK3588:
25923255 pull_type = bank->pull_type[pin_num / 8];
25933256 ret = -EINVAL;
25943257 for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
....@@ -2599,7 +3262,7 @@
25993262 }
26003263 }
26013264 /*
2602
- * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6,
3265
+ * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
26033266 * where that pull up value becomes 3.
26043267 */
26053268 if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
....@@ -2608,8 +3271,7 @@
26083271 }
26093272
26103273 if (ret < 0) {
2611
- dev_err(info->dev, "unsupported pull setting %d\n",
2612
- pull);
3274
+ dev_err(dev, "unsupported pull setting %d\n", pull);
26133275 return ret;
26143276 }
26153277
....@@ -2621,32 +3283,11 @@
26213283 ret = regmap_update_bits(regmap, reg, rmask, data);
26223284 break;
26233285 default:
2624
- dev_err(info->dev, "unsupported pinctrl type\n");
3286
+ dev_err(dev, "unsupported pinctrl type\n");
26253287 return -EINVAL;
26263288 }
26273289
26283290 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;
26503291 }
26513292
26523293 #define RK3328_SCHMITT_BITS_PER_PIN 1
....@@ -2719,6 +3360,7 @@
27193360
27203361 data >>= bit;
27213362 switch (ctrl->type) {
3363
+ case RK3562:
27223364 case RK3568:
27233365 return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
27243366 default:
....@@ -2733,12 +3375,13 @@
27333375 {
27343376 struct rockchip_pinctrl *info = bank->drvdata;
27353377 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3378
+ struct device *dev = info->dev;
27363379 struct regmap *regmap;
27373380 int reg, ret;
27383381 u8 bit;
27393382 u32 data, rmask;
27403383
2741
- dev_dbg(info->dev, "setting input schmitt of GPIO%d-%d to %d\n",
3384
+ dev_dbg(dev, "setting input schmitt of GPIO%d-%d to %d\n",
27423385 bank->bank_num, pin_num, enable);
27433386
27443387 ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
....@@ -2747,6 +3390,7 @@
27473390
27483391 /* enable the write to the equivalent lower bits */
27493392 switch (ctrl->type) {
3393
+ case RK3562:
27503394 case RK3568:
27513395 data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
27523396 rmask = data | (data >> 16);
....@@ -2881,10 +3525,11 @@
28813525 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
28823526 const unsigned int *pins = info->groups[group].pins;
28833527 const struct rockchip_pin_config *data = info->groups[group].data;
3528
+ struct device *dev = info->dev;
28843529 struct rockchip_pin_bank *bank;
28853530 int cnt, ret = 0;
28863531
2887
- dev_dbg(info->dev, "enable function %s group %s\n",
3532
+ dev_dbg(dev, "enable function %s group %s\n",
28883533 info->functions[selector].name, info->groups[group].name);
28893534
28903535 /*
....@@ -2932,6 +3577,7 @@
29323577 case RK3066B:
29333578 return pull ? false : true;
29343579 case PX30:
3580
+ case RV1106:
29353581 case RV1108:
29363582 case RV1126:
29373583 case RK1808:
....@@ -2941,11 +3587,31 @@
29413587 case RK3368:
29423588 case RK3399:
29433589 case RK3528:
3590
+ case RK3562:
29443591 case RK3568:
3592
+ case RK3588:
29453593 return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
29463594 }
29473595
29483596 return false;
3597
+}
3598
+
3599
+static int rockchip_pinconf_defer_pin(struct rockchip_pin_bank *bank,
3600
+ unsigned int pin, u32 param, u32 arg)
3601
+{
3602
+ struct rockchip_pin_deferred *cfg;
3603
+
3604
+ cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
3605
+ if (!cfg)
3606
+ return -ENOMEM;
3607
+
3608
+ cfg->pin = pin;
3609
+ cfg->param = param;
3610
+ cfg->arg = arg;
3611
+
3612
+ list_add_tail(&cfg->head, &bank->deferred_pins);
3613
+
3614
+ return 0;
29493615 }
29503616
29513617 /* set the pin config settings for a specified pin */
....@@ -2963,6 +3629,25 @@
29633629 for (i = 0; i < num_configs; i++) {
29643630 param = pinconf_to_config_param(configs[i]);
29653631 arg = pinconf_to_config_argument(configs[i]);
3632
+
3633
+ if (param == PIN_CONFIG_OUTPUT || param == PIN_CONFIG_INPUT_ENABLE) {
3634
+ /*
3635
+ * Check for gpio driver not being probed yet.
3636
+ * The lock makes sure that either gpio-probe has completed
3637
+ * or the gpio driver hasn't probed yet.
3638
+ */
3639
+ mutex_lock(&bank->deferred_lock);
3640
+ if (!gpio || !gpio->direction_output) {
3641
+ rc = rockchip_pinconf_defer_pin(bank, pin - bank->pin_base, param,
3642
+ arg);
3643
+ mutex_unlock(&bank->deferred_lock);
3644
+ if (rc)
3645
+ return rc;
3646
+
3647
+ break;
3648
+ }
3649
+ mutex_unlock(&bank->deferred_lock);
3650
+ }
29663651
29673652 switch (param) {
29683653 case PIN_CONFIG_BIAS_DISABLE:
....@@ -2989,10 +3674,8 @@
29893674 case PIN_CONFIG_OUTPUT:
29903675 rc = rockchip_set_mux(bank, pin - bank->pin_base,
29913676 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);
3677
+ if (rc != RK_FUNC_GPIO)
29943678 return -EINVAL;
2995
- }
29963679
29973680 rc = gpio->direction_output(gpio, pin - bank->pin_base,
29983681 arg);
....@@ -3077,13 +3760,13 @@
30773760 break;
30783761 case PIN_CONFIG_OUTPUT:
30793762 rc = rockchip_get_mux(bank, pin - bank->pin_base);
3080
- if (rc != 0)
3763
+ if (rc != RK_FUNC_GPIO)
30813764 return -EINVAL;
30823765
3083
- /* 0 for output, 1 for input */
3084
- rc = gpio->get_direction(gpio, pin - bank->pin_base);
3085
- if (rc)
3086
- return -EINVAL;
3766
+ if (!gpio || !gpio->get) {
3767
+ arg = 0;
3768
+ break;
3769
+ }
30873770
30883771 rc = gpio->get(gpio, pin - bank->pin_base);
30893772 if (rc < 0)
....@@ -3143,24 +3826,13 @@
31433826 {},
31443827 };
31453828
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
-
31573829 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
31583830 struct device_node *np)
31593831 {
31603832 struct device_node *child;
31613833
31623834 for_each_child_of_node(np, child) {
3163
- if (!is_function_node(child))
3835
+ if (of_match_node(rockchip_bank_match, child))
31643836 continue;
31653837
31663838 info->nfunctions++;
....@@ -3173,6 +3845,7 @@
31733845 struct rockchip_pinctrl *info,
31743846 u32 index)
31753847 {
3848
+ struct device *dev = info->dev;
31763849 struct rockchip_pin_bank *bank;
31773850 int size;
31783851 const __be32 *list;
....@@ -3180,7 +3853,7 @@
31803853 int i, j;
31813854 int ret;
31823855
3183
- dev_dbg(info->dev, "group(%d): %pOFn\n", index, np);
3856
+ dev_dbg(dev, "group(%d): %pOFn\n", index, np);
31843857
31853858 /* Initialise group */
31863859 grp->name = np->name;
....@@ -3192,19 +3865,13 @@
31923865 list = of_get_property(np, "rockchip,pins", &size);
31933866 /* we do not check return since it's safe node passed down */
31943867 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
- }
3868
+ if (!size || size % 4)
3869
+ return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
31993870
32003871 grp->npins = size / 4;
32013872
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);
3873
+ grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
3874
+ grp->data = devm_kcalloc(dev, grp->npins, sizeof(*grp->data), GFP_KERNEL);
32083875 if (!grp->pins || !grp->data)
32093876 return -ENOMEM;
32103877
....@@ -3227,6 +3894,7 @@
32273894 np_config = of_find_node_by_phandle(be32_to_cpup(phandle));
32283895 ret = pinconf_generic_parse_dt_config(np_config, NULL,
32293896 &grp->data[j].configs, &grp->data[j].nconfigs);
3897
+ of_node_put(np_config);
32303898 if (ret)
32313899 return ret;
32323900 }
....@@ -3238,6 +3906,7 @@
32383906 struct rockchip_pinctrl *info,
32393907 u32 index)
32403908 {
3909
+ struct device *dev = info->dev;
32413910 struct device_node *child;
32423911 struct rockchip_pmx_func *func;
32433912 struct rockchip_pin_group *grp;
....@@ -3245,7 +3914,7 @@
32453914 static u32 grp_index;
32463915 u32 i = 0;
32473916
3248
- dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np);
3917
+ dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
32493918
32503919 func = &info->functions[index];
32513920
....@@ -3255,8 +3924,7 @@
32553924 if (func->ngroups <= 0)
32563925 return 0;
32573926
3258
- func->groups = devm_kcalloc(info->dev,
3259
- func->ngroups, sizeof(char *), GFP_KERNEL);
3927
+ func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
32603928 if (!func->groups)
32613929 return -ENOMEM;
32623930
....@@ -3284,32 +3952,26 @@
32843952
32853953 rockchip_pinctrl_child_count(info, np);
32863954
3287
- dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions);
3288
- dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups);
3955
+ dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
3956
+ dev_dbg(dev, "ngroups = %d\n", info->ngroups);
32893957
3290
- info->functions = devm_kcalloc(dev,
3291
- info->nfunctions,
3292
- sizeof(struct rockchip_pmx_func),
3293
- GFP_KERNEL);
3958
+ info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
32943959 if (!info->functions)
32953960 return -ENOMEM;
32963961
3297
- info->groups = devm_kcalloc(dev,
3298
- info->ngroups,
3299
- sizeof(struct rockchip_pin_group),
3300
- GFP_KERNEL);
3962
+ info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
33013963 if (!info->groups)
33023964 return -ENOMEM;
33033965
33043966 i = 0;
33053967
33063968 for_each_child_of_node(np, child) {
3307
- if (!is_function_node(child))
3969
+ if (of_match_node(rockchip_bank_match, child))
33083970 continue;
33093971
33103972 ret = rockchip_pinctrl_parse_functions(child, info, i++);
33113973 if (ret) {
3312
- dev_err(&pdev->dev, "failed to parse function\n");
3974
+ dev_err(dev, "failed to parse function\n");
33133975 of_node_put(child);
33143976 return ret;
33153977 }
....@@ -3324,6 +3986,7 @@
33243986 struct pinctrl_desc *ctrldesc = &info->pctl;
33253987 struct pinctrl_pin_desc *pindesc, *pdesc;
33263988 struct rockchip_pin_bank *pin_bank;
3989
+ struct device *dev = &pdev->dev;
33273990 int pin, bank, ret;
33283991 int k;
33293992
....@@ -3333,9 +3996,7 @@
33333996 ctrldesc->pmxops = &rockchip_pmx_ops;
33343997 ctrldesc->confops = &rockchip_pinconf_ops;
33353998
3336
- pindesc = devm_kcalloc(&pdev->dev,
3337
- info->ctrl->nr_pins, sizeof(*pindesc),
3338
- GFP_KERNEL);
3999
+ pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
33394000 if (!pindesc)
33404001 return -ENOMEM;
33414002
....@@ -3351,41 +4012,24 @@
33514012 pin_bank->name, pin);
33524013 pdesc++;
33534014 }
4015
+
4016
+ INIT_LIST_HEAD(&pin_bank->deferred_pins);
4017
+ mutex_init(&pin_bank->deferred_lock);
33544018 }
33554019
33564020 ret = rockchip_pinctrl_parse_dt(pdev, info);
33574021 if (ret)
33584022 return ret;
33594023
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
- }
4024
+ info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
4025
+ if (IS_ERR(info->pctl_dev))
4026
+ return dev_err_probe(dev, PTR_ERR(info->pctl_dev), "could not register pinctrl driver\n");
33654027
33664028 return 0;
33674029 }
33684030
33694031 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
-
4032
+static struct rockchip_pin_bank rk3308bs_pin_banks[];
33894033 static struct rockchip_pin_bank px30s_pin_banks[];
33904034
33914035 /* retrieve the soc specific data */
....@@ -3393,22 +4037,19 @@
33934037 struct rockchip_pinctrl *d,
33944038 struct platform_device *pdev)
33954039 {
4040
+ struct device *dev = &pdev->dev;
4041
+ struct device_node *node = dev->of_node;
33964042 const struct of_device_id *match;
3397
- struct device_node *node = pdev->dev.of_node;
33984043 struct rockchip_pin_ctrl *ctrl;
33994044 struct rockchip_pin_bank *bank;
34004045 int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
34014046
34024047 match = of_match_node(rockchip_pinctrl_dt_match, node);
34034048 ctrl = (struct rockchip_pin_ctrl *)match->data;
4049
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && soc_is_rk3308bs())
4050
+ ctrl->pin_banks = rk3308bs_pin_banks;
34044051 if (IS_ENABLED(CONFIG_CPU_PX30) && soc_is_px30s())
34054052 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
- }
34124053
34134054 grf_offs = ctrl->grf_mux_offset;
34144055 pmu_offs = ctrl->pmu_mux_offset;
....@@ -3455,7 +4096,7 @@
34554096 drv_pmu_offs : drv_grf_offs;
34564097 }
34574098
3458
- dev_dbg(d->dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
4099
+ dev_dbg(dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
34594100 i, j, iom->offset, drv->offset);
34604101
34614102 /*
....@@ -3562,60 +4203,56 @@
35624203
35634204 /* SoC data specially handle */
35644205
3565
-/* rk3308b SoC data initialize */
3566
-#define RK3308B_GRF_SOC_CON13 0x608
3567
-#define RK3308B_GRF_SOC_CON15 0x610
4206
+/* rk3308 SoC data initialize */
4207
+#define RK3308_GRF_SOC_CON13 0x608
4208
+#define RK3308_GRF_SOC_CON15 0x610
35684209
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))
4210
+/* RK3308_GRF_SOC_CON13 */
4211
+#define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
4212
+#define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4213
+#define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
35734214
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))
4215
+/* RK3308_GRF_SOC_CON15 */
4216
+#define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
4217
+#define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4218
+#define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
35784219
3579
-static int rk3308b_soc_data_init(struct rockchip_pinctrl *info)
4220
+static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
35804221 {
35814222 int ret;
35824223
35834224 /*
35844225 * Enable the special ctrl of selected sources.
35854226 */
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;
35934227
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
- }
4228
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13,
4229
+ RK3308_GRF_I2C3_IOFUNC_SRC_CTRL |
4230
+ RK3308_GRF_GPIO2A3_SEL_SRC_CTRL |
4231
+ RK3308_GRF_GPIO2A2_SEL_SRC_CTRL);
4232
+ if (ret)
4233
+ return ret;
36014234
3602
- return 0;
4235
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15,
4236
+ RK3308_GRF_GPIO2C0_SEL_SRC_CTRL |
4237
+ RK3308_GRF_GPIO3B3_SEL_SRC_CTRL |
4238
+ RK3308_GRF_GPIO3B2_SEL_SRC_CTRL);
4239
+
4240
+ return ret;
4241
+
36034242 }
36044243
36054244 static int rockchip_pinctrl_probe(struct platform_device *pdev)
36064245 {
36074246 struct rockchip_pinctrl *info;
36084247 struct device *dev = &pdev->dev;
4248
+ struct device_node *np = dev->of_node, *node;
36094249 struct rockchip_pin_ctrl *ctrl;
3610
- struct device_node *np = pdev->dev.of_node, *node;
36114250 struct resource *res;
36124251 void __iomem *base;
36134252 int ret;
36144253
3615
- if (!dev->of_node) {
3616
- dev_err(dev, "device tree node not found\n");
3617
- return -ENODEV;
3618
- }
4254
+ if (!dev->of_node)
4255
+ return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
36194256
36204257 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
36214258 if (!info)
....@@ -3624,44 +4261,39 @@
36244261 info->dev = dev;
36254262
36264263 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
3627
- if (!ctrl) {
3628
- dev_err(dev, "driver data not available\n");
3629
- return -EINVAL;
3630
- }
4264
+ if (!ctrl)
4265
+ return dev_err_probe(dev, -EINVAL, "driver data not available\n");
36314266 info->ctrl = ctrl;
36324267
36334268 node = of_parse_phandle(np, "rockchip,grf", 0);
36344269 if (node) {
36354270 info->regmap_base = syscon_node_to_regmap(node);
4271
+ of_node_put(node);
36364272 if (IS_ERR(info->regmap_base))
36374273 return PTR_ERR(info->regmap_base);
36384274 } else {
3639
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3640
- base = devm_ioremap_resource(&pdev->dev, res);
4275
+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
36414276 if (IS_ERR(base))
36424277 return PTR_ERR(base);
36434278
36444279 rockchip_regmap_config.max_register = resource_size(res) - 4;
36454280 rockchip_regmap_config.name = "rockchip,pinctrl";
3646
- info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base,
3647
- &rockchip_regmap_config);
4281
+ info->regmap_base =
4282
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
36484283
36494284 /* to check for the old dt-bindings */
36504285 info->reg_size = resource_size(res);
36514286
36524287 /* Honor the old binding, with pull registers as 2nd resource */
36534288 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);
4289
+ base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
36564290 if (IS_ERR(base))
36574291 return PTR_ERR(base);
36584292
3659
- rockchip_regmap_config.max_register =
3660
- resource_size(res) - 4;
4293
+ rockchip_regmap_config.max_register = resource_size(res) - 4;
36614294 rockchip_regmap_config.name = "rockchip,pinctrl-pull";
3662
- info->regmap_pull = devm_regmap_init_mmio(&pdev->dev,
3663
- base,
3664
- &rockchip_regmap_config);
4295
+ info->regmap_pull =
4296
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
36654297 }
36664298 }
36674299
....@@ -3669,13 +4301,13 @@
36694301 node = of_parse_phandle(np, "rockchip,pmu", 0);
36704302 if (node) {
36714303 info->regmap_pmu = syscon_node_to_regmap(node);
4304
+ of_node_put(node);
36724305 if (IS_ERR(info->regmap_pmu))
36734306 return PTR_ERR(info->regmap_pmu);
36744307 }
36754308
3676
- /* Special handle for some Socs */
3677
- if (ctrl->soc_data_init) {
3678
- ret = ctrl->soc_data_init(info);
4309
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
4310
+ ret = rk3308_soc_data_init(info);
36794311 if (ret)
36804312 return ret;
36814313 }
....@@ -3685,16 +4317,49 @@
36854317 return ret;
36864318
36874319 platform_set_drvdata(pdev, info);
4320
+ g_pctldev = info->pctl_dev;
36884321
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
- }
4322
+ ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
4323
+ if (ret)
4324
+ return dev_err_probe(dev, ret, "failed to register gpio device\n");
4325
+
36944326 dev_info(dev, "probed %s\n", dev_name(dev));
36954327
36964328 return 0;
36974329 }
4330
+
4331
+static int rockchip_pinctrl_remove(struct platform_device *pdev)
4332
+{
4333
+ struct rockchip_pinctrl *info = platform_get_drvdata(pdev);
4334
+ struct rockchip_pin_bank *bank;
4335
+ struct rockchip_pin_deferred *cfg;
4336
+ int i;
4337
+
4338
+ g_pctldev = NULL;
4339
+ of_platform_depopulate(&pdev->dev);
4340
+
4341
+ for (i = 0; i < info->ctrl->nr_banks; i++) {
4342
+ bank = &info->ctrl->pin_banks[i];
4343
+
4344
+ mutex_lock(&bank->deferred_lock);
4345
+ while (!list_empty(&bank->deferred_pins)) {
4346
+ cfg = list_first_entry(&bank->deferred_pins,
4347
+ struct rockchip_pin_deferred, head);
4348
+ list_del(&cfg->head);
4349
+ kfree(cfg);
4350
+ }
4351
+ mutex_unlock(&bank->deferred_lock);
4352
+ }
4353
+
4354
+ return 0;
4355
+}
4356
+
4357
+static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
4358
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
4359
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4360
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4361
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4362
+};
36984363
36994364 static struct rockchip_pin_bank px30_pin_banks[] = {
37004365 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
....@@ -3719,13 +4384,6 @@
37194384 ),
37204385 };
37214386
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
-
37294387 static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
37304388 .pin_banks = px30_pin_banks,
37314389 .nr_banks = ARRAY_SIZE(px30_pin_banks),
....@@ -3739,6 +4397,48 @@
37394397 .drv_calc_reg = px30_calc_drv_reg_and_bit,
37404398 .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
37414399 .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit,
4400
+};
4401
+
4402
+static struct rockchip_pin_bank rv1106_pin_banks[] = {
4403
+ PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
4404
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4405
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4406
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4407
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU),
4408
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4409
+ IOMUX_WIDTH_4BIT,
4410
+ IOMUX_WIDTH_4BIT,
4411
+ IOMUX_WIDTH_4BIT,
4412
+ IOMUX_WIDTH_4BIT,
4413
+ 0, 0x08, 0x10, 0x18),
4414
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4415
+ IOMUX_WIDTH_4BIT,
4416
+ IOMUX_WIDTH_4BIT,
4417
+ IOMUX_WIDTH_4BIT,
4418
+ IOMUX_WIDTH_4BIT,
4419
+ 0x10020, 0x10028, 0, 0),
4420
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4421
+ IOMUX_WIDTH_4BIT,
4422
+ IOMUX_WIDTH_4BIT,
4423
+ IOMUX_WIDTH_4BIT,
4424
+ IOMUX_WIDTH_4BIT,
4425
+ 0x20040, 0x20048, 0x20050, 0x20058),
4426
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 24, "gpio4",
4427
+ IOMUX_WIDTH_4BIT,
4428
+ IOMUX_WIDTH_4BIT,
4429
+ IOMUX_WIDTH_4BIT,
4430
+ 0,
4431
+ 0x30000, 0x30008, 0x30010, 0),
4432
+};
4433
+
4434
+static struct rockchip_pin_ctrl rv1106_pin_ctrl __maybe_unused = {
4435
+ .pin_banks = rv1106_pin_banks,
4436
+ .nr_banks = ARRAY_SIZE(rv1106_pin_banks),
4437
+ .label = "RV1106-GPIO",
4438
+ .type = RV1106,
4439
+ .pull_calc_reg = rv1106_calc_pull_reg_and_bit,
4440
+ .drv_calc_reg = rv1106_calc_drv_reg_and_bit,
4441
+ .schmitt_calc_reg = rv1106_calc_schmitt_reg_and_bit,
37424442 };
37434443
37444444 static struct rockchip_pin_bank rv1108_pin_banks[] = {
....@@ -4011,6 +4711,14 @@
40114711 .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
40124712 };
40134713
4714
+static struct rockchip_pin_bank rk3308bs_pin_banks[] __maybe_unused = {
4715
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4716
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4717
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4718
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4719
+ S_PIN_BANK_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4720
+};
4721
+
40144722 static struct rockchip_pin_bank rk3308_pin_banks[] = {
40154723 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
40164724 IOMUX_WIDTH_2BIT,
....@@ -4044,11 +4752,10 @@
40444752 .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
40454753 .iomux_routes = rk3308_mux_route_data,
40464754 .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,
40494755 .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
40504756 .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
40514757 .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
4758
+ .slew_rate_calc_reg = rk3308_calc_slew_rate_reg_and_bit,
40524759 };
40534760
40544761 static struct rockchip_pin_bank rk3328_pin_banks[] = {
....@@ -4213,6 +4920,49 @@
42134920 .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit,
42144921 };
42154922
4923
+static struct rockchip_pin_bank rk3562_pin_banks[] = {
4924
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4925
+ IOMUX_WIDTH_4BIT,
4926
+ IOMUX_WIDTH_4BIT,
4927
+ IOMUX_WIDTH_4BIT,
4928
+ IOMUX_WIDTH_4BIT,
4929
+ 0x20000, 0x20008, 0x20010, 0x20018),
4930
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4931
+ IOMUX_WIDTH_4BIT,
4932
+ IOMUX_WIDTH_4BIT,
4933
+ IOMUX_WIDTH_4BIT,
4934
+ IOMUX_WIDTH_4BIT,
4935
+ 0, 0x08, 0x10, 0x18),
4936
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4937
+ IOMUX_WIDTH_4BIT,
4938
+ IOMUX_WIDTH_4BIT,
4939
+ IOMUX_WIDTH_4BIT,
4940
+ IOMUX_WIDTH_4BIT,
4941
+ 0x20, 0, 0, 0),
4942
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4943
+ IOMUX_WIDTH_4BIT,
4944
+ IOMUX_WIDTH_4BIT,
4945
+ IOMUX_WIDTH_4BIT,
4946
+ IOMUX_WIDTH_4BIT,
4947
+ 0x10040, 0x10048, 0x10050, 0x10058),
4948
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
4949
+ IOMUX_WIDTH_4BIT,
4950
+ IOMUX_WIDTH_4BIT,
4951
+ 0,
4952
+ 0,
4953
+ 0x10060, 0x10068, 0, 0),
4954
+};
4955
+
4956
+static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = {
4957
+ .pin_banks = rk3562_pin_banks,
4958
+ .nr_banks = ARRAY_SIZE(rk3562_pin_banks),
4959
+ .label = "RK3562-GPIO",
4960
+ .type = RK3562,
4961
+ .pull_calc_reg = rk3562_calc_pull_reg_and_bit,
4962
+ .drv_calc_reg = rk3562_calc_drv_reg_and_bit,
4963
+ .schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit,
4964
+};
4965
+
42164966 static struct rockchip_pin_bank rk3568_pin_banks[] = {
42174967 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
42184968 IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
....@@ -4253,12 +5003,39 @@
42535003 .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
42545004 };
42555005
5006
+static struct rockchip_pin_bank rk3588_pin_banks[] = {
5007
+ RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
5008
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5009
+ RK3588_PIN_BANK_FLAGS(1, 32, "gpio1",
5010
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5011
+ RK3588_PIN_BANK_FLAGS(2, 32, "gpio2",
5012
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5013
+ RK3588_PIN_BANK_FLAGS(3, 32, "gpio3",
5014
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5015
+ RK3588_PIN_BANK_FLAGS(4, 32, "gpio4",
5016
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5017
+};
5018
+
5019
+static struct rockchip_pin_ctrl rk3588_pin_ctrl __maybe_unused = {
5020
+ .pin_banks = rk3588_pin_banks,
5021
+ .nr_banks = ARRAY_SIZE(rk3588_pin_banks),
5022
+ .label = "RK3588-GPIO",
5023
+ .type = RK3588,
5024
+ .pull_calc_reg = rk3588_calc_pull_reg_and_bit,
5025
+ .drv_calc_reg = rk3588_calc_drv_reg_and_bit,
5026
+ .schmitt_calc_reg = rk3588_calc_schmitt_reg_and_bit,
5027
+};
5028
+
42565029 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
42575030 #ifdef CONFIG_CPU_PX30
42585031 { .compatible = "rockchip,px30-pinctrl",
42595032 .data = &px30_pin_ctrl },
42605033 #endif
4261
-#ifdef CONFIG_CPU_RV110X
5034
+#ifdef CONFIG_CPU_RV1106
5035
+ { .compatible = "rockchip,rv1106-pinctrl",
5036
+ .data = &rv1106_pin_ctrl },
5037
+#endif
5038
+#ifdef CONFIG_CPU_RV1108
42625039 { .compatible = "rockchip,rv1108-pinctrl",
42635040 .data = &rv1108_pin_ctrl },
42645041 #endif
....@@ -4320,15 +5097,24 @@
43205097 { .compatible = "rockchip,rk3528-pinctrl",
43215098 .data = &rk3528_pin_ctrl },
43225099 #endif
5100
+#ifdef CONFIG_CPU_RK3562
5101
+ { .compatible = "rockchip,rk3562-pinctrl",
5102
+ .data = &rk3562_pin_ctrl },
5103
+#endif
43235104 #ifdef CONFIG_CPU_RK3568
43245105 { .compatible = "rockchip,rk3568-pinctrl",
43255106 .data = &rk3568_pin_ctrl },
5107
+#endif
5108
+#ifdef CONFIG_CPU_RK3588
5109
+ { .compatible = "rockchip,rk3588-pinctrl",
5110
+ .data = &rk3588_pin_ctrl },
43265111 #endif
43275112 {},
43285113 };
43295114
43305115 static struct platform_driver rockchip_pinctrl_driver = {
43315116 .probe = rockchip_pinctrl_probe,
5117
+ .remove = rockchip_pinctrl_remove,
43325118 .driver = {
43335119 .name = "rockchip-pinctrl",
43345120 .pm = &rockchip_pinctrl_dev_pm_ops,
....@@ -4348,6 +5134,103 @@
43485134 }
43495135 module_exit(rockchip_pinctrl_drv_unregister);
43505136
5137
+/**
5138
+ * rk_iomux_set - set the rockchip iomux by pin number.
5139
+ *
5140
+ * @bank: the gpio bank index, from 0 to the max bank num.
5141
+ * @pin: the gpio pin index, from 0 to 31.
5142
+ * @mux: the pointer to store mux value.
5143
+ *
5144
+ * Return 0 if set success, else return error code.
5145
+ */
5146
+int rk_iomux_set(int bank, int pin, int mux)
5147
+{
5148
+ struct pinctrl_dev *pctldev = g_pctldev;
5149
+ struct rockchip_pinctrl *info;
5150
+ struct rockchip_pin_bank *gpio;
5151
+ struct rockchip_pin_group *grp = NULL;
5152
+ struct rockchip_pin_config *cfg = NULL;
5153
+ int i, j, ret;
5154
+
5155
+ if (!g_pctldev)
5156
+ return -ENODEV;
5157
+
5158
+ info = pinctrl_dev_get_drvdata(pctldev);
5159
+ if (bank >= info->ctrl->nr_banks)
5160
+ return -EINVAL;
5161
+
5162
+ if (pin > 31 || pin < 0)
5163
+ return -EINVAL;
5164
+
5165
+ gpio = &info->ctrl->pin_banks[bank];
5166
+
5167
+ mutex_lock(&iomux_lock);
5168
+ for (i = 0; i < info->ngroups; i++) {
5169
+ grp = &info->groups[i];
5170
+ for (j = 0; j < grp->npins; i++) {
5171
+ if (grp->pins[i] == (gpio->pin_base + pin)) {
5172
+ cfg = grp->data;
5173
+ break;
5174
+ }
5175
+ }
5176
+ }
5177
+
5178
+ ret = rockchip_set_mux(gpio, pin, mux);
5179
+ if (ret) {
5180
+ dev_err(info->dev, "mux GPIO%d-%d %d fail\n", bank, pin, mux);
5181
+ goto out;
5182
+ }
5183
+
5184
+ if (cfg && (cfg->func != mux))
5185
+ cfg->func = mux;
5186
+
5187
+out:
5188
+ mutex_unlock(&iomux_lock);
5189
+
5190
+ return ret;
5191
+}
5192
+EXPORT_SYMBOL_GPL(rk_iomux_set);
5193
+
5194
+/**
5195
+ * rk_iomux_get - get the rockchip iomux by pin number.
5196
+ *
5197
+ * @bank: the gpio bank index, from 0 to the max bank num.
5198
+ * @pin: the gpio pin index, from 0 to 31.
5199
+ * @mux: the pointer to store mux value.
5200
+ *
5201
+ * Return 0 if get success, else return error code.
5202
+ */
5203
+int rk_iomux_get(int bank, int pin, int *mux)
5204
+{
5205
+ struct pinctrl_dev *pctldev = g_pctldev;
5206
+ struct rockchip_pinctrl *info;
5207
+ struct rockchip_pin_bank *gpio;
5208
+ int ret;
5209
+
5210
+ if (!g_pctldev)
5211
+ return -ENODEV;
5212
+ if (!mux)
5213
+ return -EINVAL;
5214
+
5215
+ info = pinctrl_dev_get_drvdata(pctldev);
5216
+ if (bank >= info->ctrl->nr_banks)
5217
+ return -EINVAL;
5218
+
5219
+ if (pin > 31 || pin < 0)
5220
+ return -EINVAL;
5221
+
5222
+ gpio = &info->ctrl->pin_banks[bank];
5223
+
5224
+ mutex_lock(&iomux_lock);
5225
+ ret = rockchip_get_mux(gpio, pin);
5226
+ mutex_unlock(&iomux_lock);
5227
+
5228
+ *mux = ret;
5229
+
5230
+ return (ret >= 0) ? 0 : ret;
5231
+}
5232
+EXPORT_SYMBOL_GPL(rk_iomux_get);
5233
+
43515234 MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
43525235 MODULE_LICENSE("GPL");
43535236 MODULE_ALIAS("platform:pinctrl-rockchip");