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