hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/pinctrl/pinctrl-rockchip.c
....@@ -20,10 +20,10 @@
2020 #include <linux/platform_device.h>
2121 #include <linux/io.h>
2222 #include <linux/bitops.h>
23
-#include <linux/gpio.h>
23
+#include <linux/gpio/driver.h>
2424 #include <linux/of_address.h>
25
-#include <linux/of_irq.h>
2625 #include <linux/of_device.h>
26
+#include <linux/of_irq.h>
2727 #include <linux/pinctrl/machine.h>
2828 #include <linux/pinctrl/pinconf.h>
2929 #include <linux/pinctrl/pinctrl.h>
....@@ -40,7 +40,7 @@
4040 #include "pinconf.h"
4141 #include "pinctrl-rockchip.h"
4242
43
-/**
43
+/*
4444 * Generate a bitmask for setting a value (v) with a write mask bit in hiword
4545 * register 31:16 area.
4646 */
....@@ -117,6 +117,25 @@
117117 { .drv_type = type2, .offset = -1 }, \
118118 { .drv_type = type3, .offset = -1 }, \
119119 }, \
120
+ }
121
+
122
+#define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(id, pins, label, iom0, iom1, \
123
+ iom2, iom3, pull0, pull1, \
124
+ pull2, pull3) \
125
+ { \
126
+ .bank_num = id, \
127
+ .nr_pins = pins, \
128
+ .name = label, \
129
+ .iomux = { \
130
+ { .type = iom0, .offset = -1 }, \
131
+ { .type = iom1, .offset = -1 }, \
132
+ { .type = iom2, .offset = -1 }, \
133
+ { .type = iom3, .offset = -1 }, \
134
+ }, \
135
+ .pull_type[0] = pull0, \
136
+ .pull_type[1] = pull1, \
137
+ .pull_type[2] = pull2, \
138
+ .pull_type[3] = pull3, \
120139 }
121140
122141 #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \
....@@ -204,7 +223,7 @@
204223 .route_location = FLAG, \
205224 }
206225
207
-#define PX30S_PIN_BANK_FLAGS(ID, PIN, LABEL, MTYPE, DTYPE) \
226
+#define S_PIN_BANK_FLAGS(ID, PIN, LABEL, MTYPE, DTYPE) \
208227 PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(ID, PIN, LABEL, \
209228 MTYPE, MTYPE, MTYPE, MTYPE, \
210229 DTYPE, DTYPE, DTYPE, DTYPE, \
....@@ -218,6 +237,12 @@
218237
219238 #define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) \
220239 PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU)
240
+
241
+#define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P) \
242
+ PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
243
+
244
+static struct pinctrl_dev *g_pctldev;
245
+static DEFINE_MUTEX(iomux_lock);
221246
222247 static struct regmap_config rockchip_regmap_config = {
223248 .reg_bits = 32,
....@@ -309,6 +334,7 @@
309334 {
310335 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
311336 const struct rockchip_pin_group *grp;
337
+ struct device *dev = info->dev;
312338 struct pinctrl_map *new_map;
313339 struct device_node *parent;
314340 int map_num = 1;
....@@ -320,8 +346,7 @@
320346 */
321347 grp = pinctrl_name_to_group(info, np->name);
322348 if (!grp) {
323
- dev_err(info->dev, "unable to find group for node %pOFn\n",
324
- np);
349
+ dev_err(dev, "unable to find group for node %pOFn\n", np);
325350 return -EINVAL;
326351 }
327352
....@@ -355,7 +380,7 @@
355380 new_map[i].data.configs.num_configs = grp->data[i].nconfigs;
356381 }
357382
358
- dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n",
383
+ dev_dbg(dev, "maps: function %s group %s num %d\n",
359384 (*map)->data.mux.function, (*map)->data.mux.group, map_num);
360385
361386 return 0;
....@@ -510,159 +535,110 @@
510535
511536 static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
512537 {
538
+ /* gpio1b6_sel */
513539 .num = 1,
514540 .pin = 14,
515541 .reg = 0x28,
516542 .bit = 12,
517543 .mask = 0xf
518544 }, {
545
+ /* gpio1b7_sel */
519546 .num = 1,
520547 .pin = 15,
521548 .reg = 0x2c,
522549 .bit = 0,
523550 .mask = 0x3
524551 }, {
552
+ /* gpio1c2_sel */
525553 .num = 1,
526554 .pin = 18,
527555 .reg = 0x30,
528556 .bit = 4,
529557 .mask = 0xf
530558 }, {
559
+ /* gpio1c3_sel */
531560 .num = 1,
532561 .pin = 19,
533562 .reg = 0x30,
534563 .bit = 8,
535564 .mask = 0xf
536565 }, {
566
+ /* gpio1c4_sel */
537567 .num = 1,
538568 .pin = 20,
539569 .reg = 0x30,
540570 .bit = 12,
541571 .mask = 0xf
542572 }, {
573
+ /* gpio1c5_sel */
543574 .num = 1,
544575 .pin = 21,
545576 .reg = 0x34,
546577 .bit = 0,
547578 .mask = 0xf
548579 }, {
580
+ /* gpio1c6_sel */
549581 .num = 1,
550582 .pin = 22,
551583 .reg = 0x34,
552584 .bit = 4,
553585 .mask = 0xf
554586 }, {
587
+ /* gpio1c7_sel */
555588 .num = 1,
556589 .pin = 23,
557590 .reg = 0x34,
558591 .bit = 8,
559592 .mask = 0xf
560593 }, {
561
- .num = 3,
562
- .pin = 12,
563
- .reg = 0x68,
564
- .bit = 8,
565
- .mask = 0xf
566
- }, {
567
- .num = 3,
568
- .pin = 13,
569
- .reg = 0x68,
570
- .bit = 12,
571
- .mask = 0xf
572
- },
573
-};
574
-
575
-static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
576
- {
577
- .num = 1,
578
- .pin = 14,
579
- .reg = 0x28,
580
- .bit = 12,
581
- .mask = 0xf
582
- }, {
583
- .num = 1,
584
- .pin = 15,
585
- .reg = 0x2c,
586
- .bit = 0,
587
- .mask = 0x3
588
- }, {
589
- .num = 1,
590
- .pin = 18,
591
- .reg = 0x30,
592
- .bit = 4,
593
- .mask = 0xf
594
- }, {
595
- .num = 1,
596
- .pin = 19,
597
- .reg = 0x30,
598
- .bit = 8,
599
- .mask = 0xf
600
- }, {
601
- .num = 1,
602
- .pin = 20,
603
- .reg = 0x30,
604
- .bit = 12,
605
- .mask = 0xf
606
- }, {
607
- .num = 1,
608
- .pin = 21,
609
- .reg = 0x34,
610
- .bit = 0,
611
- .mask = 0xf
612
- }, {
613
- .num = 1,
614
- .pin = 22,
615
- .reg = 0x34,
616
- .bit = 4,
617
- .mask = 0xf
618
- }, {
619
- .num = 1,
620
- .pin = 23,
621
- .reg = 0x34,
622
- .bit = 8,
623
- .mask = 0xf
624
- }, {
625
- .num = 3,
626
- .pin = 12,
627
- .reg = 0x68,
628
- .bit = 8,
629
- .mask = 0xf
630
- }, {
631
- .num = 3,
632
- .pin = 13,
633
- .reg = 0x68,
634
- .bit = 12,
635
- .mask = 0xf
636
- }, {
594
+ /* gpio2a2_sel_plus */
637595 .num = 2,
638596 .pin = 2,
639597 .reg = 0x608,
640598 .bit = 0,
641599 .mask = 0x7
642600 }, {
601
+ /* gpio2a3_sel_plus */
643602 .num = 2,
644603 .pin = 3,
645604 .reg = 0x608,
646605 .bit = 4,
647606 .mask = 0x7
648607 }, {
608
+ /* gpio2c0_sel_plus */
649609 .num = 2,
650610 .pin = 16,
651611 .reg = 0x610,
652612 .bit = 8,
653613 .mask = 0x7
654614 }, {
615
+ /* gpio3b2_sel_plus */
655616 .num = 3,
656617 .pin = 10,
657618 .reg = 0x610,
658619 .bit = 0,
659620 .mask = 0x7
660621 }, {
622
+ /* gpio3b3_sel_plus */
661623 .num = 3,
662624 .pin = 11,
663625 .reg = 0x610,
664626 .bit = 4,
665627 .mask = 0x7
628
+ }, {
629
+ /* gpio3b4_sel */
630
+ .num = 3,
631
+ .pin = 12,
632
+ .reg = 0x68,
633
+ .bit = 8,
634
+ .mask = 0xf
635
+ }, {
636
+ /* gpio3b5_sel */
637
+ .num = 3,
638
+ .pin = 13,
639
+ .reg = 0x68,
640
+ .bit = 12,
641
+ .mask = 0xf
666642 },
667643 };
668644
....@@ -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,25 @@
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;
3196
+ /*
3197
+ * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
3198
+ * where that pull up value becomes 3.
3199
+ */
3200
+ if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
3201
+ if (data == 3)
3202
+ data = 1;
3203
+ }
24033204
24043205 return rockchip_pull_list[pull_type][data];
24053206 default:
2406
- dev_err(info->dev, "unsupported pinctrl type\n");
3207
+ dev_err(dev, "unsupported pinctrl type\n");
24073208 return -EINVAL;
24083209 };
24093210 }
....@@ -2413,19 +3214,21 @@
24133214 {
24143215 struct rockchip_pinctrl *info = bank->drvdata;
24153216 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3217
+ struct device *dev = info->dev;
24163218 struct regmap *regmap;
24173219 int reg, ret, i, pull_type;
24183220 u8 bit;
24193221 u32 data, rmask;
24203222
2421
- dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n",
2422
- bank->bank_num, pin_num, pull);
3223
+ dev_dbg(dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull);
24233224
24243225 /* rk3066b does support any pulls */
24253226 if (ctrl->type == RK3066B)
24263227 return pull ? -EINVAL : 0;
24273228
2428
- ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3229
+ ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
3230
+ if (ret)
3231
+ return ret;
24293232
24303233 switch (ctrl->type) {
24313234 case RK2928:
....@@ -2436,6 +3239,7 @@
24363239 ret = regmap_write(regmap, reg, data);
24373240 break;
24383241 case PX30:
3242
+ case RV1106:
24393243 case RV1108:
24403244 case RV1126:
24413245 case RK1808:
....@@ -2444,7 +3248,10 @@
24443248 case RK3308:
24453249 case RK3368:
24463250 case RK3399:
3251
+ case RK3528:
3252
+ case RK3562:
24473253 case RK3568:
3254
+ case RK3588:
24483255 pull_type = bank->pull_type[pin_num / 8];
24493256 ret = -EINVAL;
24503257 for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
....@@ -2455,7 +3262,7 @@
24553262 }
24563263 }
24573264 /*
2458
- * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6,
3265
+ * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
24593266 * where that pull up value becomes 3.
24603267 */
24613268 if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
....@@ -2464,8 +3271,7 @@
24643271 }
24653272
24663273 if (ret < 0) {
2467
- dev_err(info->dev, "unsupported pull setting %d\n",
2468
- pull);
3274
+ dev_err(dev, "unsupported pull setting %d\n", pull);
24693275 return ret;
24703276 }
24713277
....@@ -2477,32 +3283,11 @@
24773283 ret = regmap_update_bits(regmap, reg, rmask, data);
24783284 break;
24793285 default:
2480
- dev_err(info->dev, "unsupported pinctrl type\n");
3286
+ dev_err(dev, "unsupported pinctrl type\n");
24813287 return -EINVAL;
24823288 }
24833289
24843290 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;
25063291 }
25073292
25083293 #define RK3328_SCHMITT_BITS_PER_PIN 1
....@@ -2575,6 +3360,7 @@
25753360
25763361 data >>= bit;
25773362 switch (ctrl->type) {
3363
+ case RK3562:
25783364 case RK3568:
25793365 return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
25803366 default:
....@@ -2589,12 +3375,13 @@
25893375 {
25903376 struct rockchip_pinctrl *info = bank->drvdata;
25913377 struct rockchip_pin_ctrl *ctrl = info->ctrl;
3378
+ struct device *dev = info->dev;
25923379 struct regmap *regmap;
25933380 int reg, ret;
25943381 u8 bit;
25953382 u32 data, rmask;
25963383
2597
- dev_dbg(info->dev, "setting input schmitt of GPIO%d-%d to %d\n",
3384
+ dev_dbg(dev, "setting input schmitt of GPIO%d-%d to %d\n",
25983385 bank->bank_num, pin_num, enable);
25993386
26003387 ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
....@@ -2603,6 +3390,7 @@
26033390
26043391 /* enable the write to the equivalent lower bits */
26053392 switch (ctrl->type) {
3393
+ case RK3562:
26063394 case RK3568:
26073395 data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
26083396 rmask = data | (data >> 16);
....@@ -2737,10 +3525,11 @@
27373525 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
27383526 const unsigned int *pins = info->groups[group].pins;
27393527 const struct rockchip_pin_config *data = info->groups[group].data;
3528
+ struct device *dev = info->dev;
27403529 struct rockchip_pin_bank *bank;
27413530 int cnt, ret = 0;
27423531
2743
- dev_dbg(info->dev, "enable function %s group %s\n",
3532
+ dev_dbg(dev, "enable function %s group %s\n",
27443533 info->functions[selector].name, info->groups[group].name);
27453534
27463535 /*
....@@ -2788,6 +3577,7 @@
27883577 case RK3066B:
27893578 return pull ? false : true;
27903579 case PX30:
3580
+ case RV1106:
27913581 case RV1108:
27923582 case RV1126:
27933583 case RK1808:
....@@ -2796,11 +3586,32 @@
27963586 case RK3308:
27973587 case RK3368:
27983588 case RK3399:
3589
+ case RK3528:
3590
+ case RK3562:
27993591 case RK3568:
3592
+ case RK3588:
28003593 return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
28013594 }
28023595
28033596 return false;
3597
+}
3598
+
3599
+static int rockchip_pinconf_defer_pin(struct rockchip_pin_bank *bank,
3600
+ unsigned int pin, u32 param, u32 arg)
3601
+{
3602
+ struct rockchip_pin_deferred *cfg;
3603
+
3604
+ cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
3605
+ if (!cfg)
3606
+ return -ENOMEM;
3607
+
3608
+ cfg->pin = pin;
3609
+ cfg->param = param;
3610
+ cfg->arg = arg;
3611
+
3612
+ list_add_tail(&cfg->head, &bank->deferred_pins);
3613
+
3614
+ return 0;
28043615 }
28053616
28063617 /* set the pin config settings for a specified pin */
....@@ -2818,6 +3629,25 @@
28183629 for (i = 0; i < num_configs; i++) {
28193630 param = pinconf_to_config_param(configs[i]);
28203631 arg = pinconf_to_config_argument(configs[i]);
3632
+
3633
+ if (param == PIN_CONFIG_OUTPUT || param == PIN_CONFIG_INPUT_ENABLE) {
3634
+ /*
3635
+ * Check for gpio driver not being probed yet.
3636
+ * The lock makes sure that either gpio-probe has completed
3637
+ * or the gpio driver hasn't probed yet.
3638
+ */
3639
+ mutex_lock(&bank->deferred_lock);
3640
+ if (!gpio || !gpio->direction_output) {
3641
+ rc = rockchip_pinconf_defer_pin(bank, pin - bank->pin_base, param,
3642
+ arg);
3643
+ mutex_unlock(&bank->deferred_lock);
3644
+ if (rc)
3645
+ return rc;
3646
+
3647
+ break;
3648
+ }
3649
+ mutex_unlock(&bank->deferred_lock);
3650
+ }
28213651
28223652 switch (param) {
28233653 case PIN_CONFIG_BIAS_DISABLE:
....@@ -2844,10 +3674,8 @@
28443674 case PIN_CONFIG_OUTPUT:
28453675 rc = rockchip_set_mux(bank, pin - bank->pin_base,
28463676 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);
3677
+ if (rc != RK_FUNC_GPIO)
28493678 return -EINVAL;
2850
- }
28513679
28523680 rc = gpio->direction_output(gpio, pin - bank->pin_base,
28533681 arg);
....@@ -2932,13 +3760,13 @@
29323760 break;
29333761 case PIN_CONFIG_OUTPUT:
29343762 rc = rockchip_get_mux(bank, pin - bank->pin_base);
2935
- if (rc != 0)
3763
+ if (rc != RK_FUNC_GPIO)
29363764 return -EINVAL;
29373765
2938
- /* 0 for output, 1 for input */
2939
- rc = gpio->get_direction(gpio, pin - bank->pin_base);
2940
- if (rc)
2941
- return -EINVAL;
3766
+ if (!gpio || !gpio->get) {
3767
+ arg = 0;
3768
+ break;
3769
+ }
29423770
29433771 rc = gpio->get(gpio, pin - bank->pin_base);
29443772 if (rc < 0)
....@@ -2998,24 +3826,13 @@
29983826 {},
29993827 };
30003828
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
-
30123829 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
30133830 struct device_node *np)
30143831 {
30153832 struct device_node *child;
30163833
30173834 for_each_child_of_node(np, child) {
3018
- if (!is_function_node(child))
3835
+ if (of_match_node(rockchip_bank_match, child))
30193836 continue;
30203837
30213838 info->nfunctions++;
....@@ -3028,6 +3845,7 @@
30283845 struct rockchip_pinctrl *info,
30293846 u32 index)
30303847 {
3848
+ struct device *dev = info->dev;
30313849 struct rockchip_pin_bank *bank;
30323850 int size;
30333851 const __be32 *list;
....@@ -3035,7 +3853,7 @@
30353853 int i, j;
30363854 int ret;
30373855
3038
- dev_dbg(info->dev, "group(%d): %pOFn\n", index, np);
3856
+ dev_dbg(dev, "group(%d): %pOFn\n", index, np);
30393857
30403858 /* Initialise group */
30413859 grp->name = np->name;
....@@ -3047,19 +3865,13 @@
30473865 list = of_get_property(np, "rockchip,pins", &size);
30483866 /* we do not check return since it's safe node passed down */
30493867 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
- }
3868
+ if (!size || size % 4)
3869
+ return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
30543870
30553871 grp->npins = size / 4;
30563872
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);
3873
+ grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
3874
+ grp->data = devm_kcalloc(dev, grp->npins, sizeof(*grp->data), GFP_KERNEL);
30633875 if (!grp->pins || !grp->data)
30643876 return -ENOMEM;
30653877
....@@ -3082,6 +3894,7 @@
30823894 np_config = of_find_node_by_phandle(be32_to_cpup(phandle));
30833895 ret = pinconf_generic_parse_dt_config(np_config, NULL,
30843896 &grp->data[j].configs, &grp->data[j].nconfigs);
3897
+ of_node_put(np_config);
30853898 if (ret)
30863899 return ret;
30873900 }
....@@ -3093,6 +3906,7 @@
30933906 struct rockchip_pinctrl *info,
30943907 u32 index)
30953908 {
3909
+ struct device *dev = info->dev;
30963910 struct device_node *child;
30973911 struct rockchip_pmx_func *func;
30983912 struct rockchip_pin_group *grp;
....@@ -3100,7 +3914,7 @@
31003914 static u32 grp_index;
31013915 u32 i = 0;
31023916
3103
- dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np);
3917
+ dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
31043918
31053919 func = &info->functions[index];
31063920
....@@ -3110,8 +3924,7 @@
31103924 if (func->ngroups <= 0)
31113925 return 0;
31123926
3113
- func->groups = devm_kcalloc(info->dev,
3114
- func->ngroups, sizeof(char *), GFP_KERNEL);
3927
+ func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
31153928 if (!func->groups)
31163929 return -ENOMEM;
31173930
....@@ -3139,32 +3952,26 @@
31393952
31403953 rockchip_pinctrl_child_count(info, np);
31413954
3142
- dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions);
3143
- dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups);
3955
+ dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
3956
+ dev_dbg(dev, "ngroups = %d\n", info->ngroups);
31443957
3145
- info->functions = devm_kcalloc(dev,
3146
- info->nfunctions,
3147
- sizeof(struct rockchip_pmx_func),
3148
- GFP_KERNEL);
3958
+ info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
31493959 if (!info->functions)
31503960 return -ENOMEM;
31513961
3152
- info->groups = devm_kcalloc(dev,
3153
- info->ngroups,
3154
- sizeof(struct rockchip_pin_group),
3155
- GFP_KERNEL);
3962
+ info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
31563963 if (!info->groups)
31573964 return -ENOMEM;
31583965
31593966 i = 0;
31603967
31613968 for_each_child_of_node(np, child) {
3162
- if (!is_function_node(child))
3969
+ if (of_match_node(rockchip_bank_match, child))
31633970 continue;
31643971
31653972 ret = rockchip_pinctrl_parse_functions(child, info, i++);
31663973 if (ret) {
3167
- dev_err(&pdev->dev, "failed to parse function\n");
3974
+ dev_err(dev, "failed to parse function\n");
31683975 of_node_put(child);
31693976 return ret;
31703977 }
....@@ -3179,6 +3986,7 @@
31793986 struct pinctrl_desc *ctrldesc = &info->pctl;
31803987 struct pinctrl_pin_desc *pindesc, *pdesc;
31813988 struct rockchip_pin_bank *pin_bank;
3989
+ struct device *dev = &pdev->dev;
31823990 int pin, bank, ret;
31833991 int k;
31843992
....@@ -3188,9 +3996,7 @@
31883996 ctrldesc->pmxops = &rockchip_pmx_ops;
31893997 ctrldesc->confops = &rockchip_pinconf_ops;
31903998
3191
- pindesc = devm_kcalloc(&pdev->dev,
3192
- info->ctrl->nr_pins, sizeof(*pindesc),
3193
- GFP_KERNEL);
3999
+ pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
31944000 if (!pindesc)
31954001 return -ENOMEM;
31964002
....@@ -3206,41 +4012,24 @@
32064012 pin_bank->name, pin);
32074013 pdesc++;
32084014 }
4015
+
4016
+ INIT_LIST_HEAD(&pin_bank->deferred_pins);
4017
+ mutex_init(&pin_bank->deferred_lock);
32094018 }
32104019
32114020 ret = rockchip_pinctrl_parse_dt(pdev, info);
32124021 if (ret)
32134022 return ret;
32144023
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
- }
4024
+ info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
4025
+ if (IS_ERR(info->pctl_dev))
4026
+ return dev_err_probe(dev, PTR_ERR(info->pctl_dev), "could not register pinctrl driver\n");
32204027
32214028 return 0;
32224029 }
32234030
32244031 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
-
4032
+static struct rockchip_pin_bank rk3308bs_pin_banks[];
32444033 static struct rockchip_pin_bank px30s_pin_banks[];
32454034
32464035 /* retrieve the soc specific data */
....@@ -3248,22 +4037,19 @@
32484037 struct rockchip_pinctrl *d,
32494038 struct platform_device *pdev)
32504039 {
4040
+ struct device *dev = &pdev->dev;
4041
+ struct device_node *node = dev->of_node;
32514042 const struct of_device_id *match;
3252
- struct device_node *node = pdev->dev.of_node;
32534043 struct rockchip_pin_ctrl *ctrl;
32544044 struct rockchip_pin_bank *bank;
32554045 int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
32564046
32574047 match = of_match_node(rockchip_pinctrl_dt_match, node);
32584048 ctrl = (struct rockchip_pin_ctrl *)match->data;
4049
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && soc_is_rk3308bs())
4050
+ ctrl->pin_banks = rk3308bs_pin_banks;
32594051 if (IS_ENABLED(CONFIG_CPU_PX30) && soc_is_px30s())
32604052 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
- }
32674053
32684054 grf_offs = ctrl->grf_mux_offset;
32694055 pmu_offs = ctrl->pmu_mux_offset;
....@@ -3310,7 +4096,7 @@
33104096 drv_pmu_offs : drv_grf_offs;
33114097 }
33124098
3313
- dev_dbg(d->dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
4099
+ dev_dbg(dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
33144100 i, j, iom->offset, drv->offset);
33154101
33164102 /*
....@@ -3417,60 +4203,56 @@
34174203
34184204 /* SoC data specially handle */
34194205
3420
-/* rk3308b SoC data initialize */
3421
-#define RK3308B_GRF_SOC_CON13 0x608
3422
-#define RK3308B_GRF_SOC_CON15 0x610
4206
+/* rk3308 SoC data initialize */
4207
+#define RK3308_GRF_SOC_CON13 0x608
4208
+#define RK3308_GRF_SOC_CON15 0x610
34234209
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))
4210
+/* RK3308_GRF_SOC_CON13 */
4211
+#define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
4212
+#define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4213
+#define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
34284214
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))
4215
+/* RK3308_GRF_SOC_CON15 */
4216
+#define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
4217
+#define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4218
+#define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
34334219
3434
-static int rk3308b_soc_data_init(struct rockchip_pinctrl *info)
4220
+static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
34354221 {
34364222 int ret;
34374223
34384224 /*
34394225 * Enable the special ctrl of selected sources.
34404226 */
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;
34484227
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
- }
4228
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13,
4229
+ RK3308_GRF_I2C3_IOFUNC_SRC_CTRL |
4230
+ RK3308_GRF_GPIO2A3_SEL_SRC_CTRL |
4231
+ RK3308_GRF_GPIO2A2_SEL_SRC_CTRL);
4232
+ if (ret)
4233
+ return ret;
34564234
3457
- return 0;
4235
+ ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15,
4236
+ RK3308_GRF_GPIO2C0_SEL_SRC_CTRL |
4237
+ RK3308_GRF_GPIO3B3_SEL_SRC_CTRL |
4238
+ RK3308_GRF_GPIO3B2_SEL_SRC_CTRL);
4239
+
4240
+ return ret;
4241
+
34584242 }
34594243
34604244 static int rockchip_pinctrl_probe(struct platform_device *pdev)
34614245 {
34624246 struct rockchip_pinctrl *info;
34634247 struct device *dev = &pdev->dev;
4248
+ struct device_node *np = dev->of_node, *node;
34644249 struct rockchip_pin_ctrl *ctrl;
3465
- struct device_node *np = pdev->dev.of_node, *node;
34664250 struct resource *res;
34674251 void __iomem *base;
34684252 int ret;
34694253
3470
- if (!dev->of_node) {
3471
- dev_err(dev, "device tree node not found\n");
3472
- return -ENODEV;
3473
- }
4254
+ if (!dev->of_node)
4255
+ return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
34744256
34754257 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
34764258 if (!info)
....@@ -3479,44 +4261,39 @@
34794261 info->dev = dev;
34804262
34814263 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
3482
- if (!ctrl) {
3483
- dev_err(dev, "driver data not available\n");
3484
- return -EINVAL;
3485
- }
4264
+ if (!ctrl)
4265
+ return dev_err_probe(dev, -EINVAL, "driver data not available\n");
34864266 info->ctrl = ctrl;
34874267
34884268 node = of_parse_phandle(np, "rockchip,grf", 0);
34894269 if (node) {
34904270 info->regmap_base = syscon_node_to_regmap(node);
4271
+ of_node_put(node);
34914272 if (IS_ERR(info->regmap_base))
34924273 return PTR_ERR(info->regmap_base);
34934274 } else {
3494
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
3495
- base = devm_ioremap_resource(&pdev->dev, res);
4275
+ base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
34964276 if (IS_ERR(base))
34974277 return PTR_ERR(base);
34984278
34994279 rockchip_regmap_config.max_register = resource_size(res) - 4;
35004280 rockchip_regmap_config.name = "rockchip,pinctrl";
3501
- info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base,
3502
- &rockchip_regmap_config);
4281
+ info->regmap_base =
4282
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
35034283
35044284 /* to check for the old dt-bindings */
35054285 info->reg_size = resource_size(res);
35064286
35074287 /* Honor the old binding, with pull registers as 2nd resource */
35084288 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);
4289
+ base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
35114290 if (IS_ERR(base))
35124291 return PTR_ERR(base);
35134292
3514
- rockchip_regmap_config.max_register =
3515
- resource_size(res) - 4;
4293
+ rockchip_regmap_config.max_register = resource_size(res) - 4;
35164294 rockchip_regmap_config.name = "rockchip,pinctrl-pull";
3517
- info->regmap_pull = devm_regmap_init_mmio(&pdev->dev,
3518
- base,
3519
- &rockchip_regmap_config);
4295
+ info->regmap_pull =
4296
+ devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
35204297 }
35214298 }
35224299
....@@ -3524,13 +4301,13 @@
35244301 node = of_parse_phandle(np, "rockchip,pmu", 0);
35254302 if (node) {
35264303 info->regmap_pmu = syscon_node_to_regmap(node);
4304
+ of_node_put(node);
35274305 if (IS_ERR(info->regmap_pmu))
35284306 return PTR_ERR(info->regmap_pmu);
35294307 }
35304308
3531
- /* Special handle for some Socs */
3532
- if (ctrl->soc_data_init) {
3533
- ret = ctrl->soc_data_init(info);
4309
+ if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
4310
+ ret = rk3308_soc_data_init(info);
35344311 if (ret)
35354312 return ret;
35364313 }
....@@ -3540,16 +4317,49 @@
35404317 return ret;
35414318
35424319 platform_set_drvdata(pdev, info);
4320
+ g_pctldev = info->pctl_dev;
35434321
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
- }
4322
+ ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
4323
+ if (ret)
4324
+ return dev_err_probe(dev, ret, "failed to register gpio device\n");
4325
+
35494326 dev_info(dev, "probed %s\n", dev_name(dev));
35504327
35514328 return 0;
35524329 }
4330
+
4331
+static int rockchip_pinctrl_remove(struct platform_device *pdev)
4332
+{
4333
+ struct rockchip_pinctrl *info = platform_get_drvdata(pdev);
4334
+ struct rockchip_pin_bank *bank;
4335
+ struct rockchip_pin_deferred *cfg;
4336
+ int i;
4337
+
4338
+ g_pctldev = NULL;
4339
+ of_platform_depopulate(&pdev->dev);
4340
+
4341
+ for (i = 0; i < info->ctrl->nr_banks; i++) {
4342
+ bank = &info->ctrl->pin_banks[i];
4343
+
4344
+ mutex_lock(&bank->deferred_lock);
4345
+ while (!list_empty(&bank->deferred_pins)) {
4346
+ cfg = list_first_entry(&bank->deferred_pins,
4347
+ struct rockchip_pin_deferred, head);
4348
+ list_del(&cfg->head);
4349
+ kfree(cfg);
4350
+ }
4351
+ mutex_unlock(&bank->deferred_lock);
4352
+ }
4353
+
4354
+ return 0;
4355
+}
4356
+
4357
+static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
4358
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
4359
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4360
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4361
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4362
+};
35534363
35544364 static struct rockchip_pin_bank px30_pin_banks[] = {
35554365 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
....@@ -3574,13 +4384,6 @@
35744384 ),
35754385 };
35764386
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
-
35844387 static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
35854388 .pin_banks = px30_pin_banks,
35864389 .nr_banks = ARRAY_SIZE(px30_pin_banks),
....@@ -3594,6 +4397,48 @@
35944397 .drv_calc_reg = px30_calc_drv_reg_and_bit,
35954398 .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
35964399 .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit,
4400
+};
4401
+
4402
+static struct rockchip_pin_bank rv1106_pin_banks[] = {
4403
+ PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
4404
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4405
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4406
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4407
+ IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU),
4408
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4409
+ IOMUX_WIDTH_4BIT,
4410
+ IOMUX_WIDTH_4BIT,
4411
+ IOMUX_WIDTH_4BIT,
4412
+ IOMUX_WIDTH_4BIT,
4413
+ 0, 0x08, 0x10, 0x18),
4414
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4415
+ IOMUX_WIDTH_4BIT,
4416
+ IOMUX_WIDTH_4BIT,
4417
+ IOMUX_WIDTH_4BIT,
4418
+ IOMUX_WIDTH_4BIT,
4419
+ 0x10020, 0x10028, 0, 0),
4420
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4421
+ IOMUX_WIDTH_4BIT,
4422
+ IOMUX_WIDTH_4BIT,
4423
+ IOMUX_WIDTH_4BIT,
4424
+ IOMUX_WIDTH_4BIT,
4425
+ 0x20040, 0x20048, 0x20050, 0x20058),
4426
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 24, "gpio4",
4427
+ IOMUX_WIDTH_4BIT,
4428
+ IOMUX_WIDTH_4BIT,
4429
+ IOMUX_WIDTH_4BIT,
4430
+ 0,
4431
+ 0x30000, 0x30008, 0x30010, 0),
4432
+};
4433
+
4434
+static struct rockchip_pin_ctrl rv1106_pin_ctrl __maybe_unused = {
4435
+ .pin_banks = rv1106_pin_banks,
4436
+ .nr_banks = ARRAY_SIZE(rv1106_pin_banks),
4437
+ .label = "RV1106-GPIO",
4438
+ .type = RV1106,
4439
+ .pull_calc_reg = rv1106_calc_pull_reg_and_bit,
4440
+ .drv_calc_reg = rv1106_calc_drv_reg_and_bit,
4441
+ .schmitt_calc_reg = rv1106_calc_schmitt_reg_and_bit,
35974442 };
35984443
35994444 static struct rockchip_pin_bank rv1108_pin_banks[] = {
....@@ -3866,6 +4711,14 @@
38664711 .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
38674712 };
38684713
4714
+static struct rockchip_pin_bank rk3308bs_pin_banks[] __maybe_unused = {
4715
+ S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4716
+ S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4717
+ S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4718
+ S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4719
+ S_PIN_BANK_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4720
+};
4721
+
38694722 static struct rockchip_pin_bank rk3308_pin_banks[] = {
38704723 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
38714724 IOMUX_WIDTH_2BIT,
....@@ -3899,11 +4752,10 @@
38994752 .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
39004753 .iomux_routes = rk3308_mux_route_data,
39014754 .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,
39044755 .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
39054756 .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
39064757 .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
4758
+ .slew_rate_calc_reg = rk3308_calc_slew_rate_reg_and_bit,
39074759 };
39084760
39094761 static struct rockchip_pin_bank rk3328_pin_banks[] = {
....@@ -4025,6 +4877,92 @@
40254877 .drv_calc_reg = rk3399_calc_drv_reg_and_bit,
40264878 };
40274879
4880
+static struct rockchip_pin_bank rk3528_pin_banks[] = {
4881
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4882
+ IOMUX_WIDTH_4BIT,
4883
+ IOMUX_WIDTH_4BIT,
4884
+ IOMUX_WIDTH_4BIT,
4885
+ IOMUX_WIDTH_4BIT,
4886
+ 0, 0, 0, 0),
4887
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4888
+ IOMUX_WIDTH_4BIT,
4889
+ IOMUX_WIDTH_4BIT,
4890
+ IOMUX_WIDTH_4BIT,
4891
+ IOMUX_WIDTH_4BIT,
4892
+ 0x20020, 0x20028, 0x20030, 0x20038),
4893
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4894
+ IOMUX_WIDTH_4BIT,
4895
+ IOMUX_WIDTH_4BIT,
4896
+ IOMUX_WIDTH_4BIT,
4897
+ IOMUX_WIDTH_4BIT,
4898
+ 0x30040, 0, 0, 0),
4899
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4900
+ IOMUX_WIDTH_4BIT,
4901
+ IOMUX_WIDTH_4BIT,
4902
+ IOMUX_WIDTH_4BIT,
4903
+ IOMUX_WIDTH_4BIT,
4904
+ 0x20060, 0x20068, 0x20070, 0),
4905
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4",
4906
+ IOMUX_WIDTH_4BIT,
4907
+ IOMUX_WIDTH_4BIT,
4908
+ IOMUX_WIDTH_4BIT,
4909
+ IOMUX_WIDTH_4BIT,
4910
+ 0x10080, 0x10088, 0x10090, 0x10098),
4911
+};
4912
+
4913
+static struct rockchip_pin_ctrl rk3528_pin_ctrl __maybe_unused = {
4914
+ .pin_banks = rk3528_pin_banks,
4915
+ .nr_banks = ARRAY_SIZE(rk3528_pin_banks),
4916
+ .label = "RK3528-GPIO",
4917
+ .type = RK3528,
4918
+ .pull_calc_reg = rk3528_calc_pull_reg_and_bit,
4919
+ .drv_calc_reg = rk3528_calc_drv_reg_and_bit,
4920
+ .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit,
4921
+};
4922
+
4923
+static struct rockchip_pin_bank rk3562_pin_banks[] = {
4924
+ PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4925
+ IOMUX_WIDTH_4BIT,
4926
+ IOMUX_WIDTH_4BIT,
4927
+ IOMUX_WIDTH_4BIT,
4928
+ IOMUX_WIDTH_4BIT,
4929
+ 0x20000, 0x20008, 0x20010, 0x20018),
4930
+ PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4931
+ IOMUX_WIDTH_4BIT,
4932
+ IOMUX_WIDTH_4BIT,
4933
+ IOMUX_WIDTH_4BIT,
4934
+ IOMUX_WIDTH_4BIT,
4935
+ 0, 0x08, 0x10, 0x18),
4936
+ PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4937
+ IOMUX_WIDTH_4BIT,
4938
+ IOMUX_WIDTH_4BIT,
4939
+ IOMUX_WIDTH_4BIT,
4940
+ IOMUX_WIDTH_4BIT,
4941
+ 0x20, 0, 0, 0),
4942
+ PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4943
+ IOMUX_WIDTH_4BIT,
4944
+ IOMUX_WIDTH_4BIT,
4945
+ IOMUX_WIDTH_4BIT,
4946
+ IOMUX_WIDTH_4BIT,
4947
+ 0x10040, 0x10048, 0x10050, 0x10058),
4948
+ PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
4949
+ IOMUX_WIDTH_4BIT,
4950
+ IOMUX_WIDTH_4BIT,
4951
+ 0,
4952
+ 0,
4953
+ 0x10060, 0x10068, 0, 0),
4954
+};
4955
+
4956
+static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = {
4957
+ .pin_banks = rk3562_pin_banks,
4958
+ .nr_banks = ARRAY_SIZE(rk3562_pin_banks),
4959
+ .label = "RK3562-GPIO",
4960
+ .type = RK3562,
4961
+ .pull_calc_reg = rk3562_calc_pull_reg_and_bit,
4962
+ .drv_calc_reg = rk3562_calc_drv_reg_and_bit,
4963
+ .schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit,
4964
+};
4965
+
40284966 static struct rockchip_pin_bank rk3568_pin_banks[] = {
40294967 PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
40304968 IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
....@@ -4065,12 +5003,39 @@
40655003 .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
40665004 };
40675005
5006
+static struct rockchip_pin_bank rk3588_pin_banks[] = {
5007
+ RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
5008
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5009
+ RK3588_PIN_BANK_FLAGS(1, 32, "gpio1",
5010
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5011
+ RK3588_PIN_BANK_FLAGS(2, 32, "gpio2",
5012
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5013
+ RK3588_PIN_BANK_FLAGS(3, 32, "gpio3",
5014
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5015
+ RK3588_PIN_BANK_FLAGS(4, 32, "gpio4",
5016
+ IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
5017
+};
5018
+
5019
+static struct rockchip_pin_ctrl rk3588_pin_ctrl __maybe_unused = {
5020
+ .pin_banks = rk3588_pin_banks,
5021
+ .nr_banks = ARRAY_SIZE(rk3588_pin_banks),
5022
+ .label = "RK3588-GPIO",
5023
+ .type = RK3588,
5024
+ .pull_calc_reg = rk3588_calc_pull_reg_and_bit,
5025
+ .drv_calc_reg = rk3588_calc_drv_reg_and_bit,
5026
+ .schmitt_calc_reg = rk3588_calc_schmitt_reg_and_bit,
5027
+};
5028
+
40685029 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
40695030 #ifdef CONFIG_CPU_PX30
40705031 { .compatible = "rockchip,px30-pinctrl",
40715032 .data = &px30_pin_ctrl },
40725033 #endif
4073
-#ifdef CONFIG_CPU_RV110X
5034
+#ifdef CONFIG_CPU_RV1106
5035
+ { .compatible = "rockchip,rv1106-pinctrl",
5036
+ .data = &rv1106_pin_ctrl },
5037
+#endif
5038
+#ifdef CONFIG_CPU_RV1108
40745039 { .compatible = "rockchip,rv1108-pinctrl",
40755040 .data = &rv1108_pin_ctrl },
40765041 #endif
....@@ -4128,15 +5093,28 @@
41285093 { .compatible = "rockchip,rk3399-pinctrl",
41295094 .data = &rk3399_pin_ctrl },
41305095 #endif
5096
+#ifdef CONFIG_CPU_RK3528
5097
+ { .compatible = "rockchip,rk3528-pinctrl",
5098
+ .data = &rk3528_pin_ctrl },
5099
+#endif
5100
+#ifdef CONFIG_CPU_RK3562
5101
+ { .compatible = "rockchip,rk3562-pinctrl",
5102
+ .data = &rk3562_pin_ctrl },
5103
+#endif
41315104 #ifdef CONFIG_CPU_RK3568
41325105 { .compatible = "rockchip,rk3568-pinctrl",
41335106 .data = &rk3568_pin_ctrl },
5107
+#endif
5108
+#ifdef CONFIG_CPU_RK3588
5109
+ { .compatible = "rockchip,rk3588-pinctrl",
5110
+ .data = &rk3588_pin_ctrl },
41345111 #endif
41355112 {},
41365113 };
41375114
41385115 static struct platform_driver rockchip_pinctrl_driver = {
41395116 .probe = rockchip_pinctrl_probe,
5117
+ .remove = rockchip_pinctrl_remove,
41405118 .driver = {
41415119 .name = "rockchip-pinctrl",
41425120 .pm = &rockchip_pinctrl_dev_pm_ops,
....@@ -4156,6 +5134,103 @@
41565134 }
41575135 module_exit(rockchip_pinctrl_drv_unregister);
41585136
5137
+/**
5138
+ * rk_iomux_set - set the rockchip iomux by pin number.
5139
+ *
5140
+ * @bank: the gpio bank index, from 0 to the max bank num.
5141
+ * @pin: the gpio pin index, from 0 to 31.
5142
+ * @mux: the pointer to store mux value.
5143
+ *
5144
+ * Return 0 if set success, else return error code.
5145
+ */
5146
+int rk_iomux_set(int bank, int pin, int mux)
5147
+{
5148
+ struct pinctrl_dev *pctldev = g_pctldev;
5149
+ struct rockchip_pinctrl *info;
5150
+ struct rockchip_pin_bank *gpio;
5151
+ struct rockchip_pin_group *grp = NULL;
5152
+ struct rockchip_pin_config *cfg = NULL;
5153
+ int i, j, ret;
5154
+
5155
+ if (!g_pctldev)
5156
+ return -ENODEV;
5157
+
5158
+ info = pinctrl_dev_get_drvdata(pctldev);
5159
+ if (bank >= info->ctrl->nr_banks)
5160
+ return -EINVAL;
5161
+
5162
+ if (pin > 31 || pin < 0)
5163
+ return -EINVAL;
5164
+
5165
+ gpio = &info->ctrl->pin_banks[bank];
5166
+
5167
+ mutex_lock(&iomux_lock);
5168
+ for (i = 0; i < info->ngroups; i++) {
5169
+ grp = &info->groups[i];
5170
+ for (j = 0; j < grp->npins; i++) {
5171
+ if (grp->pins[i] == (gpio->pin_base + pin)) {
5172
+ cfg = grp->data;
5173
+ break;
5174
+ }
5175
+ }
5176
+ }
5177
+
5178
+ ret = rockchip_set_mux(gpio, pin, mux);
5179
+ if (ret) {
5180
+ dev_err(info->dev, "mux GPIO%d-%d %d fail\n", bank, pin, mux);
5181
+ goto out;
5182
+ }
5183
+
5184
+ if (cfg && (cfg->func != mux))
5185
+ cfg->func = mux;
5186
+
5187
+out:
5188
+ mutex_unlock(&iomux_lock);
5189
+
5190
+ return ret;
5191
+}
5192
+EXPORT_SYMBOL_GPL(rk_iomux_set);
5193
+
5194
+/**
5195
+ * rk_iomux_get - get the rockchip iomux by pin number.
5196
+ *
5197
+ * @bank: the gpio bank index, from 0 to the max bank num.
5198
+ * @pin: the gpio pin index, from 0 to 31.
5199
+ * @mux: the pointer to store mux value.
5200
+ *
5201
+ * Return 0 if get success, else return error code.
5202
+ */
5203
+int rk_iomux_get(int bank, int pin, int *mux)
5204
+{
5205
+ struct pinctrl_dev *pctldev = g_pctldev;
5206
+ struct rockchip_pinctrl *info;
5207
+ struct rockchip_pin_bank *gpio;
5208
+ int ret;
5209
+
5210
+ if (!g_pctldev)
5211
+ return -ENODEV;
5212
+ if (!mux)
5213
+ return -EINVAL;
5214
+
5215
+ info = pinctrl_dev_get_drvdata(pctldev);
5216
+ if (bank >= info->ctrl->nr_banks)
5217
+ return -EINVAL;
5218
+
5219
+ if (pin > 31 || pin < 0)
5220
+ return -EINVAL;
5221
+
5222
+ gpio = &info->ctrl->pin_banks[bank];
5223
+
5224
+ mutex_lock(&iomux_lock);
5225
+ ret = rockchip_get_mux(gpio, pin);
5226
+ mutex_unlock(&iomux_lock);
5227
+
5228
+ *mux = ret;
5229
+
5230
+ return (ret >= 0) ? 0 : ret;
5231
+}
5232
+EXPORT_SYMBOL_GPL(rk_iomux_get);
5233
+
41595234 MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
41605235 MODULE_LICENSE("GPL");
41615236 MODULE_ALIAS("platform:pinctrl-rockchip");