forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
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
....@@ -726,14 +702,23 @@
726702
727703 static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
728704 RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
705
+ RK_MUXROUTE_GRF(3, RK_PD1, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_RX_M0 */
706
+ RK_MUXROUTE_GRF(3, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_TX_M0 */
729707 RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
708
+ RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_RX_M1 */
709
+ RK_MUXROUTE_GRF(3, RK_PA4, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_TX_M1 */
730710
731711 RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
712
+ RK_MUXROUTE_GRF(1, RK_PA1, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_SCLK_M0 */
732713 RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
714
+ RK_MUXROUTE_GRF(1, RK_PD6, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_SCLK_M1 */
733715 RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
716
+ RK_MUXROUTE_GRF(2, RK_PD1, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_SCLK_M2 */
734717
735718 RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
719
+ RK_MUXROUTE_GRF(1, RK_PC6, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_SCLK_M0 */
736720 RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
721
+ RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_SCLK_M1 */
737722
738723 RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
739724 RK_MUXROUTE_GRF(3, RK_PC0, 3, 0x10260, WRITE_MASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
....@@ -914,22 +899,6 @@
914899 RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
915900 RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
916901 RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
917
- RK_MUXROUTE_SAME(0, RK_PC7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */
918
- RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */
919
- RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
920
- RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
921
- RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
922
- RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
923
- RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
924
- RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
925
- RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
926
- RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
927
-};
928
-
929
-static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
930
- RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
931
- RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
932
- RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
933902 RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
934903 RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
935904 RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
....@@ -963,7 +932,9 @@
963932 RK_MUXROUTE_SAME(2, RK_PC3, 2, 0x50, BIT(16 + 3)), /* pdm_sdi0m0 */
964933 RK_MUXROUTE_SAME(1, RK_PC7, 3, 0x50, BIT(16 + 3) | BIT(3)), /* pdm_sdi0m1 */
965934 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 */
966936 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 */
967938 RK_MUXROUTE_SAME(3, RK_PA2, 6, 0x50, BIT(16 + 6) | BIT(6)), /* i2s2_sdim1 */
968939 RK_MUXROUTE_SAME(2, RK_PC6, 3, 0x50, BIT(16 + 7) | BIT(7)), /* card_iom1 */
969940 RK_MUXROUTE_SAME(2, RK_PC0, 3, 0x50, BIT(16 + 8) | BIT(8)), /* tsp_d5m1 */
....@@ -1052,25 +1023,25 @@
10521023 RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */
10531024 RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
10541025 RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
1055
- RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
1056
- RK_MUXROUTE_GRF(1, RK_PA3, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk tx M0 */
1057
- RK_MUXROUTE_GRF(1, RK_PA4, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk rx M0 */
1058
- RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
1059
- RK_MUXROUTE_GRF(3, RK_PC7, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk tx M1 */
1060
- RK_MUXROUTE_GRF(4, RK_PA6, 5, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk rx M1 */
1061
- RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
1062
- RK_MUXROUTE_GRF(2, RK_PD1, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk tx M2 */
1063
- RK_MUXROUTE_GRF(3, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk rx M2 */
1064
- RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
1065
- RK_MUXROUTE_GRF(2, RK_PC2, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk tx M0 */
1066
- RK_MUXROUTE_GRF(2, RK_PB7, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk rx M0 */
1067
- RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
1068
- RK_MUXROUTE_GRF(4, RK_PB7, 4, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk tx M1 */
1069
- RK_MUXROUTE_GRF(4, RK_PC1, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk rx M1 */
1070
- RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
1071
- RK_MUXROUTE_GRF(3, RK_PA3, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux sclk M0 */
1072
- RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
1073
- RK_MUXROUTE_GRF(4, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux sclk M1 */
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 */
10741045 RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10751046 RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
10761047 RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
....@@ -1115,6 +1086,7 @@
11151086 static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
11161087 {
11171088 struct rockchip_pinctrl *info = bank->drvdata;
1089
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
11181090 int iomux_num = (pin / 8);
11191091 struct regmap *regmap;
11201092 unsigned int val;
....@@ -1160,6 +1132,27 @@
11601132 if (bank->recalced_mask & BIT(pin))
11611133 rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
11621134
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
+
11631156 ret = regmap_read(regmap, reg, &val);
11641157 if (ret)
11651158 return ret;
....@@ -1171,20 +1164,20 @@
11711164 int pin, int mux)
11721165 {
11731166 struct rockchip_pinctrl *info = bank->drvdata;
1167
+ struct device *dev = info->dev;
11741168 int iomux_num = (pin / 8);
11751169
11761170 if (iomux_num > 3)
11771171 return -EINVAL;
11781172
11791173 if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1180
- dev_err(info->dev, "pin %d is unrouted\n", pin);
1174
+ dev_err(dev, "pin %d is unrouted\n", pin);
11811175 return -EINVAL;
11821176 }
11831177
11841178 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
11851179 if (mux != RK_FUNC_GPIO) {
1186
- dev_err(info->dev,
1187
- "pin %d only supports a gpio mux\n", pin);
1180
+ dev_err(dev, "pin %d only supports a gpio mux\n", pin);
11881181 return -ENOTSUPP;
11891182 }
11901183 }
....@@ -1208,6 +1201,8 @@
12081201 static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
12091202 {
12101203 struct rockchip_pinctrl *info = bank->drvdata;
1204
+ struct rockchip_pin_ctrl *ctrl = info->ctrl;
1205
+ struct device *dev = info->dev;
12111206 int iomux_num = (pin / 8);
12121207 struct regmap *regmap;
12131208 int reg, ret, mask, mux_type;
....@@ -1221,8 +1216,7 @@
12211216 if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
12221217 return 0;
12231218
1224
- dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",
1225
- bank->bank_num, pin, mux);
1219
+ dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
12261220
12271221 if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
12281222 regmap = info->regmap_pmu;
....@@ -1251,6 +1245,64 @@
12511245
12521246 if (bank->recalced_mask & BIT(pin))
12531247 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
+ }
12541306
12551307 if (mux > mask)
12561308 return -EINVAL;
....@@ -1300,9 +1352,9 @@
13001352 #define PX30_PULL_PINS_PER_REG 8
13011353 #define PX30_PULL_BANK_STRIDE 16
13021354
1303
-static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1304
- int pin_num, struct regmap **regmap,
1305
- int *reg, u8 *bit)
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)
13061358 {
13071359 struct rockchip_pinctrl *info = bank->drvdata;
13081360
....@@ -1322,6 +1374,8 @@
13221374 *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
13231375 *bit = (pin_num % PX30_PULL_PINS_PER_REG);
13241376 *bit *= PX30_PULL_BITS_PER_PIN;
1377
+
1378
+ return 0;
13251379 }
13261380
13271381 #define PX30_DRV_PMU_OFFSET 0x20
....@@ -1330,9 +1384,9 @@
13301384 #define PX30_DRV_PINS_PER_REG 8
13311385 #define PX30_DRV_BANK_STRIDE 16
13321386
1333
-static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1334
- int pin_num, struct regmap **regmap,
1335
- int *reg, u8 *bit)
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)
13361390 {
13371391 struct rockchip_pinctrl *info = bank->drvdata;
13381392
....@@ -1352,6 +1406,8 @@
13521406 *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
13531407 *bit = (pin_num % PX30_DRV_PINS_PER_REG);
13541408 *bit *= PX30_DRV_BITS_PER_PIN;
1409
+
1410
+ return 0;
13551411 }
13561412
13571413 #define PX30_SCHMITT_PMU_OFFSET 0x38
....@@ -1385,15 +1441,175 @@
13851441 return 0;
13861442 }
13871443
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
+
13881604 #define RV1108_PULL_PMU_OFFSET 0x10
13891605 #define RV1108_PULL_OFFSET 0x110
13901606 #define RV1108_PULL_PINS_PER_REG 8
13911607 #define RV1108_PULL_BITS_PER_PIN 2
13921608 #define RV1108_PULL_BANK_STRIDE 16
13931609
1394
-static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1395
- int pin_num, struct regmap **regmap,
1396
- int *reg, u8 *bit)
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)
13971613 {
13981614 struct rockchip_pinctrl *info = bank->drvdata;
13991615
....@@ -1412,6 +1628,8 @@
14121628 *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
14131629 *bit = (pin_num % RV1108_PULL_PINS_PER_REG);
14141630 *bit *= RV1108_PULL_BITS_PER_PIN;
1631
+
1632
+ return 0;
14151633 }
14161634
14171635 #define RV1108_DRV_PMU_OFFSET 0x20
....@@ -1420,9 +1638,9 @@
14201638 #define RV1108_DRV_PINS_PER_REG 8
14211639 #define RV1108_DRV_BANK_STRIDE 16
14221640
1423
-static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1424
- int pin_num, struct regmap **regmap,
1425
- int *reg, u8 *bit)
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)
14261644 {
14271645 struct rockchip_pinctrl *info = bank->drvdata;
14281646
....@@ -1442,6 +1660,8 @@
14421660 *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
14431661 *bit = pin_num % RV1108_DRV_PINS_PER_REG;
14441662 *bit *= RV1108_DRV_BITS_PER_PIN;
1663
+
1664
+ return 0;
14451665 }
14461666
14471667 #define RV1108_SCHMITT_PMU_OFFSET 0x30
....@@ -1481,9 +1701,9 @@
14811701 #define RV1126_PULL_BANK_STRIDE 16
14821702 #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
14831703
1484
-static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1485
- int pin_num, struct regmap **regmap,
1486
- int *reg, u8 *bit)
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)
14871707 {
14881708 struct rockchip_pinctrl *info = bank->drvdata;
14891709
....@@ -1495,7 +1715,7 @@
14951715 *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
14961716 *bit = pin_num % RV1126_PULL_PINS_PER_REG;
14971717 *bit *= RV1126_PULL_BITS_PER_PIN;
1498
- return;
1718
+ return 0;
14991719 }
15001720 *regmap = info->regmap_pmu;
15011721 *reg = RV1126_PULL_PMU_OFFSET;
....@@ -1508,6 +1728,8 @@
15081728 *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
15091729 *bit = (pin_num % RV1126_PULL_PINS_PER_REG);
15101730 *bit *= RV1126_PULL_BITS_PER_PIN;
1731
+
1732
+ return 0;
15111733 }
15121734
15131735 #define RV1126_DRV_PMU_OFFSET 0x20
....@@ -1516,9 +1738,9 @@
15161738 #define RV1126_DRV_PINS_PER_REG 4
15171739 #define RV1126_DRV_BANK_STRIDE 32
15181740
1519
-static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1520
- int pin_num, struct regmap **regmap,
1521
- int *reg, u8 *bit)
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)
15221744 {
15231745 struct rockchip_pinctrl *info = bank->drvdata;
15241746
....@@ -1531,7 +1753,7 @@
15311753 *reg -= 0x4;
15321754 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15331755 *bit *= RV1126_DRV_BITS_PER_PIN;
1534
- return;
1756
+ return 0;
15351757 }
15361758 *regmap = info->regmap_pmu;
15371759 *reg = RV1126_DRV_PMU_OFFSET;
....@@ -1544,6 +1766,8 @@
15441766 *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
15451767 *bit = pin_num % RV1126_DRV_PINS_PER_REG;
15461768 *bit *= RV1126_DRV_BITS_PER_PIN;
1769
+
1770
+ return 0;
15471771 }
15481772
15491773 #define RV1126_SCHMITT_PMU_OFFSET 0x60
....@@ -1583,15 +1807,35 @@
15831807 return 0;
15841808 }
15851809
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
+
15861830 #define RK1808_PULL_PMU_OFFSET 0x10
15871831 #define RK1808_PULL_GRF_OFFSET 0x80
15881832 #define RK1808_PULL_PINS_PER_REG 8
15891833 #define RK1808_PULL_BITS_PER_PIN 2
15901834 #define RK1808_PULL_BANK_STRIDE 16
15911835
1592
-static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1593
- int pin_num, struct regmap **regmap,
1594
- int *reg, u8 *bit)
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)
15951839 {
15961840 struct rockchip_pinctrl *info = bank->drvdata;
15971841
....@@ -1607,6 +1851,8 @@
16071851 *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
16081852 *bit = (pin_num % RK1808_PULL_PINS_PER_REG);
16091853 *bit *= RK1808_PULL_BITS_PER_PIN;
1854
+
1855
+ return 0;
16101856 }
16111857
16121858 #define RK1808_DRV_PMU_OFFSET 0x20
....@@ -1615,10 +1861,10 @@
16151861 #define RK1808_DRV_PINS_PER_REG 8
16161862 #define RK1808_DRV_BANK_STRIDE 16
16171863
1618
-static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1619
- int pin_num,
1620
- struct regmap **regmap,
1621
- int *reg, u8 *bit)
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)
16221868 {
16231869 struct rockchip_pinctrl *info = bank->drvdata;
16241870
....@@ -1634,6 +1880,8 @@
16341880 *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
16351881 *bit = pin_num % RK1808_DRV_PINS_PER_REG;
16361882 *bit *= RK1808_DRV_BITS_PER_PIN;
1883
+
1884
+ return 0;
16371885 }
16381886
16391887 #define RK1808_SR_PMU_OFFSET 0x0030
....@@ -1692,9 +1940,9 @@
16921940 #define RK2928_PULL_PINS_PER_REG 16
16931941 #define RK2928_PULL_BANK_STRIDE 8
16941942
1695
-static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1696
- int pin_num, struct regmap **regmap,
1697
- int *reg, u8 *bit)
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)
16981946 {
16991947 struct rockchip_pinctrl *info = bank->drvdata;
17001948
....@@ -1704,13 +1952,15 @@
17041952 *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
17051953
17061954 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1955
+
1956
+ return 0;
17071957 };
17081958
17091959 #define RK3128_PULL_OFFSET 0x118
17101960
1711
-static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1712
- int pin_num, struct regmap **regmap,
1713
- int *reg, u8 *bit)
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)
17141964 {
17151965 struct rockchip_pinctrl *info = bank->drvdata;
17161966
....@@ -1720,6 +1970,8 @@
17201970 *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
17211971
17221972 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1973
+
1974
+ return 0;
17231975 }
17241976
17251977 #define RK3188_PULL_OFFSET 0x164
....@@ -1728,9 +1980,9 @@
17281980 #define RK3188_PULL_BANK_STRIDE 16
17291981 #define RK3188_PULL_PMU_OFFSET 0x64
17301982
1731
-static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1732
- int pin_num, struct regmap **regmap,
1733
- int *reg, u8 *bit)
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)
17341986 {
17351987 struct rockchip_pinctrl *info = bank->drvdata;
17361988
....@@ -1760,12 +2012,14 @@
17602012 *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
17612013 *bit *= RK3188_PULL_BITS_PER_PIN;
17622014 }
2015
+
2016
+ return 0;
17632017 }
17642018
17652019 #define RK3288_PULL_OFFSET 0x140
1766
-static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1767
- int pin_num, struct regmap **regmap,
1768
- int *reg, u8 *bit)
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)
17692023 {
17702024 struct rockchip_pinctrl *info = bank->drvdata;
17712025
....@@ -1789,6 +2043,8 @@
17892043 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
17902044 *bit *= RK3188_PULL_BITS_PER_PIN;
17912045 }
2046
+
2047
+ return 0;
17922048 }
17932049
17942050 #define RK3288_DRV_PMU_OFFSET 0x70
....@@ -1797,9 +2053,9 @@
17972053 #define RK3288_DRV_PINS_PER_REG 8
17982054 #define RK3288_DRV_BANK_STRIDE 16
17992055
1800
-static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1801
- int pin_num, struct regmap **regmap,
1802
- int *reg, u8 *bit)
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)
18032059 {
18042060 struct rockchip_pinctrl *info = bank->drvdata;
18052061
....@@ -1823,13 +2079,15 @@
18232079 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18242080 *bit *= RK3288_DRV_BITS_PER_PIN;
18252081 }
2082
+
2083
+ return 0;
18262084 }
18272085
18282086 #define RK3228_PULL_OFFSET 0x100
18292087
1830
-static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1831
- int pin_num, struct regmap **regmap,
1832
- int *reg, u8 *bit)
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)
18332091 {
18342092 struct rockchip_pinctrl *info = bank->drvdata;
18352093
....@@ -1840,13 +2098,15 @@
18402098
18412099 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18422100 *bit *= RK3188_PULL_BITS_PER_PIN;
2101
+
2102
+ return 0;
18432103 }
18442104
18452105 #define RK3228_DRV_GRF_OFFSET 0x200
18462106
1847
-static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1848
- int pin_num, struct regmap **regmap,
1849
- int *reg, u8 *bit)
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)
18502110 {
18512111 struct rockchip_pinctrl *info = bank->drvdata;
18522112
....@@ -1857,13 +2117,15 @@
18572117
18582118 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18592119 *bit *= RK3288_DRV_BITS_PER_PIN;
2120
+
2121
+ return 0;
18602122 }
18612123
18622124 #define RK3308_PULL_OFFSET 0xa0
18632125
1864
-static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1865
- int pin_num, struct regmap **regmap,
1866
- int *reg, u8 *bit)
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)
18672129 {
18682130 struct rockchip_pinctrl *info = bank->drvdata;
18692131
....@@ -1874,13 +2136,15 @@
18742136
18752137 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
18762138 *bit *= RK3188_PULL_BITS_PER_PIN;
2139
+
2140
+ return 0;
18772141 }
18782142
18792143 #define RK3308_DRV_GRF_OFFSET 0x100
18802144
1881
-static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1882
- int pin_num, struct regmap **regmap,
1883
- int *reg, u8 *bit)
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)
18842148 {
18852149 struct rockchip_pinctrl *info = bank->drvdata;
18862150
....@@ -1891,14 +2155,39 @@
18912155
18922156 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
18932157 *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;
18942183 }
18952184
18962185 #define RK3368_PULL_GRF_OFFSET 0x100
18972186 #define RK3368_PULL_PMU_OFFSET 0x10
18982187
1899
-static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1900
- int pin_num, struct regmap **regmap,
1901
- int *reg, u8 *bit)
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)
19022191 {
19032192 struct rockchip_pinctrl *info = bank->drvdata;
19042193
....@@ -1922,14 +2211,16 @@
19222211 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19232212 *bit *= RK3188_PULL_BITS_PER_PIN;
19242213 }
2214
+
2215
+ return 0;
19252216 }
19262217
19272218 #define RK3368_DRV_PMU_OFFSET 0x20
19282219 #define RK3368_DRV_GRF_OFFSET 0x200
19292220
1930
-static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1931
- int pin_num, struct regmap **regmap,
1932
- int *reg, u8 *bit)
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)
19332224 {
19342225 struct rockchip_pinctrl *info = bank->drvdata;
19352226
....@@ -1953,15 +2244,17 @@
19532244 *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
19542245 *bit *= RK3288_DRV_BITS_PER_PIN;
19552246 }
2247
+
2248
+ return 0;
19562249 }
19572250
19582251 #define RK3399_PULL_GRF_OFFSET 0xe040
19592252 #define RK3399_PULL_PMU_OFFSET 0x40
19602253 #define RK3399_DRV_3BITS_PER_PIN 3
19612254
1962
-static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1963
- int pin_num, struct regmap **regmap,
1964
- int *reg, u8 *bit)
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)
19652258 {
19662259 struct rockchip_pinctrl *info = bank->drvdata;
19672260
....@@ -1987,11 +2280,13 @@
19872280 *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
19882281 *bit *= RK3188_PULL_BITS_PER_PIN;
19892282 }
2283
+
2284
+ return 0;
19902285 }
19912286
1992
-static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1993
- int pin_num, struct regmap **regmap,
1994
- int *reg, u8 *bit)
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)
19952290 {
19962291 struct rockchip_pinctrl *info = bank->drvdata;
19972292 int drv_num = (pin_num / 8);
....@@ -2008,6 +2303,297 @@
20082303 *bit = (pin_num % 8) * 3;
20092304 else
20102305 *bit = (pin_num % 8) * 2;
2306
+
2307
+ return 0;
2308
+}
2309
+
2310
+#define RK3528_DRV_BITS_PER_PIN 8
2311
+#define RK3528_DRV_PINS_PER_REG 2
2312
+#define RK3528_DRV_GPIO0_OFFSET 0x100
2313
+#define RK3528_DRV_GPIO1_OFFSET 0x20120
2314
+#define RK3528_DRV_GPIO2_OFFSET 0x30160
2315
+#define RK3528_DRV_GPIO3_OFFSET 0x20190
2316
+#define RK3528_DRV_GPIO4_OFFSET 0x101C0
2317
+
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)
2321
+{
2322
+ struct rockchip_pinctrl *info = bank->drvdata;
2323
+
2324
+ *regmap = info->regmap_base;
2325
+ switch (bank->bank_num) {
2326
+ case 0:
2327
+ *reg = RK3528_DRV_GPIO0_OFFSET;
2328
+ break;
2329
+
2330
+ case 1:
2331
+ *reg = RK3528_DRV_GPIO1_OFFSET;
2332
+ break;
2333
+
2334
+ case 2:
2335
+ *reg = RK3528_DRV_GPIO2_OFFSET;
2336
+ break;
2337
+
2338
+ case 3:
2339
+ *reg = RK3528_DRV_GPIO3_OFFSET;
2340
+ break;
2341
+
2342
+ case 4:
2343
+ *reg = RK3528_DRV_GPIO4_OFFSET;
2344
+ break;
2345
+
2346
+ default:
2347
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2348
+ break;
2349
+ }
2350
+
2351
+ *reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
2352
+ *bit = pin_num % RK3528_DRV_PINS_PER_REG;
2353
+ *bit *= RK3528_DRV_BITS_PER_PIN;
2354
+
2355
+ return 0;
2356
+}
2357
+
2358
+#define RK3528_PULL_BITS_PER_PIN 2
2359
+#define RK3528_PULL_PINS_PER_REG 8
2360
+#define RK3528_PULL_GPIO0_OFFSET 0x200
2361
+#define RK3528_PULL_GPIO1_OFFSET 0x20210
2362
+#define RK3528_PULL_GPIO2_OFFSET 0x30220
2363
+#define RK3528_PULL_GPIO3_OFFSET 0x20230
2364
+#define RK3528_PULL_GPIO4_OFFSET 0x10240
2365
+
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)
2369
+{
2370
+ struct rockchip_pinctrl *info = bank->drvdata;
2371
+
2372
+ *regmap = info->regmap_base;
2373
+ switch (bank->bank_num) {
2374
+ case 0:
2375
+ *reg = RK3528_PULL_GPIO0_OFFSET;
2376
+ break;
2377
+
2378
+ case 1:
2379
+ *reg = RK3528_PULL_GPIO1_OFFSET;
2380
+ break;
2381
+
2382
+ case 2:
2383
+ *reg = RK3528_PULL_GPIO2_OFFSET;
2384
+ break;
2385
+
2386
+ case 3:
2387
+ *reg = RK3528_PULL_GPIO3_OFFSET;
2388
+ break;
2389
+
2390
+ case 4:
2391
+ *reg = RK3528_PULL_GPIO4_OFFSET;
2392
+ break;
2393
+
2394
+ default:
2395
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2396
+ break;
2397
+ }
2398
+
2399
+ *reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
2400
+ *bit = pin_num % RK3528_PULL_PINS_PER_REG;
2401
+ *bit *= RK3528_PULL_BITS_PER_PIN;
2402
+
2403
+ return 0;
2404
+}
2405
+
2406
+#define RK3528_SMT_BITS_PER_PIN 1
2407
+#define RK3528_SMT_PINS_PER_REG 8
2408
+#define RK3528_SMT_GPIO0_OFFSET 0x400
2409
+#define RK3528_SMT_GPIO1_OFFSET 0x20410
2410
+#define RK3528_SMT_GPIO2_OFFSET 0x30420
2411
+#define RK3528_SMT_GPIO3_OFFSET 0x20430
2412
+#define RK3528_SMT_GPIO4_OFFSET 0x10440
2413
+
2414
+static int rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2415
+ int pin_num,
2416
+ struct regmap **regmap,
2417
+ int *reg, u8 *bit)
2418
+{
2419
+ struct rockchip_pinctrl *info = bank->drvdata;
2420
+
2421
+ *regmap = info->regmap_base;
2422
+ switch (bank->bank_num) {
2423
+ case 0:
2424
+ *reg = RK3528_SMT_GPIO0_OFFSET;
2425
+ break;
2426
+
2427
+ case 1:
2428
+ *reg = RK3528_SMT_GPIO1_OFFSET;
2429
+ break;
2430
+
2431
+ case 2:
2432
+ *reg = RK3528_SMT_GPIO2_OFFSET;
2433
+ break;
2434
+
2435
+ case 3:
2436
+ *reg = RK3528_SMT_GPIO3_OFFSET;
2437
+ break;
2438
+
2439
+ case 4:
2440
+ *reg = RK3528_SMT_GPIO4_OFFSET;
2441
+ break;
2442
+
2443
+ default:
2444
+ dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2445
+ break;
2446
+ }
2447
+
2448
+ *reg += ((pin_num / RK3528_SMT_PINS_PER_REG) * 4);
2449
+ *bit = pin_num % RK3528_SMT_PINS_PER_REG;
2450
+ *bit *= RK3528_SMT_BITS_PER_PIN;
2451
+ return 0;
2452
+}
2453
+
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;
20112597 }
20122598
20132599 #define RK3568_SR_PMU_OFFSET 0x60
....@@ -2044,9 +2630,9 @@
20442630 #define RK3568_PULL_PINS_PER_REG 8
20452631 #define RK3568_PULL_BANK_STRIDE 0x10
20462632
2047
-static void rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2048
- int pin_num, struct regmap **regmap,
2049
- int *reg, u8 *bit)
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)
20502636 {
20512637 struct rockchip_pinctrl *info = bank->drvdata;
20522638
....@@ -2067,6 +2653,8 @@
20672653 *bit = (pin_num % RK3568_PULL_PINS_PER_REG);
20682654 *bit *= RK3568_PULL_BITS_PER_PIN;
20692655 }
2656
+
2657
+ return 0;
20702658 }
20712659
20722660 #define RK3568_DRV_PMU_OFFSET 0x70
....@@ -2075,9 +2663,9 @@
20752663 #define RK3568_DRV_PINS_PER_REG 2
20762664 #define RK3568_DRV_BANK_STRIDE 0x40
20772665
2078
-static void rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2079
- int pin_num, struct regmap **regmap,
2080
- int *reg, u8 *bit)
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)
20812669 {
20822670 struct rockchip_pinctrl *info = bank->drvdata;
20832671
....@@ -2104,6 +2692,197 @@
21042692 ((bank->bank_num == 2 || bank->bank_num == 3 || bank->bank_num == 4) &&
21052693 (pin_num == 7 || pin_num == 15 || pin_num == 23 || pin_num == 31)))
21062694 *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;
21072886 }
21082887
21092888 static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
....@@ -2120,13 +2899,16 @@
21202899 {
21212900 struct rockchip_pinctrl *info = bank->drvdata;
21222901 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2902
+ struct device *dev = info->dev;
21232903 struct regmap *regmap;
21242904 int reg, ret;
21252905 u32 data, temp, rmask_bits;
21262906 u8 bit;
21272907 int drv_type = bank->drv[pin_num / 8].drv_type;
21282908
2129
- 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;
21302912
21312913 switch (drv_type) {
21322914 case DRV_TYPE_IO_1V8_3V0_AUTO:
....@@ -2165,7 +2947,7 @@
21652947 bit -= 16;
21662948 break;
21672949 default:
2168
- 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",
21692951 bit, drv_type);
21702952 return -EINVAL;
21712953 }
....@@ -2178,8 +2960,7 @@
21782960 rmask_bits = RK3288_DRV_BITS_PER_PIN;
21792961 break;
21802962 default:
2181
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2182
- drv_type);
2963
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
21832964 return -EINVAL;
21842965 }
21852966
....@@ -2212,21 +2993,28 @@
22122993 {
22132994 struct rockchip_pinctrl *info = bank->drvdata;
22142995 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2996
+ struct device *dev = info->dev;
22152997 struct regmap *regmap;
22162998 int reg, ret, i, err;
22172999 u32 data, rmask, rmask_bits, temp;
22183000 u8 bit;
22193001 int drv_type = bank->drv[pin_num / 8].drv_type;
22203002
2221
- 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",
22223004 bank->bank_num, pin_num, strength);
22233005
2224
- ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2225
- 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) {
22263011 rmask_bits = RV1126_DRV_BITS_PER_PIN;
22273012 ret = strength;
22283013 goto config;
2229
- } else if (ctrl->type == RK3568) {
3014
+ } else if (ctrl->type == RV1106 ||
3015
+ ctrl->type == RK3528 ||
3016
+ ctrl->type == RK3562 ||
3017
+ ctrl->type == RK3568) {
22303018 rmask_bits = RK3568_DRV_BITS_PER_PIN;
22313019 ret = (1 << (strength + 1)) - 1;
22323020 goto config;
....@@ -2244,8 +3032,7 @@
22443032 }
22453033
22463034 if (ret < 0) {
2247
- dev_err(info->dev, "unsupported driver strength %d\n",
2248
- strength);
3035
+ dev_err(dev, "unsupported driver strength %d\n", strength);
22493036 return ret;
22503037 }
22513038
....@@ -2284,7 +3071,7 @@
22843071 bit -= 16;
22853072 break;
22863073 default:
2287
- 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",
22883075 bit, drv_type);
22893076 return -EINVAL;
22903077 }
....@@ -2296,8 +3083,7 @@
22963083 rmask_bits = RK3288_DRV_BITS_PER_PIN;
22973084 break;
22983085 default:
2299
- dev_err(info->dev, "unsupported pinctrl drive type: %d\n",
2300
- drv_type);
3086
+ dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
23013087 return -EINVAL;
23023088 }
23033089
....@@ -2366,6 +3152,7 @@
23663152 {
23673153 struct rockchip_pinctrl *info = bank->drvdata;
23683154 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3155
+ struct device *dev = info->dev;
23693156 struct regmap *regmap;
23703157 int reg, ret, pull_type;
23713158 u8 bit;
....@@ -2375,7 +3162,9 @@
23753162 if (ctrl->type == RK3066B)
23763163 return PIN_CONFIG_BIAS_DISABLE;
23773164
2378
- 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;
23793168
23803169 ret = regmap_read(regmap, reg, &data);
23813170 if (ret)
....@@ -2388,6 +3177,7 @@
23883177 ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
23893178 : PIN_CONFIG_BIAS_DISABLE;
23903179 case PX30:
3180
+ case RV1106:
23913181 case RV1108:
23923182 case RV1126:
23933183 case RK1808:
....@@ -2396,14 +3186,17 @@
23963186 case RK3308:
23973187 case RK3368:
23983188 case RK3399:
3189
+ case RK3528:
3190
+ case RK3562:
23993191 case RK3568:
3192
+ case RK3588:
24003193 pull_type = bank->pull_type[pin_num / 8];
24013194 data >>= bit;
24023195 data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
24033196
24043197 return rockchip_pull_list[pull_type][data];
24053198 default:
2406
- dev_err(info->dev, "unsupported pinctrl type\n");
3199
+ dev_err(dev, "unsupported pinctrl type\n");
24073200 return -EINVAL;
24083201 };
24093202 }
....@@ -2413,19 +3206,21 @@
24133206 {
24143207 struct rockchip_pinctrl *info = bank->drvdata;
24153208 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3209
+ struct device *dev = info->dev;
24163210 struct regmap *regmap;
24173211 int reg, ret, i, pull_type;
24183212 u8 bit;
24193213 u32 data, rmask;
24203214
2421
- dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n",
2422
- bank->bank_num, pin_num, pull);
3215
+ dev_dbg(dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull);
24233216
24243217 /* rk3066b does support any pulls */
24253218 if (ctrl->type == RK3066B)
24263219 return pull ? -EINVAL : 0;
24273220
2428
- ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3221
+ ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3222
+ if (ret)
3223
+ return ret;
24293224
24303225 switch (ctrl->type) {
24313226 case RK2928:
....@@ -2436,6 +3231,7 @@
24363231 ret = regmap_write(regmap, reg, data);
24373232 break;
24383233 case PX30:
3234
+ case RV1106:
24393235 case RV1108:
24403236 case RV1126:
24413237 case RK1808:
....@@ -2444,7 +3240,10 @@
24443240 case RK3308:
24453241 case RK3368:
24463242 case RK3399:
3243
+ case RK3528:
3244
+ case RK3562:
24473245 case RK3568:
3246
+ case RK3588:
24483247 pull_type = bank->pull_type[pin_num / 8];
24493248 ret = -EINVAL;
24503249 for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
....@@ -2455,7 +3254,7 @@
24553254 }
24563255 }
24573256 /*
2458
- * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6,
3257
+ * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
24593258 * where that pull up value becomes 3.
24603259 */
24613260 if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
....@@ -2464,8 +3263,7 @@
24643263 }
24653264
24663265 if (ret < 0) {
2467
- dev_err(info->dev, "unsupported pull setting %d\n",
2468
- pull);
3266
+ dev_err(dev, "unsupported pull setting %d\n", pull);
24693267 return ret;
24703268 }
24713269
....@@ -2477,32 +3275,11 @@
24773275 ret = regmap_update_bits(regmap, reg, rmask, data);
24783276 break;
24793277 default:
2480
- dev_err(info->dev, "unsupported pinctrl type\n");
3278
+ dev_err(dev, "unsupported pinctrl type\n");
24813279 return -EINVAL;
24823280 }
24833281
24843282 return ret;
2485
-}
2486
-
2487
-#define RK3308_SCHMITT_PINS_PER_REG 8
2488
-#define RK3308_SCHMITT_BANK_STRIDE 16
2489
-#define RK3308_SCHMITT_GRF_OFFSET 0x1a0
2490
-
2491
-static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2492
- int pin_num,
2493
- struct regmap **regmap,
2494
- int *reg, u8 *bit)
2495
-{
2496
- struct rockchip_pinctrl *info = bank->drvdata;
2497
-
2498
- *regmap = info->regmap_base;
2499
- *reg = RK3308_SCHMITT_GRF_OFFSET;
2500
-
2501
- *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2502
- *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2503
- *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2504
-
2505
- return 0;
25063283 }
25073284
25083285 #define RK3328_SCHMITT_BITS_PER_PIN 1
....@@ -2575,6 +3352,7 @@
25753352
25763353 data >>= bit;
25773354 switch (ctrl->type) {
3355
+ case RK3562:
25783356 case RK3568:
25793357 return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
25803358 default:
....@@ -2589,12 +3367,13 @@
25893367 {
25903368 struct rockchip_pinctrl *info = bank->drvdata;
25913369 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3370
+ struct device *dev = info->dev;
25923371 struct regmap *regmap;
25933372 int reg, ret;
25943373 u8 bit;
25953374 u32 data, rmask;
25963375
2597
- dev_dbg(info->dev, "setting input schmitt of GPIO%d-%d to %d\n",
3376
+ dev_dbg(dev, "setting input schmitt of GPIO%d-%d to %d\n",
25983377 bank->bank_num, pin_num, enable);
25993378
26003379 ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
....@@ -2603,6 +3382,7 @@
26033382
26043383 /* enable the write to the equivalent lower bits */
26053384 switch (ctrl->type) {
3385
+ case RK3562:
26063386 case RK3568:
26073387 data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
26083388 rmask = data | (data >> 16);
....@@ -2737,10 +3517,11 @@
27373517 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
27383518 const unsigned int *pins = info->groups[group].pins;
27393519 const struct rockchip_pin_config *data = info->groups[group].data;
3520
+ struct device *dev = info->dev;
27403521 struct rockchip_pin_bank *bank;
27413522 int cnt, ret = 0;
27423523
2743
- dev_dbg(info->dev, "enable function %s group %s\n",
3524
+ dev_dbg(dev, "enable function %s group %s\n",
27443525 info->functions[selector].name, info->groups[group].name);
27453526
27463527 /*
....@@ -2788,6 +3569,7 @@
27883569 case RK3066B:
27893570 return pull ? false : true;
27903571 case PX30:
3572
+ case RV1106:
27913573 case RV1108:
27923574 case RV1126:
27933575 case RK1808:
....@@ -2796,11 +3578,32 @@
27963578 case RK3308:
27973579 case RK3368:
27983580 case RK3399:
3581
+ case RK3528:
3582
+ case RK3562:
27993583 case RK3568:
3584
+ case RK3588:
28003585 return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
28013586 }
28023587
28033588 return false;
3589
+}
3590
+
3591
+static int rockchip_pinconf_defer_pin(struct rockchip_pin_bank *bank,
3592
+ unsigned int pin, u32 param, u32 arg)
3593
+{
3594
+ struct rockchip_pin_deferred *cfg;
3595
+
3596
+ cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
3597
+ if (!cfg)
3598
+ return -ENOMEM;
3599
+
3600
+ cfg->pin = pin;
3601
+ cfg->param = param;
3602
+ cfg->arg = arg;
3603
+
3604
+ list_add_tail(&cfg->head, &bank->deferred_pins);
3605
+
3606
+ return 0;
28043607 }
28053608
28063609 /* set the pin config settings for a specified pin */
....@@ -2818,6 +3621,25 @@
28183621 for (i = 0; i < num_configs; i++) {
28193622 param = pinconf_to_config_param(configs[i]);
28203623 arg = pinconf_to_config_argument(configs[i]);
3624
+
3625
+ if (param == PIN_CONFIG_OUTPUT || param == PIN_CONFIG_INPUT_ENABLE) {
3626
+ /*
3627
+ * Check for gpio driver not being probed yet.
3628
+ * The lock makes sure that either gpio-probe has completed
3629
+ * or the gpio driver hasn't probed yet.
3630
+ */
3631
+ mutex_lock(&bank->deferred_lock);
3632
+ if (!gpio || !gpio->direction_output) {
3633
+ rc = rockchip_pinconf_defer_pin(bank, pin - bank->pin_base, param,
3634
+ arg);
3635
+ mutex_unlock(&bank->deferred_lock);
3636
+ if (rc)
3637
+ return rc;
3638
+
3639
+ break;
3640
+ }
3641
+ mutex_unlock(&bank->deferred_lock);
3642
+ }
28213643
28223644 switch (param) {
28233645 case PIN_CONFIG_BIAS_DISABLE:
....@@ -2844,10 +3666,8 @@
28443666 case PIN_CONFIG_OUTPUT:
28453667 rc = rockchip_set_mux(bank, pin - bank->pin_base,
28463668 RK_FUNC_GPIO);
2847
- if (rc != RK_FUNC_GPIO) {
2848
- dev_err(info->dev, "pin-%d fail to mux to gpio, %d\n", pin, rc);
3669
+ if (rc != RK_FUNC_GPIO)
28493670 return -EINVAL;
2850
- }
28513671
28523672 rc = gpio->direction_output(gpio, pin - bank->pin_base,
28533673 arg);
....@@ -2932,13 +3752,13 @@
29323752 break;
29333753 case PIN_CONFIG_OUTPUT:
29343754 rc = rockchip_get_mux(bank, pin - bank->pin_base);
2935
- if (rc != 0)
3755
+ if (rc != RK_FUNC_GPIO)
29363756 return -EINVAL;
29373757
2938
- /* 0 for output, 1 for input */
2939
- rc = gpio->get_direction(gpio, pin - bank->pin_base);
2940
- if (rc)
2941
- return -EINVAL;
3758
+ if (!gpio || !gpio->get) {
3759
+ arg = 0;
3760
+ break;
3761
+ }
29423762
29433763 rc = gpio->get(gpio, pin - bank->pin_base);
29443764 if (rc < 0)
....@@ -2998,24 +3818,13 @@
29983818 {},
29993819 };
30003820
3001
-static bool is_function_node(const struct device_node *np)
3002
-{
3003
- if (of_match_node(rockchip_bank_match, np))
3004
- return false;
3005
-
3006
- if (!strncmp(np->name, "pcfg", 4))
3007
- return false;
3008
-
3009
- return true;
3010
-}
3011
-
30123821 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
30133822 struct device_node *np)
30143823 {
30153824 struct device_node *child;
30163825
30173826 for_each_child_of_node(np, child) {
3018
- if (!is_function_node(child))
3827
+ if (of_match_node(rockchip_bank_match, child))
30193828 continue;
30203829
30213830 info->nfunctions++;
....@@ -3028,6 +3837,7 @@
30283837 struct rockchip_pinctrl *info,
30293838 u32 index)
30303839 {
3840
+ struct device *dev = info->dev;
30313841 struct rockchip_pin_bank *bank;
30323842 int size;
30333843 const __be32 *list;
....@@ -3035,7 +3845,7 @@
30353845 int i, j;
30363846 int ret;
30373847
3038
- dev_dbg(info->dev, "group(%d): %pOFn\n", index, np);
3848
+ dev_dbg(dev, "group(%d): %pOFn\n", index, np);
30393849
30403850 /* Initialise group */
30413851 grp->name = np->name;
....@@ -3047,19 +3857,13 @@
30473857 list = of_get_property(np, "rockchip,pins", &size);
30483858 /* we do not check return since it's safe node passed down */
30493859 size /= sizeof(*list);
3050
- if (!size || size % 4) {
3051
- dev_err(info->dev, "wrong pins number or pins and configs should be by 4\n");
3052
- return -EINVAL;
3053
- }
3860
+ if (!size || size % 4)
3861
+ return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
30543862
30553863 grp->npins = size / 4;
30563864
3057
- grp->pins = devm_kcalloc(info->dev, grp->npins, sizeof(unsigned int),
3058
- GFP_KERNEL);
3059
- grp->data = devm_kcalloc(info->dev,
3060
- grp->npins,
3061
- sizeof(struct rockchip_pin_config),
3062
- GFP_KERNEL);
3865
+ grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
3866
+ grp->data = devm_kcalloc(dev, grp->npins, sizeof(*grp->data), GFP_KERNEL);
30633867 if (!grp->pins || !grp->data)
30643868 return -ENOMEM;
30653869
....@@ -3093,6 +3897,7 @@
30933897 struct rockchip_pinctrl *info,
30943898 u32 index)
30953899 {
3900
+ struct device *dev = info->dev;
30963901 struct device_node *child;
30973902 struct rockchip_pmx_func *func;
30983903 struct rockchip_pin_group *grp;
....@@ -3100,7 +3905,7 @@
31003905 static u32 grp_index;
31013906 u32 i = 0;
31023907
3103
- dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np);
3908
+ dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
31043909
31053910 func = &info->functions[index];
31063911
....@@ -3110,8 +3915,7 @@
31103915 if (func->ngroups <= 0)
31113916 return 0;
31123917
3113
- func->groups = devm_kcalloc(info->dev,
3114
- func->ngroups, sizeof(char *), GFP_KERNEL);
3918
+ func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
31153919 if (!func->groups)
31163920 return -ENOMEM;
31173921
....@@ -3139,32 +3943,26 @@
31393943
31403944 rockchip_pinctrl_child_count(info, np);
31413945
3142
- dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions);
3143
- dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups);
3946
+ dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
3947
+ dev_dbg(dev, "ngroups = %d\n", info->ngroups);
31443948
3145
- info->functions = devm_kcalloc(dev,
3146
- info->nfunctions,
3147
- sizeof(struct rockchip_pmx_func),
3148
- GFP_KERNEL);
3949
+ info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
31493950 if (!info->functions)
31503951 return -ENOMEM;
31513952
3152
- info->groups = devm_kcalloc(dev,
3153
- info->ngroups,
3154
- sizeof(struct rockchip_pin_group),
3155
- GFP_KERNEL);
3953
+ info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
31563954 if (!info->groups)
31573955 return -ENOMEM;
31583956
31593957 i = 0;
31603958
31613959 for_each_child_of_node(np, child) {
3162
- if (!is_function_node(child))
3960
+ if (of_match_node(rockchip_bank_match, child))
31633961 continue;
31643962
31653963 ret = rockchip_pinctrl_parse_functions(child, info, i++);
31663964 if (ret) {
3167
- dev_err(&pdev->dev, "failed to parse function\n");
3965
+ dev_err(dev, "failed to parse function\n");
31683966 of_node_put(child);
31693967 return ret;
31703968 }
....@@ -3179,6 +3977,7 @@
31793977 struct pinctrl_desc *ctrldesc = &info->pctl;
31803978 struct pinctrl_pin_desc *pindesc, *pdesc;
31813979 struct rockchip_pin_bank *pin_bank;
3980
+ struct device *dev = &pdev->dev;
31823981 int pin, bank, ret;
31833982 int k;
31843983
....@@ -3188,9 +3987,7 @@
31883987 ctrldesc->pmxops = &rockchip_pmx_ops;
31893988 ctrldesc->confops = &rockchip_pinconf_ops;
31903989
3191
- pindesc = devm_kcalloc(&pdev->dev,
3192
- info->ctrl->nr_pins, sizeof(*pindesc),
3193
- GFP_KERNEL);
3990
+ pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
31943991 if (!pindesc)
31953992 return -ENOMEM;
31963993
....@@ -3206,41 +4003,24 @@
32064003 pin_bank->name, pin);
32074004 pdesc++;
32084005 }
4006
+
4007
+ INIT_LIST_HEAD(&pin_bank->deferred_pins);
4008
+ mutex_init(&pin_bank->deferred_lock);
32094009 }
32104010
32114011 ret = rockchip_pinctrl_parse_dt(pdev, info);
32124012 if (ret)
32134013 return ret;
32144014
3215
- info->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc, info);
3216
- if (IS_ERR(info->pctl_dev)) {
3217
- dev_err(&pdev->dev, "could not register pinctrl driver\n");
3218
- return PTR_ERR(info->pctl_dev);
3219
- }
4015
+ info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
4016
+ if (IS_ERR(info->pctl_dev))
4017
+ return dev_err_probe(dev, PTR_ERR(info->pctl_dev), "could not register pinctrl driver\n");
32204018
32214019 return 0;
32224020 }
32234021
32244022 static const struct of_device_id rockchip_pinctrl_dt_match[];
3225
-
3226
-/* Ctrl data specially handle */
3227
-static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl)
3228
-{
3229
- /*
3230
- * Special for rk3308b, where we need to replace the recalced
3231
- * and routed arrays.
3232
- */
3233
- if (soc_is_rk3308b()) {
3234
- ctrl->iomux_recalced = rk3308b_mux_recalced_data;
3235
- ctrl->niomux_recalced = ARRAY_SIZE(rk3308b_mux_recalced_data);
3236
- ctrl->iomux_routes = rk3308b_mux_route_data;
3237
- ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data);
3238
-
3239
- }
3240
-
3241
- return 0;
3242
-}
3243
-
4023
+static struct rockchip_pin_bank rk3308bs_pin_banks[];
32444024 static struct rockchip_pin_bank px30s_pin_banks[];
32454025
32464026 /* retrieve the soc specific data */
....@@ -3248,22 +4028,19 @@
32484028 struct rockchip_pinctrl *d,
32494029 struct platform_device *pdev)
32504030 {
4031
+ struct device *dev = &pdev->dev;
4032
+ struct device_node *node = dev->of_node;
32514033 const struct of_device_id *match;
3252
- struct device_node *node = pdev->dev.of_node;
32534034 struct rockchip_pin_ctrl *ctrl;
32544035 struct rockchip_pin_bank *bank;
32554036 int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
32564037
32574038 match = of_match_node(rockchip_pinctrl_dt_match, node);
32584039 ctrl = (struct rockchip_pin_ctrl *)match->data;
4040
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && soc_is_rk3308bs())
4041
+ ctrl->pin_banks = rk3308bs_pin_banks;
32594042 if (IS_ENABLED(CONFIG_CPU_PX30) && soc_is_px30s())
32604043 ctrl->pin_banks = px30s_pin_banks;
3261
-
3262
- /* Ctrl data re-initialize for some Socs */
3263
- if (ctrl->ctrl_data_re_init) {
3264
- if (ctrl->ctrl_data_re_init(ctrl))
3265
- return NULL;
3266
- }
32674044
32684045 grf_offs = ctrl->grf_mux_offset;
32694046 pmu_offs = ctrl->pmu_mux_offset;
....@@ -3310,7 +4087,7 @@
33104087 drv_pmu_offs : drv_grf_offs;
33114088 }
33124089
3313
- dev_dbg(d->dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
4090
+ dev_dbg(dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
33144091 i, j, iom->offset, drv->offset);
33154092
33164093 /*
....@@ -3417,60 +4194,56 @@
34174194
34184195 /* SoC data specially handle */
34194196
3420
-/* rk3308b SoC data initialize */
3421
-#define RK3308B_GRF_SOC_CON13 0x608
3422
-#define RK3308B_GRF_SOC_CON15 0x610
4197
+/* rk3308 SoC data initialize */
4198
+#define RK3308_GRF_SOC_CON13 0x608
4199
+#define RK3308_GRF_SOC_CON15 0x610
34234200
3424
-/* RK3308B_GRF_SOC_CON13 */
3425
-#define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
3426
-#define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
3427
-#define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
4201
+/* RK3308_GRF_SOC_CON13 */
4202
+#define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
4203
+#define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4204
+#define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
34284205
3429
-/* RK3308B_GRF_SOC_CON15 */
3430
-#define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
3431
-#define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
3432
-#define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
4206
+/* RK3308_GRF_SOC_CON15 */
4207
+#define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
4208
+#define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4209
+#define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
34334210
3434
-static int rk3308b_soc_data_init(struct rockchip_pinctrl *info)
4211
+static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
34354212 {
34364213 int ret;
34374214
34384215 /*
34394216 * Enable the special ctrl of selected sources.
34404217 */
3441
- if (soc_is_rk3308b()) {
3442
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON13,
3443
- RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3444
- RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3445
- RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3446
- if (ret)
3447
- return ret;
34484218
3449
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON15,
3450
- RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3451
- RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3452
- RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3453
- if (ret)
3454
- return ret;
3455
- }
4219
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13,
4220
+ RK3308_GRF_I2C3_IOFUNC_SRC_CTRL |
4221
+ RK3308_GRF_GPIO2A3_SEL_SRC_CTRL |
4222
+ RK3308_GRF_GPIO2A2_SEL_SRC_CTRL);
4223
+ if (ret)
4224
+ return ret;
34564225
3457
- return 0;
4226
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15,
4227
+ RK3308_GRF_GPIO2C0_SEL_SRC_CTRL |
4228
+ RK3308_GRF_GPIO3B3_SEL_SRC_CTRL |
4229
+ RK3308_GRF_GPIO3B2_SEL_SRC_CTRL);
4230
+
4231
+ return ret;
4232
+
34584233 }
34594234
34604235 static int rockchip_pinctrl_probe(struct platform_device *pdev)
34614236 {
34624237 struct rockchip_pinctrl *info;
34634238 struct device *dev = &pdev->dev;
4239
+ struct device_node *np = dev->of_node, *node;
34644240 struct rockchip_pin_ctrl *ctrl;
3465
- struct device_node *np = pdev->dev.of_node, *node;
34664241 struct resource *res;
34674242 void __iomem *base;
34684243 int ret;
34694244
3470
- if (!dev->of_node) {
3471
- dev_err(dev, "device tree node not found\n");
3472
- return -ENODEV;
3473
- }
4245
+ if (!dev->of_node)
4246
+ return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
34744247
34754248 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
34764249 if (!info)
....@@ -3479,44 +4252,39 @@
34794252 info->dev = dev;
34804253
34814254 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
3482
- if (!ctrl) {
3483
- dev_err(dev, "driver data not available\n");
3484
- return -EINVAL;
3485
- }
4255
+ if (!ctrl)
4256
+ return dev_err_probe(dev, -EINVAL, "driver data not available\n");
34864257 info->ctrl = ctrl;
34874258
34884259 node = of_parse_phandle(np, "rockchip,grf", 0);
34894260 if (node) {
34904261 info->regmap_base = syscon_node_to_regmap(node);
4262
+ of_node_put(node);
34914263 if (IS_ERR(info->regmap_base))
34924264 return PTR_ERR(info->regmap_base);
34934265 } else {
3494
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3495
- base = devm_ioremap_resource(&pdev->dev, res);
4266
+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
34964267 if (IS_ERR(base))
34974268 return PTR_ERR(base);
34984269
34994270 rockchip_regmap_config.max_register = resource_size(res) - 4;
35004271 rockchip_regmap_config.name = "rockchip,pinctrl";
3501
- info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base,
3502
- &rockchip_regmap_config);
4272
+ info->regmap_base =
4273
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
35034274
35044275 /* to check for the old dt-bindings */
35054276 info->reg_size = resource_size(res);
35064277
35074278 /* Honor the old binding, with pull registers as 2nd resource */
35084279 if (ctrl->type == RK3188 && info->reg_size < 0x200) {
3509
- res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
3510
- base = devm_ioremap_resource(&pdev->dev, res);
4280
+ base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
35114281 if (IS_ERR(base))
35124282 return PTR_ERR(base);
35134283
3514
- rockchip_regmap_config.max_register =
3515
- resource_size(res) - 4;
4284
+ rockchip_regmap_config.max_register = resource_size(res) - 4;
35164285 rockchip_regmap_config.name = "rockchip,pinctrl-pull";
3517
- info->regmap_pull = devm_regmap_init_mmio(&pdev->dev,
3518
- base,
3519
- &rockchip_regmap_config);
4286
+ info->regmap_pull =
4287
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
35204288 }
35214289 }
35224290
....@@ -3524,13 +4292,13 @@
35244292 node = of_parse_phandle(np, "rockchip,pmu", 0);
35254293 if (node) {
35264294 info->regmap_pmu = syscon_node_to_regmap(node);
4295
+ of_node_put(node);
35274296 if (IS_ERR(info->regmap_pmu))
35284297 return PTR_ERR(info->regmap_pmu);
35294298 }
35304299
3531
- /* Special handle for some Socs */
3532
- if (ctrl->soc_data_init) {
3533
- ret = ctrl->soc_data_init(info);
4300
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
4301
+ ret = rk3308_soc_data_init(info);
35344302 if (ret)
35354303 return ret;
35364304 }
....@@ -3540,16 +4308,49 @@
35404308 return ret;
35414309
35424310 platform_set_drvdata(pdev, info);
4311
+ g_pctldev = info->pctl_dev;
35434312
3544
- ret = of_platform_populate(np, rockchip_bank_match, NULL, NULL);
3545
- if (ret) {
3546
- dev_err(&pdev->dev, "failed to register gpio device\n");
3547
- return ret;
3548
- }
4313
+ ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
4314
+ if (ret)
4315
+ return dev_err_probe(dev, ret, "failed to register gpio device\n");
4316
+
35494317 dev_info(dev, "probed %s\n", dev_name(dev));
35504318
35514319 return 0;
35524320 }
4321
+
4322
+static int rockchip_pinctrl_remove(struct platform_device *pdev)
4323
+{
4324
+ struct rockchip_pinctrl *info = platform_get_drvdata(pdev);
4325
+ struct rockchip_pin_bank *bank;
4326
+ struct rockchip_pin_deferred *cfg;
4327
+ int i;
4328
+
4329
+ g_pctldev = NULL;
4330
+ of_platform_depopulate(&pdev->dev);
4331
+
4332
+ for (i = 0; i < info->ctrl->nr_banks; i++) {
4333
+ bank = &info->ctrl->pin_banks[i];
4334
+
4335
+ mutex_lock(&bank->deferred_lock);
4336
+ while (!list_empty(&bank->deferred_pins)) {
4337
+ cfg = list_first_entry(&bank->deferred_pins,
4338
+ struct rockchip_pin_deferred, head);
4339
+ list_del(&cfg->head);
4340
+ kfree(cfg);
4341
+ }
4342
+ mutex_unlock(&bank->deferred_lock);
4343
+ }
4344
+
4345
+ return 0;
4346
+}
4347
+
4348
+static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
4349
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
4350
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4351
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4352
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4353
+};
35534354
35544355 static struct rockchip_pin_bank px30_pin_banks[] = {
35554356 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
....@@ -3574,13 +4375,6 @@
35744375 ),
35754376 };
35764377
3577
-static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
3578
- PX30S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
3579
- PX30S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3580
- PX30S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3581
- PX30S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
3582
-};
3583
-
35844378 static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
35854379 .pin_banks = px30_pin_banks,
35864380 .nr_banks = ARRAY_SIZE(px30_pin_banks),
....@@ -3594,6 +4388,48 @@
35944388 .drv_calc_reg = px30_calc_drv_reg_and_bit,
35954389 .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
35964390 .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit,
4391
+};
4392
+
4393
+static struct rockchip_pin_bank rv1106_pin_banks[] = {
4394
+ PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
4395
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4396
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4397
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4398
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU),
4399
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4400
+ IOMUX_WIDTH_4BIT,
4401
+ IOMUX_WIDTH_4BIT,
4402
+ IOMUX_WIDTH_4BIT,
4403
+ IOMUX_WIDTH_4BIT,
4404
+ 0, 0x08, 0x10, 0x18),
4405
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4406
+ IOMUX_WIDTH_4BIT,
4407
+ IOMUX_WIDTH_4BIT,
4408
+ IOMUX_WIDTH_4BIT,
4409
+ IOMUX_WIDTH_4BIT,
4410
+ 0x10020, 0x10028, 0, 0),
4411
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4412
+ IOMUX_WIDTH_4BIT,
4413
+ IOMUX_WIDTH_4BIT,
4414
+ IOMUX_WIDTH_4BIT,
4415
+ IOMUX_WIDTH_4BIT,
4416
+ 0x20040, 0x20048, 0x20050, 0x20058),
4417
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 24, "gpio4",
4418
+ IOMUX_WIDTH_4BIT,
4419
+ IOMUX_WIDTH_4BIT,
4420
+ IOMUX_WIDTH_4BIT,
4421
+ 0,
4422
+ 0x30000, 0x30008, 0x30010, 0),
4423
+};
4424
+
4425
+static struct rockchip_pin_ctrl rv1106_pin_ctrl __maybe_unused = {
4426
+ .pin_banks = rv1106_pin_banks,
4427
+ .nr_banks = ARRAY_SIZE(rv1106_pin_banks),
4428
+ .label = "RV1106-GPIO",
4429
+ .type = RV1106,
4430
+ .pull_calc_reg = rv1106_calc_pull_reg_and_bit,
4431
+ .drv_calc_reg = rv1106_calc_drv_reg_and_bit,
4432
+ .schmitt_calc_reg = rv1106_calc_schmitt_reg_and_bit,
35974433 };
35984434
35994435 static struct rockchip_pin_bank rv1108_pin_banks[] = {
....@@ -3866,6 +4702,14 @@
38664702 .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
38674703 };
38684704
4705
+static struct rockchip_pin_bank rk3308bs_pin_banks[] __maybe_unused = {
4706
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4707
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4708
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4709
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4710
+ S_PIN_BANK_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4711
+};
4712
+
38694713 static struct rockchip_pin_bank rk3308_pin_banks[] = {
38704714 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
38714715 IOMUX_WIDTH_2BIT,
....@@ -3899,11 +4743,10 @@
38994743 .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
39004744 .iomux_routes = rk3308_mux_route_data,
39014745 .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data),
3902
- .ctrl_data_re_init = rk3308b_ctrl_data_re_init,
3903
- .soc_data_init = rk3308b_soc_data_init,
39044746 .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
39054747 .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
39064748 .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
4749
+ .slew_rate_calc_reg = rk3308_calc_slew_rate_reg_and_bit,
39074750 };
39084751
39094752 static struct rockchip_pin_bank rk3328_pin_banks[] = {
....@@ -4025,6 +4868,92 @@
40254868 .drv_calc_reg = rk3399_calc_drv_reg_and_bit,
40264869 };
40274870
4871
+static struct rockchip_pin_bank rk3528_pin_banks[] = {
4872
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4873
+ IOMUX_WIDTH_4BIT,
4874
+ IOMUX_WIDTH_4BIT,
4875
+ IOMUX_WIDTH_4BIT,
4876
+ IOMUX_WIDTH_4BIT,
4877
+ 0, 0, 0, 0),
4878
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4879
+ IOMUX_WIDTH_4BIT,
4880
+ IOMUX_WIDTH_4BIT,
4881
+ IOMUX_WIDTH_4BIT,
4882
+ IOMUX_WIDTH_4BIT,
4883
+ 0x20020, 0x20028, 0x20030, 0x20038),
4884
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4885
+ IOMUX_WIDTH_4BIT,
4886
+ IOMUX_WIDTH_4BIT,
4887
+ IOMUX_WIDTH_4BIT,
4888
+ IOMUX_WIDTH_4BIT,
4889
+ 0x30040, 0, 0, 0),
4890
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4891
+ IOMUX_WIDTH_4BIT,
4892
+ IOMUX_WIDTH_4BIT,
4893
+ IOMUX_WIDTH_4BIT,
4894
+ IOMUX_WIDTH_4BIT,
4895
+ 0x20060, 0x20068, 0x20070, 0),
4896
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4",
4897
+ IOMUX_WIDTH_4BIT,
4898
+ IOMUX_WIDTH_4BIT,
4899
+ IOMUX_WIDTH_4BIT,
4900
+ IOMUX_WIDTH_4BIT,
4901
+ 0x10080, 0x10088, 0x10090, 0x10098),
4902
+};
4903
+
4904
+static struct rockchip_pin_ctrl rk3528_pin_ctrl __maybe_unused = {
4905
+ .pin_banks = rk3528_pin_banks,
4906
+ .nr_banks = ARRAY_SIZE(rk3528_pin_banks),
4907
+ .label = "RK3528-GPIO",
4908
+ .type = RK3528,
4909
+ .pull_calc_reg = rk3528_calc_pull_reg_and_bit,
4910
+ .drv_calc_reg = rk3528_calc_drv_reg_and_bit,
4911
+ .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit,
4912
+};
4913
+
4914
+static struct rockchip_pin_bank rk3562_pin_banks[] = {
4915
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4916
+ IOMUX_WIDTH_4BIT,
4917
+ IOMUX_WIDTH_4BIT,
4918
+ IOMUX_WIDTH_4BIT,
4919
+ IOMUX_WIDTH_4BIT,
4920
+ 0x20000, 0x20008, 0x20010, 0x20018),
4921
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4922
+ IOMUX_WIDTH_4BIT,
4923
+ IOMUX_WIDTH_4BIT,
4924
+ IOMUX_WIDTH_4BIT,
4925
+ IOMUX_WIDTH_4BIT,
4926
+ 0, 0x08, 0x10, 0x18),
4927
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4928
+ IOMUX_WIDTH_4BIT,
4929
+ IOMUX_WIDTH_4BIT,
4930
+ IOMUX_WIDTH_4BIT,
4931
+ IOMUX_WIDTH_4BIT,
4932
+ 0x20, 0, 0, 0),
4933
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4934
+ IOMUX_WIDTH_4BIT,
4935
+ IOMUX_WIDTH_4BIT,
4936
+ IOMUX_WIDTH_4BIT,
4937
+ IOMUX_WIDTH_4BIT,
4938
+ 0x10040, 0x10048, 0x10050, 0x10058),
4939
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
4940
+ IOMUX_WIDTH_4BIT,
4941
+ IOMUX_WIDTH_4BIT,
4942
+ 0,
4943
+ 0,
4944
+ 0x10060, 0x10068, 0, 0),
4945
+};
4946
+
4947
+static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = {
4948
+ .pin_banks = rk3562_pin_banks,
4949
+ .nr_banks = ARRAY_SIZE(rk3562_pin_banks),
4950
+ .label = "RK3562-GPIO",
4951
+ .type = RK3562,
4952
+ .pull_calc_reg = rk3562_calc_pull_reg_and_bit,
4953
+ .drv_calc_reg = rk3562_calc_drv_reg_and_bit,
4954
+ .schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit,
4955
+};
4956
+
40284957 static struct rockchip_pin_bank rk3568_pin_banks[] = {
40294958 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
40304959 IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
....@@ -4065,12 +4994,39 @@
40654994 .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
40664995 };
40674996
4997
+static struct rockchip_pin_bank rk3588_pin_banks[] = {
4998
+ RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
4999
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5000
+ RK3588_PIN_BANK_FLAGS(1, 32, "gpio1",
5001
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5002
+ RK3588_PIN_BANK_FLAGS(2, 32, "gpio2",
5003
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5004
+ RK3588_PIN_BANK_FLAGS(3, 32, "gpio3",
5005
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5006
+ RK3588_PIN_BANK_FLAGS(4, 32, "gpio4",
5007
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5008
+};
5009
+
5010
+static struct rockchip_pin_ctrl rk3588_pin_ctrl __maybe_unused = {
5011
+ .pin_banks = rk3588_pin_banks,
5012
+ .nr_banks = ARRAY_SIZE(rk3588_pin_banks),
5013
+ .label = "RK3588-GPIO",
5014
+ .type = RK3588,
5015
+ .pull_calc_reg = rk3588_calc_pull_reg_and_bit,
5016
+ .drv_calc_reg = rk3588_calc_drv_reg_and_bit,
5017
+ .schmitt_calc_reg = rk3588_calc_schmitt_reg_and_bit,
5018
+};
5019
+
40685020 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
40695021 #ifdef CONFIG_CPU_PX30
40705022 { .compatible = "rockchip,px30-pinctrl",
40715023 .data = &px30_pin_ctrl },
40725024 #endif
4073
-#ifdef CONFIG_CPU_RV110X
5025
+#ifdef CONFIG_CPU_RV1106
5026
+ { .compatible = "rockchip,rv1106-pinctrl",
5027
+ .data = &rv1106_pin_ctrl },
5028
+#endif
5029
+#ifdef CONFIG_CPU_RV1108
40745030 { .compatible = "rockchip,rv1108-pinctrl",
40755031 .data = &rv1108_pin_ctrl },
40765032 #endif
....@@ -4128,15 +5084,28 @@
41285084 { .compatible = "rockchip,rk3399-pinctrl",
41295085 .data = &rk3399_pin_ctrl },
41305086 #endif
5087
+#ifdef CONFIG_CPU_RK3528
5088
+ { .compatible = "rockchip,rk3528-pinctrl",
5089
+ .data = &rk3528_pin_ctrl },
5090
+#endif
5091
+#ifdef CONFIG_CPU_RK3562
5092
+ { .compatible = "rockchip,rk3562-pinctrl",
5093
+ .data = &rk3562_pin_ctrl },
5094
+#endif
41315095 #ifdef CONFIG_CPU_RK3568
41325096 { .compatible = "rockchip,rk3568-pinctrl",
41335097 .data = &rk3568_pin_ctrl },
5098
+#endif
5099
+#ifdef CONFIG_CPU_RK3588
5100
+ { .compatible = "rockchip,rk3588-pinctrl",
5101
+ .data = &rk3588_pin_ctrl },
41345102 #endif
41355103 {},
41365104 };
41375105
41385106 static struct platform_driver rockchip_pinctrl_driver = {
41395107 .probe = rockchip_pinctrl_probe,
5108
+ .remove = rockchip_pinctrl_remove,
41405109 .driver = {
41415110 .name = "rockchip-pinctrl",
41425111 .pm = &rockchip_pinctrl_dev_pm_ops,
....@@ -4156,6 +5125,103 @@
41565125 }
41575126 module_exit(rockchip_pinctrl_drv_unregister);
41585127
5128
+/**
5129
+ * rk_iomux_set - set the rockchip iomux by pin number.
5130
+ *
5131
+ * @bank: the gpio bank index, from 0 to the max bank num.
5132
+ * @pin: the gpio pin index, from 0 to 31.
5133
+ * @mux: the pointer to store mux value.
5134
+ *
5135
+ * Return 0 if set success, else return error code.
5136
+ */
5137
+int rk_iomux_set(int bank, int pin, int mux)
5138
+{
5139
+ struct pinctrl_dev *pctldev = g_pctldev;
5140
+ struct rockchip_pinctrl *info;
5141
+ struct rockchip_pin_bank *gpio;
5142
+ struct rockchip_pin_group *grp = NULL;
5143
+ struct rockchip_pin_config *cfg = NULL;
5144
+ int i, j, ret;
5145
+
5146
+ if (!g_pctldev)
5147
+ return -ENODEV;
5148
+
5149
+ info = pinctrl_dev_get_drvdata(pctldev);
5150
+ if (bank >= info->ctrl->nr_banks)
5151
+ return -EINVAL;
5152
+
5153
+ if (pin > 31 || pin < 0)
5154
+ return -EINVAL;
5155
+
5156
+ gpio = &info->ctrl->pin_banks[bank];
5157
+
5158
+ mutex_lock(&iomux_lock);
5159
+ for (i = 0; i < info->ngroups; i++) {
5160
+ grp = &info->groups[i];
5161
+ for (j = 0; j < grp->npins; i++) {
5162
+ if (grp->pins[i] == (gpio->pin_base + pin)) {
5163
+ cfg = grp->data;
5164
+ break;
5165
+ }
5166
+ }
5167
+ }
5168
+
5169
+ ret = rockchip_set_mux(gpio, pin, mux);
5170
+ if (ret) {
5171
+ dev_err(info->dev, "mux GPIO%d-%d %d fail\n", bank, pin, mux);
5172
+ goto out;
5173
+ }
5174
+
5175
+ if (cfg && (cfg->func != mux))
5176
+ cfg->func = mux;
5177
+
5178
+out:
5179
+ mutex_unlock(&iomux_lock);
5180
+
5181
+ return ret;
5182
+}
5183
+EXPORT_SYMBOL_GPL(rk_iomux_set);
5184
+
5185
+/**
5186
+ * rk_iomux_get - get the rockchip iomux by pin number.
5187
+ *
5188
+ * @bank: the gpio bank index, from 0 to the max bank num.
5189
+ * @pin: the gpio pin index, from 0 to 31.
5190
+ * @mux: the pointer to store mux value.
5191
+ *
5192
+ * Return 0 if get success, else return error code.
5193
+ */
5194
+int rk_iomux_get(int bank, int pin, int *mux)
5195
+{
5196
+ struct pinctrl_dev *pctldev = g_pctldev;
5197
+ struct rockchip_pinctrl *info;
5198
+ struct rockchip_pin_bank *gpio;
5199
+ int ret;
5200
+
5201
+ if (!g_pctldev)
5202
+ return -ENODEV;
5203
+ if (!mux)
5204
+ return -EINVAL;
5205
+
5206
+ info = pinctrl_dev_get_drvdata(pctldev);
5207
+ if (bank >= info->ctrl->nr_banks)
5208
+ return -EINVAL;
5209
+
5210
+ if (pin > 31 || pin < 0)
5211
+ return -EINVAL;
5212
+
5213
+ gpio = &info->ctrl->pin_banks[bank];
5214
+
5215
+ mutex_lock(&iomux_lock);
5216
+ ret = rockchip_get_mux(gpio, pin);
5217
+ mutex_unlock(&iomux_lock);
5218
+
5219
+ *mux = ret;
5220
+
5221
+ return (ret >= 0) ? 0 : ret;
5222
+}
5223
+EXPORT_SYMBOL_GPL(rk_iomux_get);
5224
+
41595225 MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
41605226 MODULE_LICENSE("GPL");
41615227 MODULE_ALIAS("platform:pinctrl-rockchip");