xref: /rk3399_rockchip-uboot/drivers/pinctrl/rockchip/pinctrl-rk3308.c (revision 72832ab67525bb179c7abc70e240a9b491c520d4)
1*72832ab6SJianqun Xu // SPDX-License-Identifier: GPL-2.0+
2*72832ab6SJianqun Xu /*
3*72832ab6SJianqun Xu  * (C) Copyright 2020 Rockchip Electronics Co., Ltd
4*72832ab6SJianqun Xu  */
5*72832ab6SJianqun Xu 
6*72832ab6SJianqun Xu #include <common.h>
7*72832ab6SJianqun Xu #include <dm.h>
8*72832ab6SJianqun Xu #include <dm/pinctrl.h>
9*72832ab6SJianqun Xu #include <regmap.h>
10*72832ab6SJianqun Xu #include <syscon.h>
11*72832ab6SJianqun Xu #include <asm/arch/cpu.h>
12*72832ab6SJianqun Xu 
13*72832ab6SJianqun Xu #include "pinctrl-rockchip.h"
14*72832ab6SJianqun Xu 
15*72832ab6SJianqun Xu static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
16*72832ab6SJianqun Xu 	{
17*72832ab6SJianqun Xu 		/* rtc_clk */
18*72832ab6SJianqun Xu 		.bank_num = 0,
19*72832ab6SJianqun Xu 		.pin = 19,
20*72832ab6SJianqun Xu 		.func = 1,
21*72832ab6SJianqun Xu 		.route_offset = 0x314,
22*72832ab6SJianqun Xu 		.route_val = BIT(16 + 0) | BIT(0),
23*72832ab6SJianqun Xu 	}, {
24*72832ab6SJianqun Xu 		/* uart2_rxm0 */
25*72832ab6SJianqun Xu 		.bank_num = 1,
26*72832ab6SJianqun Xu 		.pin = 22,
27*72832ab6SJianqun Xu 		.func = 2,
28*72832ab6SJianqun Xu 		.route_offset = 0x314,
29*72832ab6SJianqun Xu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
30*72832ab6SJianqun Xu 	}, {
31*72832ab6SJianqun Xu 		/* uart2_rxm1 */
32*72832ab6SJianqun Xu 		.bank_num = 4,
33*72832ab6SJianqun Xu 		.pin = 26,
34*72832ab6SJianqun Xu 		.func = 2,
35*72832ab6SJianqun Xu 		.route_offset = 0x314,
36*72832ab6SJianqun Xu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
37*72832ab6SJianqun Xu 	}, {
38*72832ab6SJianqun Xu 		/* i2c3_sdam0 */
39*72832ab6SJianqun Xu 		.bank_num = 0,
40*72832ab6SJianqun Xu 		.pin = 23,
41*72832ab6SJianqun Xu 		.func = 2,
42*72832ab6SJianqun Xu 		.route_offset = 0x314,
43*72832ab6SJianqun Xu 		.route_val = BIT(16 + 4),
44*72832ab6SJianqun Xu 	}, {
45*72832ab6SJianqun Xu 		/* i2c3_sdam1 */
46*72832ab6SJianqun Xu 		.bank_num = 3,
47*72832ab6SJianqun Xu 		.pin = 12,
48*72832ab6SJianqun Xu 		.func = 2,
49*72832ab6SJianqun Xu 		.route_offset = 0x314,
50*72832ab6SJianqun Xu 		.route_val = BIT(16 + 4) | BIT(4),
51*72832ab6SJianqun Xu 	}, {
52*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclktxm0 */
53*72832ab6SJianqun Xu 		.bank_num = 1,
54*72832ab6SJianqun Xu 		.pin = 3,
55*72832ab6SJianqun Xu 		.func = 2,
56*72832ab6SJianqun Xu 		.route_offset = 0x308,
57*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3),
58*72832ab6SJianqun Xu 	}, {
59*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclkrxm0 */
60*72832ab6SJianqun Xu 		.bank_num = 1,
61*72832ab6SJianqun Xu 		.pin = 4,
62*72832ab6SJianqun Xu 		.func = 2,
63*72832ab6SJianqun Xu 		.route_offset = 0x308,
64*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3),
65*72832ab6SJianqun Xu 	}, {
66*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclktxm1 */
67*72832ab6SJianqun Xu 		.bank_num = 1,
68*72832ab6SJianqun Xu 		.pin = 13,
69*72832ab6SJianqun Xu 		.func = 2,
70*72832ab6SJianqun Xu 		.route_offset = 0x308,
71*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
72*72832ab6SJianqun Xu 	}, {
73*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclkrxm1 */
74*72832ab6SJianqun Xu 		.bank_num = 1,
75*72832ab6SJianqun Xu 		.pin = 14,
76*72832ab6SJianqun Xu 		.func = 2,
77*72832ab6SJianqun Xu 		.route_offset = 0x308,
78*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
79*72832ab6SJianqun Xu 	}, {
80*72832ab6SJianqun Xu 		/* pdm-clkm0 */
81*72832ab6SJianqun Xu 		.bank_num = 1,
82*72832ab6SJianqun Xu 		.pin = 4,
83*72832ab6SJianqun Xu 		.func = 3,
84*72832ab6SJianqun Xu 		.route_offset = 0x308,
85*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
86*72832ab6SJianqun Xu 	}, {
87*72832ab6SJianqun Xu 		/* pdm-clkm1 */
88*72832ab6SJianqun Xu 		.bank_num = 1,
89*72832ab6SJianqun Xu 		.pin = 14,
90*72832ab6SJianqun Xu 		.func = 4,
91*72832ab6SJianqun Xu 		.route_offset = 0x308,
92*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
93*72832ab6SJianqun Xu 	}, {
94*72832ab6SJianqun Xu 		/* pdm-clkm2 */
95*72832ab6SJianqun Xu 		.bank_num = 2,
96*72832ab6SJianqun Xu 		.pin = 6,
97*72832ab6SJianqun Xu 		.func = 2,
98*72832ab6SJianqun Xu 		.route_offset = 0x308,
99*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
100*72832ab6SJianqun Xu 	}, {
101*72832ab6SJianqun Xu 		/* pdm-clkm-m2 */
102*72832ab6SJianqun Xu 		.bank_num = 2,
103*72832ab6SJianqun Xu 		.pin = 4,
104*72832ab6SJianqun Xu 		.func = 3,
105*72832ab6SJianqun Xu 		.route_offset = 0x600,
106*72832ab6SJianqun Xu 		.route_val = BIT(16 + 2) | BIT(2),
107*72832ab6SJianqun Xu 	},
108*72832ab6SJianqun Xu };
109*72832ab6SJianqun Xu 
110*72832ab6SJianqun Xu static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
111*72832ab6SJianqun Xu 	{
112*72832ab6SJianqun Xu 		/* rtc_clk */
113*72832ab6SJianqun Xu 		.bank_num = 0,
114*72832ab6SJianqun Xu 		.pin = 19,
115*72832ab6SJianqun Xu 		.func = 1,
116*72832ab6SJianqun Xu 		.route_offset = 0x314,
117*72832ab6SJianqun Xu 		.route_val = BIT(16 + 0) | BIT(0),
118*72832ab6SJianqun Xu 	}, {
119*72832ab6SJianqun Xu 		/* uart2_rxm0 */
120*72832ab6SJianqun Xu 		.bank_num = 1,
121*72832ab6SJianqun Xu 		.pin = 22,
122*72832ab6SJianqun Xu 		.func = 2,
123*72832ab6SJianqun Xu 		.route_offset = 0x314,
124*72832ab6SJianqun Xu 		.route_val = BIT(16 + 2) | BIT(16 + 3),
125*72832ab6SJianqun Xu 	}, {
126*72832ab6SJianqun Xu 		/* uart2_rxm1 */
127*72832ab6SJianqun Xu 		.bank_num = 4,
128*72832ab6SJianqun Xu 		.pin = 26,
129*72832ab6SJianqun Xu 		.func = 2,
130*72832ab6SJianqun Xu 		.route_offset = 0x314,
131*72832ab6SJianqun Xu 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
132*72832ab6SJianqun Xu 	}, {
133*72832ab6SJianqun Xu 		/* i2c3_sdam0 */
134*72832ab6SJianqun Xu 		.bank_num = 0,
135*72832ab6SJianqun Xu 		.pin = 15,
136*72832ab6SJianqun Xu 		.func = 2,
137*72832ab6SJianqun Xu 		.route_offset = 0x608,
138*72832ab6SJianqun Xu 		.route_val = BIT(16 + 8) | BIT(16 + 9),
139*72832ab6SJianqun Xu 	}, {
140*72832ab6SJianqun Xu 		/* i2c3_sdam1 */
141*72832ab6SJianqun Xu 		.bank_num = 3,
142*72832ab6SJianqun Xu 		.pin = 12,
143*72832ab6SJianqun Xu 		.func = 2,
144*72832ab6SJianqun Xu 		.route_offset = 0x608,
145*72832ab6SJianqun Xu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
146*72832ab6SJianqun Xu 	}, {
147*72832ab6SJianqun Xu 		/* i2c3_sdam2 */
148*72832ab6SJianqun Xu 		.bank_num = 2,
149*72832ab6SJianqun Xu 		.pin = 0,
150*72832ab6SJianqun Xu 		.func = 3,
151*72832ab6SJianqun Xu 		.route_offset = 0x608,
152*72832ab6SJianqun Xu 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
153*72832ab6SJianqun Xu 	}, {
154*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclktxm0 */
155*72832ab6SJianqun Xu 		.bank_num = 1,
156*72832ab6SJianqun Xu 		.pin = 3,
157*72832ab6SJianqun Xu 		.func = 2,
158*72832ab6SJianqun Xu 		.route_offset = 0x308,
159*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3),
160*72832ab6SJianqun Xu 	}, {
161*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclkrxm0 */
162*72832ab6SJianqun Xu 		.bank_num = 1,
163*72832ab6SJianqun Xu 		.pin = 4,
164*72832ab6SJianqun Xu 		.func = 2,
165*72832ab6SJianqun Xu 		.route_offset = 0x308,
166*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3),
167*72832ab6SJianqun Xu 	}, {
168*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclktxm1 */
169*72832ab6SJianqun Xu 		.bank_num = 1,
170*72832ab6SJianqun Xu 		.pin = 13,
171*72832ab6SJianqun Xu 		.func = 2,
172*72832ab6SJianqun Xu 		.route_offset = 0x308,
173*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
174*72832ab6SJianqun Xu 	}, {
175*72832ab6SJianqun Xu 		/* i2s-8ch-1-sclkrxm1 */
176*72832ab6SJianqun Xu 		.bank_num = 1,
177*72832ab6SJianqun Xu 		.pin = 14,
178*72832ab6SJianqun Xu 		.func = 2,
179*72832ab6SJianqun Xu 		.route_offset = 0x308,
180*72832ab6SJianqun Xu 		.route_val = BIT(16 + 3) | BIT(3),
181*72832ab6SJianqun Xu 	}, {
182*72832ab6SJianqun Xu 		/* pdm-clkm0 */
183*72832ab6SJianqun Xu 		.bank_num = 1,
184*72832ab6SJianqun Xu 		.pin = 4,
185*72832ab6SJianqun Xu 		.func = 3,
186*72832ab6SJianqun Xu 		.route_offset = 0x308,
187*72832ab6SJianqun Xu 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
188*72832ab6SJianqun Xu 	}, {
189*72832ab6SJianqun Xu 		/* pdm-clkm1 */
190*72832ab6SJianqun Xu 		.bank_num = 1,
191*72832ab6SJianqun Xu 		.pin = 14,
192*72832ab6SJianqun Xu 		.func = 4,
193*72832ab6SJianqun Xu 		.route_offset = 0x308,
194*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
195*72832ab6SJianqun Xu 	}, {
196*72832ab6SJianqun Xu 		/* pdm-clkm2 */
197*72832ab6SJianqun Xu 		.bank_num = 2,
198*72832ab6SJianqun Xu 		.pin = 6,
199*72832ab6SJianqun Xu 		.func = 2,
200*72832ab6SJianqun Xu 		.route_offset = 0x308,
201*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
202*72832ab6SJianqun Xu 	}, {
203*72832ab6SJianqun Xu 		/* pdm-clkm-m2 */
204*72832ab6SJianqun Xu 		.bank_num = 2,
205*72832ab6SJianqun Xu 		.pin = 4,
206*72832ab6SJianqun Xu 		.func = 3,
207*72832ab6SJianqun Xu 		.route_offset = 0x600,
208*72832ab6SJianqun Xu 		.route_val = BIT(16 + 2) | BIT(2),
209*72832ab6SJianqun Xu 	}, {
210*72832ab6SJianqun Xu 		/* spi1_miso */
211*72832ab6SJianqun Xu 		.bank_num = 3,
212*72832ab6SJianqun Xu 		.pin = 10,
213*72832ab6SJianqun Xu 		.func = 3,
214*72832ab6SJianqun Xu 		.route_offset = 0x314,
215*72832ab6SJianqun Xu 		.route_val = BIT(16 + 9),
216*72832ab6SJianqun Xu 	}, {
217*72832ab6SJianqun Xu 		/* spi1_miso_m1 */
218*72832ab6SJianqun Xu 		.bank_num = 2,
219*72832ab6SJianqun Xu 		.pin = 4,
220*72832ab6SJianqun Xu 		.func = 2,
221*72832ab6SJianqun Xu 		.route_offset = 0x314,
222*72832ab6SJianqun Xu 		.route_val = BIT(16 + 9) | BIT(9),
223*72832ab6SJianqun Xu 	}, {
224*72832ab6SJianqun Xu 		/* owire_m0 */
225*72832ab6SJianqun Xu 		.bank_num = 0,
226*72832ab6SJianqun Xu 		.pin = 11,
227*72832ab6SJianqun Xu 		.func = 3,
228*72832ab6SJianqun Xu 		.route_offset = 0x314,
229*72832ab6SJianqun Xu 		.route_val = BIT(16 + 10) | BIT(16 + 11),
230*72832ab6SJianqun Xu 	}, {
231*72832ab6SJianqun Xu 		/* owire_m1 */
232*72832ab6SJianqun Xu 		.bank_num = 1,
233*72832ab6SJianqun Xu 		.pin = 22,
234*72832ab6SJianqun Xu 		.func = 7,
235*72832ab6SJianqun Xu 		.route_offset = 0x314,
236*72832ab6SJianqun Xu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
237*72832ab6SJianqun Xu 	}, {
238*72832ab6SJianqun Xu 		/* owire_m2 */
239*72832ab6SJianqun Xu 		.bank_num = 2,
240*72832ab6SJianqun Xu 		.pin = 2,
241*72832ab6SJianqun Xu 		.func = 5,
242*72832ab6SJianqun Xu 		.route_offset = 0x314,
243*72832ab6SJianqun Xu 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
244*72832ab6SJianqun Xu 	}, {
245*72832ab6SJianqun Xu 		/* can_rxd_m0 */
246*72832ab6SJianqun Xu 		.bank_num = 0,
247*72832ab6SJianqun Xu 		.pin = 11,
248*72832ab6SJianqun Xu 		.func = 2,
249*72832ab6SJianqun Xu 		.route_offset = 0x314,
250*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13),
251*72832ab6SJianqun Xu 	}, {
252*72832ab6SJianqun Xu 		/* can_rxd_m1 */
253*72832ab6SJianqun Xu 		.bank_num = 1,
254*72832ab6SJianqun Xu 		.pin = 22,
255*72832ab6SJianqun Xu 		.func = 5,
256*72832ab6SJianqun Xu 		.route_offset = 0x314,
257*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
258*72832ab6SJianqun Xu 	}, {
259*72832ab6SJianqun Xu 		/* can_rxd_m2 */
260*72832ab6SJianqun Xu 		.bank_num = 2,
261*72832ab6SJianqun Xu 		.pin = 2,
262*72832ab6SJianqun Xu 		.func = 4,
263*72832ab6SJianqun Xu 		.route_offset = 0x314,
264*72832ab6SJianqun Xu 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
265*72832ab6SJianqun Xu 	}, {
266*72832ab6SJianqun Xu 		/* mac_rxd0_m0 */
267*72832ab6SJianqun Xu 		.bank_num = 1,
268*72832ab6SJianqun Xu 		.pin = 20,
269*72832ab6SJianqun Xu 		.func = 3,
270*72832ab6SJianqun Xu 		.route_offset = 0x314,
271*72832ab6SJianqun Xu 		.route_val = BIT(16 + 14),
272*72832ab6SJianqun Xu 	}, {
273*72832ab6SJianqun Xu 		/* mac_rxd0_m1 */
274*72832ab6SJianqun Xu 		.bank_num = 4,
275*72832ab6SJianqun Xu 		.pin = 2,
276*72832ab6SJianqun Xu 		.func = 2,
277*72832ab6SJianqun Xu 		.route_offset = 0x314,
278*72832ab6SJianqun Xu 		.route_val = BIT(16 + 14) | BIT(14),
279*72832ab6SJianqun Xu 	}, {
280*72832ab6SJianqun Xu 		/* uart3_rx */
281*72832ab6SJianqun Xu 		.bank_num = 3,
282*72832ab6SJianqun Xu 		.pin = 12,
283*72832ab6SJianqun Xu 		.func = 4,
284*72832ab6SJianqun Xu 		.route_offset = 0x314,
285*72832ab6SJianqun Xu 		.route_val = BIT(16 + 15),
286*72832ab6SJianqun Xu 	}, {
287*72832ab6SJianqun Xu 		/* uart3_rx_m1 */
288*72832ab6SJianqun Xu 		.bank_num = 0,
289*72832ab6SJianqun Xu 		.pin = 17,
290*72832ab6SJianqun Xu 		.func = 3,
291*72832ab6SJianqun Xu 		.route_offset = 0x314,
292*72832ab6SJianqun Xu 		.route_val = BIT(16 + 15) | BIT(15),
293*72832ab6SJianqun Xu 	},
294*72832ab6SJianqun Xu };
295*72832ab6SJianqun Xu static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
296*72832ab6SJianqun Xu 	{
297*72832ab6SJianqun Xu 		.num = 1,
298*72832ab6SJianqun Xu 		.pin = 14,
299*72832ab6SJianqun Xu 		.reg = 0x28,
300*72832ab6SJianqun Xu 		.bit = 12,
301*72832ab6SJianqun Xu 		.mask = 0x7
302*72832ab6SJianqun Xu 	}, {
303*72832ab6SJianqun Xu 		.num = 1,
304*72832ab6SJianqun Xu 		.pin = 15,
305*72832ab6SJianqun Xu 		.reg = 0x2c,
306*72832ab6SJianqun Xu 		.bit = 0,
307*72832ab6SJianqun Xu 		.mask = 0x3
308*72832ab6SJianqun Xu 	}, {
309*72832ab6SJianqun Xu 		.num = 1,
310*72832ab6SJianqun Xu 		.pin = 18,
311*72832ab6SJianqun Xu 		.reg = 0x30,
312*72832ab6SJianqun Xu 		.bit = 4,
313*72832ab6SJianqun Xu 		.mask = 0x7
314*72832ab6SJianqun Xu 	}, {
315*72832ab6SJianqun Xu 		.num = 1,
316*72832ab6SJianqun Xu 		.pin = 19,
317*72832ab6SJianqun Xu 		.reg = 0x30,
318*72832ab6SJianqun Xu 		.bit = 8,
319*72832ab6SJianqun Xu 		.mask = 0x7
320*72832ab6SJianqun Xu 	}, {
321*72832ab6SJianqun Xu 		.num = 1,
322*72832ab6SJianqun Xu 		.pin = 20,
323*72832ab6SJianqun Xu 		.reg = 0x30,
324*72832ab6SJianqun Xu 		.bit = 12,
325*72832ab6SJianqun Xu 		.mask = 0x7
326*72832ab6SJianqun Xu 	}, {
327*72832ab6SJianqun Xu 		.num = 1,
328*72832ab6SJianqun Xu 		.pin = 21,
329*72832ab6SJianqun Xu 		.reg = 0x34,
330*72832ab6SJianqun Xu 		.bit = 0,
331*72832ab6SJianqun Xu 		.mask = 0x7
332*72832ab6SJianqun Xu 	}, {
333*72832ab6SJianqun Xu 		.num = 1,
334*72832ab6SJianqun Xu 		.pin = 22,
335*72832ab6SJianqun Xu 		.reg = 0x34,
336*72832ab6SJianqun Xu 		.bit = 4,
337*72832ab6SJianqun Xu 		.mask = 0x7
338*72832ab6SJianqun Xu 	}, {
339*72832ab6SJianqun Xu 		.num = 1,
340*72832ab6SJianqun Xu 		.pin = 23,
341*72832ab6SJianqun Xu 		.reg = 0x34,
342*72832ab6SJianqun Xu 		.bit = 8,
343*72832ab6SJianqun Xu 		.mask = 0x7
344*72832ab6SJianqun Xu 	}, {
345*72832ab6SJianqun Xu 		.num = 3,
346*72832ab6SJianqun Xu 		.pin = 12,
347*72832ab6SJianqun Xu 		.reg = 0x68,
348*72832ab6SJianqun Xu 		.bit = 8,
349*72832ab6SJianqun Xu 		.mask = 0x7
350*72832ab6SJianqun Xu 	}, {
351*72832ab6SJianqun Xu 		.num = 3,
352*72832ab6SJianqun Xu 		.pin = 13,
353*72832ab6SJianqun Xu 		.reg = 0x68,
354*72832ab6SJianqun Xu 		.bit = 12,
355*72832ab6SJianqun Xu 		.mask = 0x7
356*72832ab6SJianqun Xu 	},
357*72832ab6SJianqun Xu };
358*72832ab6SJianqun Xu 
359*72832ab6SJianqun Xu static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
360*72832ab6SJianqun Xu 	{
361*72832ab6SJianqun Xu 		.num = 1,
362*72832ab6SJianqun Xu 		.pin = 14,
363*72832ab6SJianqun Xu 		.reg = 0x28,
364*72832ab6SJianqun Xu 		.bit = 12,
365*72832ab6SJianqun Xu 		.mask = 0xf
366*72832ab6SJianqun Xu 	}, {
367*72832ab6SJianqun Xu 		.num = 1,
368*72832ab6SJianqun Xu 		.pin = 15,
369*72832ab6SJianqun Xu 		.reg = 0x2c,
370*72832ab6SJianqun Xu 		.bit = 0,
371*72832ab6SJianqun Xu 		.mask = 0x3
372*72832ab6SJianqun Xu 	}, {
373*72832ab6SJianqun Xu 		.num = 1,
374*72832ab6SJianqun Xu 		.pin = 18,
375*72832ab6SJianqun Xu 		.reg = 0x30,
376*72832ab6SJianqun Xu 		.bit = 4,
377*72832ab6SJianqun Xu 		.mask = 0xf
378*72832ab6SJianqun Xu 	}, {
379*72832ab6SJianqun Xu 		.num = 1,
380*72832ab6SJianqun Xu 		.pin = 19,
381*72832ab6SJianqun Xu 		.reg = 0x30,
382*72832ab6SJianqun Xu 		.bit = 8,
383*72832ab6SJianqun Xu 		.mask = 0xf
384*72832ab6SJianqun Xu 	}, {
385*72832ab6SJianqun Xu 		.num = 1,
386*72832ab6SJianqun Xu 		.pin = 20,
387*72832ab6SJianqun Xu 		.reg = 0x30,
388*72832ab6SJianqun Xu 		.bit = 12,
389*72832ab6SJianqun Xu 		.mask = 0xf
390*72832ab6SJianqun Xu 	}, {
391*72832ab6SJianqun Xu 		.num = 1,
392*72832ab6SJianqun Xu 		.pin = 21,
393*72832ab6SJianqun Xu 		.reg = 0x34,
394*72832ab6SJianqun Xu 		.bit = 0,
395*72832ab6SJianqun Xu 		.mask = 0xf
396*72832ab6SJianqun Xu 	}, {
397*72832ab6SJianqun Xu 		.num = 1,
398*72832ab6SJianqun Xu 		.pin = 22,
399*72832ab6SJianqun Xu 		.reg = 0x34,
400*72832ab6SJianqun Xu 		.bit = 4,
401*72832ab6SJianqun Xu 		.mask = 0xf
402*72832ab6SJianqun Xu 	}, {
403*72832ab6SJianqun Xu 		.num = 1,
404*72832ab6SJianqun Xu 		.pin = 23,
405*72832ab6SJianqun Xu 		.reg = 0x34,
406*72832ab6SJianqun Xu 		.bit = 8,
407*72832ab6SJianqun Xu 		.mask = 0xf
408*72832ab6SJianqun Xu 	}, {
409*72832ab6SJianqun Xu 		.num = 3,
410*72832ab6SJianqun Xu 		.pin = 12,
411*72832ab6SJianqun Xu 		.reg = 0x68,
412*72832ab6SJianqun Xu 		.bit = 8,
413*72832ab6SJianqun Xu 		.mask = 0xf
414*72832ab6SJianqun Xu 	}, {
415*72832ab6SJianqun Xu 		.num = 3,
416*72832ab6SJianqun Xu 		.pin = 13,
417*72832ab6SJianqun Xu 		.reg = 0x68,
418*72832ab6SJianqun Xu 		.bit = 12,
419*72832ab6SJianqun Xu 		.mask = 0xf
420*72832ab6SJianqun Xu 	}, {
421*72832ab6SJianqun Xu 		.num = 2,
422*72832ab6SJianqun Xu 		.pin = 2,
423*72832ab6SJianqun Xu 		.reg = 0x608,
424*72832ab6SJianqun Xu 		.bit = 0,
425*72832ab6SJianqun Xu 		.mask = 0x7
426*72832ab6SJianqun Xu 	}, {
427*72832ab6SJianqun Xu 		.num = 2,
428*72832ab6SJianqun Xu 		.pin = 3,
429*72832ab6SJianqun Xu 		.reg = 0x608,
430*72832ab6SJianqun Xu 		.bit = 4,
431*72832ab6SJianqun Xu 		.mask = 0x7
432*72832ab6SJianqun Xu 	}, {
433*72832ab6SJianqun Xu 		.num = 2,
434*72832ab6SJianqun Xu 		.pin = 16,
435*72832ab6SJianqun Xu 		.reg = 0x610,
436*72832ab6SJianqun Xu 		.bit = 8,
437*72832ab6SJianqun Xu 		.mask = 0x7
438*72832ab6SJianqun Xu 	}, {
439*72832ab6SJianqun Xu 		.num = 3,
440*72832ab6SJianqun Xu 		.pin = 10,
441*72832ab6SJianqun Xu 		.reg = 0x610,
442*72832ab6SJianqun Xu 		.bit = 0,
443*72832ab6SJianqun Xu 		.mask = 0x7
444*72832ab6SJianqun Xu 	}, {
445*72832ab6SJianqun Xu 		.num = 3,
446*72832ab6SJianqun Xu 		.pin = 11,
447*72832ab6SJianqun Xu 		.reg = 0x610,
448*72832ab6SJianqun Xu 		.bit = 4,
449*72832ab6SJianqun Xu 		.mask = 0x7
450*72832ab6SJianqun Xu 	},
451*72832ab6SJianqun Xu };
452*72832ab6SJianqun Xu 
rk3308_set_mux(struct rockchip_pin_bank * bank,int pin,int mux)453*72832ab6SJianqun Xu static int rk3308_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
454*72832ab6SJianqun Xu {
455*72832ab6SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
456*72832ab6SJianqun Xu 	int iomux_num = (pin / 8);
457*72832ab6SJianqun Xu 	struct regmap *regmap;
458*72832ab6SJianqun Xu 	int reg, ret, mask, mux_type;
459*72832ab6SJianqun Xu 	u8 bit;
460*72832ab6SJianqun Xu 	u32 data;
461*72832ab6SJianqun Xu 
462*72832ab6SJianqun Xu 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
463*72832ab6SJianqun Xu 
464*72832ab6SJianqun Xu 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
465*72832ab6SJianqun Xu 		regmap = priv->regmap_pmu;
466*72832ab6SJianqun Xu 	else
467*72832ab6SJianqun Xu 		regmap = priv->regmap_base;
468*72832ab6SJianqun Xu 
469*72832ab6SJianqun Xu 	/* get basic quadrupel of mux registers and the correct reg inside */
470*72832ab6SJianqun Xu 	mux_type = bank->iomux[iomux_num].type;
471*72832ab6SJianqun Xu 	reg = bank->iomux[iomux_num].offset;
472*72832ab6SJianqun Xu 	if (mux_type & IOMUX_WIDTH_4BIT) {
473*72832ab6SJianqun Xu 		if ((pin % 8) >= 4)
474*72832ab6SJianqun Xu 			reg += 0x4;
475*72832ab6SJianqun Xu 		bit = (pin % 4) * 4;
476*72832ab6SJianqun Xu 		mask = 0xf;
477*72832ab6SJianqun Xu 	} else {
478*72832ab6SJianqun Xu 		bit = (pin % 8) * 2;
479*72832ab6SJianqun Xu 		mask = 0x3;
480*72832ab6SJianqun Xu 	}
481*72832ab6SJianqun Xu 
482*72832ab6SJianqun Xu 	if (bank->recalced_mask & BIT(pin))
483*72832ab6SJianqun Xu 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
484*72832ab6SJianqun Xu 
485*72832ab6SJianqun Xu 	data = (mask << (bit + 16));
486*72832ab6SJianqun Xu 	data |= (mux & mask) << bit;
487*72832ab6SJianqun Xu 	ret = regmap_write(regmap, reg, data);
488*72832ab6SJianqun Xu 
489*72832ab6SJianqun Xu 	return ret;
490*72832ab6SJianqun Xu }
491*72832ab6SJianqun Xu 
492*72832ab6SJianqun Xu #define RK3308_PULL_OFFSET		0xa0
493*72832ab6SJianqun Xu #define RK3308_PULL_BITS_PER_PIN	2
494*72832ab6SJianqun Xu #define RK3308_PULL_PINS_PER_REG	8
495*72832ab6SJianqun Xu #define RK3308_PULL_BANK_STRIDE		16
496*72832ab6SJianqun Xu 
rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)497*72832ab6SJianqun Xu static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
498*72832ab6SJianqun Xu 					 int pin_num, struct regmap **regmap,
499*72832ab6SJianqun Xu 					 int *reg, u8 *bit)
500*72832ab6SJianqun Xu {
501*72832ab6SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
502*72832ab6SJianqun Xu 
503*72832ab6SJianqun Xu 	*regmap = priv->regmap_base;
504*72832ab6SJianqun Xu 	*reg = RK3308_PULL_OFFSET;
505*72832ab6SJianqun Xu 	*reg += bank->bank_num * RK3308_PULL_BANK_STRIDE;
506*72832ab6SJianqun Xu 	*reg += ((pin_num / RK3308_PULL_PINS_PER_REG) * 4);
507*72832ab6SJianqun Xu 
508*72832ab6SJianqun Xu 	*bit = (pin_num % RK3308_PULL_PINS_PER_REG);
509*72832ab6SJianqun Xu 	*bit *= RK3308_PULL_BITS_PER_PIN;
510*72832ab6SJianqun Xu }
511*72832ab6SJianqun Xu 
512*72832ab6SJianqun Xu #define RK3308_DRV_GRF_OFFSET		0x100
513*72832ab6SJianqun Xu #define RK3308_DRV_BITS_PER_PIN		2
514*72832ab6SJianqun Xu #define RK3308_DRV_PINS_PER_REG		8
515*72832ab6SJianqun Xu #define RK3308_DRV_BANK_STRIDE		16
516*72832ab6SJianqun Xu 
rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)517*72832ab6SJianqun Xu static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
518*72832ab6SJianqun Xu 					int pin_num, struct regmap **regmap,
519*72832ab6SJianqun Xu 					int *reg, u8 *bit)
520*72832ab6SJianqun Xu {
521*72832ab6SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
522*72832ab6SJianqun Xu 
523*72832ab6SJianqun Xu 	*regmap = priv->regmap_base;
524*72832ab6SJianqun Xu 	*reg = RK3308_DRV_GRF_OFFSET;
525*72832ab6SJianqun Xu 	*reg += bank->bank_num * RK3308_DRV_BANK_STRIDE;
526*72832ab6SJianqun Xu 	*reg += ((pin_num / RK3308_DRV_PINS_PER_REG) * 4);
527*72832ab6SJianqun Xu 
528*72832ab6SJianqun Xu 	*bit = (pin_num % RK3308_DRV_PINS_PER_REG);
529*72832ab6SJianqun Xu 	*bit *= RK3308_DRV_BITS_PER_PIN;
530*72832ab6SJianqun Xu }
531*72832ab6SJianqun Xu 
532*72832ab6SJianqun Xu #define RK3308_SCHMITT_PINS_PER_REG	8
533*72832ab6SJianqun Xu #define RK3308_SCHMITT_BANK_STRIDE	16
534*72832ab6SJianqun Xu #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
535*72832ab6SJianqun Xu 
rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)536*72832ab6SJianqun Xu static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
537*72832ab6SJianqun Xu 					   int pin_num,
538*72832ab6SJianqun Xu 					   struct regmap **regmap,
539*72832ab6SJianqun Xu 					   int *reg, u8 *bit)
540*72832ab6SJianqun Xu {
541*72832ab6SJianqun Xu 	struct rockchip_pinctrl_priv *priv = bank->priv;
542*72832ab6SJianqun Xu 
543*72832ab6SJianqun Xu 	*regmap = priv->regmap_base;
544*72832ab6SJianqun Xu 	*reg = RK3308_SCHMITT_GRF_OFFSET;
545*72832ab6SJianqun Xu 
546*72832ab6SJianqun Xu 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
547*72832ab6SJianqun Xu 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
548*72832ab6SJianqun Xu 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
549*72832ab6SJianqun Xu 
550*72832ab6SJianqun Xu 	return 0;
551*72832ab6SJianqun Xu }
552*72832ab6SJianqun Xu 
rk3308_set_pull(struct rockchip_pin_bank * bank,int pin_num,int pull)553*72832ab6SJianqun Xu static int rk3308_set_pull(struct rockchip_pin_bank *bank,
554*72832ab6SJianqun Xu 			   int pin_num, int pull)
555*72832ab6SJianqun Xu {
556*72832ab6SJianqun Xu 	struct regmap *regmap;
557*72832ab6SJianqun Xu 	int reg, ret;
558*72832ab6SJianqun Xu 	u8 bit, type;
559*72832ab6SJianqun Xu 	u32 data;
560*72832ab6SJianqun Xu 
561*72832ab6SJianqun Xu 	if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
562*72832ab6SJianqun Xu 		return -ENOTSUPP;
563*72832ab6SJianqun Xu 
564*72832ab6SJianqun Xu 	rk3308_calc_pull_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
565*72832ab6SJianqun Xu 	type = bank->pull_type[pin_num / 8];
566*72832ab6SJianqun Xu 	ret = rockchip_translate_pull_value(type, pull);
567*72832ab6SJianqun Xu 	if (ret < 0) {
568*72832ab6SJianqun Xu 		debug("unsupported pull setting %d\n", pull);
569*72832ab6SJianqun Xu 		return ret;
570*72832ab6SJianqun Xu 	}
571*72832ab6SJianqun Xu 
572*72832ab6SJianqun Xu 	/* enable the write to the equivalent lower bits */
573*72832ab6SJianqun Xu 	data = ((1 << ROCKCHIP_PULL_BITS_PER_PIN) - 1) << (bit + 16);
574*72832ab6SJianqun Xu 
575*72832ab6SJianqun Xu 	data |= (ret << bit);
576*72832ab6SJianqun Xu 	ret = regmap_write(regmap, reg, data);
577*72832ab6SJianqun Xu 
578*72832ab6SJianqun Xu 	return ret;
579*72832ab6SJianqun Xu }
580*72832ab6SJianqun Xu 
rk3308_set_drive(struct rockchip_pin_bank * bank,int pin_num,int strength)581*72832ab6SJianqun Xu static int rk3308_set_drive(struct rockchip_pin_bank *bank,
582*72832ab6SJianqun Xu 			    int pin_num, int strength)
583*72832ab6SJianqun Xu {
584*72832ab6SJianqun Xu 	struct regmap *regmap;
585*72832ab6SJianqun Xu 	int reg;
586*72832ab6SJianqun Xu 	u32 data;
587*72832ab6SJianqun Xu 	u8 bit;
588*72832ab6SJianqun Xu 
589*72832ab6SJianqun Xu 	rk3308_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
590*72832ab6SJianqun Xu 
591*72832ab6SJianqun Xu 	/* enable the write to the equivalent lower bits */
592*72832ab6SJianqun Xu 	data = ((1 << ROCKCHIP_DRV_BITS_PER_PIN) - 1) << (bit + 16);
593*72832ab6SJianqun Xu 	data |= (strength << bit);
594*72832ab6SJianqun Xu 
595*72832ab6SJianqun Xu 	return regmap_write(regmap, reg, data);
596*72832ab6SJianqun Xu }
597*72832ab6SJianqun Xu 
rk3308_set_schmitt(struct rockchip_pin_bank * bank,int pin_num,int enable)598*72832ab6SJianqun Xu static int rk3308_set_schmitt(struct rockchip_pin_bank *bank,
599*72832ab6SJianqun Xu 			      int pin_num, int enable)
600*72832ab6SJianqun Xu {
601*72832ab6SJianqun Xu 	struct regmap *regmap;
602*72832ab6SJianqun Xu 	int reg;
603*72832ab6SJianqun Xu 	u8 bit;
604*72832ab6SJianqun Xu 	u32 data;
605*72832ab6SJianqun Xu 
606*72832ab6SJianqun Xu 	rk3308_calc_schmitt_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
607*72832ab6SJianqun Xu 	/* enable the write to the equivalent lower bits */
608*72832ab6SJianqun Xu 	data = BIT(bit + 16) | (enable << bit);
609*72832ab6SJianqun Xu 
610*72832ab6SJianqun Xu 	return regmap_write(regmap, reg, data);
611*72832ab6SJianqun Xu }
612*72832ab6SJianqun Xu 
613*72832ab6SJianqun Xu static struct rockchip_pin_bank rk3308_pin_banks[] = {
614*72832ab6SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
615*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
616*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
617*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT),
618*72832ab6SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
619*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
620*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
621*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT),
622*72832ab6SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
623*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
624*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
625*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT),
626*72832ab6SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
627*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
628*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
629*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT),
630*72832ab6SJianqun Xu 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
631*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
632*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT,
633*72832ab6SJianqun Xu 					     IOMUX_8WIDTH_2BIT),
634*72832ab6SJianqun Xu };
635*72832ab6SJianqun Xu 
636*72832ab6SJianqun Xu static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
637*72832ab6SJianqun Xu 	.pin_banks		= rk3308_pin_banks,
638*72832ab6SJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
639*72832ab6SJianqun Xu 	.nr_pins		= 160,
640*72832ab6SJianqun Xu 	.grf_mux_offset		= 0x0,
641*72832ab6SJianqun Xu 	.iomux_recalced		= rk3308_mux_recalced_data,
642*72832ab6SJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
643*72832ab6SJianqun Xu 	.iomux_routes		= rk3308_mux_route_data,
644*72832ab6SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
645*72832ab6SJianqun Xu 	.set_mux		= rk3308_set_mux,
646*72832ab6SJianqun Xu 	.set_pull		= rk3308_set_pull,
647*72832ab6SJianqun Xu 	.set_drive		= rk3308_set_drive,
648*72832ab6SJianqun Xu 	.set_schmitt		= rk3308_set_schmitt,
649*72832ab6SJianqun Xu };
650*72832ab6SJianqun Xu 
651*72832ab6SJianqun Xu static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = {
652*72832ab6SJianqun Xu 	.pin_banks		= rk3308_pin_banks,
653*72832ab6SJianqun Xu 	.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
654*72832ab6SJianqun Xu 	.nr_pins		= 160,
655*72832ab6SJianqun Xu 	.grf_mux_offset		= 0x0,
656*72832ab6SJianqun Xu 	.iomux_recalced		= rk3308b_mux_recalced_data,
657*72832ab6SJianqun Xu 	.niomux_recalced	= ARRAY_SIZE(rk3308b_mux_recalced_data),
658*72832ab6SJianqun Xu 	.iomux_routes		= rk3308b_mux_route_data,
659*72832ab6SJianqun Xu 	.niomux_routes		= ARRAY_SIZE(rk3308b_mux_route_data),
660*72832ab6SJianqun Xu 	.set_mux		= rk3308_set_mux,
661*72832ab6SJianqun Xu 	.set_pull		= rk3308_set_pull,
662*72832ab6SJianqun Xu 	.set_drive		= rk3308_set_drive,
663*72832ab6SJianqun Xu 	.set_schmitt		= rk3308_set_schmitt,
664*72832ab6SJianqun Xu };
665*72832ab6SJianqun Xu 
666*72832ab6SJianqun Xu static const struct udevice_id rk3308_pinctrl_ids[] = {
667*72832ab6SJianqun Xu 	{
668*72832ab6SJianqun Xu 		.compatible = "rockchip,rk3308-pinctrl",
669*72832ab6SJianqun Xu 		.data = (ulong)&rk3308_pin_ctrl
670*72832ab6SJianqun Xu 	},
671*72832ab6SJianqun Xu 	{ }
672*72832ab6SJianqun Xu };
673*72832ab6SJianqun Xu 
674*72832ab6SJianqun Xu /* rk3308b SoC data initialize */
675*72832ab6SJianqun Xu #define RK3308B_GRF_SOC_CON13			0x608
676*72832ab6SJianqun Xu #define RK3308B_GRF_SOC_CON15			0x610
677*72832ab6SJianqun Xu 
678*72832ab6SJianqun Xu /* RK3308B_GRF_SOC_CON13 */
679*72832ab6SJianqun Xu #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
680*72832ab6SJianqun Xu #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
681*72832ab6SJianqun Xu #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
682*72832ab6SJianqun Xu 
683*72832ab6SJianqun Xu /* RK3308B_GRF_SOC_CON15 */
684*72832ab6SJianqun Xu #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
685*72832ab6SJianqun Xu #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
686*72832ab6SJianqun Xu #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
687*72832ab6SJianqun Xu 
rk3308b_soc_data_init(struct udevice * dev)688*72832ab6SJianqun Xu static int rk3308b_soc_data_init(struct udevice *dev)
689*72832ab6SJianqun Xu {
690*72832ab6SJianqun Xu 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
691*72832ab6SJianqun Xu 	int ret;
692*72832ab6SJianqun Xu 
693*72832ab6SJianqun Xu 	/*
694*72832ab6SJianqun Xu 	 * Enable the special ctrl  of selected sources.
695*72832ab6SJianqun Xu 	 */
696*72832ab6SJianqun Xu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
697*72832ab6SJianqun Xu 			   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
698*72832ab6SJianqun Xu 			   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
699*72832ab6SJianqun Xu 			   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
700*72832ab6SJianqun Xu 	if (ret)
701*72832ab6SJianqun Xu 		return ret;
702*72832ab6SJianqun Xu 
703*72832ab6SJianqun Xu 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
704*72832ab6SJianqun Xu 			   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
705*72832ab6SJianqun Xu 			   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
706*72832ab6SJianqun Xu 			   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
707*72832ab6SJianqun Xu 	if (ret)
708*72832ab6SJianqun Xu 		return ret;
709*72832ab6SJianqun Xu 
710*72832ab6SJianqun Xu 	return 0;
711*72832ab6SJianqun Xu }
712*72832ab6SJianqun Xu 
rk3308_pinctrl_probe(struct udevice * dev)713*72832ab6SJianqun Xu static int rk3308_pinctrl_probe(struct udevice *dev)
714*72832ab6SJianqun Xu {
715*72832ab6SJianqun Xu 	int ret;
716*72832ab6SJianqun Xu 
717*72832ab6SJianqun Xu 	if (soc_is_rk3308b())
718*72832ab6SJianqun Xu 		dev->driver_data = (ulong)&rk3308b_pin_ctrl;
719*72832ab6SJianqun Xu 
720*72832ab6SJianqun Xu 	ret = rockchip_pinctrl_probe(dev);
721*72832ab6SJianqun Xu 	if (ret)
722*72832ab6SJianqun Xu 		return ret;
723*72832ab6SJianqun Xu 
724*72832ab6SJianqun Xu 	if (soc_is_rk3308b())
725*72832ab6SJianqun Xu 		ret = rk3308b_soc_data_init(dev);
726*72832ab6SJianqun Xu 
727*72832ab6SJianqun Xu 	return ret;
728*72832ab6SJianqun Xu }
729*72832ab6SJianqun Xu 
730*72832ab6SJianqun Xu U_BOOT_DRIVER(pinctrl_rk3308) = {
731*72832ab6SJianqun Xu 	.name		= "rockchip_rk3308_pinctrl",
732*72832ab6SJianqun Xu 	.id		= UCLASS_PINCTRL,
733*72832ab6SJianqun Xu 	.of_match	= rk3308_pinctrl_ids,
734*72832ab6SJianqun Xu 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
735*72832ab6SJianqun Xu 	.ops		= &rockchip_pinctrl_ops,
736*72832ab6SJianqun Xu #if !CONFIG_IS_ENABLED(OF_PLATDATA)
737*72832ab6SJianqun Xu 	.bind		= dm_scan_fdt_dev,
738*72832ab6SJianqun Xu #endif
739*72832ab6SJianqun Xu 	.probe		= rk3308_pinctrl_probe,
740*72832ab6SJianqun Xu };
741