xref: /OK3568_Linux_fs/u-boot/drivers/pinctrl/pinctrl-rockchip.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <dm.h>
9*4882a593Smuzhiyun #include <dm/pinctrl.h>
10*4882a593Smuzhiyun #include <dm/ofnode.h>
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <regmap.h>
13*4882a593Smuzhiyun #include <syscon.h>
14*4882a593Smuzhiyun #include <asm/arch/cpu.h>
15*4882a593Smuzhiyun #include <dt-bindings/pinctrl/rockchip.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define MAX_ROCKCHIP_GPIO_PER_BANK	32
18*4882a593Smuzhiyun #define RK_FUNC_GPIO			0
19*4882a593Smuzhiyun #define MAX_ROCKCHIP_PINS_ENTRIES	30
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun enum rockchip_pinctrl_type {
22*4882a593Smuzhiyun 	PX30,
23*4882a593Smuzhiyun 	RV1108,
24*4882a593Smuzhiyun 	RV1126,
25*4882a593Smuzhiyun 	RK1808,
26*4882a593Smuzhiyun 	RK2928,
27*4882a593Smuzhiyun 	RK3066B,
28*4882a593Smuzhiyun 	RK3128,
29*4882a593Smuzhiyun 	RK3188,
30*4882a593Smuzhiyun 	RK3288,
31*4882a593Smuzhiyun 	RK3308,
32*4882a593Smuzhiyun 	RK3368,
33*4882a593Smuzhiyun 	RK3399,
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define RK_GENMASK_VAL(h, l, v) \
37*4882a593Smuzhiyun 	(GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /**
40*4882a593Smuzhiyun  * Encode variants of iomux registers into a type variable
41*4882a593Smuzhiyun  */
42*4882a593Smuzhiyun #define IOMUX_GPIO_ONLY		BIT(0)
43*4882a593Smuzhiyun #define IOMUX_WIDTH_4BIT	BIT(1)
44*4882a593Smuzhiyun #define IOMUX_SOURCE_PMU	BIT(2)
45*4882a593Smuzhiyun #define IOMUX_UNROUTED		BIT(3)
46*4882a593Smuzhiyun #define IOMUX_WIDTH_3BIT	BIT(4)
47*4882a593Smuzhiyun #define IOMUX_8WIDTH_2BIT	BIT(5)
48*4882a593Smuzhiyun #define IOMUX_WRITABLE_32BIT	BIT(6)
49*4882a593Smuzhiyun #define IOMUX_L_SOURCE_PMU	BIT(7)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /**
52*4882a593Smuzhiyun  * @type: iomux variant using IOMUX_* constants
53*4882a593Smuzhiyun  * @offset: if initialized to -1 it will be autocalculated, by specifying
54*4882a593Smuzhiyun  *	    an initial offset value the relevant source offset can be reset
55*4882a593Smuzhiyun  *	    to a new value for autocalculating the following iomux registers.
56*4882a593Smuzhiyun  */
57*4882a593Smuzhiyun struct rockchip_iomux {
58*4882a593Smuzhiyun 	int				type;
59*4882a593Smuzhiyun 	int				offset;
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define DRV_TYPE_IO_MASK		GENMASK(31, 16)
63*4882a593Smuzhiyun #define DRV_TYPE_WRITABLE_32BIT		BIT(31)
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /**
66*4882a593Smuzhiyun  * enum type index corresponding to rockchip_perpin_drv_list arrays index.
67*4882a593Smuzhiyun  */
68*4882a593Smuzhiyun enum rockchip_pin_drv_type {
69*4882a593Smuzhiyun 	DRV_TYPE_IO_DEFAULT = 0,
70*4882a593Smuzhiyun 	DRV_TYPE_IO_1V8_OR_3V0,
71*4882a593Smuzhiyun 	DRV_TYPE_IO_1V8_ONLY,
72*4882a593Smuzhiyun 	DRV_TYPE_IO_1V8_3V0_AUTO,
73*4882a593Smuzhiyun 	DRV_TYPE_IO_3V3_ONLY,
74*4882a593Smuzhiyun 	DRV_TYPE_IO_SMIC,
75*4882a593Smuzhiyun 	DRV_TYPE_MAX
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define PULL_TYPE_IO_MASK		GENMASK(31, 16)
79*4882a593Smuzhiyun #define PULL_TYPE_WRITABLE_32BIT	BIT(31)
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /**
82*4882a593Smuzhiyun  * enum type index corresponding to rockchip_pull_list arrays index.
83*4882a593Smuzhiyun  */
84*4882a593Smuzhiyun enum rockchip_pin_pull_type {
85*4882a593Smuzhiyun 	PULL_TYPE_IO_DEFAULT = 0,
86*4882a593Smuzhiyun 	PULL_TYPE_IO_1V8_ONLY,
87*4882a593Smuzhiyun 	PULL_TYPE_MAX
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun  * enum mux route register type, should be invalid/default/topgrf/pmugrf.
92*4882a593Smuzhiyun  * INVALID: means do not need to set mux route
93*4882a593Smuzhiyun  * DEFAULT: means same regmap as pin iomux
94*4882a593Smuzhiyun  * TOPGRF: means mux route setting in topgrf
95*4882a593Smuzhiyun  * PMUGRF: means mux route setting in pmugrf
96*4882a593Smuzhiyun  */
97*4882a593Smuzhiyun enum rockchip_pin_route_type {
98*4882a593Smuzhiyun 	ROUTE_TYPE_DEFAULT = 0,
99*4882a593Smuzhiyun 	ROUTE_TYPE_TOPGRF = 1,
100*4882a593Smuzhiyun 	ROUTE_TYPE_PMUGRF = 2,
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	ROUTE_TYPE_INVALID = -1,
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun /**
106*4882a593Smuzhiyun  * @drv_type: drive strength variant using rockchip_perpin_drv_type
107*4882a593Smuzhiyun  * @offset: if initialized to -1 it will be autocalculated, by specifying
108*4882a593Smuzhiyun  *	    an initial offset value the relevant source offset can be reset
109*4882a593Smuzhiyun  *	    to a new value for autocalculating the following drive strength
110*4882a593Smuzhiyun  *	    registers. if used chips own cal_drv func instead to calculate
111*4882a593Smuzhiyun  *	    registers offset, the variant could be ignored.
112*4882a593Smuzhiyun  */
113*4882a593Smuzhiyun struct rockchip_drv {
114*4882a593Smuzhiyun 	enum rockchip_pin_drv_type	drv_type;
115*4882a593Smuzhiyun 	int				offset;
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /**
119*4882a593Smuzhiyun  * @priv: common pinctrl private basedata
120*4882a593Smuzhiyun  * @pin_base: first pin number
121*4882a593Smuzhiyun  * @nr_pins: number of pins in this bank
122*4882a593Smuzhiyun  * @name: name of the bank
123*4882a593Smuzhiyun  * @bank_num: number of the bank, to account for holes
124*4882a593Smuzhiyun  * @iomux: array describing the 4 iomux sources of the bank
125*4882a593Smuzhiyun  * @drv: array describing the 4 drive strength sources of the bank
126*4882a593Smuzhiyun  * @pull_type: array describing the 4 pull type sources of the bank
127*4882a593Smuzhiyun  * @recalced_mask: bits describing the mux recalced pins of per bank
128*4882a593Smuzhiyun  * @route_mask: bits describing the routing pins of per bank
129*4882a593Smuzhiyun  */
130*4882a593Smuzhiyun struct rockchip_pin_bank {
131*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv	*priv;
132*4882a593Smuzhiyun 	u32				pin_base;
133*4882a593Smuzhiyun 	u8				nr_pins;
134*4882a593Smuzhiyun 	char				*name;
135*4882a593Smuzhiyun 	u8				bank_num;
136*4882a593Smuzhiyun 	struct rockchip_iomux		iomux[4];
137*4882a593Smuzhiyun 	struct rockchip_drv		drv[4];
138*4882a593Smuzhiyun 	enum rockchip_pin_pull_type	pull_type[4];
139*4882a593Smuzhiyun 	u32				recalced_mask;
140*4882a593Smuzhiyun 	u32				route_mask;
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define PIN_BANK(id, pins, label)			\
144*4882a593Smuzhiyun 	{						\
145*4882a593Smuzhiyun 		.bank_num	= id,			\
146*4882a593Smuzhiyun 		.nr_pins	= pins,			\
147*4882a593Smuzhiyun 		.name		= label,		\
148*4882a593Smuzhiyun 		.iomux		= {			\
149*4882a593Smuzhiyun 			{ .offset = -1 },		\
150*4882a593Smuzhiyun 			{ .offset = -1 },		\
151*4882a593Smuzhiyun 			{ .offset = -1 },		\
152*4882a593Smuzhiyun 			{ .offset = -1 },		\
153*4882a593Smuzhiyun 		},					\
154*4882a593Smuzhiyun 	}
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)	\
157*4882a593Smuzhiyun 	{								\
158*4882a593Smuzhiyun 		.bank_num	= id,					\
159*4882a593Smuzhiyun 		.nr_pins	= pins,					\
160*4882a593Smuzhiyun 		.name		= label,				\
161*4882a593Smuzhiyun 		.iomux		= {					\
162*4882a593Smuzhiyun 			{ .type = iom0, .offset = -1 },			\
163*4882a593Smuzhiyun 			{ .type = iom1, .offset = -1 },			\
164*4882a593Smuzhiyun 			{ .type = iom2, .offset = -1 },			\
165*4882a593Smuzhiyun 			{ .type = iom3, .offset = -1 },			\
166*4882a593Smuzhiyun 		},							\
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2,	\
170*4882a593Smuzhiyun 				    iom3, offset0, offset1, offset2,	\
171*4882a593Smuzhiyun 				    offset3)				\
172*4882a593Smuzhiyun 	{								\
173*4882a593Smuzhiyun 		.bank_num	= id,					\
174*4882a593Smuzhiyun 		.nr_pins	= pins,					\
175*4882a593Smuzhiyun 		.name		= label,				\
176*4882a593Smuzhiyun 		.iomux		= {					\
177*4882a593Smuzhiyun 			{ .type = iom0, .offset = offset0 },		\
178*4882a593Smuzhiyun 			{ .type = iom1, .offset = offset1 },		\
179*4882a593Smuzhiyun 			{ .type = iom2, .offset = offset2 },		\
180*4882a593Smuzhiyun 			{ .type = iom3, .offset = offset3 },		\
181*4882a593Smuzhiyun 		},							\
182*4882a593Smuzhiyun 	}
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
185*4882a593Smuzhiyun 	{								\
186*4882a593Smuzhiyun 		.bank_num	= id,					\
187*4882a593Smuzhiyun 		.nr_pins	= pins,					\
188*4882a593Smuzhiyun 		.name		= label,				\
189*4882a593Smuzhiyun 		.iomux		= {					\
190*4882a593Smuzhiyun 			{ .offset = -1 },				\
191*4882a593Smuzhiyun 			{ .offset = -1 },				\
192*4882a593Smuzhiyun 			{ .offset = -1 },				\
193*4882a593Smuzhiyun 			{ .offset = -1 },				\
194*4882a593Smuzhiyun 		},							\
195*4882a593Smuzhiyun 		.drv		= {					\
196*4882a593Smuzhiyun 			{ .drv_type = type0, .offset = -1 },		\
197*4882a593Smuzhiyun 			{ .drv_type = type1, .offset = -1 },		\
198*4882a593Smuzhiyun 			{ .drv_type = type2, .offset = -1 },		\
199*4882a593Smuzhiyun 			{ .drv_type = type3, .offset = -1 },		\
200*4882a593Smuzhiyun 		},							\
201*4882a593Smuzhiyun 	}
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1,	\
204*4882a593Smuzhiyun 				      drv2, drv3, pull0, pull1,		\
205*4882a593Smuzhiyun 				      pull2, pull3)			\
206*4882a593Smuzhiyun 	{								\
207*4882a593Smuzhiyun 		.bank_num	= id,					\
208*4882a593Smuzhiyun 		.nr_pins	= pins,					\
209*4882a593Smuzhiyun 		.name		= label,				\
210*4882a593Smuzhiyun 		.iomux		= {					\
211*4882a593Smuzhiyun 			{ .offset = -1 },				\
212*4882a593Smuzhiyun 			{ .offset = -1 },				\
213*4882a593Smuzhiyun 			{ .offset = -1 },				\
214*4882a593Smuzhiyun 			{ .offset = -1 },				\
215*4882a593Smuzhiyun 		},							\
216*4882a593Smuzhiyun 		.drv		= {					\
217*4882a593Smuzhiyun 			{ .drv_type = drv0, .offset = -1 },		\
218*4882a593Smuzhiyun 			{ .drv_type = drv1, .offset = -1 },		\
219*4882a593Smuzhiyun 			{ .drv_type = drv2, .offset = -1 },		\
220*4882a593Smuzhiyun 			{ .drv_type = drv3, .offset = -1 },		\
221*4882a593Smuzhiyun 		},							\
222*4882a593Smuzhiyun 		.pull_type[0] = pull0,					\
223*4882a593Smuzhiyun 		.pull_type[1] = pull1,					\
224*4882a593Smuzhiyun 		.pull_type[2] = pull2,					\
225*4882a593Smuzhiyun 		.pull_type[3] = pull3,					\
226*4882a593Smuzhiyun 	}
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1,	\
229*4882a593Smuzhiyun 					iom2, iom3, drv0, drv1, drv2,	\
230*4882a593Smuzhiyun 					drv3, offset0, offset1,		\
231*4882a593Smuzhiyun 					offset2, offset3)		\
232*4882a593Smuzhiyun 	{								\
233*4882a593Smuzhiyun 		.bank_num	= id,					\
234*4882a593Smuzhiyun 		.nr_pins	= pins,					\
235*4882a593Smuzhiyun 		.name		= label,				\
236*4882a593Smuzhiyun 		.iomux		= {					\
237*4882a593Smuzhiyun 			{ .type = iom0, .offset = -1 },			\
238*4882a593Smuzhiyun 			{ .type = iom1, .offset = -1 },			\
239*4882a593Smuzhiyun 			{ .type = iom2, .offset = -1 },			\
240*4882a593Smuzhiyun 			{ .type = iom3, .offset = -1 },			\
241*4882a593Smuzhiyun 		},							\
242*4882a593Smuzhiyun 		.drv		= {					\
243*4882a593Smuzhiyun 			{ .drv_type = drv0, .offset = offset0 },	\
244*4882a593Smuzhiyun 			{ .drv_type = drv1, .offset = offset1 },	\
245*4882a593Smuzhiyun 			{ .drv_type = drv2, .offset = offset2 },	\
246*4882a593Smuzhiyun 			{ .drv_type = drv3, .offset = offset3 },	\
247*4882a593Smuzhiyun 		},							\
248*4882a593Smuzhiyun 	}
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun #define PIN_BANK_IOMUX_DRV_PULL_FLAGS(id, pins, label, iom0, iom1,	\
251*4882a593Smuzhiyun 				      iom2, iom3, drv0, drv1, drv2,	\
252*4882a593Smuzhiyun 				      drv3, pull0, pull1, pull2,	\
253*4882a593Smuzhiyun 				      pull3)				\
254*4882a593Smuzhiyun 	{								\
255*4882a593Smuzhiyun 		.bank_num	= id,					\
256*4882a593Smuzhiyun 		.nr_pins	= pins,					\
257*4882a593Smuzhiyun 		.name		= label,				\
258*4882a593Smuzhiyun 		.iomux		= {					\
259*4882a593Smuzhiyun 			{ .type = iom0, .offset = -1 },			\
260*4882a593Smuzhiyun 			{ .type = iom1, .offset = -1 },			\
261*4882a593Smuzhiyun 			{ .type = iom2, .offset = -1 },			\
262*4882a593Smuzhiyun 			{ .type = iom3, .offset = -1 },			\
263*4882a593Smuzhiyun 		},							\
264*4882a593Smuzhiyun 		.drv		= {					\
265*4882a593Smuzhiyun 			{ .drv_type = drv0, .offset = -1 },		\
266*4882a593Smuzhiyun 			{ .drv_type = drv1, .offset = -1 },		\
267*4882a593Smuzhiyun 			{ .drv_type = drv2, .offset = -1 },		\
268*4882a593Smuzhiyun 			{ .drv_type = drv3, .offset = -1 },		\
269*4882a593Smuzhiyun 		},							\
270*4882a593Smuzhiyun 		.pull_type[0] = pull0,					\
271*4882a593Smuzhiyun 		.pull_type[1] = pull1,					\
272*4882a593Smuzhiyun 		.pull_type[2] = pull2,					\
273*4882a593Smuzhiyun 		.pull_type[3] = pull3,					\
274*4882a593Smuzhiyun 	}
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins,	\
277*4882a593Smuzhiyun 					      label, iom0, iom1, iom2,  \
278*4882a593Smuzhiyun 					      iom3, drv0, drv1, drv2,   \
279*4882a593Smuzhiyun 					      drv3, offset0, offset1,   \
280*4882a593Smuzhiyun 					      offset2, offset3, pull0,  \
281*4882a593Smuzhiyun 					      pull1, pull2, pull3)	\
282*4882a593Smuzhiyun 	{								\
283*4882a593Smuzhiyun 		.bank_num	= id,					\
284*4882a593Smuzhiyun 		.nr_pins	= pins,					\
285*4882a593Smuzhiyun 		.name		= label,				\
286*4882a593Smuzhiyun 		.iomux		= {					\
287*4882a593Smuzhiyun 			{ .type = iom0, .offset = -1 },			\
288*4882a593Smuzhiyun 			{ .type = iom1, .offset = -1 },			\
289*4882a593Smuzhiyun 			{ .type = iom2, .offset = -1 },			\
290*4882a593Smuzhiyun 			{ .type = iom3, .offset = -1 },			\
291*4882a593Smuzhiyun 		},							\
292*4882a593Smuzhiyun 		.drv		= {					\
293*4882a593Smuzhiyun 			{ .drv_type = drv0, .offset = offset0 },	\
294*4882a593Smuzhiyun 			{ .drv_type = drv1, .offset = offset1 },	\
295*4882a593Smuzhiyun 			{ .drv_type = drv2, .offset = offset2 },	\
296*4882a593Smuzhiyun 			{ .drv_type = drv3, .offset = offset3 },	\
297*4882a593Smuzhiyun 		},							\
298*4882a593Smuzhiyun 		.pull_type[0] = pull0,					\
299*4882a593Smuzhiyun 		.pull_type[1] = pull1,					\
300*4882a593Smuzhiyun 		.pull_type[2] = pull2,					\
301*4882a593Smuzhiyun 		.pull_type[3] = pull3,					\
302*4882a593Smuzhiyun 	}
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG)		\
305*4882a593Smuzhiyun 	{								\
306*4882a593Smuzhiyun 		.bank_num	= ID,					\
307*4882a593Smuzhiyun 		.pin		= PIN,					\
308*4882a593Smuzhiyun 		.func		= FUNC,					\
309*4882a593Smuzhiyun 		.route_offset	= REG,					\
310*4882a593Smuzhiyun 		.route_val	= VAL,					\
311*4882a593Smuzhiyun 		.route_type	= FLAG,					\
312*4882a593Smuzhiyun 	}
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun #define MR_DEFAULT(ID, PIN, FUNC, REG, VAL)	\
315*4882a593Smuzhiyun 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT)
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun #define MR_TOPGRF(ID, PIN, FUNC, REG, VAL)	\
318*4882a593Smuzhiyun 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF)
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun #define MR_PMUGRF(ID, PIN, FUNC, REG, VAL)	\
321*4882a593Smuzhiyun 	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF)
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun /**
324*4882a593Smuzhiyun  * struct rockchip_mux_recalced_data: represent a pin iomux data.
325*4882a593Smuzhiyun  * @num: bank number.
326*4882a593Smuzhiyun  * @pin: pin number.
327*4882a593Smuzhiyun  * @bit: index at register.
328*4882a593Smuzhiyun  * @reg: register offset.
329*4882a593Smuzhiyun  * @mask: mask bit
330*4882a593Smuzhiyun  */
331*4882a593Smuzhiyun struct rockchip_mux_recalced_data {
332*4882a593Smuzhiyun 	u8 num;
333*4882a593Smuzhiyun 	u8 pin;
334*4882a593Smuzhiyun 	u32 reg;
335*4882a593Smuzhiyun 	u8 bit;
336*4882a593Smuzhiyun 	u8 mask;
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /**
340*4882a593Smuzhiyun  * struct rockchip_mux_recalced_data: represent a pin iomux data.
341*4882a593Smuzhiyun  * @bank_num: bank number.
342*4882a593Smuzhiyun  * @pin: index at register or used to calc index.
343*4882a593Smuzhiyun  * @func: the min pin.
344*4882a593Smuzhiyun  * @route_type: the register type.
345*4882a593Smuzhiyun  * @route_offset: the max pin.
346*4882a593Smuzhiyun  * @route_val: the register offset.
347*4882a593Smuzhiyun  */
348*4882a593Smuzhiyun struct rockchip_mux_route_data {
349*4882a593Smuzhiyun 	u8 bank_num;
350*4882a593Smuzhiyun 	u8 pin;
351*4882a593Smuzhiyun 	u8 func;
352*4882a593Smuzhiyun 	enum rockchip_pin_route_type route_type : 8;
353*4882a593Smuzhiyun 	u32 route_offset;
354*4882a593Smuzhiyun 	u32 route_val;
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /**
358*4882a593Smuzhiyun  */
359*4882a593Smuzhiyun struct rockchip_pin_ctrl {
360*4882a593Smuzhiyun 	struct rockchip_pin_bank	*pin_banks;
361*4882a593Smuzhiyun 	u32				nr_banks;
362*4882a593Smuzhiyun 	u32				nr_pins;
363*4882a593Smuzhiyun 	char				*label;
364*4882a593Smuzhiyun 	enum rockchip_pinctrl_type	type;
365*4882a593Smuzhiyun 	int				grf_mux_offset;
366*4882a593Smuzhiyun 	int				pmu_mux_offset;
367*4882a593Smuzhiyun 	int				grf_drv_offset;
368*4882a593Smuzhiyun 	int				pmu_drv_offset;
369*4882a593Smuzhiyun 	struct rockchip_mux_recalced_data *iomux_recalced;
370*4882a593Smuzhiyun 	u32				niomux_recalced;
371*4882a593Smuzhiyun 	struct rockchip_mux_route_data *iomux_routes;
372*4882a593Smuzhiyun 	u32				niomux_routes;
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	int	(*ctrl_data_re_init)(const struct rockchip_pin_ctrl *ctrl);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	int	(*soc_data_init)(struct rockchip_pinctrl_priv *info);
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank,
379*4882a593Smuzhiyun 				 int pin_num, struct regmap **regmap,
380*4882a593Smuzhiyun 				 int *reg, u8 *bit);
381*4882a593Smuzhiyun 	void	(*drv_calc_reg)(struct rockchip_pin_bank *bank,
382*4882a593Smuzhiyun 				int pin_num, struct regmap **regmap,
383*4882a593Smuzhiyun 				int *reg, u8 *bit);
384*4882a593Smuzhiyun 	int	(*schmitt_calc_reg)(struct rockchip_pin_bank *bank,
385*4882a593Smuzhiyun 				    int pin_num, struct regmap **regmap,
386*4882a593Smuzhiyun 				    int *reg, u8 *bit);
387*4882a593Smuzhiyun 	int	(*slew_rate_calc_reg)(struct rockchip_pin_bank *bank,
388*4882a593Smuzhiyun 				      int pin_num, struct regmap **regmap,
389*4882a593Smuzhiyun 				      int *reg, u8 *bit);
390*4882a593Smuzhiyun };
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun /**
393*4882a593Smuzhiyun  */
394*4882a593Smuzhiyun struct rockchip_pinctrl_priv {
395*4882a593Smuzhiyun 	struct rockchip_pin_ctrl	*ctrl;
396*4882a593Smuzhiyun 	struct regmap			*regmap_base;
397*4882a593Smuzhiyun 	struct regmap			*regmap_pmu;
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun };
400*4882a593Smuzhiyun 
rockchip_verify_config(struct udevice * dev,u32 bank,u32 pin)401*4882a593Smuzhiyun static int rockchip_verify_config(struct udevice *dev, u32 bank, u32 pin)
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
404*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	if (bank >= ctrl->nr_banks) {
407*4882a593Smuzhiyun 		debug("pin conf bank %d >= nbanks %d\n", bank, ctrl->nr_banks);
408*4882a593Smuzhiyun 		return -EINVAL;
409*4882a593Smuzhiyun 	}
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 	if (pin >= MAX_ROCKCHIP_GPIO_PER_BANK) {
412*4882a593Smuzhiyun 		debug("pin conf pin %d >= %d\n", pin,
413*4882a593Smuzhiyun 		      MAX_ROCKCHIP_GPIO_PER_BANK);
414*4882a593Smuzhiyun 		return -EINVAL;
415*4882a593Smuzhiyun 	}
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	return 0;
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
421*4882a593Smuzhiyun 	{
422*4882a593Smuzhiyun 		.num = 1,
423*4882a593Smuzhiyun 		.pin = 0,
424*4882a593Smuzhiyun 		.reg = 0x418,
425*4882a593Smuzhiyun 		.bit = 0,
426*4882a593Smuzhiyun 		.mask = 0x3
427*4882a593Smuzhiyun 	}, {
428*4882a593Smuzhiyun 		.num = 1,
429*4882a593Smuzhiyun 		.pin = 1,
430*4882a593Smuzhiyun 		.reg = 0x418,
431*4882a593Smuzhiyun 		.bit = 2,
432*4882a593Smuzhiyun 		.mask = 0x3
433*4882a593Smuzhiyun 	}, {
434*4882a593Smuzhiyun 		.num = 1,
435*4882a593Smuzhiyun 		.pin = 2,
436*4882a593Smuzhiyun 		.reg = 0x418,
437*4882a593Smuzhiyun 		.bit = 4,
438*4882a593Smuzhiyun 		.mask = 0x3
439*4882a593Smuzhiyun 	}, {
440*4882a593Smuzhiyun 		.num = 1,
441*4882a593Smuzhiyun 		.pin = 3,
442*4882a593Smuzhiyun 		.reg = 0x418,
443*4882a593Smuzhiyun 		.bit = 6,
444*4882a593Smuzhiyun 		.mask = 0x3
445*4882a593Smuzhiyun 	}, {
446*4882a593Smuzhiyun 		.num = 1,
447*4882a593Smuzhiyun 		.pin = 4,
448*4882a593Smuzhiyun 		.reg = 0x418,
449*4882a593Smuzhiyun 		.bit = 8,
450*4882a593Smuzhiyun 		.mask = 0x3
451*4882a593Smuzhiyun 	}, {
452*4882a593Smuzhiyun 		.num = 1,
453*4882a593Smuzhiyun 		.pin = 5,
454*4882a593Smuzhiyun 		.reg = 0x418,
455*4882a593Smuzhiyun 		.bit = 10,
456*4882a593Smuzhiyun 		.mask = 0x3
457*4882a593Smuzhiyun 	}, {
458*4882a593Smuzhiyun 		.num = 1,
459*4882a593Smuzhiyun 		.pin = 6,
460*4882a593Smuzhiyun 		.reg = 0x418,
461*4882a593Smuzhiyun 		.bit = 12,
462*4882a593Smuzhiyun 		.mask = 0x3
463*4882a593Smuzhiyun 	}, {
464*4882a593Smuzhiyun 		.num = 1,
465*4882a593Smuzhiyun 		.pin = 7,
466*4882a593Smuzhiyun 		.reg = 0x418,
467*4882a593Smuzhiyun 		.bit = 14,
468*4882a593Smuzhiyun 		.mask = 0x3
469*4882a593Smuzhiyun 	}, {
470*4882a593Smuzhiyun 		.num = 1,
471*4882a593Smuzhiyun 		.pin = 8,
472*4882a593Smuzhiyun 		.reg = 0x41c,
473*4882a593Smuzhiyun 		.bit = 0,
474*4882a593Smuzhiyun 		.mask = 0x3
475*4882a593Smuzhiyun 	}, {
476*4882a593Smuzhiyun 		.num = 1,
477*4882a593Smuzhiyun 		.pin = 9,
478*4882a593Smuzhiyun 		.reg = 0x41c,
479*4882a593Smuzhiyun 		.bit = 2,
480*4882a593Smuzhiyun 		.mask = 0x3
481*4882a593Smuzhiyun 	},
482*4882a593Smuzhiyun };
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
485*4882a593Smuzhiyun 	{
486*4882a593Smuzhiyun 		.num = 0,
487*4882a593Smuzhiyun 		.pin = 20,
488*4882a593Smuzhiyun 		.reg = 0x10000,
489*4882a593Smuzhiyun 		.bit = 0,
490*4882a593Smuzhiyun 		.mask = 0xf
491*4882a593Smuzhiyun 	},
492*4882a593Smuzhiyun 	{
493*4882a593Smuzhiyun 		.num = 0,
494*4882a593Smuzhiyun 		.pin = 21,
495*4882a593Smuzhiyun 		.reg = 0x10000,
496*4882a593Smuzhiyun 		.bit = 4,
497*4882a593Smuzhiyun 		.mask = 0xf
498*4882a593Smuzhiyun 	},
499*4882a593Smuzhiyun 	{
500*4882a593Smuzhiyun 		.num = 0,
501*4882a593Smuzhiyun 		.pin = 22,
502*4882a593Smuzhiyun 		.reg = 0x10000,
503*4882a593Smuzhiyun 		.bit = 8,
504*4882a593Smuzhiyun 		.mask = 0xf
505*4882a593Smuzhiyun 	},
506*4882a593Smuzhiyun 	{
507*4882a593Smuzhiyun 		.num = 0,
508*4882a593Smuzhiyun 		.pin = 23,
509*4882a593Smuzhiyun 		.reg = 0x10000,
510*4882a593Smuzhiyun 		.bit = 12,
511*4882a593Smuzhiyun 		.mask = 0xf
512*4882a593Smuzhiyun 	},
513*4882a593Smuzhiyun };
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun static  struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
516*4882a593Smuzhiyun 	{
517*4882a593Smuzhiyun 		.num = 2,
518*4882a593Smuzhiyun 		.pin = 20,
519*4882a593Smuzhiyun 		.reg = 0xe8,
520*4882a593Smuzhiyun 		.bit = 0,
521*4882a593Smuzhiyun 		.mask = 0x7
522*4882a593Smuzhiyun 	}, {
523*4882a593Smuzhiyun 		.num = 2,
524*4882a593Smuzhiyun 		.pin = 21,
525*4882a593Smuzhiyun 		.reg = 0xe8,
526*4882a593Smuzhiyun 		.bit = 4,
527*4882a593Smuzhiyun 		.mask = 0x7
528*4882a593Smuzhiyun 	}, {
529*4882a593Smuzhiyun 		.num = 2,
530*4882a593Smuzhiyun 		.pin = 22,
531*4882a593Smuzhiyun 		.reg = 0xe8,
532*4882a593Smuzhiyun 		.bit = 8,
533*4882a593Smuzhiyun 		.mask = 0x7
534*4882a593Smuzhiyun 	}, {
535*4882a593Smuzhiyun 		.num = 2,
536*4882a593Smuzhiyun 		.pin = 23,
537*4882a593Smuzhiyun 		.reg = 0xe8,
538*4882a593Smuzhiyun 		.bit = 12,
539*4882a593Smuzhiyun 		.mask = 0x7
540*4882a593Smuzhiyun 	}, {
541*4882a593Smuzhiyun 		.num = 2,
542*4882a593Smuzhiyun 		.pin = 24,
543*4882a593Smuzhiyun 		.reg = 0xd4,
544*4882a593Smuzhiyun 		.bit = 12,
545*4882a593Smuzhiyun 		.mask = 0x7
546*4882a593Smuzhiyun 	},
547*4882a593Smuzhiyun };
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
550*4882a593Smuzhiyun 	{
551*4882a593Smuzhiyun 		.num = 1,
552*4882a593Smuzhiyun 		.pin = 14,
553*4882a593Smuzhiyun 		.reg = 0x28,
554*4882a593Smuzhiyun 		.bit = 12,
555*4882a593Smuzhiyun 		.mask = 0x7
556*4882a593Smuzhiyun 	}, {
557*4882a593Smuzhiyun 		.num = 1,
558*4882a593Smuzhiyun 		.pin = 15,
559*4882a593Smuzhiyun 		.reg = 0x2c,
560*4882a593Smuzhiyun 		.bit = 0,
561*4882a593Smuzhiyun 		.mask = 0x3
562*4882a593Smuzhiyun 	}, {
563*4882a593Smuzhiyun 		.num = 1,
564*4882a593Smuzhiyun 		.pin = 18,
565*4882a593Smuzhiyun 		.reg = 0x30,
566*4882a593Smuzhiyun 		.bit = 4,
567*4882a593Smuzhiyun 		.mask = 0x7
568*4882a593Smuzhiyun 	}, {
569*4882a593Smuzhiyun 		.num = 1,
570*4882a593Smuzhiyun 		.pin = 19,
571*4882a593Smuzhiyun 		.reg = 0x30,
572*4882a593Smuzhiyun 		.bit = 8,
573*4882a593Smuzhiyun 		.mask = 0x7
574*4882a593Smuzhiyun 	}, {
575*4882a593Smuzhiyun 		.num = 1,
576*4882a593Smuzhiyun 		.pin = 20,
577*4882a593Smuzhiyun 		.reg = 0x30,
578*4882a593Smuzhiyun 		.bit = 12,
579*4882a593Smuzhiyun 		.mask = 0x7
580*4882a593Smuzhiyun 	}, {
581*4882a593Smuzhiyun 		.num = 1,
582*4882a593Smuzhiyun 		.pin = 21,
583*4882a593Smuzhiyun 		.reg = 0x34,
584*4882a593Smuzhiyun 		.bit = 0,
585*4882a593Smuzhiyun 		.mask = 0x7
586*4882a593Smuzhiyun 	}, {
587*4882a593Smuzhiyun 		.num = 1,
588*4882a593Smuzhiyun 		.pin = 22,
589*4882a593Smuzhiyun 		.reg = 0x34,
590*4882a593Smuzhiyun 		.bit = 4,
591*4882a593Smuzhiyun 		.mask = 0x7
592*4882a593Smuzhiyun 	}, {
593*4882a593Smuzhiyun 		.num = 1,
594*4882a593Smuzhiyun 		.pin = 23,
595*4882a593Smuzhiyun 		.reg = 0x34,
596*4882a593Smuzhiyun 		.bit = 8,
597*4882a593Smuzhiyun 		.mask = 0x7
598*4882a593Smuzhiyun 	}, {
599*4882a593Smuzhiyun 		.num = 3,
600*4882a593Smuzhiyun 		.pin = 12,
601*4882a593Smuzhiyun 		.reg = 0x68,
602*4882a593Smuzhiyun 		.bit = 8,
603*4882a593Smuzhiyun 		.mask = 0x7
604*4882a593Smuzhiyun 	}, {
605*4882a593Smuzhiyun 		.num = 3,
606*4882a593Smuzhiyun 		.pin = 13,
607*4882a593Smuzhiyun 		.reg = 0x68,
608*4882a593Smuzhiyun 		.bit = 12,
609*4882a593Smuzhiyun 		.mask = 0x7
610*4882a593Smuzhiyun 	},
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rk3308b_mux_recalced_data[] = {
614*4882a593Smuzhiyun 	{
615*4882a593Smuzhiyun 		.num = 1,
616*4882a593Smuzhiyun 		.pin = 14,
617*4882a593Smuzhiyun 		.reg = 0x28,
618*4882a593Smuzhiyun 		.bit = 12,
619*4882a593Smuzhiyun 		.mask = 0xf
620*4882a593Smuzhiyun 	}, {
621*4882a593Smuzhiyun 		.num = 1,
622*4882a593Smuzhiyun 		.pin = 15,
623*4882a593Smuzhiyun 		.reg = 0x2c,
624*4882a593Smuzhiyun 		.bit = 0,
625*4882a593Smuzhiyun 		.mask = 0x3
626*4882a593Smuzhiyun 	}, {
627*4882a593Smuzhiyun 		.num = 1,
628*4882a593Smuzhiyun 		.pin = 18,
629*4882a593Smuzhiyun 		.reg = 0x30,
630*4882a593Smuzhiyun 		.bit = 4,
631*4882a593Smuzhiyun 		.mask = 0xf
632*4882a593Smuzhiyun 	}, {
633*4882a593Smuzhiyun 		.num = 1,
634*4882a593Smuzhiyun 		.pin = 19,
635*4882a593Smuzhiyun 		.reg = 0x30,
636*4882a593Smuzhiyun 		.bit = 8,
637*4882a593Smuzhiyun 		.mask = 0xf
638*4882a593Smuzhiyun 	}, {
639*4882a593Smuzhiyun 		.num = 1,
640*4882a593Smuzhiyun 		.pin = 20,
641*4882a593Smuzhiyun 		.reg = 0x30,
642*4882a593Smuzhiyun 		.bit = 12,
643*4882a593Smuzhiyun 		.mask = 0xf
644*4882a593Smuzhiyun 	}, {
645*4882a593Smuzhiyun 		.num = 1,
646*4882a593Smuzhiyun 		.pin = 21,
647*4882a593Smuzhiyun 		.reg = 0x34,
648*4882a593Smuzhiyun 		.bit = 0,
649*4882a593Smuzhiyun 		.mask = 0xf
650*4882a593Smuzhiyun 	}, {
651*4882a593Smuzhiyun 		.num = 1,
652*4882a593Smuzhiyun 		.pin = 22,
653*4882a593Smuzhiyun 		.reg = 0x34,
654*4882a593Smuzhiyun 		.bit = 4,
655*4882a593Smuzhiyun 		.mask = 0xf
656*4882a593Smuzhiyun 	}, {
657*4882a593Smuzhiyun 		.num = 1,
658*4882a593Smuzhiyun 		.pin = 23,
659*4882a593Smuzhiyun 		.reg = 0x34,
660*4882a593Smuzhiyun 		.bit = 8,
661*4882a593Smuzhiyun 		.mask = 0xf
662*4882a593Smuzhiyun 	}, {
663*4882a593Smuzhiyun 		.num = 3,
664*4882a593Smuzhiyun 		.pin = 12,
665*4882a593Smuzhiyun 		.reg = 0x68,
666*4882a593Smuzhiyun 		.bit = 8,
667*4882a593Smuzhiyun 		.mask = 0xf
668*4882a593Smuzhiyun 	}, {
669*4882a593Smuzhiyun 		.num = 3,
670*4882a593Smuzhiyun 		.pin = 13,
671*4882a593Smuzhiyun 		.reg = 0x68,
672*4882a593Smuzhiyun 		.bit = 12,
673*4882a593Smuzhiyun 		.mask = 0xf
674*4882a593Smuzhiyun 	}, {
675*4882a593Smuzhiyun 		.num = 2,
676*4882a593Smuzhiyun 		.pin = 2,
677*4882a593Smuzhiyun 		.reg = 0x608,
678*4882a593Smuzhiyun 		.bit = 0,
679*4882a593Smuzhiyun 		.mask = 0x7
680*4882a593Smuzhiyun 	}, {
681*4882a593Smuzhiyun 		.num = 2,
682*4882a593Smuzhiyun 		.pin = 3,
683*4882a593Smuzhiyun 		.reg = 0x608,
684*4882a593Smuzhiyun 		.bit = 4,
685*4882a593Smuzhiyun 		.mask = 0x7
686*4882a593Smuzhiyun 	}, {
687*4882a593Smuzhiyun 		.num = 2,
688*4882a593Smuzhiyun 		.pin = 16,
689*4882a593Smuzhiyun 		.reg = 0x610,
690*4882a593Smuzhiyun 		.bit = 8,
691*4882a593Smuzhiyun 		.mask = 0x7
692*4882a593Smuzhiyun 	}, {
693*4882a593Smuzhiyun 		.num = 3,
694*4882a593Smuzhiyun 		.pin = 10,
695*4882a593Smuzhiyun 		.reg = 0x610,
696*4882a593Smuzhiyun 		.bit = 0,
697*4882a593Smuzhiyun 		.mask = 0x7
698*4882a593Smuzhiyun 	}, {
699*4882a593Smuzhiyun 		.num = 3,
700*4882a593Smuzhiyun 		.pin = 11,
701*4882a593Smuzhiyun 		.reg = 0x610,
702*4882a593Smuzhiyun 		.bit = 4,
703*4882a593Smuzhiyun 		.mask = 0x7
704*4882a593Smuzhiyun 	},
705*4882a593Smuzhiyun };
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
708*4882a593Smuzhiyun 	{
709*4882a593Smuzhiyun 		.num = 2,
710*4882a593Smuzhiyun 		.pin = 12,
711*4882a593Smuzhiyun 		.reg = 0x24,
712*4882a593Smuzhiyun 		.bit = 8,
713*4882a593Smuzhiyun 		.mask = 0x3
714*4882a593Smuzhiyun 	}, {
715*4882a593Smuzhiyun 		.num = 2,
716*4882a593Smuzhiyun 		.pin = 15,
717*4882a593Smuzhiyun 		.reg = 0x28,
718*4882a593Smuzhiyun 		.bit = 0,
719*4882a593Smuzhiyun 		.mask = 0x7
720*4882a593Smuzhiyun 	}, {
721*4882a593Smuzhiyun 		.num = 2,
722*4882a593Smuzhiyun 		.pin = 23,
723*4882a593Smuzhiyun 		.reg = 0x30,
724*4882a593Smuzhiyun 		.bit = 14,
725*4882a593Smuzhiyun 		.mask = 0x3
726*4882a593Smuzhiyun 	},
727*4882a593Smuzhiyun };
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
730*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
731*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
734*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
735*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
736*4882a593Smuzhiyun 
737*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
738*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
741*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
744*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
747*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
748*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
751*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
754*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
755*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
758*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
759*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
762*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
765*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */
768*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */
771*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */
774*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
777*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
780*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
783*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
784*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
787*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
788*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
791*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
792*4882a593Smuzhiyun 	MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */
795*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */
798*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */
799*4882a593Smuzhiyun 
800*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */
801*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
804*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */
807*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */
810*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */
813*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
816*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
819*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
820*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
823*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
824*4882a593Smuzhiyun 	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(4, 4, 1)), /* I2C2 */
825*4882a593Smuzhiyun };
826*4882a593Smuzhiyun 
rockchip_get_recalced_mux(struct rockchip_pin_bank * bank,int pin,int * reg,u8 * bit,int * mask)827*4882a593Smuzhiyun static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
828*4882a593Smuzhiyun 				      int *reg, u8 *bit, int *mask)
829*4882a593Smuzhiyun {
830*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
831*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
832*4882a593Smuzhiyun 	struct rockchip_mux_recalced_data *data;
833*4882a593Smuzhiyun 	int i;
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 	for (i = 0; i < ctrl->niomux_recalced; i++) {
836*4882a593Smuzhiyun 		data = &ctrl->iomux_recalced[i];
837*4882a593Smuzhiyun 		if (data->num == bank->bank_num &&
838*4882a593Smuzhiyun 		    data->pin == pin)
839*4882a593Smuzhiyun 			break;
840*4882a593Smuzhiyun 	}
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 	if (i >= ctrl->niomux_recalced)
843*4882a593Smuzhiyun 		return;
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun 	*reg = data->reg;
846*4882a593Smuzhiyun 	*mask = data->mask;
847*4882a593Smuzhiyun 	*bit = data->bit;
848*4882a593Smuzhiyun }
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun static struct rockchip_mux_route_data px30_mux_route_data[] = {
851*4882a593Smuzhiyun 	{
852*4882a593Smuzhiyun 		/* cif-d2m0 */
853*4882a593Smuzhiyun 		.bank_num = 2,
854*4882a593Smuzhiyun 		.pin = 0,
855*4882a593Smuzhiyun 		.func = 1,
856*4882a593Smuzhiyun 		.route_offset = 0x184,
857*4882a593Smuzhiyun 		.route_val = BIT(16 + 7),
858*4882a593Smuzhiyun 	}, {
859*4882a593Smuzhiyun 		/* cif-d2m1 */
860*4882a593Smuzhiyun 		.bank_num = 3,
861*4882a593Smuzhiyun 		.pin = 3,
862*4882a593Smuzhiyun 		.func = 3,
863*4882a593Smuzhiyun 		.route_offset = 0x184,
864*4882a593Smuzhiyun 		.route_val = BIT(16 + 7) | BIT(7),
865*4882a593Smuzhiyun 	}, {
866*4882a593Smuzhiyun 		/* pdm-m0 */
867*4882a593Smuzhiyun 		.bank_num = 3,
868*4882a593Smuzhiyun 		.pin = 22,
869*4882a593Smuzhiyun 		.func = 2,
870*4882a593Smuzhiyun 		.route_offset = 0x184,
871*4882a593Smuzhiyun 		.route_val = BIT(16 + 8),
872*4882a593Smuzhiyun 	}, {
873*4882a593Smuzhiyun 		/* pdm-m1 */
874*4882a593Smuzhiyun 		.bank_num = 2,
875*4882a593Smuzhiyun 		.pin = 22,
876*4882a593Smuzhiyun 		.func = 1,
877*4882a593Smuzhiyun 		.route_offset = 0x184,
878*4882a593Smuzhiyun 		.route_val = BIT(16 + 8) | BIT(8),
879*4882a593Smuzhiyun 	}, {
880*4882a593Smuzhiyun 		/* uart2-rxm0 */
881*4882a593Smuzhiyun 		.bank_num = 1,
882*4882a593Smuzhiyun 		.pin = 27,
883*4882a593Smuzhiyun 		.func = 2,
884*4882a593Smuzhiyun 		.route_offset = 0x184,
885*4882a593Smuzhiyun 		.route_val = BIT(16 + 10),
886*4882a593Smuzhiyun 	}, {
887*4882a593Smuzhiyun 		/* uart2-rxm1 */
888*4882a593Smuzhiyun 		.bank_num = 2,
889*4882a593Smuzhiyun 		.pin = 14,
890*4882a593Smuzhiyun 		.func = 2,
891*4882a593Smuzhiyun 		.route_offset = 0x184,
892*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(10),
893*4882a593Smuzhiyun 	}, {
894*4882a593Smuzhiyun 		/* uart3-rxm0 */
895*4882a593Smuzhiyun 		.bank_num = 0,
896*4882a593Smuzhiyun 		.pin = 17,
897*4882a593Smuzhiyun 		.func = 2,
898*4882a593Smuzhiyun 		.route_offset = 0x184,
899*4882a593Smuzhiyun 		.route_val = BIT(16 + 9),
900*4882a593Smuzhiyun 	}, {
901*4882a593Smuzhiyun 		/* uart3-rxm1 */
902*4882a593Smuzhiyun 		.bank_num = 1,
903*4882a593Smuzhiyun 		.pin = 15,
904*4882a593Smuzhiyun 		.func = 2,
905*4882a593Smuzhiyun 		.route_offset = 0x184,
906*4882a593Smuzhiyun 		.route_val = BIT(16 + 9) | BIT(9),
907*4882a593Smuzhiyun 	},
908*4882a593Smuzhiyun };
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
911*4882a593Smuzhiyun 	{
912*4882a593Smuzhiyun 		/* i2c2m0_sda */
913*4882a593Smuzhiyun 		.bank_num = 3,
914*4882a593Smuzhiyun 		.pin = 12,
915*4882a593Smuzhiyun 		.func = 2,
916*4882a593Smuzhiyun 		.route_offset = 0x190,
917*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
918*4882a593Smuzhiyun 	}, {
919*4882a593Smuzhiyun 		/* i2c2m1_sda */
920*4882a593Smuzhiyun 		.bank_num = 1,
921*4882a593Smuzhiyun 		.pin = 13,
922*4882a593Smuzhiyun 		.func = 2,
923*4882a593Smuzhiyun 		.route_offset = 0x190,
924*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(3),
925*4882a593Smuzhiyun 	}, {
926*4882a593Smuzhiyun 		/* uart2_rxm0 */
927*4882a593Smuzhiyun 		.bank_num = 4,
928*4882a593Smuzhiyun 		.pin = 3,
929*4882a593Smuzhiyun 		.func = 2,
930*4882a593Smuzhiyun 		.route_offset = 0x190,
931*4882a593Smuzhiyun 		.route_val = BIT(16 + 14) | BIT(16 + 15),
932*4882a593Smuzhiyun 	}, {
933*4882a593Smuzhiyun 		/* uart2_rxm1 */
934*4882a593Smuzhiyun 		.bank_num = 2,
935*4882a593Smuzhiyun 		.pin = 25,
936*4882a593Smuzhiyun 		.func = 2,
937*4882a593Smuzhiyun 		.route_offset = 0x190,
938*4882a593Smuzhiyun 		.route_val = BIT(16 + 14) | BIT(14) | BIT(16 + 15),
939*4882a593Smuzhiyun 	}, {
940*4882a593Smuzhiyun 		/* uart2_rxm2 */
941*4882a593Smuzhiyun 		.bank_num = 3,
942*4882a593Smuzhiyun 		.pin = 4,
943*4882a593Smuzhiyun 		.func = 2,
944*4882a593Smuzhiyun 		.route_offset = 0x190,
945*4882a593Smuzhiyun 		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
946*4882a593Smuzhiyun 	},
947*4882a593Smuzhiyun };
948*4882a593Smuzhiyun 
949*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
950*4882a593Smuzhiyun 	{
951*4882a593Smuzhiyun 		/* spi-0 */
952*4882a593Smuzhiyun 		.bank_num = 1,
953*4882a593Smuzhiyun 		.pin = 10,
954*4882a593Smuzhiyun 		.func = 1,
955*4882a593Smuzhiyun 		.route_offset = 0x144,
956*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(16 + 4),
957*4882a593Smuzhiyun 	}, {
958*4882a593Smuzhiyun 		/* spi-1 */
959*4882a593Smuzhiyun 		.bank_num = 1,
960*4882a593Smuzhiyun 		.pin = 27,
961*4882a593Smuzhiyun 		.func = 3,
962*4882a593Smuzhiyun 		.route_offset = 0x144,
963*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
964*4882a593Smuzhiyun 	}, {
965*4882a593Smuzhiyun 		/* spi-2 */
966*4882a593Smuzhiyun 		.bank_num = 0,
967*4882a593Smuzhiyun 		.pin = 13,
968*4882a593Smuzhiyun 		.func = 2,
969*4882a593Smuzhiyun 		.route_offset = 0x144,
970*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
971*4882a593Smuzhiyun 	}, {
972*4882a593Smuzhiyun 		/* i2s-0 */
973*4882a593Smuzhiyun 		.bank_num = 1,
974*4882a593Smuzhiyun 		.pin = 5,
975*4882a593Smuzhiyun 		.func = 1,
976*4882a593Smuzhiyun 		.route_offset = 0x144,
977*4882a593Smuzhiyun 		.route_val = BIT(16 + 5),
978*4882a593Smuzhiyun 	}, {
979*4882a593Smuzhiyun 		/* i2s-1 */
980*4882a593Smuzhiyun 		.bank_num = 0,
981*4882a593Smuzhiyun 		.pin = 14,
982*4882a593Smuzhiyun 		.func = 1,
983*4882a593Smuzhiyun 		.route_offset = 0x144,
984*4882a593Smuzhiyun 		.route_val = BIT(16 + 5) | BIT(5),
985*4882a593Smuzhiyun 	}, {
986*4882a593Smuzhiyun 		/* emmc-0 */
987*4882a593Smuzhiyun 		.bank_num = 1,
988*4882a593Smuzhiyun 		.pin = 22,
989*4882a593Smuzhiyun 		.func = 2,
990*4882a593Smuzhiyun 		.route_offset = 0x144,
991*4882a593Smuzhiyun 		.route_val = BIT(16 + 6),
992*4882a593Smuzhiyun 	}, {
993*4882a593Smuzhiyun 		/* emmc-1 */
994*4882a593Smuzhiyun 		.bank_num = 2,
995*4882a593Smuzhiyun 		.pin = 4,
996*4882a593Smuzhiyun 		.func = 2,
997*4882a593Smuzhiyun 		.route_offset = 0x144,
998*4882a593Smuzhiyun 		.route_val = BIT(16 + 6) | BIT(6),
999*4882a593Smuzhiyun 	},
1000*4882a593Smuzhiyun };
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
1003*4882a593Smuzhiyun 	{
1004*4882a593Smuzhiyun 		/* pwm0-0 */
1005*4882a593Smuzhiyun 		.bank_num = 0,
1006*4882a593Smuzhiyun 		.pin = 26,
1007*4882a593Smuzhiyun 		.func = 1,
1008*4882a593Smuzhiyun 		.route_offset = 0x50,
1009*4882a593Smuzhiyun 		.route_val = BIT(16),
1010*4882a593Smuzhiyun 	}, {
1011*4882a593Smuzhiyun 		/* pwm0-1 */
1012*4882a593Smuzhiyun 		.bank_num = 3,
1013*4882a593Smuzhiyun 		.pin = 21,
1014*4882a593Smuzhiyun 		.func = 1,
1015*4882a593Smuzhiyun 		.route_offset = 0x50,
1016*4882a593Smuzhiyun 		.route_val = BIT(16) | BIT(0),
1017*4882a593Smuzhiyun 	}, {
1018*4882a593Smuzhiyun 		/* pwm1-0 */
1019*4882a593Smuzhiyun 		.bank_num = 0,
1020*4882a593Smuzhiyun 		.pin = 27,
1021*4882a593Smuzhiyun 		.func = 1,
1022*4882a593Smuzhiyun 		.route_offset = 0x50,
1023*4882a593Smuzhiyun 		.route_val = BIT(16 + 1),
1024*4882a593Smuzhiyun 	}, {
1025*4882a593Smuzhiyun 		/* pwm1-1 */
1026*4882a593Smuzhiyun 		.bank_num = 0,
1027*4882a593Smuzhiyun 		.pin = 30,
1028*4882a593Smuzhiyun 		.func = 2,
1029*4882a593Smuzhiyun 		.route_offset = 0x50,
1030*4882a593Smuzhiyun 		.route_val = BIT(16 + 1) | BIT(1),
1031*4882a593Smuzhiyun 	}, {
1032*4882a593Smuzhiyun 		/* pwm2-0 */
1033*4882a593Smuzhiyun 		.bank_num = 0,
1034*4882a593Smuzhiyun 		.pin = 28,
1035*4882a593Smuzhiyun 		.func = 1,
1036*4882a593Smuzhiyun 		.route_offset = 0x50,
1037*4882a593Smuzhiyun 		.route_val = BIT(16 + 2),
1038*4882a593Smuzhiyun 	}, {
1039*4882a593Smuzhiyun 		/* pwm2-1 */
1040*4882a593Smuzhiyun 		.bank_num = 1,
1041*4882a593Smuzhiyun 		.pin = 12,
1042*4882a593Smuzhiyun 		.func = 2,
1043*4882a593Smuzhiyun 		.route_offset = 0x50,
1044*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(2),
1045*4882a593Smuzhiyun 	}, {
1046*4882a593Smuzhiyun 		/* pwm3-0 */
1047*4882a593Smuzhiyun 		.bank_num = 3,
1048*4882a593Smuzhiyun 		.pin = 26,
1049*4882a593Smuzhiyun 		.func = 1,
1050*4882a593Smuzhiyun 		.route_offset = 0x50,
1051*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
1052*4882a593Smuzhiyun 	}, {
1053*4882a593Smuzhiyun 		/* pwm3-1 */
1054*4882a593Smuzhiyun 		.bank_num = 1,
1055*4882a593Smuzhiyun 		.pin = 11,
1056*4882a593Smuzhiyun 		.func = 2,
1057*4882a593Smuzhiyun 		.route_offset = 0x50,
1058*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(3),
1059*4882a593Smuzhiyun 	}, {
1060*4882a593Smuzhiyun 		/* sdio-0_d0 */
1061*4882a593Smuzhiyun 		.bank_num = 1,
1062*4882a593Smuzhiyun 		.pin = 1,
1063*4882a593Smuzhiyun 		.func = 1,
1064*4882a593Smuzhiyun 		.route_offset = 0x50,
1065*4882a593Smuzhiyun 		.route_val = BIT(16 + 4),
1066*4882a593Smuzhiyun 	}, {
1067*4882a593Smuzhiyun 		/* sdio-1_d0 */
1068*4882a593Smuzhiyun 		.bank_num = 3,
1069*4882a593Smuzhiyun 		.pin = 2,
1070*4882a593Smuzhiyun 		.func = 1,
1071*4882a593Smuzhiyun 		.route_offset = 0x50,
1072*4882a593Smuzhiyun 		.route_val = BIT(16 + 4) | BIT(4),
1073*4882a593Smuzhiyun 	}, {
1074*4882a593Smuzhiyun 		/* spi-0_rx */
1075*4882a593Smuzhiyun 		.bank_num = 0,
1076*4882a593Smuzhiyun 		.pin = 13,
1077*4882a593Smuzhiyun 		.func = 2,
1078*4882a593Smuzhiyun 		.route_offset = 0x50,
1079*4882a593Smuzhiyun 		.route_val = BIT(16 + 5),
1080*4882a593Smuzhiyun 	}, {
1081*4882a593Smuzhiyun 		/* spi-1_rx */
1082*4882a593Smuzhiyun 		.bank_num = 2,
1083*4882a593Smuzhiyun 		.pin = 0,
1084*4882a593Smuzhiyun 		.func = 2,
1085*4882a593Smuzhiyun 		.route_offset = 0x50,
1086*4882a593Smuzhiyun 		.route_val = BIT(16 + 5) | BIT(5),
1087*4882a593Smuzhiyun 	}, {
1088*4882a593Smuzhiyun 		/* emmc-0_cmd */
1089*4882a593Smuzhiyun 		.bank_num = 1,
1090*4882a593Smuzhiyun 		.pin = 22,
1091*4882a593Smuzhiyun 		.func = 2,
1092*4882a593Smuzhiyun 		.route_offset = 0x50,
1093*4882a593Smuzhiyun 		.route_val = BIT(16 + 7),
1094*4882a593Smuzhiyun 	}, {
1095*4882a593Smuzhiyun 		/* emmc-1_cmd */
1096*4882a593Smuzhiyun 		.bank_num = 2,
1097*4882a593Smuzhiyun 		.pin = 4,
1098*4882a593Smuzhiyun 		.func = 2,
1099*4882a593Smuzhiyun 		.route_offset = 0x50,
1100*4882a593Smuzhiyun 		.route_val = BIT(16 + 7) | BIT(7),
1101*4882a593Smuzhiyun 	}, {
1102*4882a593Smuzhiyun 		/* uart2-0_rx */
1103*4882a593Smuzhiyun 		.bank_num = 1,
1104*4882a593Smuzhiyun 		.pin = 19,
1105*4882a593Smuzhiyun 		.func = 2,
1106*4882a593Smuzhiyun 		.route_offset = 0x50,
1107*4882a593Smuzhiyun 		.route_val = BIT(16 + 8),
1108*4882a593Smuzhiyun 	}, {
1109*4882a593Smuzhiyun 		/* uart2-1_rx */
1110*4882a593Smuzhiyun 		.bank_num = 1,
1111*4882a593Smuzhiyun 		.pin = 10,
1112*4882a593Smuzhiyun 		.func = 2,
1113*4882a593Smuzhiyun 		.route_offset = 0x50,
1114*4882a593Smuzhiyun 		.route_val = BIT(16 + 8) | BIT(8),
1115*4882a593Smuzhiyun 	}, {
1116*4882a593Smuzhiyun 		/* uart1-0_rx */
1117*4882a593Smuzhiyun 		.bank_num = 1,
1118*4882a593Smuzhiyun 		.pin = 10,
1119*4882a593Smuzhiyun 		.func = 1,
1120*4882a593Smuzhiyun 		.route_offset = 0x50,
1121*4882a593Smuzhiyun 		.route_val = BIT(16 + 11),
1122*4882a593Smuzhiyun 	}, {
1123*4882a593Smuzhiyun 		/* uart1-1_rx */
1124*4882a593Smuzhiyun 		.bank_num = 3,
1125*4882a593Smuzhiyun 		.pin = 13,
1126*4882a593Smuzhiyun 		.func = 1,
1127*4882a593Smuzhiyun 		.route_offset = 0x50,
1128*4882a593Smuzhiyun 		.route_val = BIT(16 + 11) | BIT(11),
1129*4882a593Smuzhiyun 	},
1130*4882a593Smuzhiyun };
1131*4882a593Smuzhiyun 
1132*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
1133*4882a593Smuzhiyun 	{
1134*4882a593Smuzhiyun 		/* edphdmi_cecinoutt1 */
1135*4882a593Smuzhiyun 		.bank_num = 7,
1136*4882a593Smuzhiyun 		.pin = 16,
1137*4882a593Smuzhiyun 		.func = 2,
1138*4882a593Smuzhiyun 		.route_offset = 0x264,
1139*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(12),
1140*4882a593Smuzhiyun 	}, {
1141*4882a593Smuzhiyun 		/* edphdmi_cecinout */
1142*4882a593Smuzhiyun 		.bank_num = 7,
1143*4882a593Smuzhiyun 		.pin = 23,
1144*4882a593Smuzhiyun 		.func = 4,
1145*4882a593Smuzhiyun 		.route_offset = 0x264,
1146*4882a593Smuzhiyun 		.route_val = BIT(16 + 12),
1147*4882a593Smuzhiyun 	},
1148*4882a593Smuzhiyun };
1149*4882a593Smuzhiyun 
1150*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
1151*4882a593Smuzhiyun 	{
1152*4882a593Smuzhiyun 		/* rtc_clk */
1153*4882a593Smuzhiyun 		.bank_num = 0,
1154*4882a593Smuzhiyun 		.pin = 19,
1155*4882a593Smuzhiyun 		.func = 1,
1156*4882a593Smuzhiyun 		.route_offset = 0x314,
1157*4882a593Smuzhiyun 		.route_val = BIT(16 + 0) | BIT(0),
1158*4882a593Smuzhiyun 	}, {
1159*4882a593Smuzhiyun 		/* uart2_rxm0 */
1160*4882a593Smuzhiyun 		.bank_num = 1,
1161*4882a593Smuzhiyun 		.pin = 22,
1162*4882a593Smuzhiyun 		.func = 2,
1163*4882a593Smuzhiyun 		.route_offset = 0x314,
1164*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1165*4882a593Smuzhiyun 	}, {
1166*4882a593Smuzhiyun 		/* uart2_rxm1 */
1167*4882a593Smuzhiyun 		.bank_num = 4,
1168*4882a593Smuzhiyun 		.pin = 26,
1169*4882a593Smuzhiyun 		.func = 2,
1170*4882a593Smuzhiyun 		.route_offset = 0x314,
1171*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1172*4882a593Smuzhiyun 	}, {
1173*4882a593Smuzhiyun 		/* i2c3_sdam0 */
1174*4882a593Smuzhiyun 		.bank_num = 0,
1175*4882a593Smuzhiyun 		.pin = 23,
1176*4882a593Smuzhiyun 		.func = 2,
1177*4882a593Smuzhiyun 		.route_offset = 0x314,
1178*4882a593Smuzhiyun 		.route_val = BIT(16 + 4),
1179*4882a593Smuzhiyun 	}, {
1180*4882a593Smuzhiyun 		/* i2c3_sdam1 */
1181*4882a593Smuzhiyun 		.bank_num = 3,
1182*4882a593Smuzhiyun 		.pin = 12,
1183*4882a593Smuzhiyun 		.func = 2,
1184*4882a593Smuzhiyun 		.route_offset = 0x314,
1185*4882a593Smuzhiyun 		.route_val = BIT(16 + 4) | BIT(4),
1186*4882a593Smuzhiyun 	}, {
1187*4882a593Smuzhiyun 		/* i2s-8ch-1-sclktxm0 */
1188*4882a593Smuzhiyun 		.bank_num = 1,
1189*4882a593Smuzhiyun 		.pin = 3,
1190*4882a593Smuzhiyun 		.func = 2,
1191*4882a593Smuzhiyun 		.route_offset = 0x308,
1192*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
1193*4882a593Smuzhiyun 	}, {
1194*4882a593Smuzhiyun 		/* i2s-8ch-1-sclkrxm0 */
1195*4882a593Smuzhiyun 		.bank_num = 1,
1196*4882a593Smuzhiyun 		.pin = 4,
1197*4882a593Smuzhiyun 		.func = 2,
1198*4882a593Smuzhiyun 		.route_offset = 0x308,
1199*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
1200*4882a593Smuzhiyun 	}, {
1201*4882a593Smuzhiyun 		/* i2s-8ch-1-sclktxm1 */
1202*4882a593Smuzhiyun 		.bank_num = 1,
1203*4882a593Smuzhiyun 		.pin = 13,
1204*4882a593Smuzhiyun 		.func = 2,
1205*4882a593Smuzhiyun 		.route_offset = 0x308,
1206*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(3),
1207*4882a593Smuzhiyun 	}, {
1208*4882a593Smuzhiyun 		/* i2s-8ch-1-sclkrxm1 */
1209*4882a593Smuzhiyun 		.bank_num = 1,
1210*4882a593Smuzhiyun 		.pin = 14,
1211*4882a593Smuzhiyun 		.func = 2,
1212*4882a593Smuzhiyun 		.route_offset = 0x308,
1213*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(3),
1214*4882a593Smuzhiyun 	}, {
1215*4882a593Smuzhiyun 		/* pdm-clkm0 */
1216*4882a593Smuzhiyun 		.bank_num = 1,
1217*4882a593Smuzhiyun 		.pin = 4,
1218*4882a593Smuzhiyun 		.func = 3,
1219*4882a593Smuzhiyun 		.route_offset = 0x308,
1220*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1221*4882a593Smuzhiyun 	}, {
1222*4882a593Smuzhiyun 		/* pdm-clkm1 */
1223*4882a593Smuzhiyun 		.bank_num = 1,
1224*4882a593Smuzhiyun 		.pin = 14,
1225*4882a593Smuzhiyun 		.func = 4,
1226*4882a593Smuzhiyun 		.route_offset = 0x308,
1227*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1228*4882a593Smuzhiyun 	}, {
1229*4882a593Smuzhiyun 		/* pdm-clkm2 */
1230*4882a593Smuzhiyun 		.bank_num = 2,
1231*4882a593Smuzhiyun 		.pin = 6,
1232*4882a593Smuzhiyun 		.func = 2,
1233*4882a593Smuzhiyun 		.route_offset = 0x308,
1234*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1235*4882a593Smuzhiyun 	}, {
1236*4882a593Smuzhiyun 		/* pdm-clkm-m2 */
1237*4882a593Smuzhiyun 		.bank_num = 2,
1238*4882a593Smuzhiyun 		.pin = 4,
1239*4882a593Smuzhiyun 		.func = 3,
1240*4882a593Smuzhiyun 		.route_offset = 0x600,
1241*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(2),
1242*4882a593Smuzhiyun 	},
1243*4882a593Smuzhiyun };
1244*4882a593Smuzhiyun 
1245*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
1246*4882a593Smuzhiyun 	{
1247*4882a593Smuzhiyun 		/* rtc_clk */
1248*4882a593Smuzhiyun 		.bank_num = 0,
1249*4882a593Smuzhiyun 		.pin = 19,
1250*4882a593Smuzhiyun 		.func = 1,
1251*4882a593Smuzhiyun 		.route_offset = 0x314,
1252*4882a593Smuzhiyun 		.route_val = BIT(16 + 0) | BIT(0),
1253*4882a593Smuzhiyun 	}, {
1254*4882a593Smuzhiyun 		/* uart2_rxm0 */
1255*4882a593Smuzhiyun 		.bank_num = 1,
1256*4882a593Smuzhiyun 		.pin = 22,
1257*4882a593Smuzhiyun 		.func = 2,
1258*4882a593Smuzhiyun 		.route_offset = 0x314,
1259*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(16 + 3),
1260*4882a593Smuzhiyun 	}, {
1261*4882a593Smuzhiyun 		/* uart2_rxm1 */
1262*4882a593Smuzhiyun 		.bank_num = 4,
1263*4882a593Smuzhiyun 		.pin = 26,
1264*4882a593Smuzhiyun 		.func = 2,
1265*4882a593Smuzhiyun 		.route_offset = 0x314,
1266*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
1267*4882a593Smuzhiyun 	}, {
1268*4882a593Smuzhiyun 		/* i2c3_sdam0 */
1269*4882a593Smuzhiyun 		.bank_num = 0,
1270*4882a593Smuzhiyun 		.pin = 15,
1271*4882a593Smuzhiyun 		.func = 2,
1272*4882a593Smuzhiyun 		.route_offset = 0x608,
1273*4882a593Smuzhiyun 		.route_val = BIT(16 + 8) | BIT(16 + 9),
1274*4882a593Smuzhiyun 	}, {
1275*4882a593Smuzhiyun 		/* i2c3_sdam1 */
1276*4882a593Smuzhiyun 		.bank_num = 3,
1277*4882a593Smuzhiyun 		.pin = 12,
1278*4882a593Smuzhiyun 		.func = 2,
1279*4882a593Smuzhiyun 		.route_offset = 0x608,
1280*4882a593Smuzhiyun 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
1281*4882a593Smuzhiyun 	}, {
1282*4882a593Smuzhiyun 		/* i2c3_sdam2 */
1283*4882a593Smuzhiyun 		.bank_num = 2,
1284*4882a593Smuzhiyun 		.pin = 0,
1285*4882a593Smuzhiyun 		.func = 3,
1286*4882a593Smuzhiyun 		.route_offset = 0x608,
1287*4882a593Smuzhiyun 		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
1288*4882a593Smuzhiyun 	}, {
1289*4882a593Smuzhiyun 		/* i2s-8ch-1-sclktxm0 */
1290*4882a593Smuzhiyun 		.bank_num = 1,
1291*4882a593Smuzhiyun 		.pin = 3,
1292*4882a593Smuzhiyun 		.func = 2,
1293*4882a593Smuzhiyun 		.route_offset = 0x308,
1294*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
1295*4882a593Smuzhiyun 	}, {
1296*4882a593Smuzhiyun 		/* i2s-8ch-1-sclkrxm0 */
1297*4882a593Smuzhiyun 		.bank_num = 1,
1298*4882a593Smuzhiyun 		.pin = 4,
1299*4882a593Smuzhiyun 		.func = 2,
1300*4882a593Smuzhiyun 		.route_offset = 0x308,
1301*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
1302*4882a593Smuzhiyun 	}, {
1303*4882a593Smuzhiyun 		/* i2s-8ch-1-sclktxm1 */
1304*4882a593Smuzhiyun 		.bank_num = 1,
1305*4882a593Smuzhiyun 		.pin = 13,
1306*4882a593Smuzhiyun 		.func = 2,
1307*4882a593Smuzhiyun 		.route_offset = 0x308,
1308*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(3),
1309*4882a593Smuzhiyun 	}, {
1310*4882a593Smuzhiyun 		/* i2s-8ch-1-sclkrxm1 */
1311*4882a593Smuzhiyun 		.bank_num = 1,
1312*4882a593Smuzhiyun 		.pin = 14,
1313*4882a593Smuzhiyun 		.func = 2,
1314*4882a593Smuzhiyun 		.route_offset = 0x308,
1315*4882a593Smuzhiyun 		.route_val = BIT(16 + 3) | BIT(3),
1316*4882a593Smuzhiyun 	}, {
1317*4882a593Smuzhiyun 		/* pdm-clkm0 */
1318*4882a593Smuzhiyun 		.bank_num = 1,
1319*4882a593Smuzhiyun 		.pin = 4,
1320*4882a593Smuzhiyun 		.func = 3,
1321*4882a593Smuzhiyun 		.route_offset = 0x308,
1322*4882a593Smuzhiyun 		.route_val =  BIT(16 + 12) | BIT(16 + 13),
1323*4882a593Smuzhiyun 	}, {
1324*4882a593Smuzhiyun 		/* pdm-clkm1 */
1325*4882a593Smuzhiyun 		.bank_num = 1,
1326*4882a593Smuzhiyun 		.pin = 14,
1327*4882a593Smuzhiyun 		.func = 4,
1328*4882a593Smuzhiyun 		.route_offset = 0x308,
1329*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1330*4882a593Smuzhiyun 	}, {
1331*4882a593Smuzhiyun 		/* pdm-clkm2 */
1332*4882a593Smuzhiyun 		.bank_num = 2,
1333*4882a593Smuzhiyun 		.pin = 6,
1334*4882a593Smuzhiyun 		.func = 2,
1335*4882a593Smuzhiyun 		.route_offset = 0x308,
1336*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1337*4882a593Smuzhiyun 	}, {
1338*4882a593Smuzhiyun 		/* pdm-clkm-m2 */
1339*4882a593Smuzhiyun 		.bank_num = 2,
1340*4882a593Smuzhiyun 		.pin = 4,
1341*4882a593Smuzhiyun 		.func = 3,
1342*4882a593Smuzhiyun 		.route_offset = 0x600,
1343*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(2),
1344*4882a593Smuzhiyun 	}, {
1345*4882a593Smuzhiyun 		/* spi1_miso */
1346*4882a593Smuzhiyun 		.bank_num = 3,
1347*4882a593Smuzhiyun 		.pin = 10,
1348*4882a593Smuzhiyun 		.func = 3,
1349*4882a593Smuzhiyun 		.route_offset = 0x314,
1350*4882a593Smuzhiyun 		.route_val = BIT(16 + 9),
1351*4882a593Smuzhiyun 	}, {
1352*4882a593Smuzhiyun 		/* spi1_miso_m1 */
1353*4882a593Smuzhiyun 		.bank_num = 2,
1354*4882a593Smuzhiyun 		.pin = 4,
1355*4882a593Smuzhiyun 		.func = 2,
1356*4882a593Smuzhiyun 		.route_offset = 0x314,
1357*4882a593Smuzhiyun 		.route_val = BIT(16 + 9) | BIT(9),
1358*4882a593Smuzhiyun 	}, {
1359*4882a593Smuzhiyun 		/* owire_m0 */
1360*4882a593Smuzhiyun 		.bank_num = 0,
1361*4882a593Smuzhiyun 		.pin = 11,
1362*4882a593Smuzhiyun 		.func = 3,
1363*4882a593Smuzhiyun 		.route_offset = 0x314,
1364*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1365*4882a593Smuzhiyun 	}, {
1366*4882a593Smuzhiyun 		/* owire_m1 */
1367*4882a593Smuzhiyun 		.bank_num = 1,
1368*4882a593Smuzhiyun 		.pin = 22,
1369*4882a593Smuzhiyun 		.func = 7,
1370*4882a593Smuzhiyun 		.route_offset = 0x314,
1371*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1372*4882a593Smuzhiyun 	}, {
1373*4882a593Smuzhiyun 		/* owire_m2 */
1374*4882a593Smuzhiyun 		.bank_num = 2,
1375*4882a593Smuzhiyun 		.pin = 2,
1376*4882a593Smuzhiyun 		.func = 5,
1377*4882a593Smuzhiyun 		.route_offset = 0x314,
1378*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1379*4882a593Smuzhiyun 	}, {
1380*4882a593Smuzhiyun 		/* can_rxd_m0 */
1381*4882a593Smuzhiyun 		.bank_num = 0,
1382*4882a593Smuzhiyun 		.pin = 11,
1383*4882a593Smuzhiyun 		.func = 2,
1384*4882a593Smuzhiyun 		.route_offset = 0x314,
1385*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13),
1386*4882a593Smuzhiyun 	}, {
1387*4882a593Smuzhiyun 		/* can_rxd_m1 */
1388*4882a593Smuzhiyun 		.bank_num = 1,
1389*4882a593Smuzhiyun 		.pin = 22,
1390*4882a593Smuzhiyun 		.func = 5,
1391*4882a593Smuzhiyun 		.route_offset = 0x314,
1392*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
1393*4882a593Smuzhiyun 	}, {
1394*4882a593Smuzhiyun 		/* can_rxd_m2 */
1395*4882a593Smuzhiyun 		.bank_num = 2,
1396*4882a593Smuzhiyun 		.pin = 2,
1397*4882a593Smuzhiyun 		.func = 4,
1398*4882a593Smuzhiyun 		.route_offset = 0x314,
1399*4882a593Smuzhiyun 		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
1400*4882a593Smuzhiyun 	}, {
1401*4882a593Smuzhiyun 		/* mac_rxd0_m0 */
1402*4882a593Smuzhiyun 		.bank_num = 1,
1403*4882a593Smuzhiyun 		.pin = 20,
1404*4882a593Smuzhiyun 		.func = 3,
1405*4882a593Smuzhiyun 		.route_offset = 0x314,
1406*4882a593Smuzhiyun 		.route_val = BIT(16 + 14),
1407*4882a593Smuzhiyun 	}, {
1408*4882a593Smuzhiyun 		/* mac_rxd0_m1 */
1409*4882a593Smuzhiyun 		.bank_num = 4,
1410*4882a593Smuzhiyun 		.pin = 2,
1411*4882a593Smuzhiyun 		.func = 2,
1412*4882a593Smuzhiyun 		.route_offset = 0x314,
1413*4882a593Smuzhiyun 		.route_val = BIT(16 + 14) | BIT(14),
1414*4882a593Smuzhiyun 	}, {
1415*4882a593Smuzhiyun 		/* uart3_rx */
1416*4882a593Smuzhiyun 		.bank_num = 3,
1417*4882a593Smuzhiyun 		.pin = 12,
1418*4882a593Smuzhiyun 		.func = 4,
1419*4882a593Smuzhiyun 		.route_offset = 0x314,
1420*4882a593Smuzhiyun 		.route_val = BIT(16 + 15),
1421*4882a593Smuzhiyun 	}, {
1422*4882a593Smuzhiyun 		/* uart3_rx_m1 */
1423*4882a593Smuzhiyun 		.bank_num = 0,
1424*4882a593Smuzhiyun 		.pin = 17,
1425*4882a593Smuzhiyun 		.func = 3,
1426*4882a593Smuzhiyun 		.route_offset = 0x314,
1427*4882a593Smuzhiyun 		.route_val = BIT(16 + 15) | BIT(15),
1428*4882a593Smuzhiyun 	},
1429*4882a593Smuzhiyun };
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
1432*4882a593Smuzhiyun 	{
1433*4882a593Smuzhiyun 		/* uart2dbg_rxm0 */
1434*4882a593Smuzhiyun 		.bank_num = 1,
1435*4882a593Smuzhiyun 		.pin = 1,
1436*4882a593Smuzhiyun 		.func = 2,
1437*4882a593Smuzhiyun 		.route_offset = 0x50,
1438*4882a593Smuzhiyun 		.route_val = BIT(16) | BIT(16 + 1),
1439*4882a593Smuzhiyun 	}, {
1440*4882a593Smuzhiyun 		/* uart2dbg_rxm1 */
1441*4882a593Smuzhiyun 		.bank_num = 2,
1442*4882a593Smuzhiyun 		.pin = 1,
1443*4882a593Smuzhiyun 		.func = 1,
1444*4882a593Smuzhiyun 		.route_offset = 0x50,
1445*4882a593Smuzhiyun 		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
1446*4882a593Smuzhiyun 	}, {
1447*4882a593Smuzhiyun 		/* gmac-m1_rxd0 */
1448*4882a593Smuzhiyun 		.bank_num = 1,
1449*4882a593Smuzhiyun 		.pin = 11,
1450*4882a593Smuzhiyun 		.func = 2,
1451*4882a593Smuzhiyun 		.route_offset = 0x50,
1452*4882a593Smuzhiyun 		.route_val = BIT(16 + 2) | BIT(2),
1453*4882a593Smuzhiyun 	}, {
1454*4882a593Smuzhiyun 		/* gmac-m1-optimized_rxd3 */
1455*4882a593Smuzhiyun 		.bank_num = 1,
1456*4882a593Smuzhiyun 		.pin = 14,
1457*4882a593Smuzhiyun 		.func = 2,
1458*4882a593Smuzhiyun 		.route_offset = 0x50,
1459*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(10),
1460*4882a593Smuzhiyun 	}, {
1461*4882a593Smuzhiyun 		/* pdm_sdi0m0 */
1462*4882a593Smuzhiyun 		.bank_num = 2,
1463*4882a593Smuzhiyun 		.pin = 19,
1464*4882a593Smuzhiyun 		.func = 2,
1465*4882a593Smuzhiyun 		.route_offset = 0x50,
1466*4882a593Smuzhiyun 		.route_val = BIT(16 + 3),
1467*4882a593Smuzhiyun 	}, {
1468*4882a593Smuzhiyun 		/* pdm_sdi0m1 */
1469*4882a593Smuzhiyun 		.bank_num = 1,
1470*4882a593Smuzhiyun 		.pin = 23,
1471*4882a593Smuzhiyun 		.func = 3,
1472*4882a593Smuzhiyun 		.route_offset = 0x50,
1473*4882a593Smuzhiyun 		.route_val =  BIT(16 + 3) | BIT(3),
1474*4882a593Smuzhiyun 	}, {
1475*4882a593Smuzhiyun 		/* spi_rxdm2 */
1476*4882a593Smuzhiyun 		.bank_num = 3,
1477*4882a593Smuzhiyun 		.pin = 2,
1478*4882a593Smuzhiyun 		.func = 4,
1479*4882a593Smuzhiyun 		.route_offset = 0x50,
1480*4882a593Smuzhiyun 		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
1481*4882a593Smuzhiyun 	}, {
1482*4882a593Smuzhiyun 		/* i2s2_sdim0 */
1483*4882a593Smuzhiyun 		.bank_num = 1,
1484*4882a593Smuzhiyun 		.pin = 24,
1485*4882a593Smuzhiyun 		.func = 1,
1486*4882a593Smuzhiyun 		.route_offset = 0x50,
1487*4882a593Smuzhiyun 		.route_val = BIT(16 + 6),
1488*4882a593Smuzhiyun 	}, {
1489*4882a593Smuzhiyun 		/* i2s2_sdim1 */
1490*4882a593Smuzhiyun 		.bank_num = 3,
1491*4882a593Smuzhiyun 		.pin = 2,
1492*4882a593Smuzhiyun 		.func = 6,
1493*4882a593Smuzhiyun 		.route_offset = 0x50,
1494*4882a593Smuzhiyun 		.route_val =  BIT(16 + 6) | BIT(6),
1495*4882a593Smuzhiyun 	}, {
1496*4882a593Smuzhiyun 		/* card_iom1 */
1497*4882a593Smuzhiyun 		.bank_num = 2,
1498*4882a593Smuzhiyun 		.pin = 22,
1499*4882a593Smuzhiyun 		.func = 3,
1500*4882a593Smuzhiyun 		.route_offset = 0x50,
1501*4882a593Smuzhiyun 		.route_val =  BIT(16 + 7) | BIT(7),
1502*4882a593Smuzhiyun 	}, {
1503*4882a593Smuzhiyun 		/* tsp_d5m1 */
1504*4882a593Smuzhiyun 		.bank_num = 2,
1505*4882a593Smuzhiyun 		.pin = 16,
1506*4882a593Smuzhiyun 		.func = 3,
1507*4882a593Smuzhiyun 		.route_offset = 0x50,
1508*4882a593Smuzhiyun 		.route_val =  BIT(16 + 8) | BIT(8),
1509*4882a593Smuzhiyun 	}, {
1510*4882a593Smuzhiyun 		/* cif_data5m1 */
1511*4882a593Smuzhiyun 		.bank_num = 2,
1512*4882a593Smuzhiyun 		.pin = 16,
1513*4882a593Smuzhiyun 		.func = 4,
1514*4882a593Smuzhiyun 		.route_offset = 0x50,
1515*4882a593Smuzhiyun 		.route_val =  BIT(16 + 9) | BIT(9),
1516*4882a593Smuzhiyun 	},
1517*4882a593Smuzhiyun };
1518*4882a593Smuzhiyun 
1519*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
1520*4882a593Smuzhiyun 	{
1521*4882a593Smuzhiyun 		/* uart2dbga_rx */
1522*4882a593Smuzhiyun 		.bank_num = 4,
1523*4882a593Smuzhiyun 		.pin = 8,
1524*4882a593Smuzhiyun 		.func = 2,
1525*4882a593Smuzhiyun 		.route_offset = 0xe21c,
1526*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(16 + 11),
1527*4882a593Smuzhiyun 	}, {
1528*4882a593Smuzhiyun 		/* uart2dbgb_rx */
1529*4882a593Smuzhiyun 		.bank_num = 4,
1530*4882a593Smuzhiyun 		.pin = 16,
1531*4882a593Smuzhiyun 		.func = 2,
1532*4882a593Smuzhiyun 		.route_offset = 0xe21c,
1533*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
1534*4882a593Smuzhiyun 	}, {
1535*4882a593Smuzhiyun 		/* uart2dbgc_rx */
1536*4882a593Smuzhiyun 		.bank_num = 4,
1537*4882a593Smuzhiyun 		.pin = 19,
1538*4882a593Smuzhiyun 		.func = 1,
1539*4882a593Smuzhiyun 		.route_offset = 0xe21c,
1540*4882a593Smuzhiyun 		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
1541*4882a593Smuzhiyun 	}, {
1542*4882a593Smuzhiyun 		/* pcie_clkreqn */
1543*4882a593Smuzhiyun 		.bank_num = 2,
1544*4882a593Smuzhiyun 		.pin = 26,
1545*4882a593Smuzhiyun 		.func = 2,
1546*4882a593Smuzhiyun 		.route_offset = 0xe21c,
1547*4882a593Smuzhiyun 		.route_val = BIT(16 + 14),
1548*4882a593Smuzhiyun 	}, {
1549*4882a593Smuzhiyun 		/* pcie_clkreqnb */
1550*4882a593Smuzhiyun 		.bank_num = 4,
1551*4882a593Smuzhiyun 		.pin = 24,
1552*4882a593Smuzhiyun 		.func = 1,
1553*4882a593Smuzhiyun 		.route_offset = 0xe21c,
1554*4882a593Smuzhiyun 		.route_val = BIT(16 + 14) | BIT(14),
1555*4882a593Smuzhiyun 	},
1556*4882a593Smuzhiyun };
1557*4882a593Smuzhiyun 
1558*4882a593Smuzhiyun static enum rockchip_pin_route_type
rockchip_get_mux_route(struct rockchip_pin_bank * bank,int pin,int mux,u32 * reg,u32 * value)1559*4882a593Smuzhiyun rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
1560*4882a593Smuzhiyun 		       int mux, u32 *reg, u32 *value)
1561*4882a593Smuzhiyun {
1562*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1563*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
1564*4882a593Smuzhiyun 	struct rockchip_mux_route_data *data;
1565*4882a593Smuzhiyun 	int i;
1566*4882a593Smuzhiyun 
1567*4882a593Smuzhiyun 	for (i = 0; i < ctrl->niomux_routes; i++) {
1568*4882a593Smuzhiyun 		data = &ctrl->iomux_routes[i];
1569*4882a593Smuzhiyun 		if ((data->bank_num == bank->bank_num) &&
1570*4882a593Smuzhiyun 		    (data->pin == pin) && (data->func == mux))
1571*4882a593Smuzhiyun 			break;
1572*4882a593Smuzhiyun 	}
1573*4882a593Smuzhiyun 
1574*4882a593Smuzhiyun 	if (i >= ctrl->niomux_routes)
1575*4882a593Smuzhiyun 		return ROUTE_TYPE_INVALID;
1576*4882a593Smuzhiyun 
1577*4882a593Smuzhiyun 	*reg = data->route_offset;
1578*4882a593Smuzhiyun 	*value = data->route_val;
1579*4882a593Smuzhiyun 
1580*4882a593Smuzhiyun 	return data->route_type;
1581*4882a593Smuzhiyun }
1582*4882a593Smuzhiyun 
rockchip_get_mux(struct rockchip_pin_bank * bank,int pin)1583*4882a593Smuzhiyun static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
1584*4882a593Smuzhiyun {
1585*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1586*4882a593Smuzhiyun 	int iomux_num = (pin / 8);
1587*4882a593Smuzhiyun 	struct regmap *regmap;
1588*4882a593Smuzhiyun 	unsigned int val;
1589*4882a593Smuzhiyun 	int reg, ret, mask, mux_type;
1590*4882a593Smuzhiyun 	u8 bit;
1591*4882a593Smuzhiyun 
1592*4882a593Smuzhiyun 	if (iomux_num > 3)
1593*4882a593Smuzhiyun 		return -EINVAL;
1594*4882a593Smuzhiyun 
1595*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1596*4882a593Smuzhiyun 		debug("pin %d is unrouted\n", pin);
1597*4882a593Smuzhiyun 		return -EINVAL;
1598*4882a593Smuzhiyun 	}
1599*4882a593Smuzhiyun 
1600*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
1601*4882a593Smuzhiyun 		return RK_FUNC_GPIO;
1602*4882a593Smuzhiyun 
1603*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1604*4882a593Smuzhiyun 		regmap = priv->regmap_pmu;
1605*4882a593Smuzhiyun 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1606*4882a593Smuzhiyun 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1607*4882a593Smuzhiyun 	else
1608*4882a593Smuzhiyun 		regmap = priv->regmap_base;
1609*4882a593Smuzhiyun 
1610*4882a593Smuzhiyun 	/* get basic quadrupel of mux registers and the correct reg inside */
1611*4882a593Smuzhiyun 	mux_type = bank->iomux[iomux_num].type;
1612*4882a593Smuzhiyun 	reg = bank->iomux[iomux_num].offset;
1613*4882a593Smuzhiyun 	if (mux_type & IOMUX_WIDTH_4BIT) {
1614*4882a593Smuzhiyun 		if ((pin % 8) >= 4)
1615*4882a593Smuzhiyun 			reg += 0x4;
1616*4882a593Smuzhiyun 		bit = (pin % 4) * 4;
1617*4882a593Smuzhiyun 		mask = 0xf;
1618*4882a593Smuzhiyun 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
1619*4882a593Smuzhiyun 		if ((pin % 8) >= 5)
1620*4882a593Smuzhiyun 			reg += 0x4;
1621*4882a593Smuzhiyun 		bit = (pin % 8 % 5) * 3;
1622*4882a593Smuzhiyun 		mask = 0x7;
1623*4882a593Smuzhiyun 	} else {
1624*4882a593Smuzhiyun 		bit = (pin % 8) * 2;
1625*4882a593Smuzhiyun 		mask = 0x3;
1626*4882a593Smuzhiyun 	}
1627*4882a593Smuzhiyun 
1628*4882a593Smuzhiyun 	if (bank->recalced_mask & BIT(pin))
1629*4882a593Smuzhiyun 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun 	ret = regmap_read(regmap, reg, &val);
1632*4882a593Smuzhiyun 	if (ret)
1633*4882a593Smuzhiyun 		return ret;
1634*4882a593Smuzhiyun 
1635*4882a593Smuzhiyun 	return ((val >> bit) & mask);
1636*4882a593Smuzhiyun }
1637*4882a593Smuzhiyun 
rockchip_pinctrl_get_gpio_mux(struct udevice * dev,int banknum,int index)1638*4882a593Smuzhiyun static int rockchip_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
1639*4882a593Smuzhiyun 					 int index)
1640*4882a593Smuzhiyun {	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
1641*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
1642*4882a593Smuzhiyun 
1643*4882a593Smuzhiyun 	return rockchip_get_mux(&ctrl->pin_banks[banknum], index);
1644*4882a593Smuzhiyun }
1645*4882a593Smuzhiyun 
rockchip_verify_mux(struct rockchip_pin_bank * bank,int pin,int mux)1646*4882a593Smuzhiyun static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
1647*4882a593Smuzhiyun 			       int pin, int mux)
1648*4882a593Smuzhiyun {
1649*4882a593Smuzhiyun 	int iomux_num = (pin / 8);
1650*4882a593Smuzhiyun 
1651*4882a593Smuzhiyun 	if (iomux_num > 3)
1652*4882a593Smuzhiyun 		return -EINVAL;
1653*4882a593Smuzhiyun 
1654*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1655*4882a593Smuzhiyun 		debug("pin %d is unrouted\n", pin);
1656*4882a593Smuzhiyun 		return -EINVAL;
1657*4882a593Smuzhiyun 	}
1658*4882a593Smuzhiyun 
1659*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
1660*4882a593Smuzhiyun 		if (mux != IOMUX_GPIO_ONLY) {
1661*4882a593Smuzhiyun 			debug("pin %d only supports a gpio mux\n", pin);
1662*4882a593Smuzhiyun 			return -ENOTSUPP;
1663*4882a593Smuzhiyun 		}
1664*4882a593Smuzhiyun 	}
1665*4882a593Smuzhiyun 
1666*4882a593Smuzhiyun 	return 0;
1667*4882a593Smuzhiyun }
1668*4882a593Smuzhiyun 
1669*4882a593Smuzhiyun /*
1670*4882a593Smuzhiyun  * Set a new mux function for a pin.
1671*4882a593Smuzhiyun  *
1672*4882a593Smuzhiyun  * The register is divided into the upper and lower 16 bit. When changing
1673*4882a593Smuzhiyun  * a value, the previous register value is not read and changed. Instead
1674*4882a593Smuzhiyun  * it seems the changed bits are marked in the upper 16 bit, while the
1675*4882a593Smuzhiyun  * changed value gets set in the same offset in the lower 16 bit.
1676*4882a593Smuzhiyun  * All pin settings seem to be 2 bit wide in both the upper and lower
1677*4882a593Smuzhiyun  * parts.
1678*4882a593Smuzhiyun  * @bank: pin bank to change
1679*4882a593Smuzhiyun  * @pin: pin to change
1680*4882a593Smuzhiyun  * @mux: new mux function to set
1681*4882a593Smuzhiyun  */
rockchip_set_mux(struct rockchip_pin_bank * bank,int pin,int mux)1682*4882a593Smuzhiyun static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
1683*4882a593Smuzhiyun {
1684*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1685*4882a593Smuzhiyun 	int iomux_num = (pin / 8);
1686*4882a593Smuzhiyun 	struct regmap *regmap;
1687*4882a593Smuzhiyun 	int reg, ret, mask, mux_type;
1688*4882a593Smuzhiyun 	u8 bit;
1689*4882a593Smuzhiyun 	u32 data;
1690*4882a593Smuzhiyun 
1691*4882a593Smuzhiyun 	ret = rockchip_verify_mux(bank, pin, mux);
1692*4882a593Smuzhiyun 	if (ret < 0)
1693*4882a593Smuzhiyun 		return ret;
1694*4882a593Smuzhiyun 
1695*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
1696*4882a593Smuzhiyun 		return 0;
1697*4882a593Smuzhiyun 
1698*4882a593Smuzhiyun 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
1699*4882a593Smuzhiyun 
1700*4882a593Smuzhiyun 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1701*4882a593Smuzhiyun 		regmap = priv->regmap_pmu;
1702*4882a593Smuzhiyun 	else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1703*4882a593Smuzhiyun 		regmap = (pin % 8 < 4) ? priv->regmap_pmu : priv->regmap_base;
1704*4882a593Smuzhiyun 	else
1705*4882a593Smuzhiyun 		regmap = priv->regmap_base;
1706*4882a593Smuzhiyun 
1707*4882a593Smuzhiyun 	/* get basic quadrupel of mux registers and the correct reg inside */
1708*4882a593Smuzhiyun 	mux_type = bank->iomux[iomux_num].type;
1709*4882a593Smuzhiyun 	reg = bank->iomux[iomux_num].offset;
1710*4882a593Smuzhiyun 	if (mux_type & IOMUX_WIDTH_4BIT) {
1711*4882a593Smuzhiyun 		if ((pin % 8) >= 4)
1712*4882a593Smuzhiyun 			reg += 0x4;
1713*4882a593Smuzhiyun 		bit = (pin % 4) * 4;
1714*4882a593Smuzhiyun 		mask = 0xf;
1715*4882a593Smuzhiyun 	} else if (mux_type & IOMUX_WIDTH_3BIT) {
1716*4882a593Smuzhiyun 		if ((pin % 8) >= 5)
1717*4882a593Smuzhiyun 			reg += 0x4;
1718*4882a593Smuzhiyun 		bit = (pin % 8 % 5) * 3;
1719*4882a593Smuzhiyun 		mask = 0x7;
1720*4882a593Smuzhiyun 	} else {
1721*4882a593Smuzhiyun 		bit = (pin % 8) * 2;
1722*4882a593Smuzhiyun 		mask = 0x3;
1723*4882a593Smuzhiyun 	}
1724*4882a593Smuzhiyun 
1725*4882a593Smuzhiyun 	if (bank->recalced_mask & BIT(pin))
1726*4882a593Smuzhiyun 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
1727*4882a593Smuzhiyun 
1728*4882a593Smuzhiyun 	if (bank->route_mask & BIT(pin)) {
1729*4882a593Smuzhiyun 		u32 route_reg = 0, route_val = 0;
1730*4882a593Smuzhiyun 
1731*4882a593Smuzhiyun 		ret = rockchip_get_mux_route(bank, pin, mux,
1732*4882a593Smuzhiyun 					     &route_reg, &route_val);
1733*4882a593Smuzhiyun 		switch (ret) {
1734*4882a593Smuzhiyun 		case ROUTE_TYPE_DEFAULT:
1735*4882a593Smuzhiyun 			regmap_write(regmap, route_reg, route_val);
1736*4882a593Smuzhiyun 			break;
1737*4882a593Smuzhiyun 		case ROUTE_TYPE_TOPGRF:
1738*4882a593Smuzhiyun 			regmap_write(priv->regmap_base, route_reg, route_val);
1739*4882a593Smuzhiyun 			break;
1740*4882a593Smuzhiyun 		case ROUTE_TYPE_PMUGRF:
1741*4882a593Smuzhiyun 			regmap_write(priv->regmap_pmu, route_reg, route_val);
1742*4882a593Smuzhiyun 			break;
1743*4882a593Smuzhiyun 		case ROUTE_TYPE_INVALID: /* Fall through */
1744*4882a593Smuzhiyun 		default:
1745*4882a593Smuzhiyun 			break;
1746*4882a593Smuzhiyun 		}
1747*4882a593Smuzhiyun 	}
1748*4882a593Smuzhiyun 
1749*4882a593Smuzhiyun 	if (mux_type & IOMUX_WRITABLE_32BIT) {
1750*4882a593Smuzhiyun 		regmap_read(regmap, reg, &data);
1751*4882a593Smuzhiyun 		data &= ~(mask << bit);
1752*4882a593Smuzhiyun 	} else {
1753*4882a593Smuzhiyun 		data = (mask << (bit + 16));
1754*4882a593Smuzhiyun 	}
1755*4882a593Smuzhiyun 
1756*4882a593Smuzhiyun 	data |= (mux & mask) << bit;
1757*4882a593Smuzhiyun 	ret = regmap_write(regmap, reg, data);
1758*4882a593Smuzhiyun 
1759*4882a593Smuzhiyun 	return ret;
1760*4882a593Smuzhiyun }
1761*4882a593Smuzhiyun 
1762*4882a593Smuzhiyun #define PX30_PULL_PMU_OFFSET		0x10
1763*4882a593Smuzhiyun #define PX30_PULL_GRF_OFFSET		0x60
1764*4882a593Smuzhiyun #define PX30_PULL_BITS_PER_PIN		2
1765*4882a593Smuzhiyun #define PX30_PULL_PINS_PER_REG		8
1766*4882a593Smuzhiyun #define PX30_PULL_BANK_STRIDE		16
1767*4882a593Smuzhiyun 
px30_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1768*4882a593Smuzhiyun static void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1769*4882a593Smuzhiyun 				       int pin_num, struct regmap **regmap,
1770*4882a593Smuzhiyun 				       int *reg, u8 *bit)
1771*4882a593Smuzhiyun {
1772*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1773*4882a593Smuzhiyun 
1774*4882a593Smuzhiyun 	/* The first 32 pins of the first bank are located in PMU */
1775*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1776*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1777*4882a593Smuzhiyun 		*reg = PX30_PULL_PMU_OFFSET;
1778*4882a593Smuzhiyun 	} else {
1779*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1780*4882a593Smuzhiyun 		*reg = PX30_PULL_GRF_OFFSET;
1781*4882a593Smuzhiyun 
1782*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
1783*4882a593Smuzhiyun 		*reg -= 0x10;
1784*4882a593Smuzhiyun 		*reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
1785*4882a593Smuzhiyun 	}
1786*4882a593Smuzhiyun 
1787*4882a593Smuzhiyun 	*reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
1788*4882a593Smuzhiyun 	*bit = (pin_num % PX30_PULL_PINS_PER_REG);
1789*4882a593Smuzhiyun 	*bit *= PX30_PULL_BITS_PER_PIN;
1790*4882a593Smuzhiyun }
1791*4882a593Smuzhiyun 
1792*4882a593Smuzhiyun #define PX30_DRV_PMU_OFFSET		0x20
1793*4882a593Smuzhiyun #define PX30_DRV_GRF_OFFSET		0xf0
1794*4882a593Smuzhiyun #define PX30_DRV_BITS_PER_PIN		2
1795*4882a593Smuzhiyun #define PX30_DRV_PINS_PER_REG		8
1796*4882a593Smuzhiyun #define PX30_DRV_BANK_STRIDE		16
1797*4882a593Smuzhiyun 
px30_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1798*4882a593Smuzhiyun static void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1799*4882a593Smuzhiyun 				      int pin_num, struct regmap **regmap,
1800*4882a593Smuzhiyun 				      int *reg, u8 *bit)
1801*4882a593Smuzhiyun {
1802*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1803*4882a593Smuzhiyun 
1804*4882a593Smuzhiyun 	/* The first 32 pins of the first bank are located in PMU */
1805*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1806*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1807*4882a593Smuzhiyun 		*reg = PX30_DRV_PMU_OFFSET;
1808*4882a593Smuzhiyun 	} else {
1809*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1810*4882a593Smuzhiyun 		*reg = PX30_DRV_GRF_OFFSET;
1811*4882a593Smuzhiyun 
1812*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
1813*4882a593Smuzhiyun 		*reg -= 0x10;
1814*4882a593Smuzhiyun 		*reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
1815*4882a593Smuzhiyun 	}
1816*4882a593Smuzhiyun 
1817*4882a593Smuzhiyun 	*reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
1818*4882a593Smuzhiyun 	*bit = (pin_num % PX30_DRV_PINS_PER_REG);
1819*4882a593Smuzhiyun 	*bit *= PX30_DRV_BITS_PER_PIN;
1820*4882a593Smuzhiyun }
1821*4882a593Smuzhiyun 
1822*4882a593Smuzhiyun #define PX30_SCHMITT_PMU_OFFSET			0x38
1823*4882a593Smuzhiyun #define PX30_SCHMITT_GRF_OFFSET			0xc0
1824*4882a593Smuzhiyun #define PX30_SCHMITT_PINS_PER_PMU_REG		16
1825*4882a593Smuzhiyun #define PX30_SCHMITT_BANK_STRIDE		16
1826*4882a593Smuzhiyun #define PX30_SCHMITT_PINS_PER_GRF_REG		8
1827*4882a593Smuzhiyun 
px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1828*4882a593Smuzhiyun static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1829*4882a593Smuzhiyun 					 int pin_num,
1830*4882a593Smuzhiyun 					 struct regmap **regmap,
1831*4882a593Smuzhiyun 					 int *reg, u8 *bit)
1832*4882a593Smuzhiyun {
1833*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1834*4882a593Smuzhiyun 	int pins_per_reg;
1835*4882a593Smuzhiyun 
1836*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1837*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1838*4882a593Smuzhiyun 		*reg = PX30_SCHMITT_PMU_OFFSET;
1839*4882a593Smuzhiyun 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
1840*4882a593Smuzhiyun 	} else {
1841*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1842*4882a593Smuzhiyun 		*reg = PX30_SCHMITT_GRF_OFFSET;
1843*4882a593Smuzhiyun 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
1844*4882a593Smuzhiyun 		*reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
1845*4882a593Smuzhiyun 	}
1846*4882a593Smuzhiyun 	*reg += ((pin_num / pins_per_reg) * 4);
1847*4882a593Smuzhiyun 	*bit = pin_num % pins_per_reg;
1848*4882a593Smuzhiyun 
1849*4882a593Smuzhiyun 	return 0;
1850*4882a593Smuzhiyun }
1851*4882a593Smuzhiyun 
1852*4882a593Smuzhiyun #define RV1108_PULL_PMU_OFFSET		0x10
1853*4882a593Smuzhiyun #define RV1108_PULL_OFFSET		0x110
1854*4882a593Smuzhiyun #define RV1108_PULL_PINS_PER_REG	8
1855*4882a593Smuzhiyun #define RV1108_PULL_BITS_PER_PIN	2
1856*4882a593Smuzhiyun #define RV1108_PULL_BANK_STRIDE		16
1857*4882a593Smuzhiyun 
rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1858*4882a593Smuzhiyun static void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1859*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
1860*4882a593Smuzhiyun 					 int *reg, u8 *bit)
1861*4882a593Smuzhiyun {
1862*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun 	/* The first 24 pins of the first bank are located in PMU */
1865*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1866*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1867*4882a593Smuzhiyun 		*reg = RV1108_PULL_PMU_OFFSET;
1868*4882a593Smuzhiyun 	} else {
1869*4882a593Smuzhiyun 		*reg = RV1108_PULL_OFFSET;
1870*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1871*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
1872*4882a593Smuzhiyun 		*reg -= 0x10;
1873*4882a593Smuzhiyun 		*reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
1874*4882a593Smuzhiyun 	}
1875*4882a593Smuzhiyun 
1876*4882a593Smuzhiyun 	*reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
1877*4882a593Smuzhiyun 	*bit = (pin_num % RV1108_PULL_PINS_PER_REG);
1878*4882a593Smuzhiyun 	*bit *= RV1108_PULL_BITS_PER_PIN;
1879*4882a593Smuzhiyun }
1880*4882a593Smuzhiyun 
1881*4882a593Smuzhiyun #define RV1108_DRV_PMU_OFFSET		0x20
1882*4882a593Smuzhiyun #define RV1108_DRV_GRF_OFFSET		0x210
1883*4882a593Smuzhiyun #define RV1108_DRV_BITS_PER_PIN		2
1884*4882a593Smuzhiyun #define RV1108_DRV_PINS_PER_REG		8
1885*4882a593Smuzhiyun #define RV1108_DRV_BANK_STRIDE		16
1886*4882a593Smuzhiyun 
rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1887*4882a593Smuzhiyun static void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1888*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
1889*4882a593Smuzhiyun 					int *reg, u8 *bit)
1890*4882a593Smuzhiyun {
1891*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1892*4882a593Smuzhiyun 
1893*4882a593Smuzhiyun 	/* The first 24 pins of the first bank are located in PMU */
1894*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1895*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1896*4882a593Smuzhiyun 		*reg = RV1108_DRV_PMU_OFFSET;
1897*4882a593Smuzhiyun 	} else {
1898*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1899*4882a593Smuzhiyun 		*reg = RV1108_DRV_GRF_OFFSET;
1900*4882a593Smuzhiyun 
1901*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
1902*4882a593Smuzhiyun 		*reg -= 0x10;
1903*4882a593Smuzhiyun 		*reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
1904*4882a593Smuzhiyun 	}
1905*4882a593Smuzhiyun 
1906*4882a593Smuzhiyun 	*reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
1907*4882a593Smuzhiyun 	*bit = pin_num % RV1108_DRV_PINS_PER_REG;
1908*4882a593Smuzhiyun 	*bit *= RV1108_DRV_BITS_PER_PIN;
1909*4882a593Smuzhiyun }
1910*4882a593Smuzhiyun 
1911*4882a593Smuzhiyun #define RV1108_SCHMITT_PMU_OFFSET		0x30
1912*4882a593Smuzhiyun #define RV1108_SCHMITT_GRF_OFFSET		0x388
1913*4882a593Smuzhiyun #define RV1108_SCHMITT_BANK_STRIDE		8
1914*4882a593Smuzhiyun #define RV1108_SCHMITT_PINS_PER_GRF_REG		16
1915*4882a593Smuzhiyun #define RV1108_SCHMITT_PINS_PER_PMU_REG		8
1916*4882a593Smuzhiyun 
rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1917*4882a593Smuzhiyun static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1918*4882a593Smuzhiyun 					   int pin_num,
1919*4882a593Smuzhiyun 					   struct regmap **regmap,
1920*4882a593Smuzhiyun 					   int *reg, u8 *bit)
1921*4882a593Smuzhiyun {
1922*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1923*4882a593Smuzhiyun 	int pins_per_reg;
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1926*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1927*4882a593Smuzhiyun 		*reg = RV1108_SCHMITT_PMU_OFFSET;
1928*4882a593Smuzhiyun 		pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
1929*4882a593Smuzhiyun 	} else {
1930*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1931*4882a593Smuzhiyun 		*reg = RV1108_SCHMITT_GRF_OFFSET;
1932*4882a593Smuzhiyun 		pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
1933*4882a593Smuzhiyun 		*reg += (bank->bank_num  - 1) * RV1108_SCHMITT_BANK_STRIDE;
1934*4882a593Smuzhiyun 	}
1935*4882a593Smuzhiyun 	*reg += ((pin_num / pins_per_reg) * 4);
1936*4882a593Smuzhiyun 	*bit = pin_num % pins_per_reg;
1937*4882a593Smuzhiyun 
1938*4882a593Smuzhiyun 	return 0;
1939*4882a593Smuzhiyun }
1940*4882a593Smuzhiyun 
1941*4882a593Smuzhiyun #define RV1126_PULL_PMU_OFFSET		0x40
1942*4882a593Smuzhiyun #define RV1126_PULL_GRF_GPIO1A0_OFFSET		0x10108
1943*4882a593Smuzhiyun #define RV1126_PULL_PINS_PER_REG	8
1944*4882a593Smuzhiyun #define RV1126_PULL_BITS_PER_PIN	2
1945*4882a593Smuzhiyun #define RV1126_PULL_BANK_STRIDE		16
1946*4882a593Smuzhiyun #define RV1126_GPIO_C4_D7(p)	(p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1947*4882a593Smuzhiyun 
rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1948*4882a593Smuzhiyun static void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1949*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
1950*4882a593Smuzhiyun 					 int *reg, u8 *bit)
1951*4882a593Smuzhiyun {
1952*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1953*4882a593Smuzhiyun 
1954*4882a593Smuzhiyun 	/* The first 24 pins of the first bank are located in PMU */
1955*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1956*4882a593Smuzhiyun 		if (RV1126_GPIO_C4_D7(pin_num)) {
1957*4882a593Smuzhiyun 			*regmap = priv->regmap_base;
1958*4882a593Smuzhiyun 			*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1959*4882a593Smuzhiyun 			*reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
1960*4882a593Smuzhiyun 			*bit = pin_num % RV1126_PULL_PINS_PER_REG;
1961*4882a593Smuzhiyun 			*bit *= RV1126_PULL_BITS_PER_PIN;
1962*4882a593Smuzhiyun 			return;
1963*4882a593Smuzhiyun 		}
1964*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
1965*4882a593Smuzhiyun 		*reg = RV1126_PULL_PMU_OFFSET;
1966*4882a593Smuzhiyun 	} else {
1967*4882a593Smuzhiyun 		*reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1968*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
1969*4882a593Smuzhiyun 		*reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
1970*4882a593Smuzhiyun 	}
1971*4882a593Smuzhiyun 
1972*4882a593Smuzhiyun 	*reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
1973*4882a593Smuzhiyun 	*bit = (pin_num % RV1126_PULL_PINS_PER_REG);
1974*4882a593Smuzhiyun 	*bit *= RV1126_PULL_BITS_PER_PIN;
1975*4882a593Smuzhiyun }
1976*4882a593Smuzhiyun 
1977*4882a593Smuzhiyun #define RV1126_DRV_PMU_OFFSET		0x20
1978*4882a593Smuzhiyun #define RV1126_DRV_GRF_GPIO1A0_OFFSET		0x10090
1979*4882a593Smuzhiyun #define RV1126_DRV_BITS_PER_PIN		4
1980*4882a593Smuzhiyun #define RV1126_DRV_PINS_PER_REG		4
1981*4882a593Smuzhiyun #define RV1126_DRV_BANK_STRIDE		32
1982*4882a593Smuzhiyun 
rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1983*4882a593Smuzhiyun static void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1984*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
1985*4882a593Smuzhiyun 					int *reg, u8 *bit)
1986*4882a593Smuzhiyun {
1987*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun 	/* The first 24 pins of the first bank are located in PMU */
1990*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
1991*4882a593Smuzhiyun 		if (RV1126_GPIO_C4_D7(pin_num)) {
1992*4882a593Smuzhiyun 			*regmap = priv->regmap_base;
1993*4882a593Smuzhiyun 			*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1994*4882a593Smuzhiyun 			*reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
1995*4882a593Smuzhiyun 			*reg -= 0x4;
1996*4882a593Smuzhiyun 			*bit = pin_num % RV1126_DRV_PINS_PER_REG;
1997*4882a593Smuzhiyun 			*bit *= RV1126_DRV_BITS_PER_PIN;
1998*4882a593Smuzhiyun 			return;
1999*4882a593Smuzhiyun 		}
2000*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2001*4882a593Smuzhiyun 		*reg = RV1126_DRV_PMU_OFFSET;
2002*4882a593Smuzhiyun 	} else {
2003*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2004*4882a593Smuzhiyun 		*reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
2005*4882a593Smuzhiyun 		*reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
2006*4882a593Smuzhiyun 	}
2007*4882a593Smuzhiyun 
2008*4882a593Smuzhiyun 	*reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
2009*4882a593Smuzhiyun 	*bit = pin_num % RV1126_DRV_PINS_PER_REG;
2010*4882a593Smuzhiyun 	*bit *= RV1126_DRV_BITS_PER_PIN;
2011*4882a593Smuzhiyun }
2012*4882a593Smuzhiyun 
2013*4882a593Smuzhiyun #define RV1126_SCHMITT_PMU_OFFSET		0x60
2014*4882a593Smuzhiyun #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET		0x10188
2015*4882a593Smuzhiyun #define RV1126_SCHMITT_BANK_STRIDE		16
2016*4882a593Smuzhiyun #define RV1126_SCHMITT_PINS_PER_GRF_REG		8
2017*4882a593Smuzhiyun #define RV1126_SCHMITT_PINS_PER_PMU_REG		8
2018*4882a593Smuzhiyun 
rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2019*4882a593Smuzhiyun static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2020*4882a593Smuzhiyun 					   int pin_num,
2021*4882a593Smuzhiyun 					   struct regmap **regmap,
2022*4882a593Smuzhiyun 					   int *reg, u8 *bit)
2023*4882a593Smuzhiyun {
2024*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2025*4882a593Smuzhiyun 	int pins_per_reg;
2026*4882a593Smuzhiyun 
2027*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2028*4882a593Smuzhiyun 		if (RV1126_GPIO_C4_D7(pin_num)) {
2029*4882a593Smuzhiyun 			*regmap = priv->regmap_base;
2030*4882a593Smuzhiyun 			*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2031*4882a593Smuzhiyun 			*reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
2032*4882a593Smuzhiyun 			*bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
2033*4882a593Smuzhiyun 			return 0;
2034*4882a593Smuzhiyun 		}
2035*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2036*4882a593Smuzhiyun 		*reg = RV1126_SCHMITT_PMU_OFFSET;
2037*4882a593Smuzhiyun 		pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
2038*4882a593Smuzhiyun 	} else {
2039*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2040*4882a593Smuzhiyun 		*reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
2041*4882a593Smuzhiyun 		pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
2042*4882a593Smuzhiyun 		*reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
2043*4882a593Smuzhiyun 	}
2044*4882a593Smuzhiyun 	*reg += ((pin_num / pins_per_reg) * 4);
2045*4882a593Smuzhiyun 	*bit = pin_num % pins_per_reg;
2046*4882a593Smuzhiyun 
2047*4882a593Smuzhiyun 	return 0;
2048*4882a593Smuzhiyun }
2049*4882a593Smuzhiyun 
2050*4882a593Smuzhiyun #define RK1808_PULL_PMU_OFFSET		0x10
2051*4882a593Smuzhiyun #define RK1808_PULL_GRF_OFFSET		0x80
2052*4882a593Smuzhiyun #define RK1808_PULL_PINS_PER_REG	8
2053*4882a593Smuzhiyun #define RK1808_PULL_BITS_PER_PIN	2
2054*4882a593Smuzhiyun #define RK1808_PULL_BANK_STRIDE		16
2055*4882a593Smuzhiyun 
rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2056*4882a593Smuzhiyun static void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2057*4882a593Smuzhiyun 					 int pin_num,
2058*4882a593Smuzhiyun 					 struct regmap **regmap,
2059*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2060*4882a593Smuzhiyun {
2061*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2062*4882a593Smuzhiyun 
2063*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2064*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2065*4882a593Smuzhiyun 		*reg = RK1808_PULL_PMU_OFFSET;
2066*4882a593Smuzhiyun 	} else {
2067*4882a593Smuzhiyun 		*reg = RK1808_PULL_GRF_OFFSET;
2068*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2069*4882a593Smuzhiyun 	}
2070*4882a593Smuzhiyun 
2071*4882a593Smuzhiyun 	*reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
2072*4882a593Smuzhiyun 	*bit = (pin_num % RK1808_PULL_PINS_PER_REG);
2073*4882a593Smuzhiyun 	*bit *= RK1808_PULL_BITS_PER_PIN;
2074*4882a593Smuzhiyun }
2075*4882a593Smuzhiyun 
2076*4882a593Smuzhiyun #define RK1808_DRV_PMU_OFFSET		0x20
2077*4882a593Smuzhiyun #define RK1808_DRV_GRF_OFFSET		0x140
2078*4882a593Smuzhiyun #define RK1808_DRV_BITS_PER_PIN		2
2079*4882a593Smuzhiyun #define RK1808_DRV_PINS_PER_REG		8
2080*4882a593Smuzhiyun #define RK1808_DRV_BANK_STRIDE		16
2081*4882a593Smuzhiyun 
rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2082*4882a593Smuzhiyun static void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2083*4882a593Smuzhiyun 					int pin_num,
2084*4882a593Smuzhiyun 					struct regmap **regmap,
2085*4882a593Smuzhiyun 					int *reg, u8 *bit)
2086*4882a593Smuzhiyun {
2087*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2088*4882a593Smuzhiyun 
2089*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2090*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2091*4882a593Smuzhiyun 		*reg = RK1808_DRV_PMU_OFFSET;
2092*4882a593Smuzhiyun 	} else {
2093*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2094*4882a593Smuzhiyun 		*reg = RK1808_DRV_GRF_OFFSET;
2095*4882a593Smuzhiyun 	}
2096*4882a593Smuzhiyun 
2097*4882a593Smuzhiyun 	*reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
2098*4882a593Smuzhiyun 	*bit = pin_num % RK1808_DRV_PINS_PER_REG;
2099*4882a593Smuzhiyun 	*bit *= RK1808_DRV_BITS_PER_PIN;
2100*4882a593Smuzhiyun }
2101*4882a593Smuzhiyun 
2102*4882a593Smuzhiyun #define RK1808_SCHMITT_PMU_OFFSET		0x0040
2103*4882a593Smuzhiyun #define RK1808_SCHMITT_GRF_OFFSET		0x0100
2104*4882a593Smuzhiyun #define RK1808_SCHMITT_BANK_STRIDE		16
2105*4882a593Smuzhiyun #define RK1808_SCHMITT_PINS_PER_REG		8
2106*4882a593Smuzhiyun 
rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2107*4882a593Smuzhiyun static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2108*4882a593Smuzhiyun 					   int pin_num,
2109*4882a593Smuzhiyun 					   struct regmap **regmap,
2110*4882a593Smuzhiyun 					   int *reg, u8 *bit)
2111*4882a593Smuzhiyun {
2112*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2113*4882a593Smuzhiyun 
2114*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2115*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2116*4882a593Smuzhiyun 		*reg = RK1808_SCHMITT_PMU_OFFSET;
2117*4882a593Smuzhiyun 	} else {
2118*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2119*4882a593Smuzhiyun 		*reg = RK1808_SCHMITT_GRF_OFFSET;
2120*4882a593Smuzhiyun 		*reg += (bank->bank_num  - 1) * RK1808_SCHMITT_BANK_STRIDE;
2121*4882a593Smuzhiyun 	}
2122*4882a593Smuzhiyun 	*reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
2123*4882a593Smuzhiyun 	*bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
2124*4882a593Smuzhiyun 
2125*4882a593Smuzhiyun 	return 0;
2126*4882a593Smuzhiyun }
2127*4882a593Smuzhiyun 
2128*4882a593Smuzhiyun #define RK2928_PULL_OFFSET		0x118
2129*4882a593Smuzhiyun #define RK2928_PULL_PINS_PER_REG	16
2130*4882a593Smuzhiyun #define RK2928_PULL_BANK_STRIDE		8
2131*4882a593Smuzhiyun 
rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2132*4882a593Smuzhiyun static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2133*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2134*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2135*4882a593Smuzhiyun {
2136*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2137*4882a593Smuzhiyun 
2138*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2139*4882a593Smuzhiyun 	*reg = RK2928_PULL_OFFSET;
2140*4882a593Smuzhiyun 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
2141*4882a593Smuzhiyun 	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
2142*4882a593Smuzhiyun 
2143*4882a593Smuzhiyun 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
2144*4882a593Smuzhiyun };
2145*4882a593Smuzhiyun 
2146*4882a593Smuzhiyun #define RK3128_PULL_OFFSET	0x118
2147*4882a593Smuzhiyun 
rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2148*4882a593Smuzhiyun static void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2149*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2150*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2151*4882a593Smuzhiyun {
2152*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2153*4882a593Smuzhiyun 
2154*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2155*4882a593Smuzhiyun 	*reg = RK3128_PULL_OFFSET;
2156*4882a593Smuzhiyun 	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
2157*4882a593Smuzhiyun 	*reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
2158*4882a593Smuzhiyun 
2159*4882a593Smuzhiyun 	*bit = pin_num % RK2928_PULL_PINS_PER_REG;
2160*4882a593Smuzhiyun }
2161*4882a593Smuzhiyun 
2162*4882a593Smuzhiyun #define RK3188_PULL_OFFSET		0x164
2163*4882a593Smuzhiyun #define RK3188_PULL_BITS_PER_PIN	2
2164*4882a593Smuzhiyun #define RK3188_PULL_PINS_PER_REG	8
2165*4882a593Smuzhiyun #define RK3188_PULL_BANK_STRIDE		16
2166*4882a593Smuzhiyun #define RK3188_PULL_PMU_OFFSET		0x64
2167*4882a593Smuzhiyun 
rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2168*4882a593Smuzhiyun static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2169*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2170*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2171*4882a593Smuzhiyun {
2172*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2173*4882a593Smuzhiyun 
2174*4882a593Smuzhiyun 	/* The first 12 pins of the first bank are located elsewhere */
2175*4882a593Smuzhiyun 	if (bank->bank_num == 0 && pin_num < 12) {
2176*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2177*4882a593Smuzhiyun 		*reg = RK3188_PULL_PMU_OFFSET;
2178*4882a593Smuzhiyun 
2179*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2180*4882a593Smuzhiyun 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
2181*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2182*4882a593Smuzhiyun 	} else {
2183*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2184*4882a593Smuzhiyun 		*reg = RK3188_PULL_OFFSET;
2185*4882a593Smuzhiyun 
2186*4882a593Smuzhiyun 		/* correct the offset, as it is the 2nd pull register */
2187*4882a593Smuzhiyun 		*reg -= 4;
2188*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2189*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2190*4882a593Smuzhiyun 
2191*4882a593Smuzhiyun 		/*
2192*4882a593Smuzhiyun 		 * The bits in these registers have an inverse ordering
2193*4882a593Smuzhiyun 		 * with the lowest pin being in bits 15:14 and the highest
2194*4882a593Smuzhiyun 		 * pin in bits 1:0
2195*4882a593Smuzhiyun 		 */
2196*4882a593Smuzhiyun 		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
2197*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2198*4882a593Smuzhiyun 	}
2199*4882a593Smuzhiyun }
2200*4882a593Smuzhiyun 
2201*4882a593Smuzhiyun #define RK3288_PULL_OFFSET		0x140
rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2202*4882a593Smuzhiyun static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2203*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2204*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2205*4882a593Smuzhiyun {
2206*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2207*4882a593Smuzhiyun 
2208*4882a593Smuzhiyun 	/* The first 24 pins of the first bank are located in PMU */
2209*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2210*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2211*4882a593Smuzhiyun 		*reg = RK3188_PULL_PMU_OFFSET;
2212*4882a593Smuzhiyun 
2213*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2214*4882a593Smuzhiyun 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
2215*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2216*4882a593Smuzhiyun 	} else {
2217*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2218*4882a593Smuzhiyun 		*reg = RK3288_PULL_OFFSET;
2219*4882a593Smuzhiyun 
2220*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
2221*4882a593Smuzhiyun 		*reg -= 0x10;
2222*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2223*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2224*4882a593Smuzhiyun 
2225*4882a593Smuzhiyun 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2226*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2227*4882a593Smuzhiyun 	}
2228*4882a593Smuzhiyun }
2229*4882a593Smuzhiyun 
2230*4882a593Smuzhiyun #define RK3288_DRV_PMU_OFFSET		0x70
2231*4882a593Smuzhiyun #define RK3288_DRV_GRF_OFFSET		0x1c0
2232*4882a593Smuzhiyun #define RK3288_DRV_BITS_PER_PIN		2
2233*4882a593Smuzhiyun #define RK3288_DRV_PINS_PER_REG		8
2234*4882a593Smuzhiyun #define RK3288_DRV_BANK_STRIDE		16
2235*4882a593Smuzhiyun 
rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2236*4882a593Smuzhiyun static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2237*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
2238*4882a593Smuzhiyun 					int *reg, u8 *bit)
2239*4882a593Smuzhiyun {
2240*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2241*4882a593Smuzhiyun 
2242*4882a593Smuzhiyun 	/* The first 24 pins of the first bank are located in PMU */
2243*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2244*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2245*4882a593Smuzhiyun 		*reg = RK3288_DRV_PMU_OFFSET;
2246*4882a593Smuzhiyun 
2247*4882a593Smuzhiyun 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2248*4882a593Smuzhiyun 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
2249*4882a593Smuzhiyun 		*bit *= RK3288_DRV_BITS_PER_PIN;
2250*4882a593Smuzhiyun 	} else {
2251*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2252*4882a593Smuzhiyun 		*reg = RK3288_DRV_GRF_OFFSET;
2253*4882a593Smuzhiyun 
2254*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
2255*4882a593Smuzhiyun 		*reg -= 0x10;
2256*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2257*4882a593Smuzhiyun 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2258*4882a593Smuzhiyun 
2259*4882a593Smuzhiyun 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2260*4882a593Smuzhiyun 		*bit *= RK3288_DRV_BITS_PER_PIN;
2261*4882a593Smuzhiyun 	}
2262*4882a593Smuzhiyun }
2263*4882a593Smuzhiyun 
2264*4882a593Smuzhiyun #define RK3228_PULL_OFFSET		0x100
2265*4882a593Smuzhiyun 
rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2266*4882a593Smuzhiyun static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2267*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2268*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2269*4882a593Smuzhiyun {
2270*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2271*4882a593Smuzhiyun 
2272*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2273*4882a593Smuzhiyun 	*reg = RK3228_PULL_OFFSET;
2274*4882a593Smuzhiyun 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2275*4882a593Smuzhiyun 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2276*4882a593Smuzhiyun 
2277*4882a593Smuzhiyun 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2278*4882a593Smuzhiyun 	*bit *= RK3188_PULL_BITS_PER_PIN;
2279*4882a593Smuzhiyun }
2280*4882a593Smuzhiyun 
2281*4882a593Smuzhiyun #define RK3228_DRV_GRF_OFFSET		0x200
2282*4882a593Smuzhiyun 
rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2283*4882a593Smuzhiyun static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2284*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
2285*4882a593Smuzhiyun 					int *reg, u8 *bit)
2286*4882a593Smuzhiyun {
2287*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2288*4882a593Smuzhiyun 
2289*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2290*4882a593Smuzhiyun 	*reg = RK3228_DRV_GRF_OFFSET;
2291*4882a593Smuzhiyun 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2292*4882a593Smuzhiyun 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2293*4882a593Smuzhiyun 
2294*4882a593Smuzhiyun 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2295*4882a593Smuzhiyun 	*bit *= RK3288_DRV_BITS_PER_PIN;
2296*4882a593Smuzhiyun }
2297*4882a593Smuzhiyun 
2298*4882a593Smuzhiyun #define RK3308_PULL_OFFSET		0xa0
2299*4882a593Smuzhiyun 
rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2300*4882a593Smuzhiyun static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2301*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2302*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2303*4882a593Smuzhiyun {
2304*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2305*4882a593Smuzhiyun 
2306*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2307*4882a593Smuzhiyun 	*reg = RK3308_PULL_OFFSET;
2308*4882a593Smuzhiyun 	*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2309*4882a593Smuzhiyun 	*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2310*4882a593Smuzhiyun 
2311*4882a593Smuzhiyun 	*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2312*4882a593Smuzhiyun 	*bit *= RK3188_PULL_BITS_PER_PIN;
2313*4882a593Smuzhiyun }
2314*4882a593Smuzhiyun 
2315*4882a593Smuzhiyun #define RK3308_DRV_GRF_OFFSET		0x100
2316*4882a593Smuzhiyun 
rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2317*4882a593Smuzhiyun static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2318*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
2319*4882a593Smuzhiyun 					int *reg, u8 *bit)
2320*4882a593Smuzhiyun {
2321*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2322*4882a593Smuzhiyun 
2323*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2324*4882a593Smuzhiyun 	*reg = RK3308_DRV_GRF_OFFSET;
2325*4882a593Smuzhiyun 	*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2326*4882a593Smuzhiyun 	*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2327*4882a593Smuzhiyun 
2328*4882a593Smuzhiyun 	*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2329*4882a593Smuzhiyun 	*bit *= RK3288_DRV_BITS_PER_PIN;
2330*4882a593Smuzhiyun }
2331*4882a593Smuzhiyun 
2332*4882a593Smuzhiyun #define RK3308_SCHMITT_PINS_PER_REG	8
2333*4882a593Smuzhiyun #define RK3308_SCHMITT_BANK_STRIDE	16
2334*4882a593Smuzhiyun #define RK3308_SCHMITT_GRF_OFFSET	0x1a0
2335*4882a593Smuzhiyun 
rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2336*4882a593Smuzhiyun static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2337*4882a593Smuzhiyun 					   int pin_num,
2338*4882a593Smuzhiyun 					   struct regmap **regmap,
2339*4882a593Smuzhiyun 					   int *reg, u8 *bit)
2340*4882a593Smuzhiyun {
2341*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2342*4882a593Smuzhiyun 
2343*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2344*4882a593Smuzhiyun 	*reg = RK3308_SCHMITT_GRF_OFFSET;
2345*4882a593Smuzhiyun 
2346*4882a593Smuzhiyun 	*reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
2347*4882a593Smuzhiyun 	*reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
2348*4882a593Smuzhiyun 	*bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
2349*4882a593Smuzhiyun 
2350*4882a593Smuzhiyun 	return 0;
2351*4882a593Smuzhiyun }
2352*4882a593Smuzhiyun 
2353*4882a593Smuzhiyun #define RK3368_PULL_GRF_OFFSET		0x100
2354*4882a593Smuzhiyun #define RK3368_PULL_PMU_OFFSET		0x10
2355*4882a593Smuzhiyun 
rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2356*4882a593Smuzhiyun static void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2357*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2358*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2359*4882a593Smuzhiyun {
2360*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2361*4882a593Smuzhiyun 
2362*4882a593Smuzhiyun 	/* The first 32 pins of the first bank are located in PMU */
2363*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2364*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2365*4882a593Smuzhiyun 		*reg = RK3368_PULL_PMU_OFFSET;
2366*4882a593Smuzhiyun 
2367*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2368*4882a593Smuzhiyun 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
2369*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2370*4882a593Smuzhiyun 	} else {
2371*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2372*4882a593Smuzhiyun 		*reg = RK3368_PULL_GRF_OFFSET;
2373*4882a593Smuzhiyun 
2374*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
2375*4882a593Smuzhiyun 		*reg -= 0x10;
2376*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2377*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2378*4882a593Smuzhiyun 
2379*4882a593Smuzhiyun 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2380*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2381*4882a593Smuzhiyun 	}
2382*4882a593Smuzhiyun }
2383*4882a593Smuzhiyun 
2384*4882a593Smuzhiyun #define RK3368_DRV_PMU_OFFSET		0x20
2385*4882a593Smuzhiyun #define RK3368_DRV_GRF_OFFSET		0x200
2386*4882a593Smuzhiyun 
rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2387*4882a593Smuzhiyun static void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2388*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
2389*4882a593Smuzhiyun 					int *reg, u8 *bit)
2390*4882a593Smuzhiyun {
2391*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2392*4882a593Smuzhiyun 
2393*4882a593Smuzhiyun 	/* The first 32 pins of the first bank are located in PMU */
2394*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2395*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2396*4882a593Smuzhiyun 		*reg = RK3368_DRV_PMU_OFFSET;
2397*4882a593Smuzhiyun 
2398*4882a593Smuzhiyun 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2399*4882a593Smuzhiyun 		*bit = pin_num % RK3288_DRV_PINS_PER_REG;
2400*4882a593Smuzhiyun 		*bit *= RK3288_DRV_BITS_PER_PIN;
2401*4882a593Smuzhiyun 	} else {
2402*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2403*4882a593Smuzhiyun 		*reg = RK3368_DRV_GRF_OFFSET;
2404*4882a593Smuzhiyun 
2405*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 2nd bank */
2406*4882a593Smuzhiyun 		*reg -= 0x10;
2407*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2408*4882a593Smuzhiyun 		*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2409*4882a593Smuzhiyun 
2410*4882a593Smuzhiyun 		*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2411*4882a593Smuzhiyun 		*bit *= RK3288_DRV_BITS_PER_PIN;
2412*4882a593Smuzhiyun 	}
2413*4882a593Smuzhiyun }
2414*4882a593Smuzhiyun 
2415*4882a593Smuzhiyun #define RK3399_PULL_GRF_OFFSET		0xe040
2416*4882a593Smuzhiyun #define RK3399_PULL_PMU_OFFSET		0x40
2417*4882a593Smuzhiyun #define RK3399_DRV_3BITS_PER_PIN	3
2418*4882a593Smuzhiyun 
rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2419*4882a593Smuzhiyun static void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2420*4882a593Smuzhiyun 					 int pin_num, struct regmap **regmap,
2421*4882a593Smuzhiyun 					 int *reg, u8 *bit)
2422*4882a593Smuzhiyun {
2423*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2424*4882a593Smuzhiyun 
2425*4882a593Smuzhiyun 	/* The bank0:16 and bank1:32 pins are located in PMU */
2426*4882a593Smuzhiyun 	if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
2427*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2428*4882a593Smuzhiyun 		*reg = RK3399_PULL_PMU_OFFSET;
2429*4882a593Smuzhiyun 
2430*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2431*4882a593Smuzhiyun 
2432*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2433*4882a593Smuzhiyun 		*bit = pin_num % RK3188_PULL_PINS_PER_REG;
2434*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2435*4882a593Smuzhiyun 	} else {
2436*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2437*4882a593Smuzhiyun 		*reg = RK3399_PULL_GRF_OFFSET;
2438*4882a593Smuzhiyun 
2439*4882a593Smuzhiyun 		/* correct the offset, as we're starting with the 3rd bank */
2440*4882a593Smuzhiyun 		*reg -= 0x20;
2441*4882a593Smuzhiyun 		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2442*4882a593Smuzhiyun 		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2443*4882a593Smuzhiyun 
2444*4882a593Smuzhiyun 		*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2445*4882a593Smuzhiyun 		*bit *= RK3188_PULL_BITS_PER_PIN;
2446*4882a593Smuzhiyun 	}
2447*4882a593Smuzhiyun }
2448*4882a593Smuzhiyun 
rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2449*4882a593Smuzhiyun static void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2450*4882a593Smuzhiyun 					int pin_num, struct regmap **regmap,
2451*4882a593Smuzhiyun 					int *reg, u8 *bit)
2452*4882a593Smuzhiyun {
2453*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2454*4882a593Smuzhiyun 	int drv_num = (pin_num / 8);
2455*4882a593Smuzhiyun 
2456*4882a593Smuzhiyun 	/*  The bank0:16 and bank1:32 pins are located in PMU */
2457*4882a593Smuzhiyun 	if ((bank->bank_num == 0) || (bank->bank_num == 1))
2458*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2459*4882a593Smuzhiyun 	else
2460*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2461*4882a593Smuzhiyun 
2462*4882a593Smuzhiyun 	*reg = bank->drv[drv_num].offset;
2463*4882a593Smuzhiyun 	if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
2464*4882a593Smuzhiyun 	    (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
2465*4882a593Smuzhiyun 		*bit = (pin_num % 8) * 3;
2466*4882a593Smuzhiyun 	else
2467*4882a593Smuzhiyun 		*bit = (pin_num % 8) * 2;
2468*4882a593Smuzhiyun }
2469*4882a593Smuzhiyun 
2470*4882a593Smuzhiyun #define RK3308_SLEW_RATE_GRF_OFFSET		0x150
2471*4882a593Smuzhiyun #define RK3308_SLEW_RATE_BANK_STRIDE		16
2472*4882a593Smuzhiyun #define RK3308_SLEW_RATE_PINS_PER_GRF_REG	8
2473*4882a593Smuzhiyun 
rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2474*4882a593Smuzhiyun static void rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2475*4882a593Smuzhiyun 					      int pin_num,
2476*4882a593Smuzhiyun 					      struct regmap **regmap,
2477*4882a593Smuzhiyun 					      int *reg, u8 *bit)
2478*4882a593Smuzhiyun {
2479*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2480*4882a593Smuzhiyun 	int pins_per_reg;
2481*4882a593Smuzhiyun 
2482*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2483*4882a593Smuzhiyun 	*reg = RK3308_SLEW_RATE_GRF_OFFSET;
2484*4882a593Smuzhiyun 	*reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE;
2485*4882a593Smuzhiyun 	pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG;
2486*4882a593Smuzhiyun 
2487*4882a593Smuzhiyun 	*reg += ((pin_num / pins_per_reg) * 4);
2488*4882a593Smuzhiyun 	*bit = pin_num % pins_per_reg;
2489*4882a593Smuzhiyun }
2490*4882a593Smuzhiyun 
2491*4882a593Smuzhiyun static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
2492*4882a593Smuzhiyun 	{ 2, 4, 8, 12, -1, -1, -1, -1 },
2493*4882a593Smuzhiyun 	{ 3, 6, 9, 12, -1, -1, -1, -1 },
2494*4882a593Smuzhiyun 	{ 5, 10, 15, 20, -1, -1, -1, -1 },
2495*4882a593Smuzhiyun 	{ 4, 6, 8, 10, 12, 14, 16, 18 },
2496*4882a593Smuzhiyun 	{ 4, 7, 10, 13, 16, 19, 22, 26 },
2497*4882a593Smuzhiyun 	{ 0, 2, 4, 6, 6, 8, 10, 12 }
2498*4882a593Smuzhiyun };
2499*4882a593Smuzhiyun 
rockchip_set_drive_perpin(struct rockchip_pin_bank * bank,int pin_num,int strength)2500*4882a593Smuzhiyun static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
2501*4882a593Smuzhiyun 				     int pin_num, int strength)
2502*4882a593Smuzhiyun {
2503*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2504*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
2505*4882a593Smuzhiyun 	struct regmap *regmap;
2506*4882a593Smuzhiyun 	int reg, ret, i;
2507*4882a593Smuzhiyun 	u32 data, rmask_bits, temp;
2508*4882a593Smuzhiyun 	u8 bit;
2509*4882a593Smuzhiyun 	/* Where need to clean the special mask for rockchip_perpin_drv_list */
2510*4882a593Smuzhiyun 	int drv_type = bank->drv[pin_num / 8].drv_type & (~DRV_TYPE_IO_MASK);
2511*4882a593Smuzhiyun 
2512*4882a593Smuzhiyun 	debug("setting drive of GPIO%d-%d to %d\n", bank->bank_num,
2513*4882a593Smuzhiyun 	      pin_num, strength);
2514*4882a593Smuzhiyun 
2515*4882a593Smuzhiyun 	ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2516*4882a593Smuzhiyun 	if (ctrl->type == RV1126) {
2517*4882a593Smuzhiyun 		rmask_bits = RV1126_DRV_BITS_PER_PIN;
2518*4882a593Smuzhiyun 		ret = strength;
2519*4882a593Smuzhiyun 		goto config;
2520*4882a593Smuzhiyun 	}
2521*4882a593Smuzhiyun 	if (soc_is_rk3308bs())
2522*4882a593Smuzhiyun 		drv_type = DRV_TYPE_IO_SMIC;
2523*4882a593Smuzhiyun 
2524*4882a593Smuzhiyun 	ret = -EINVAL;
2525*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
2526*4882a593Smuzhiyun 		if (rockchip_perpin_drv_list[drv_type][i] == strength) {
2527*4882a593Smuzhiyun 			ret = i;
2528*4882a593Smuzhiyun 			break;
2529*4882a593Smuzhiyun 		} else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
2530*4882a593Smuzhiyun 			ret = rockchip_perpin_drv_list[drv_type][i];
2531*4882a593Smuzhiyun 			break;
2532*4882a593Smuzhiyun 		}
2533*4882a593Smuzhiyun 	}
2534*4882a593Smuzhiyun 
2535*4882a593Smuzhiyun 	if (ret < 0) {
2536*4882a593Smuzhiyun 		debug("unsupported driver strength %d\n", strength);
2537*4882a593Smuzhiyun 		return ret;
2538*4882a593Smuzhiyun 	}
2539*4882a593Smuzhiyun 
2540*4882a593Smuzhiyun 	switch (drv_type) {
2541*4882a593Smuzhiyun 	case DRV_TYPE_IO_SMIC:
2542*4882a593Smuzhiyun 		if (ctrl->type == RK3308) { /* RK3308B-S */
2543*4882a593Smuzhiyun 			int regval = ret;
2544*4882a593Smuzhiyun 
2545*4882a593Smuzhiyun 			data = 0x3 << (bit + 16);
2546*4882a593Smuzhiyun 			data |= ((regval & 0x3) << bit);
2547*4882a593Smuzhiyun 
2548*4882a593Smuzhiyun 			ret = regmap_write(regmap, reg, data);
2549*4882a593Smuzhiyun 			if (ret < 0)
2550*4882a593Smuzhiyun 				return ret;
2551*4882a593Smuzhiyun 
2552*4882a593Smuzhiyun 			rk3308_calc_slew_rate_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
2553*4882a593Smuzhiyun 			data = BIT(bit + 16) | (((regval > 3) ? 1 : 0) << bit);
2554*4882a593Smuzhiyun 
2555*4882a593Smuzhiyun 			return regmap_write(regmap, reg, data);
2556*4882a593Smuzhiyun 		}
2557*4882a593Smuzhiyun 
2558*4882a593Smuzhiyun 		dev_err(info->dev, "unsupported type DRV_TYPE_IO_SMIC\n");
2559*4882a593Smuzhiyun 		return -EINVAL;
2560*4882a593Smuzhiyun 	case DRV_TYPE_IO_1V8_3V0_AUTO:
2561*4882a593Smuzhiyun 	case DRV_TYPE_IO_3V3_ONLY:
2562*4882a593Smuzhiyun 		rmask_bits = RK3399_DRV_3BITS_PER_PIN;
2563*4882a593Smuzhiyun 		switch (bit) {
2564*4882a593Smuzhiyun 		case 0 ... 12:
2565*4882a593Smuzhiyun 			/* regular case, nothing to do */
2566*4882a593Smuzhiyun 			break;
2567*4882a593Smuzhiyun 		case 15:
2568*4882a593Smuzhiyun 			/*
2569*4882a593Smuzhiyun 			 * drive-strength offset is special, as it is spread
2570*4882a593Smuzhiyun 			 * over 2 registers, the bit data[15] contains bit 0
2571*4882a593Smuzhiyun 			 * of the value while temp[1:0] contains bits 2 and 1
2572*4882a593Smuzhiyun 			 */
2573*4882a593Smuzhiyun 			data = (ret & 0x1) << 15;
2574*4882a593Smuzhiyun 			temp = (ret >> 0x1) & 0x3;
2575*4882a593Smuzhiyun 
2576*4882a593Smuzhiyun 			data |= BIT(31);
2577*4882a593Smuzhiyun 			ret = regmap_write(regmap, reg, data);
2578*4882a593Smuzhiyun 			if (ret)
2579*4882a593Smuzhiyun 				return ret;
2580*4882a593Smuzhiyun 
2581*4882a593Smuzhiyun 			temp |= (0x3 << 16);
2582*4882a593Smuzhiyun 			reg += 0x4;
2583*4882a593Smuzhiyun 			ret = regmap_write(regmap, reg, temp);
2584*4882a593Smuzhiyun 
2585*4882a593Smuzhiyun 			return ret;
2586*4882a593Smuzhiyun 		case 18 ... 21:
2587*4882a593Smuzhiyun 			/* setting fully enclosed in the second register */
2588*4882a593Smuzhiyun 			reg += 4;
2589*4882a593Smuzhiyun 			bit -= 16;
2590*4882a593Smuzhiyun 			break;
2591*4882a593Smuzhiyun 		default:
2592*4882a593Smuzhiyun 			debug("unsupported bit: %d for pinctrl drive type: %d\n",
2593*4882a593Smuzhiyun 			      bit, drv_type);
2594*4882a593Smuzhiyun 			return -EINVAL;
2595*4882a593Smuzhiyun 		}
2596*4882a593Smuzhiyun 		break;
2597*4882a593Smuzhiyun 	case DRV_TYPE_IO_DEFAULT:
2598*4882a593Smuzhiyun 	case DRV_TYPE_IO_1V8_OR_3V0:
2599*4882a593Smuzhiyun 	case DRV_TYPE_IO_1V8_ONLY:
2600*4882a593Smuzhiyun 		rmask_bits = RK3288_DRV_BITS_PER_PIN;
2601*4882a593Smuzhiyun 		break;
2602*4882a593Smuzhiyun 	default:
2603*4882a593Smuzhiyun 		debug("unsupported pinctrl drive type: %d\n",
2604*4882a593Smuzhiyun 		      drv_type);
2605*4882a593Smuzhiyun 		return -EINVAL;
2606*4882a593Smuzhiyun 	}
2607*4882a593Smuzhiyun 
2608*4882a593Smuzhiyun config:
2609*4882a593Smuzhiyun 	if (bank->drv[pin_num / 8].drv_type & DRV_TYPE_WRITABLE_32BIT) {
2610*4882a593Smuzhiyun 		regmap_read(regmap, reg, &data);
2611*4882a593Smuzhiyun 		data &= ~(((1 << rmask_bits) - 1) << bit);
2612*4882a593Smuzhiyun 	} else {
2613*4882a593Smuzhiyun 		/* enable the write to the equivalent lower bits */
2614*4882a593Smuzhiyun 		data = ((1 << rmask_bits) - 1) << (bit + 16);
2615*4882a593Smuzhiyun 	}
2616*4882a593Smuzhiyun 
2617*4882a593Smuzhiyun 	data |= (ret << bit);
2618*4882a593Smuzhiyun 	ret = regmap_write(regmap, reg, data);
2619*4882a593Smuzhiyun 	return ret;
2620*4882a593Smuzhiyun }
2621*4882a593Smuzhiyun 
2622*4882a593Smuzhiyun static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
2623*4882a593Smuzhiyun 	{
2624*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_DISABLE,
2625*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_PULL_UP,
2626*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_PULL_DOWN,
2627*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_BUS_HOLD
2628*4882a593Smuzhiyun 	},
2629*4882a593Smuzhiyun 	{
2630*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_DISABLE,
2631*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_PULL_DOWN,
2632*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_DISABLE,
2633*4882a593Smuzhiyun 		PIN_CONFIG_BIAS_PULL_UP
2634*4882a593Smuzhiyun 	},
2635*4882a593Smuzhiyun };
2636*4882a593Smuzhiyun 
rockchip_set_pull(struct rockchip_pin_bank * bank,int pin_num,int pull)2637*4882a593Smuzhiyun static int rockchip_set_pull(struct rockchip_pin_bank *bank,
2638*4882a593Smuzhiyun 			     int pin_num, int pull)
2639*4882a593Smuzhiyun {
2640*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2641*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
2642*4882a593Smuzhiyun 	struct regmap *regmap;
2643*4882a593Smuzhiyun 	int reg, ret, i, pull_type;
2644*4882a593Smuzhiyun 	u8 bit;
2645*4882a593Smuzhiyun 	u32 data;
2646*4882a593Smuzhiyun 
2647*4882a593Smuzhiyun 	debug("setting pull of GPIO%d-%d to %d\n", bank->bank_num,
2648*4882a593Smuzhiyun 	      pin_num, pull);
2649*4882a593Smuzhiyun 
2650*4882a593Smuzhiyun 	/* rk3066b does support any pulls */
2651*4882a593Smuzhiyun 	if (ctrl->type == RK3066B)
2652*4882a593Smuzhiyun 		return pull ? -EINVAL : 0;
2653*4882a593Smuzhiyun 
2654*4882a593Smuzhiyun 	ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2655*4882a593Smuzhiyun 
2656*4882a593Smuzhiyun 	switch (ctrl->type) {
2657*4882a593Smuzhiyun 	case RK2928:
2658*4882a593Smuzhiyun 	case RK3128:
2659*4882a593Smuzhiyun 		data = BIT(bit + 16);
2660*4882a593Smuzhiyun 		if (pull == PIN_CONFIG_BIAS_DISABLE)
2661*4882a593Smuzhiyun 			data |= BIT(bit);
2662*4882a593Smuzhiyun 		ret = regmap_write(regmap, reg, data);
2663*4882a593Smuzhiyun 		break;
2664*4882a593Smuzhiyun 	case PX30:
2665*4882a593Smuzhiyun 	case RV1108:
2666*4882a593Smuzhiyun 	case RV1126:
2667*4882a593Smuzhiyun 	case RK1808:
2668*4882a593Smuzhiyun 	case RK3188:
2669*4882a593Smuzhiyun 	case RK3288:
2670*4882a593Smuzhiyun 	case RK3308:
2671*4882a593Smuzhiyun 	case RK3368:
2672*4882a593Smuzhiyun 	case RK3399:
2673*4882a593Smuzhiyun 		/*
2674*4882a593Smuzhiyun 		 * Where need to clean the special mask for
2675*4882a593Smuzhiyun 		 * rockchip_pull_list.
2676*4882a593Smuzhiyun 		 */
2677*4882a593Smuzhiyun 		pull_type = bank->pull_type[pin_num / 8] & (~PULL_TYPE_IO_MASK);
2678*4882a593Smuzhiyun 		ret = -EINVAL;
2679*4882a593Smuzhiyun 		for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
2680*4882a593Smuzhiyun 			i++) {
2681*4882a593Smuzhiyun 			if (rockchip_pull_list[pull_type][i] == pull) {
2682*4882a593Smuzhiyun 				ret = i;
2683*4882a593Smuzhiyun 				break;
2684*4882a593Smuzhiyun 			}
2685*4882a593Smuzhiyun 		}
2686*4882a593Smuzhiyun 
2687*4882a593Smuzhiyun 		if (ret < 0) {
2688*4882a593Smuzhiyun 			debug("unsupported pull setting %d\n", pull);
2689*4882a593Smuzhiyun 			return ret;
2690*4882a593Smuzhiyun 		}
2691*4882a593Smuzhiyun 
2692*4882a593Smuzhiyun 		if (bank->pull_type[pin_num / 8] & PULL_TYPE_WRITABLE_32BIT) {
2693*4882a593Smuzhiyun 			regmap_read(regmap, reg, &data);
2694*4882a593Smuzhiyun 			data &= ~(((1 << RK3188_PULL_BITS_PER_PIN) - 1) << bit);
2695*4882a593Smuzhiyun 		} else {
2696*4882a593Smuzhiyun 			/* enable the write to the equivalent lower bits */
2697*4882a593Smuzhiyun 			data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
2698*4882a593Smuzhiyun 		}
2699*4882a593Smuzhiyun 
2700*4882a593Smuzhiyun 		data |= (ret << bit);
2701*4882a593Smuzhiyun 		ret = regmap_write(regmap, reg, data);
2702*4882a593Smuzhiyun 		break;
2703*4882a593Smuzhiyun 	default:
2704*4882a593Smuzhiyun 		debug("unsupported pinctrl type\n");
2705*4882a593Smuzhiyun 		return -EINVAL;
2706*4882a593Smuzhiyun 	}
2707*4882a593Smuzhiyun 
2708*4882a593Smuzhiyun 	return ret;
2709*4882a593Smuzhiyun }
2710*4882a593Smuzhiyun 
2711*4882a593Smuzhiyun #define RK3328_SCHMITT_BITS_PER_PIN		1
2712*4882a593Smuzhiyun #define RK3328_SCHMITT_PINS_PER_REG		16
2713*4882a593Smuzhiyun #define RK3328_SCHMITT_BANK_STRIDE		8
2714*4882a593Smuzhiyun #define RK3328_SCHMITT_GRF_OFFSET		0x380
2715*4882a593Smuzhiyun 
rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2716*4882a593Smuzhiyun static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2717*4882a593Smuzhiyun 					   int pin_num,
2718*4882a593Smuzhiyun 					   struct regmap **regmap,
2719*4882a593Smuzhiyun 					   int *reg, u8 *bit)
2720*4882a593Smuzhiyun {
2721*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2722*4882a593Smuzhiyun 
2723*4882a593Smuzhiyun 	*regmap = priv->regmap_base;
2724*4882a593Smuzhiyun 	*reg = RK3328_SCHMITT_GRF_OFFSET;
2725*4882a593Smuzhiyun 
2726*4882a593Smuzhiyun 	*reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
2727*4882a593Smuzhiyun 	*reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
2728*4882a593Smuzhiyun 	*bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
2729*4882a593Smuzhiyun 
2730*4882a593Smuzhiyun 	return 0;
2731*4882a593Smuzhiyun }
2732*4882a593Smuzhiyun 
rockchip_set_schmitt(struct rockchip_pin_bank * bank,int pin_num,int enable)2733*4882a593Smuzhiyun static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
2734*4882a593Smuzhiyun 				int pin_num, int enable)
2735*4882a593Smuzhiyun {
2736*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2737*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
2738*4882a593Smuzhiyun 	struct regmap *regmap;
2739*4882a593Smuzhiyun 	int reg, ret;
2740*4882a593Smuzhiyun 	u8 bit;
2741*4882a593Smuzhiyun 	u32 data;
2742*4882a593Smuzhiyun 
2743*4882a593Smuzhiyun 	debug("setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num,
2744*4882a593Smuzhiyun 	      pin_num, enable);
2745*4882a593Smuzhiyun 
2746*4882a593Smuzhiyun 	ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2747*4882a593Smuzhiyun 	if (ret)
2748*4882a593Smuzhiyun 		return ret;
2749*4882a593Smuzhiyun 
2750*4882a593Smuzhiyun 	/* enable the write to the equivalent lower bits */
2751*4882a593Smuzhiyun 	data = BIT(bit + 16) | (enable << bit);
2752*4882a593Smuzhiyun 
2753*4882a593Smuzhiyun 	return regmap_write(regmap, reg, data);
2754*4882a593Smuzhiyun }
2755*4882a593Smuzhiyun 
2756*4882a593Smuzhiyun #define PX30_SLEW_RATE_PMU_OFFSET		0x30
2757*4882a593Smuzhiyun #define PX30_SLEW_RATE_GRF_OFFSET		0x90
2758*4882a593Smuzhiyun #define PX30_SLEW_RATE_PINS_PER_PMU_REG		16
2759*4882a593Smuzhiyun #define PX30_SLEW_RATE_BANK_STRIDE		16
2760*4882a593Smuzhiyun #define PX30_SLEW_RATE_PINS_PER_GRF_REG		8
2761*4882a593Smuzhiyun 
px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2762*4882a593Smuzhiyun static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2763*4882a593Smuzhiyun 					   int pin_num,
2764*4882a593Smuzhiyun 					   struct regmap **regmap,
2765*4882a593Smuzhiyun 					   int *reg, u8 *bit)
2766*4882a593Smuzhiyun {
2767*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2768*4882a593Smuzhiyun 	int pins_per_reg;
2769*4882a593Smuzhiyun 
2770*4882a593Smuzhiyun 	if (bank->bank_num == 0) {
2771*4882a593Smuzhiyun 		*regmap = priv->regmap_pmu;
2772*4882a593Smuzhiyun 		*reg = PX30_SLEW_RATE_PMU_OFFSET;
2773*4882a593Smuzhiyun 		pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
2774*4882a593Smuzhiyun 	} else {
2775*4882a593Smuzhiyun 		*regmap = priv->regmap_base;
2776*4882a593Smuzhiyun 		*reg = PX30_SCHMITT_GRF_OFFSET;
2777*4882a593Smuzhiyun 		pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
2778*4882a593Smuzhiyun 		*reg += (bank->bank_num  - 1) * PX30_SCHMITT_BANK_STRIDE;
2779*4882a593Smuzhiyun 	}
2780*4882a593Smuzhiyun 	*reg += ((pin_num / pins_per_reg) * 4);
2781*4882a593Smuzhiyun 	*bit = pin_num % pins_per_reg;
2782*4882a593Smuzhiyun 
2783*4882a593Smuzhiyun 	return 0;
2784*4882a593Smuzhiyun }
2785*4882a593Smuzhiyun 
rockchip_set_slew_rate(struct rockchip_pin_bank * bank,int pin_num,int speed)2786*4882a593Smuzhiyun static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
2787*4882a593Smuzhiyun 				  int pin_num, int speed)
2788*4882a593Smuzhiyun {
2789*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2790*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
2791*4882a593Smuzhiyun 	struct regmap *regmap;
2792*4882a593Smuzhiyun 	int reg, ret;
2793*4882a593Smuzhiyun 	u8 bit;
2794*4882a593Smuzhiyun 	u32 data;
2795*4882a593Smuzhiyun 
2796*4882a593Smuzhiyun 	debug("setting slew rate of GPIO%d-%d to %d\n", bank->bank_num,
2797*4882a593Smuzhiyun 	      pin_num, speed);
2798*4882a593Smuzhiyun 
2799*4882a593Smuzhiyun 	ret = ctrl->slew_rate_calc_reg(bank, pin_num, &regmap, &reg, &bit);
2800*4882a593Smuzhiyun 	if (ret)
2801*4882a593Smuzhiyun 		return ret;
2802*4882a593Smuzhiyun 
2803*4882a593Smuzhiyun 	/* enable the write to the equivalent lower bits */
2804*4882a593Smuzhiyun 	data = BIT(bit + 16) | (speed << bit);
2805*4882a593Smuzhiyun 
2806*4882a593Smuzhiyun 	return regmap_write(regmap, reg, data);
2807*4882a593Smuzhiyun }
2808*4882a593Smuzhiyun 
2809*4882a593Smuzhiyun /*
2810*4882a593Smuzhiyun  * Pinconf_ops handling
2811*4882a593Smuzhiyun  */
rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl * ctrl,unsigned int pull)2812*4882a593Smuzhiyun static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
2813*4882a593Smuzhiyun 					unsigned int pull)
2814*4882a593Smuzhiyun {
2815*4882a593Smuzhiyun 	switch (ctrl->type) {
2816*4882a593Smuzhiyun 	case RK2928:
2817*4882a593Smuzhiyun 	case RK3128:
2818*4882a593Smuzhiyun 		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
2819*4882a593Smuzhiyun 			pull == PIN_CONFIG_BIAS_DISABLE);
2820*4882a593Smuzhiyun 	case RK3066B:
2821*4882a593Smuzhiyun 		return pull ? false : true;
2822*4882a593Smuzhiyun 	case PX30:
2823*4882a593Smuzhiyun 	case RV1108:
2824*4882a593Smuzhiyun 	case RV1126:
2825*4882a593Smuzhiyun 	case RK1808:
2826*4882a593Smuzhiyun 	case RK3188:
2827*4882a593Smuzhiyun 	case RK3288:
2828*4882a593Smuzhiyun 	case RK3308:
2829*4882a593Smuzhiyun 	case RK3368:
2830*4882a593Smuzhiyun 	case RK3399:
2831*4882a593Smuzhiyun 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
2832*4882a593Smuzhiyun 	}
2833*4882a593Smuzhiyun 
2834*4882a593Smuzhiyun 	return false;
2835*4882a593Smuzhiyun }
2836*4882a593Smuzhiyun 
2837*4882a593Smuzhiyun /* set the pin config settings for a specified pin */
rockchip_pinconf_set(struct rockchip_pin_bank * bank,u32 pin,u32 param,u32 arg)2838*4882a593Smuzhiyun static int rockchip_pinconf_set(struct rockchip_pin_bank *bank,
2839*4882a593Smuzhiyun 				u32 pin, u32 param, u32 arg)
2840*4882a593Smuzhiyun {
2841*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = bank->priv;
2842*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
2843*4882a593Smuzhiyun 	int rc;
2844*4882a593Smuzhiyun 
2845*4882a593Smuzhiyun 	switch (param) {
2846*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_DISABLE:
2847*4882a593Smuzhiyun 		rc =  rockchip_set_pull(bank, pin, param);
2848*4882a593Smuzhiyun 		if (rc)
2849*4882a593Smuzhiyun 			return rc;
2850*4882a593Smuzhiyun 		break;
2851*4882a593Smuzhiyun 
2852*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_UP:
2853*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_DOWN:
2854*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
2855*4882a593Smuzhiyun 	case PIN_CONFIG_BIAS_BUS_HOLD:
2856*4882a593Smuzhiyun 		if (!rockchip_pinconf_pull_valid(ctrl, param))
2857*4882a593Smuzhiyun 			return -ENOTSUPP;
2858*4882a593Smuzhiyun 
2859*4882a593Smuzhiyun 		if (!arg)
2860*4882a593Smuzhiyun 			return -EINVAL;
2861*4882a593Smuzhiyun 
2862*4882a593Smuzhiyun 		rc = rockchip_set_pull(bank, pin, param);
2863*4882a593Smuzhiyun 		if (rc)
2864*4882a593Smuzhiyun 			return rc;
2865*4882a593Smuzhiyun 		break;
2866*4882a593Smuzhiyun 
2867*4882a593Smuzhiyun 	case PIN_CONFIG_DRIVE_STRENGTH:
2868*4882a593Smuzhiyun 		if (!ctrl->drv_calc_reg)
2869*4882a593Smuzhiyun 			return -ENOTSUPP;
2870*4882a593Smuzhiyun 
2871*4882a593Smuzhiyun 		rc = rockchip_set_drive_perpin(bank, pin, arg);
2872*4882a593Smuzhiyun 		if (rc < 0)
2873*4882a593Smuzhiyun 			return rc;
2874*4882a593Smuzhiyun 		break;
2875*4882a593Smuzhiyun 
2876*4882a593Smuzhiyun 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
2877*4882a593Smuzhiyun 		if (!ctrl->schmitt_calc_reg)
2878*4882a593Smuzhiyun 			return -ENOTSUPP;
2879*4882a593Smuzhiyun 
2880*4882a593Smuzhiyun 		rc = rockchip_set_schmitt(bank, pin, arg);
2881*4882a593Smuzhiyun 		if (rc < 0)
2882*4882a593Smuzhiyun 			return rc;
2883*4882a593Smuzhiyun 		break;
2884*4882a593Smuzhiyun 
2885*4882a593Smuzhiyun 	case PIN_CONFIG_SLEW_RATE:
2886*4882a593Smuzhiyun 		if (!ctrl->slew_rate_calc_reg)
2887*4882a593Smuzhiyun 			return -ENOTSUPP;
2888*4882a593Smuzhiyun 
2889*4882a593Smuzhiyun 		rc = rockchip_set_slew_rate(bank,
2890*4882a593Smuzhiyun 					    pin - bank->pin_base, arg);
2891*4882a593Smuzhiyun 		if (rc < 0)
2892*4882a593Smuzhiyun 			return rc;
2893*4882a593Smuzhiyun 		break;
2894*4882a593Smuzhiyun 
2895*4882a593Smuzhiyun 	default:
2896*4882a593Smuzhiyun 		break;
2897*4882a593Smuzhiyun 	}
2898*4882a593Smuzhiyun 
2899*4882a593Smuzhiyun 	return 0;
2900*4882a593Smuzhiyun }
2901*4882a593Smuzhiyun 
2902*4882a593Smuzhiyun static const struct pinconf_param rockchip_conf_params[] = {
2903*4882a593Smuzhiyun 	{ "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
2904*4882a593Smuzhiyun 	{ "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
2905*4882a593Smuzhiyun 	{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
2906*4882a593Smuzhiyun 	{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
2907*4882a593Smuzhiyun 	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
2908*4882a593Smuzhiyun 	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
2909*4882a593Smuzhiyun 	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
2910*4882a593Smuzhiyun 	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
2911*4882a593Smuzhiyun 	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
2912*4882a593Smuzhiyun 	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0 },
2913*4882a593Smuzhiyun };
2914*4882a593Smuzhiyun 
rockchip_pinconf_prop_name_to_param(const char * property,u32 * default_value)2915*4882a593Smuzhiyun static int rockchip_pinconf_prop_name_to_param(const char *property,
2916*4882a593Smuzhiyun 					       u32 *default_value)
2917*4882a593Smuzhiyun {
2918*4882a593Smuzhiyun 	const struct pinconf_param *p, *end;
2919*4882a593Smuzhiyun 
2920*4882a593Smuzhiyun 	p = rockchip_conf_params;
2921*4882a593Smuzhiyun 	end = p + sizeof(rockchip_conf_params) / sizeof(struct pinconf_param);
2922*4882a593Smuzhiyun 
2923*4882a593Smuzhiyun 	/* See if this pctldev supports this parameter */
2924*4882a593Smuzhiyun 	for (; p < end; p++) {
2925*4882a593Smuzhiyun 		if (!strcmp(property, p->property)) {
2926*4882a593Smuzhiyun 			*default_value = p->default_value;
2927*4882a593Smuzhiyun 			return p->param;
2928*4882a593Smuzhiyun 		}
2929*4882a593Smuzhiyun 	}
2930*4882a593Smuzhiyun 
2931*4882a593Smuzhiyun 	*default_value = 0;
2932*4882a593Smuzhiyun 	return -EPERM;
2933*4882a593Smuzhiyun }
2934*4882a593Smuzhiyun 
rockchip_pinctrl_set_state(struct udevice * dev,struct udevice * config)2935*4882a593Smuzhiyun static int rockchip_pinctrl_set_state(struct udevice *dev,
2936*4882a593Smuzhiyun 				      struct udevice *config)
2937*4882a593Smuzhiyun {
2938*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
2939*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
2940*4882a593Smuzhiyun 	u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
2941*4882a593Smuzhiyun 	u32 bank, pin, mux, conf, arg, default_val;
2942*4882a593Smuzhiyun 	int ret, count, i;
2943*4882a593Smuzhiyun 	const char *prop_name;
2944*4882a593Smuzhiyun 	const void *value;
2945*4882a593Smuzhiyun 	int prop_len, param;
2946*4882a593Smuzhiyun 	const u32 *data;
2947*4882a593Smuzhiyun 	ofnode node;
2948*4882a593Smuzhiyun #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
2949*4882a593Smuzhiyun 	const struct device_node *np;
2950*4882a593Smuzhiyun 	struct property *pp;
2951*4882a593Smuzhiyun #else
2952*4882a593Smuzhiyun 	int property_offset, pcfg_node;
2953*4882a593Smuzhiyun 	const void *blob = gd->fdt_blob;
2954*4882a593Smuzhiyun #endif
2955*4882a593Smuzhiyun 	data = dev_read_prop(config, "rockchip,pins", &count);
2956*4882a593Smuzhiyun 	if (count < 0) {
2957*4882a593Smuzhiyun 		debug("%s: bad array size %d\n", __func__, count);
2958*4882a593Smuzhiyun 		return -EINVAL;
2959*4882a593Smuzhiyun 	}
2960*4882a593Smuzhiyun 
2961*4882a593Smuzhiyun 	count /= sizeof(u32);
2962*4882a593Smuzhiyun 	if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
2963*4882a593Smuzhiyun 		debug("%s: unsupported pins array count %d\n",
2964*4882a593Smuzhiyun 		      __func__, count);
2965*4882a593Smuzhiyun 		return -EINVAL;
2966*4882a593Smuzhiyun 	}
2967*4882a593Smuzhiyun 
2968*4882a593Smuzhiyun 	for (i = 0; i < count; i++)
2969*4882a593Smuzhiyun 		cells[i] = fdt32_to_cpu(data[i]);
2970*4882a593Smuzhiyun 
2971*4882a593Smuzhiyun 	for (i = 0; i < (count >> 2); i++) {
2972*4882a593Smuzhiyun 		bank = cells[4 * i + 0];
2973*4882a593Smuzhiyun 		pin = cells[4 * i + 1];
2974*4882a593Smuzhiyun 		mux = cells[4 * i + 2];
2975*4882a593Smuzhiyun 		conf = cells[4 * i + 3];
2976*4882a593Smuzhiyun 
2977*4882a593Smuzhiyun 		ret = rockchip_verify_config(dev, bank, pin);
2978*4882a593Smuzhiyun 		if (ret)
2979*4882a593Smuzhiyun 			return ret;
2980*4882a593Smuzhiyun 
2981*4882a593Smuzhiyun 		ret = rockchip_set_mux(&ctrl->pin_banks[bank], pin, mux);
2982*4882a593Smuzhiyun 		if (ret)
2983*4882a593Smuzhiyun 			return ret;
2984*4882a593Smuzhiyun 
2985*4882a593Smuzhiyun 		node = ofnode_get_by_phandle(conf);
2986*4882a593Smuzhiyun 		if (!ofnode_valid(node))
2987*4882a593Smuzhiyun 			return -ENODEV;
2988*4882a593Smuzhiyun #if defined(CONFIG_OF_LIVE) && !defined(CONFIG_SPL_BUILD)
2989*4882a593Smuzhiyun 		np = ofnode_to_np(node);
2990*4882a593Smuzhiyun 		for (pp = np->properties; pp; pp = pp->next) {
2991*4882a593Smuzhiyun 			prop_name = pp->name;
2992*4882a593Smuzhiyun 			prop_len = pp->length;
2993*4882a593Smuzhiyun 			value = pp->value;
2994*4882a593Smuzhiyun #else
2995*4882a593Smuzhiyun 		pcfg_node = ofnode_to_offset(node);
2996*4882a593Smuzhiyun 		fdt_for_each_property_offset(property_offset, blob, pcfg_node) {
2997*4882a593Smuzhiyun 			value = fdt_getprop_by_offset(blob, property_offset,
2998*4882a593Smuzhiyun 						      &prop_name, &prop_len);
2999*4882a593Smuzhiyun 			if (!value)
3000*4882a593Smuzhiyun 				return -ENOENT;
3001*4882a593Smuzhiyun #endif
3002*4882a593Smuzhiyun 			param = rockchip_pinconf_prop_name_to_param(prop_name,
3003*4882a593Smuzhiyun 								    &default_val);
3004*4882a593Smuzhiyun 			if (param < 0)
3005*4882a593Smuzhiyun 				break;
3006*4882a593Smuzhiyun 
3007*4882a593Smuzhiyun 			if (prop_len >= sizeof(fdt32_t))
3008*4882a593Smuzhiyun 				arg = fdt32_to_cpu(*(fdt32_t *)value);
3009*4882a593Smuzhiyun 			else
3010*4882a593Smuzhiyun 				arg = default_val;
3011*4882a593Smuzhiyun 
3012*4882a593Smuzhiyun 			ret = rockchip_pinconf_set(&ctrl->pin_banks[bank], pin,
3013*4882a593Smuzhiyun 						   param, arg);
3014*4882a593Smuzhiyun 			if (ret) {
3015*4882a593Smuzhiyun 				debug("%s: rockchip_pinconf_set fail: %d\n",
3016*4882a593Smuzhiyun 				      __func__, ret);
3017*4882a593Smuzhiyun 				return ret;
3018*4882a593Smuzhiyun 			}
3019*4882a593Smuzhiyun 		}
3020*4882a593Smuzhiyun 	}
3021*4882a593Smuzhiyun 
3022*4882a593Smuzhiyun 	return 0;
3023*4882a593Smuzhiyun }
3024*4882a593Smuzhiyun 
3025*4882a593Smuzhiyun static int rockchip_pinctrl_get_pins_count(struct udevice *dev)
3026*4882a593Smuzhiyun {
3027*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
3028*4882a593Smuzhiyun 	struct rockchip_pin_ctrl *ctrl = priv->ctrl;
3029*4882a593Smuzhiyun 
3030*4882a593Smuzhiyun 	return ctrl->nr_pins;
3031*4882a593Smuzhiyun }
3032*4882a593Smuzhiyun 
3033*4882a593Smuzhiyun static struct pinctrl_ops rockchip_pinctrl_ops = {
3034*4882a593Smuzhiyun 	.get_pins_count			= rockchip_pinctrl_get_pins_count,
3035*4882a593Smuzhiyun 	.set_state			= rockchip_pinctrl_set_state,
3036*4882a593Smuzhiyun 	.get_gpio_mux			= rockchip_pinctrl_get_gpio_mux,
3037*4882a593Smuzhiyun };
3038*4882a593Smuzhiyun 
3039*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3308b_pin_ctrl;
3040*4882a593Smuzhiyun 
3041*4882a593Smuzhiyun /* retrieve the soc specific data */
3042*4882a593Smuzhiyun static const struct rockchip_pin_ctrl *
3043*4882a593Smuzhiyun rockchip_pinctrl_get_soc_data(struct udevice *dev)
3044*4882a593Smuzhiyun {
3045*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
3046*4882a593Smuzhiyun 	const struct rockchip_pin_ctrl *ctrl =
3047*4882a593Smuzhiyun 		(const struct rockchip_pin_ctrl *)dev_get_driver_data(dev);
3048*4882a593Smuzhiyun 	struct rockchip_pin_bank *bank;
3049*4882a593Smuzhiyun 	int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
3050*4882a593Smuzhiyun 	u32 nr_pins;
3051*4882a593Smuzhiyun 
3052*4882a593Smuzhiyun 	if (soc_is_rk3308b() || soc_is_rk3308bs())
3053*4882a593Smuzhiyun 		ctrl = &rk3308b_pin_ctrl;
3054*4882a593Smuzhiyun 
3055*4882a593Smuzhiyun 	grf_offs = ctrl->grf_mux_offset;
3056*4882a593Smuzhiyun 	pmu_offs = ctrl->pmu_mux_offset;
3057*4882a593Smuzhiyun 	drv_pmu_offs = ctrl->pmu_drv_offset;
3058*4882a593Smuzhiyun 	drv_grf_offs = ctrl->grf_drv_offset;
3059*4882a593Smuzhiyun 	bank = ctrl->pin_banks;
3060*4882a593Smuzhiyun 
3061*4882a593Smuzhiyun 	/* Ctrl data re-initialize for some Socs */
3062*4882a593Smuzhiyun 	if (ctrl->ctrl_data_re_init) {
3063*4882a593Smuzhiyun 		if (ctrl->ctrl_data_re_init(ctrl))
3064*4882a593Smuzhiyun 			return NULL;
3065*4882a593Smuzhiyun 	}
3066*4882a593Smuzhiyun 
3067*4882a593Smuzhiyun 	nr_pins = 0;
3068*4882a593Smuzhiyun 	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
3069*4882a593Smuzhiyun 		int bank_pins = 0;
3070*4882a593Smuzhiyun 
3071*4882a593Smuzhiyun 		bank->priv = priv;
3072*4882a593Smuzhiyun 		bank->pin_base = nr_pins;
3073*4882a593Smuzhiyun 		nr_pins += bank->nr_pins;
3074*4882a593Smuzhiyun 
3075*4882a593Smuzhiyun 		/* calculate iomux and drv offsets */
3076*4882a593Smuzhiyun 		for (j = 0; j < 4; j++) {
3077*4882a593Smuzhiyun 			struct rockchip_iomux *iom = &bank->iomux[j];
3078*4882a593Smuzhiyun 			struct rockchip_drv *drv = &bank->drv[j];
3079*4882a593Smuzhiyun 			int inc;
3080*4882a593Smuzhiyun 
3081*4882a593Smuzhiyun 			if (bank_pins >= bank->nr_pins)
3082*4882a593Smuzhiyun 				break;
3083*4882a593Smuzhiyun 
3084*4882a593Smuzhiyun 			/* preset iomux offset value, set new start value */
3085*4882a593Smuzhiyun 			if (iom->offset >= 0) {
3086*4882a593Smuzhiyun 				if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
3087*4882a593Smuzhiyun 					pmu_offs = iom->offset;
3088*4882a593Smuzhiyun 				else
3089*4882a593Smuzhiyun 					grf_offs = iom->offset;
3090*4882a593Smuzhiyun 			} else { /* set current iomux offset */
3091*4882a593Smuzhiyun 				iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
3092*4882a593Smuzhiyun 					       (iom->type & IOMUX_L_SOURCE_PMU)) ?
3093*4882a593Smuzhiyun 							pmu_offs : grf_offs;
3094*4882a593Smuzhiyun 			}
3095*4882a593Smuzhiyun 
3096*4882a593Smuzhiyun 			/* preset drv offset value, set new start value */
3097*4882a593Smuzhiyun 			if (drv->offset >= 0) {
3098*4882a593Smuzhiyun 				if (iom->type & IOMUX_SOURCE_PMU)
3099*4882a593Smuzhiyun 					drv_pmu_offs = drv->offset;
3100*4882a593Smuzhiyun 				else
3101*4882a593Smuzhiyun 					drv_grf_offs = drv->offset;
3102*4882a593Smuzhiyun 			} else { /* set current drv offset */
3103*4882a593Smuzhiyun 				drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
3104*4882a593Smuzhiyun 						drv_pmu_offs : drv_grf_offs;
3105*4882a593Smuzhiyun 			}
3106*4882a593Smuzhiyun 
3107*4882a593Smuzhiyun 			debug("bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
3108*4882a593Smuzhiyun 			      i, j, iom->offset, drv->offset);
3109*4882a593Smuzhiyun 
3110*4882a593Smuzhiyun 			/*
3111*4882a593Smuzhiyun 			 * Increase offset according to iomux width.
3112*4882a593Smuzhiyun 			 * 4bit iomux'es are spread over two registers.
3113*4882a593Smuzhiyun 			 */
3114*4882a593Smuzhiyun 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
3115*4882a593Smuzhiyun 					    IOMUX_WIDTH_3BIT |
3116*4882a593Smuzhiyun 					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
3117*4882a593Smuzhiyun 			if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
3118*4882a593Smuzhiyun 				pmu_offs += inc;
3119*4882a593Smuzhiyun 			else
3120*4882a593Smuzhiyun 				grf_offs += inc;
3121*4882a593Smuzhiyun 
3122*4882a593Smuzhiyun 			/*
3123*4882a593Smuzhiyun 			 * Increase offset according to drv width.
3124*4882a593Smuzhiyun 			 * 3bit drive-strenth'es are spread over two registers.
3125*4882a593Smuzhiyun 			 */
3126*4882a593Smuzhiyun 			if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
3127*4882a593Smuzhiyun 			    (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
3128*4882a593Smuzhiyun 				inc = 8;
3129*4882a593Smuzhiyun 			else
3130*4882a593Smuzhiyun 				inc = 4;
3131*4882a593Smuzhiyun 
3132*4882a593Smuzhiyun 			if (iom->type & IOMUX_SOURCE_PMU)
3133*4882a593Smuzhiyun 				drv_pmu_offs += inc;
3134*4882a593Smuzhiyun 			else
3135*4882a593Smuzhiyun 				drv_grf_offs += inc;
3136*4882a593Smuzhiyun 
3137*4882a593Smuzhiyun 			bank_pins += 8;
3138*4882a593Smuzhiyun 		}
3139*4882a593Smuzhiyun 
3140*4882a593Smuzhiyun 		/* calculate the per-bank recalced_mask */
3141*4882a593Smuzhiyun 		for (j = 0; j < ctrl->niomux_recalced; j++) {
3142*4882a593Smuzhiyun 			int pin = 0;
3143*4882a593Smuzhiyun 
3144*4882a593Smuzhiyun 			if (ctrl->iomux_recalced[j].num == bank->bank_num) {
3145*4882a593Smuzhiyun 				pin = ctrl->iomux_recalced[j].pin;
3146*4882a593Smuzhiyun 				bank->recalced_mask |= BIT(pin);
3147*4882a593Smuzhiyun 			}
3148*4882a593Smuzhiyun 		}
3149*4882a593Smuzhiyun 
3150*4882a593Smuzhiyun 		/* calculate the per-bank route_mask */
3151*4882a593Smuzhiyun 		for (j = 0; j < ctrl->niomux_routes; j++) {
3152*4882a593Smuzhiyun 			int pin = 0;
3153*4882a593Smuzhiyun 
3154*4882a593Smuzhiyun 			if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
3155*4882a593Smuzhiyun 				pin = ctrl->iomux_routes[j].pin;
3156*4882a593Smuzhiyun 				bank->route_mask |= BIT(pin);
3157*4882a593Smuzhiyun 			}
3158*4882a593Smuzhiyun 		}
3159*4882a593Smuzhiyun 	}
3160*4882a593Smuzhiyun 
3161*4882a593Smuzhiyun 	WARN_ON(nr_pins != ctrl->nr_pins);
3162*4882a593Smuzhiyun 
3163*4882a593Smuzhiyun 	return ctrl;
3164*4882a593Smuzhiyun }
3165*4882a593Smuzhiyun 
3166*4882a593Smuzhiyun /* SoC data specially handle */
3167*4882a593Smuzhiyun 
3168*4882a593Smuzhiyun /* rk3308b SoC data initialize */
3169*4882a593Smuzhiyun #define RK3308B_GRF_SOC_CON13			0x608
3170*4882a593Smuzhiyun #define RK3308B_GRF_SOC_CON15			0x610
3171*4882a593Smuzhiyun 
3172*4882a593Smuzhiyun /* RK3308B_GRF_SOC_CON13 */
3173*4882a593Smuzhiyun #define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL	(BIT(16 + 10) | BIT(10))
3174*4882a593Smuzhiyun #define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3175*4882a593Smuzhiyun #define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3176*4882a593Smuzhiyun 
3177*4882a593Smuzhiyun /* RK3308B_GRF_SOC_CON15 */
3178*4882a593Smuzhiyun #define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL	(BIT(16 + 11) | BIT(11))
3179*4882a593Smuzhiyun #define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL	(BIT(16 + 7)  | BIT(7))
3180*4882a593Smuzhiyun #define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL	(BIT(16 + 3)  | BIT(3))
3181*4882a593Smuzhiyun 
3182*4882a593Smuzhiyun static int rk3308b_soc_data_init(struct rockchip_pinctrl_priv *priv)
3183*4882a593Smuzhiyun {
3184*4882a593Smuzhiyun 	int ret;
3185*4882a593Smuzhiyun 
3186*4882a593Smuzhiyun 	/*
3187*4882a593Smuzhiyun 	 * Enable the special ctrl  of selected sources.
3188*4882a593Smuzhiyun 	 */
3189*4882a593Smuzhiyun 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON13,
3190*4882a593Smuzhiyun 			   RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
3191*4882a593Smuzhiyun 			   RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
3192*4882a593Smuzhiyun 			   RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
3193*4882a593Smuzhiyun 	if (ret)
3194*4882a593Smuzhiyun 		return ret;
3195*4882a593Smuzhiyun 
3196*4882a593Smuzhiyun 	ret = regmap_write(priv->regmap_base, RK3308B_GRF_SOC_CON15,
3197*4882a593Smuzhiyun 			   RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
3198*4882a593Smuzhiyun 			   RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
3199*4882a593Smuzhiyun 			   RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
3200*4882a593Smuzhiyun 	if (ret)
3201*4882a593Smuzhiyun 		return ret;
3202*4882a593Smuzhiyun 
3203*4882a593Smuzhiyun 	return 0;
3204*4882a593Smuzhiyun }
3205*4882a593Smuzhiyun 
3206*4882a593Smuzhiyun static int rockchip_pinctrl_probe(struct udevice *dev)
3207*4882a593Smuzhiyun {
3208*4882a593Smuzhiyun 	struct rockchip_pinctrl_priv *priv = dev_get_priv(dev);
3209*4882a593Smuzhiyun 	const struct rockchip_pin_ctrl *ctrl;
3210*4882a593Smuzhiyun 	struct udevice *syscon;
3211*4882a593Smuzhiyun 	struct regmap *regmap;
3212*4882a593Smuzhiyun 	int ret = 0;
3213*4882a593Smuzhiyun 
3214*4882a593Smuzhiyun 	/* get rockchip grf syscon phandle */
3215*4882a593Smuzhiyun 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
3216*4882a593Smuzhiyun 					   &syscon);
3217*4882a593Smuzhiyun 	if (ret) {
3218*4882a593Smuzhiyun 		debug("unable to find rockchip,grf syscon device (%d)\n", ret);
3219*4882a593Smuzhiyun 		return ret;
3220*4882a593Smuzhiyun 	}
3221*4882a593Smuzhiyun 
3222*4882a593Smuzhiyun 	/* get grf-reg base address */
3223*4882a593Smuzhiyun 	regmap = syscon_get_regmap(syscon);
3224*4882a593Smuzhiyun 	if (!regmap) {
3225*4882a593Smuzhiyun 		debug("unable to find rockchip grf regmap\n");
3226*4882a593Smuzhiyun 		return -ENODEV;
3227*4882a593Smuzhiyun 	}
3228*4882a593Smuzhiyun 	priv->regmap_base = regmap;
3229*4882a593Smuzhiyun 
3230*4882a593Smuzhiyun 	/* option: get pmu-reg base address */
3231*4882a593Smuzhiyun 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pmu",
3232*4882a593Smuzhiyun 					   &syscon);
3233*4882a593Smuzhiyun 	if (!ret) {
3234*4882a593Smuzhiyun 		/* get pmugrf-reg base address */
3235*4882a593Smuzhiyun 		regmap = syscon_get_regmap(syscon);
3236*4882a593Smuzhiyun 		if (!regmap) {
3237*4882a593Smuzhiyun 			debug("unable to find rockchip pmu regmap\n");
3238*4882a593Smuzhiyun 			return -ENODEV;
3239*4882a593Smuzhiyun 		}
3240*4882a593Smuzhiyun 		priv->regmap_pmu = regmap;
3241*4882a593Smuzhiyun 	}
3242*4882a593Smuzhiyun 
3243*4882a593Smuzhiyun 	ctrl = rockchip_pinctrl_get_soc_data(dev);
3244*4882a593Smuzhiyun 	if (!ctrl) {
3245*4882a593Smuzhiyun 		debug("driver data not available\n");
3246*4882a593Smuzhiyun 		return -EINVAL;
3247*4882a593Smuzhiyun 	}
3248*4882a593Smuzhiyun 
3249*4882a593Smuzhiyun 	/* Special handle for some Socs */
3250*4882a593Smuzhiyun 	if (ctrl->soc_data_init) {
3251*4882a593Smuzhiyun 		ret = ctrl->soc_data_init(priv);
3252*4882a593Smuzhiyun 		if (ret)
3253*4882a593Smuzhiyun 			return ret;
3254*4882a593Smuzhiyun 	}
3255*4882a593Smuzhiyun 
3256*4882a593Smuzhiyun 	priv->ctrl = (struct rockchip_pin_ctrl *)ctrl;
3257*4882a593Smuzhiyun 	return 0;
3258*4882a593Smuzhiyun }
3259*4882a593Smuzhiyun 
3260*4882a593Smuzhiyun static struct rockchip_pin_bank px30_pin_banks[] = {
3261*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
3262*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU,
3263*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU,
3264*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU
3265*4882a593Smuzhiyun 			    ),
3266*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
3267*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3268*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3269*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT
3270*4882a593Smuzhiyun 			    ),
3271*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
3272*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3273*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3274*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT
3275*4882a593Smuzhiyun 			    ),
3276*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
3277*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3278*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3279*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT
3280*4882a593Smuzhiyun 			    ),
3281*4882a593Smuzhiyun };
3282*4882a593Smuzhiyun 
3283*4882a593Smuzhiyun static const struct rockchip_pin_ctrl px30_pin_ctrl = {
3284*4882a593Smuzhiyun 	.pin_banks		= px30_pin_banks,
3285*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(px30_pin_banks),
3286*4882a593Smuzhiyun 	.nr_pins		= 128,
3287*4882a593Smuzhiyun 	.label			= "PX30-GPIO",
3288*4882a593Smuzhiyun 	.type			= PX30,
3289*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3290*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x0,
3291*4882a593Smuzhiyun 	.iomux_routes		= px30_mux_route_data,
3292*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(px30_mux_route_data),
3293*4882a593Smuzhiyun 	.pull_calc_reg		= px30_calc_pull_reg_and_bit,
3294*4882a593Smuzhiyun 	.drv_calc_reg		= px30_calc_drv_reg_and_bit,
3295*4882a593Smuzhiyun 	.schmitt_calc_reg	= px30_calc_schmitt_reg_and_bit,
3296*4882a593Smuzhiyun 	.slew_rate_calc_reg	= px30_calc_slew_rate_reg_and_bit,
3297*4882a593Smuzhiyun };
3298*4882a593Smuzhiyun 
3299*4882a593Smuzhiyun static struct rockchip_pin_bank rv1108_pin_banks[] = {
3300*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
3301*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU,
3302*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU,
3303*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU),
3304*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
3305*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
3306*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
3307*4882a593Smuzhiyun };
3308*4882a593Smuzhiyun 
3309*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rv1108_pin_ctrl = {
3310*4882a593Smuzhiyun 	.pin_banks		= rv1108_pin_banks,
3311*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
3312*4882a593Smuzhiyun 	.nr_pins		= 128,
3313*4882a593Smuzhiyun 	.label			= "RV1108-GPIO",
3314*4882a593Smuzhiyun 	.type			= RV1108,
3315*4882a593Smuzhiyun 	.grf_mux_offset		= 0x10,
3316*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x0,
3317*4882a593Smuzhiyun 	.iomux_recalced		= rv1108_mux_recalced_data,
3318*4882a593Smuzhiyun 	.niomux_recalced	= ARRAY_SIZE(rv1108_mux_recalced_data),
3319*4882a593Smuzhiyun 	.pull_calc_reg		= rv1108_calc_pull_reg_and_bit,
3320*4882a593Smuzhiyun 	.drv_calc_reg		= rv1108_calc_drv_reg_and_bit,
3321*4882a593Smuzhiyun 	.schmitt_calc_reg	= rv1108_calc_schmitt_reg_and_bit,
3322*4882a593Smuzhiyun };
3323*4882a593Smuzhiyun 
3324*4882a593Smuzhiyun static struct rockchip_pin_bank rv1126_pin_banks[] = {
3325*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3326*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3327*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
3328*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
3329*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3330*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
3331*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3332*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3333*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3334*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3335*4882a593Smuzhiyun 			     0x10010, 0x10018, 0x10020, 0x10028),
3336*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3337*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3338*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3339*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3340*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3341*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3342*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3343*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3344*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3345*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3346*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
3347*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
3348*4882a593Smuzhiyun };
3349*4882a593Smuzhiyun 
3350*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rv1126_pin_ctrl = {
3351*4882a593Smuzhiyun 	.pin_banks		= rv1126_pin_banks,
3352*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
3353*4882a593Smuzhiyun 	.nr_pins		= 130,
3354*4882a593Smuzhiyun 	.label			= "RV1126-GPIO",
3355*4882a593Smuzhiyun 	.type			= RV1126,
3356*4882a593Smuzhiyun 	.grf_mux_offset		= 0x10004, /* mux offset from GPIO0_D0 */
3357*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x0,
3358*4882a593Smuzhiyun 	.iomux_routes		= rv1126_mux_route_data,
3359*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rv1126_mux_route_data),
3360*4882a593Smuzhiyun 	.iomux_recalced		= rv1126_mux_recalced_data,
3361*4882a593Smuzhiyun 	.niomux_recalced	= ARRAY_SIZE(rv1126_mux_recalced_data),
3362*4882a593Smuzhiyun 	.pull_calc_reg		= rv1126_calc_pull_reg_and_bit,
3363*4882a593Smuzhiyun 	.drv_calc_reg		= rv1126_calc_drv_reg_and_bit,
3364*4882a593Smuzhiyun 	.schmitt_calc_reg	= rv1126_calc_schmitt_reg_and_bit,
3365*4882a593Smuzhiyun };
3366*4882a593Smuzhiyun 
3367*4882a593Smuzhiyun static struct rockchip_pin_bank rk1808_pin_banks[] = {
3368*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
3369*4882a593Smuzhiyun 			     IOMUX_SOURCE_PMU,
3370*4882a593Smuzhiyun 			     IOMUX_SOURCE_PMU,
3371*4882a593Smuzhiyun 			     IOMUX_SOURCE_PMU,
3372*4882a593Smuzhiyun 			     IOMUX_SOURCE_PMU),
3373*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1",
3374*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3375*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3376*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3377*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3378*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
3379*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3380*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3381*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3382*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3383*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3384*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3385*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3386*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3387*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3388*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4",
3389*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3390*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3391*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT,
3392*4882a593Smuzhiyun 			     IOMUX_WIDTH_4BIT),
3393*4882a593Smuzhiyun };
3394*4882a593Smuzhiyun 
3395*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk1808_pin_ctrl = {
3396*4882a593Smuzhiyun 	.pin_banks		= rk1808_pin_banks,
3397*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
3398*4882a593Smuzhiyun 	.nr_pins		= 160,
3399*4882a593Smuzhiyun 	.label			= "RK1808-GPIO",
3400*4882a593Smuzhiyun 	.type			= RK1808,
3401*4882a593Smuzhiyun 	.iomux_routes		= rk1808_mux_route_data,
3402*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk1808_mux_route_data),
3403*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3404*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x0,
3405*4882a593Smuzhiyun 	.pull_calc_reg		= rk1808_calc_pull_reg_and_bit,
3406*4882a593Smuzhiyun 	.drv_calc_reg		= rk1808_calc_drv_reg_and_bit,
3407*4882a593Smuzhiyun 	.schmitt_calc_reg	= rk1808_calc_schmitt_reg_and_bit,
3408*4882a593Smuzhiyun };
3409*4882a593Smuzhiyun 
3410*4882a593Smuzhiyun static struct rockchip_pin_bank rk2928_pin_banks[] = {
3411*4882a593Smuzhiyun 	PIN_BANK(0, 32, "gpio0"),
3412*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3413*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3414*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3415*4882a593Smuzhiyun };
3416*4882a593Smuzhiyun 
3417*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk2928_pin_ctrl = {
3418*4882a593Smuzhiyun 	.pin_banks		= rk2928_pin_banks,
3419*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
3420*4882a593Smuzhiyun 	.nr_pins		= 128,
3421*4882a593Smuzhiyun 	.label			= "RK2928-GPIO",
3422*4882a593Smuzhiyun 	.type			= RK2928,
3423*4882a593Smuzhiyun 	.grf_mux_offset		= 0xa8,
3424*4882a593Smuzhiyun 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
3425*4882a593Smuzhiyun };
3426*4882a593Smuzhiyun 
3427*4882a593Smuzhiyun static struct rockchip_pin_bank rk3036_pin_banks[] = {
3428*4882a593Smuzhiyun 	PIN_BANK(0, 32, "gpio0"),
3429*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3430*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3431*4882a593Smuzhiyun };
3432*4882a593Smuzhiyun 
3433*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3036_pin_ctrl = {
3434*4882a593Smuzhiyun 	.pin_banks		= rk3036_pin_banks,
3435*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
3436*4882a593Smuzhiyun 	.nr_pins		= 96,
3437*4882a593Smuzhiyun 	.label			= "RK3036-GPIO",
3438*4882a593Smuzhiyun 	.type			= RK2928,
3439*4882a593Smuzhiyun 	.grf_mux_offset		= 0xa8,
3440*4882a593Smuzhiyun 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
3441*4882a593Smuzhiyun };
3442*4882a593Smuzhiyun 
3443*4882a593Smuzhiyun static struct rockchip_pin_bank rk3066a_pin_banks[] = {
3444*4882a593Smuzhiyun 	PIN_BANK(0, 32, "gpio0"),
3445*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3446*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3447*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3448*4882a593Smuzhiyun 	PIN_BANK(4, 32, "gpio4"),
3449*4882a593Smuzhiyun 	PIN_BANK(6, 16, "gpio6"),
3450*4882a593Smuzhiyun };
3451*4882a593Smuzhiyun 
3452*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
3453*4882a593Smuzhiyun 	.pin_banks		= rk3066a_pin_banks,
3454*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
3455*4882a593Smuzhiyun 	.nr_pins		= 176,
3456*4882a593Smuzhiyun 	.label			= "RK3066a-GPIO",
3457*4882a593Smuzhiyun 	.type			= RK2928,
3458*4882a593Smuzhiyun 	.grf_mux_offset		= 0xa8,
3459*4882a593Smuzhiyun 	.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,
3460*4882a593Smuzhiyun };
3461*4882a593Smuzhiyun 
3462*4882a593Smuzhiyun static struct rockchip_pin_bank rk3066b_pin_banks[] = {
3463*4882a593Smuzhiyun 	PIN_BANK(0, 32, "gpio0"),
3464*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3465*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3466*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3467*4882a593Smuzhiyun };
3468*4882a593Smuzhiyun 
3469*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
3470*4882a593Smuzhiyun 	.pin_banks		= rk3066b_pin_banks,
3471*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3066b_pin_banks),
3472*4882a593Smuzhiyun 	.nr_pins		= 128,
3473*4882a593Smuzhiyun 	.label			= "RK3066b-GPIO",
3474*4882a593Smuzhiyun 	.type			= RK3066B,
3475*4882a593Smuzhiyun 	.grf_mux_offset		= 0x60,
3476*4882a593Smuzhiyun };
3477*4882a593Smuzhiyun 
3478*4882a593Smuzhiyun static struct rockchip_pin_bank rk3128_pin_banks[] = {
3479*4882a593Smuzhiyun 	PIN_BANK(0, 32, "gpio0"),
3480*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3481*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3482*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3483*4882a593Smuzhiyun };
3484*4882a593Smuzhiyun 
3485*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3128_pin_ctrl = {
3486*4882a593Smuzhiyun 	.pin_banks		= rk3128_pin_banks,
3487*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
3488*4882a593Smuzhiyun 	.nr_pins		= 128,
3489*4882a593Smuzhiyun 	.label			= "RK3128-GPIO",
3490*4882a593Smuzhiyun 	.type			= RK3128,
3491*4882a593Smuzhiyun 	.grf_mux_offset		= 0xa8,
3492*4882a593Smuzhiyun 	.iomux_recalced		= rk3128_mux_recalced_data,
3493*4882a593Smuzhiyun 	.niomux_recalced	= ARRAY_SIZE(rk3128_mux_recalced_data),
3494*4882a593Smuzhiyun 	.iomux_routes		= rk3128_mux_route_data,
3495*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk3128_mux_route_data),
3496*4882a593Smuzhiyun 	.pull_calc_reg		= rk3128_calc_pull_reg_and_bit,
3497*4882a593Smuzhiyun };
3498*4882a593Smuzhiyun 
3499*4882a593Smuzhiyun static struct rockchip_pin_bank rk3188_pin_banks[] = {
3500*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
3501*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3502*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3503*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3504*4882a593Smuzhiyun };
3505*4882a593Smuzhiyun 
3506*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3188_pin_ctrl = {
3507*4882a593Smuzhiyun 	.pin_banks		= rk3188_pin_banks,
3508*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
3509*4882a593Smuzhiyun 	.nr_pins		= 128,
3510*4882a593Smuzhiyun 	.label			= "RK3188-GPIO",
3511*4882a593Smuzhiyun 	.type			= RK3188,
3512*4882a593Smuzhiyun 	.grf_mux_offset		= 0x60,
3513*4882a593Smuzhiyun 	.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
3514*4882a593Smuzhiyun };
3515*4882a593Smuzhiyun 
3516*4882a593Smuzhiyun static struct rockchip_pin_bank rk3228_pin_banks[] = {
3517*4882a593Smuzhiyun 	PIN_BANK(0, 32, "gpio0"),
3518*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3519*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3520*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3521*4882a593Smuzhiyun };
3522*4882a593Smuzhiyun 
3523*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3228_pin_ctrl = {
3524*4882a593Smuzhiyun 	.pin_banks		= rk3228_pin_banks,
3525*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
3526*4882a593Smuzhiyun 	.nr_pins		= 128,
3527*4882a593Smuzhiyun 	.label			= "RK3228-GPIO",
3528*4882a593Smuzhiyun 	.type			= RK3288,
3529*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3530*4882a593Smuzhiyun 	.iomux_routes		= rk3228_mux_route_data,
3531*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk3228_mux_route_data),
3532*4882a593Smuzhiyun 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
3533*4882a593Smuzhiyun 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
3534*4882a593Smuzhiyun };
3535*4882a593Smuzhiyun 
3536*4882a593Smuzhiyun static struct rockchip_pin_bank rk3288_pin_banks[] = {
3537*4882a593Smuzhiyun 	PIN_BANK_IOMUX_DRV_PULL_FLAGS(0, 24, "gpio0",
3538*4882a593Smuzhiyun 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
3539*4882a593Smuzhiyun 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
3540*4882a593Smuzhiyun 				      IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
3541*4882a593Smuzhiyun 				      IOMUX_UNROUTED,
3542*4882a593Smuzhiyun 				      DRV_TYPE_WRITABLE_32BIT,
3543*4882a593Smuzhiyun 				      DRV_TYPE_WRITABLE_32BIT,
3544*4882a593Smuzhiyun 				      DRV_TYPE_WRITABLE_32BIT,
3545*4882a593Smuzhiyun 				      0,
3546*4882a593Smuzhiyun 				      PULL_TYPE_WRITABLE_32BIT,
3547*4882a593Smuzhiyun 				      PULL_TYPE_WRITABLE_32BIT,
3548*4882a593Smuzhiyun 				      PULL_TYPE_WRITABLE_32BIT,
3549*4882a593Smuzhiyun 				      0
3550*4882a593Smuzhiyun 			    ),
3551*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
3552*4882a593Smuzhiyun 					     IOMUX_UNROUTED,
3553*4882a593Smuzhiyun 					     IOMUX_UNROUTED,
3554*4882a593Smuzhiyun 					     0
3555*4882a593Smuzhiyun 			    ),
3556*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
3557*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
3558*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
3559*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3560*4882a593Smuzhiyun 					     0,
3561*4882a593Smuzhiyun 					     0
3562*4882a593Smuzhiyun 			    ),
3563*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
3564*4882a593Smuzhiyun 					     0,
3565*4882a593Smuzhiyun 					     0,
3566*4882a593Smuzhiyun 					     IOMUX_UNROUTED
3567*4882a593Smuzhiyun 			    ),
3568*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
3569*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
3570*4882a593Smuzhiyun 					     0,
3571*4882a593Smuzhiyun 					     IOMUX_WIDTH_4BIT,
3572*4882a593Smuzhiyun 					     IOMUX_UNROUTED
3573*4882a593Smuzhiyun 			    ),
3574*4882a593Smuzhiyun 	PIN_BANK(8, 16, "gpio8"),
3575*4882a593Smuzhiyun };
3576*4882a593Smuzhiyun 
3577*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3288_pin_ctrl = {
3578*4882a593Smuzhiyun 	.pin_banks		= rk3288_pin_banks,
3579*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
3580*4882a593Smuzhiyun 	.nr_pins		= 264,
3581*4882a593Smuzhiyun 	.label			= "RK3288-GPIO",
3582*4882a593Smuzhiyun 	.type			= RK3288,
3583*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3584*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x84,
3585*4882a593Smuzhiyun 	.iomux_routes		= rk3288_mux_route_data,
3586*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk3288_mux_route_data),
3587*4882a593Smuzhiyun 	.pull_calc_reg		= rk3288_calc_pull_reg_and_bit,
3588*4882a593Smuzhiyun 	.drv_calc_reg		= rk3288_calc_drv_reg_and_bit,
3589*4882a593Smuzhiyun };
3590*4882a593Smuzhiyun 
3591*4882a593Smuzhiyun static struct rockchip_pin_bank rk3308_pin_banks[] = {
3592*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
3593*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3594*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3595*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT),
3596*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
3597*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3598*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3599*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT),
3600*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
3601*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3602*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3603*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT),
3604*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
3605*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3606*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3607*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT),
3608*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
3609*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3610*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT,
3611*4882a593Smuzhiyun 					     IOMUX_8WIDTH_2BIT),
3612*4882a593Smuzhiyun };
3613*4882a593Smuzhiyun 
3614*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
3615*4882a593Smuzhiyun 		.pin_banks		= rk3308_pin_banks,
3616*4882a593Smuzhiyun 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3617*4882a593Smuzhiyun 		.nr_pins		= 160,
3618*4882a593Smuzhiyun 		.label			= "RK3308-GPIO",
3619*4882a593Smuzhiyun 		.type			= RK3308,
3620*4882a593Smuzhiyun 		.grf_mux_offset		= 0x0,
3621*4882a593Smuzhiyun 		.iomux_recalced		= rk3308_mux_recalced_data,
3622*4882a593Smuzhiyun 		.niomux_recalced	= ARRAY_SIZE(rk3308_mux_recalced_data),
3623*4882a593Smuzhiyun 		.iomux_routes		= rk3308_mux_route_data,
3624*4882a593Smuzhiyun 		.niomux_routes		= ARRAY_SIZE(rk3308_mux_route_data),
3625*4882a593Smuzhiyun 		.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3626*4882a593Smuzhiyun 		.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3627*4882a593Smuzhiyun 		.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3628*4882a593Smuzhiyun };
3629*4882a593Smuzhiyun 
3630*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3308b_pin_ctrl = {
3631*4882a593Smuzhiyun 	.pin_banks		= rk3308_pin_banks,
3632*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
3633*4882a593Smuzhiyun 	.nr_pins		= 160,
3634*4882a593Smuzhiyun 	.label			= "RK3308-GPIO",
3635*4882a593Smuzhiyun 	.type			= RK3308,
3636*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3637*4882a593Smuzhiyun 	.iomux_recalced		= rk3308b_mux_recalced_data,
3638*4882a593Smuzhiyun 	.niomux_recalced	= ARRAY_SIZE(rk3308b_mux_recalced_data),
3639*4882a593Smuzhiyun 	.iomux_routes		= rk3308b_mux_route_data,
3640*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk3308b_mux_route_data),
3641*4882a593Smuzhiyun 	.soc_data_init		= rk3308b_soc_data_init,
3642*4882a593Smuzhiyun 	.pull_calc_reg		= rk3308_calc_pull_reg_and_bit,
3643*4882a593Smuzhiyun 	.drv_calc_reg		= rk3308_calc_drv_reg_and_bit,
3644*4882a593Smuzhiyun 	.schmitt_calc_reg	= rk3308_calc_schmitt_reg_and_bit,
3645*4882a593Smuzhiyun };
3646*4882a593Smuzhiyun 
3647*4882a593Smuzhiyun static struct rockchip_pin_bank rk3328_pin_banks[] = {
3648*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
3649*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
3650*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
3651*4882a593Smuzhiyun 			     IOMUX_WIDTH_3BIT,
3652*4882a593Smuzhiyun 			     IOMUX_WIDTH_3BIT,
3653*4882a593Smuzhiyun 			     0),
3654*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
3655*4882a593Smuzhiyun 			     IOMUX_WIDTH_3BIT,
3656*4882a593Smuzhiyun 			     IOMUX_WIDTH_3BIT,
3657*4882a593Smuzhiyun 			     0,
3658*4882a593Smuzhiyun 			     0),
3659*4882a593Smuzhiyun };
3660*4882a593Smuzhiyun 
3661*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3328_pin_ctrl = {
3662*4882a593Smuzhiyun 	.pin_banks		= rk3328_pin_banks,
3663*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
3664*4882a593Smuzhiyun 	.nr_pins		= 128,
3665*4882a593Smuzhiyun 	.label			= "RK3328-GPIO",
3666*4882a593Smuzhiyun 	.type			= RK3288,
3667*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3668*4882a593Smuzhiyun 	.iomux_recalced		= rk3328_mux_recalced_data,
3669*4882a593Smuzhiyun 	.niomux_recalced	= ARRAY_SIZE(rk3328_mux_recalced_data),
3670*4882a593Smuzhiyun 	.iomux_routes		= rk3328_mux_route_data,
3671*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk3328_mux_route_data),
3672*4882a593Smuzhiyun 	.pull_calc_reg		= rk3228_calc_pull_reg_and_bit,
3673*4882a593Smuzhiyun 	.drv_calc_reg		= rk3228_calc_drv_reg_and_bit,
3674*4882a593Smuzhiyun 	.schmitt_calc_reg	= rk3328_calc_schmitt_reg_and_bit,
3675*4882a593Smuzhiyun };
3676*4882a593Smuzhiyun 
3677*4882a593Smuzhiyun static struct rockchip_pin_bank rk3368_pin_banks[] = {
3678*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
3679*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU,
3680*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU,
3681*4882a593Smuzhiyun 					     IOMUX_SOURCE_PMU
3682*4882a593Smuzhiyun 			    ),
3683*4882a593Smuzhiyun 	PIN_BANK(1, 32, "gpio1"),
3684*4882a593Smuzhiyun 	PIN_BANK(2, 32, "gpio2"),
3685*4882a593Smuzhiyun 	PIN_BANK(3, 32, "gpio3"),
3686*4882a593Smuzhiyun };
3687*4882a593Smuzhiyun 
3688*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3368_pin_ctrl = {
3689*4882a593Smuzhiyun 	.pin_banks		= rk3368_pin_banks,
3690*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
3691*4882a593Smuzhiyun 	.nr_pins		= 128,
3692*4882a593Smuzhiyun 	.label			= "RK3368-GPIO",
3693*4882a593Smuzhiyun 	.type			= RK3368,
3694*4882a593Smuzhiyun 	.grf_mux_offset		= 0x0,
3695*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x0,
3696*4882a593Smuzhiyun 	.pull_calc_reg		= rk3368_calc_pull_reg_and_bit,
3697*4882a593Smuzhiyun 	.drv_calc_reg		= rk3368_calc_drv_reg_and_bit,
3698*4882a593Smuzhiyun };
3699*4882a593Smuzhiyun 
3700*4882a593Smuzhiyun static struct rockchip_pin_bank rk3399_pin_banks[] = {
3701*4882a593Smuzhiyun 	PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
3702*4882a593Smuzhiyun 							 IOMUX_SOURCE_PMU,
3703*4882a593Smuzhiyun 							 IOMUX_SOURCE_PMU,
3704*4882a593Smuzhiyun 							 IOMUX_SOURCE_PMU,
3705*4882a593Smuzhiyun 							 IOMUX_SOURCE_PMU,
3706*4882a593Smuzhiyun 							 DRV_TYPE_IO_1V8_ONLY,
3707*4882a593Smuzhiyun 							 DRV_TYPE_IO_1V8_ONLY,
3708*4882a593Smuzhiyun 							 DRV_TYPE_IO_DEFAULT,
3709*4882a593Smuzhiyun 							 DRV_TYPE_IO_DEFAULT,
3710*4882a593Smuzhiyun 							 0x80,
3711*4882a593Smuzhiyun 							 0x88,
3712*4882a593Smuzhiyun 							 -1,
3713*4882a593Smuzhiyun 							 -1,
3714*4882a593Smuzhiyun 							 PULL_TYPE_IO_1V8_ONLY,
3715*4882a593Smuzhiyun 							 PULL_TYPE_IO_1V8_ONLY,
3716*4882a593Smuzhiyun 							 PULL_TYPE_IO_DEFAULT,
3717*4882a593Smuzhiyun 							 PULL_TYPE_IO_DEFAULT
3718*4882a593Smuzhiyun 							),
3719*4882a593Smuzhiyun 	PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
3720*4882a593Smuzhiyun 					IOMUX_SOURCE_PMU,
3721*4882a593Smuzhiyun 					IOMUX_SOURCE_PMU,
3722*4882a593Smuzhiyun 					IOMUX_SOURCE_PMU,
3723*4882a593Smuzhiyun 					DRV_TYPE_IO_1V8_OR_3V0,
3724*4882a593Smuzhiyun 					DRV_TYPE_IO_1V8_OR_3V0,
3725*4882a593Smuzhiyun 					DRV_TYPE_IO_1V8_OR_3V0,
3726*4882a593Smuzhiyun 					DRV_TYPE_IO_1V8_OR_3V0,
3727*4882a593Smuzhiyun 					0xa0,
3728*4882a593Smuzhiyun 					0xa8,
3729*4882a593Smuzhiyun 					0xb0,
3730*4882a593Smuzhiyun 					0xb8
3731*4882a593Smuzhiyun 					),
3732*4882a593Smuzhiyun 	PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
3733*4882a593Smuzhiyun 				      DRV_TYPE_IO_1V8_OR_3V0,
3734*4882a593Smuzhiyun 				      DRV_TYPE_IO_1V8_ONLY,
3735*4882a593Smuzhiyun 				      DRV_TYPE_IO_1V8_ONLY,
3736*4882a593Smuzhiyun 				      PULL_TYPE_IO_DEFAULT,
3737*4882a593Smuzhiyun 				      PULL_TYPE_IO_DEFAULT,
3738*4882a593Smuzhiyun 				      PULL_TYPE_IO_1V8_ONLY,
3739*4882a593Smuzhiyun 				      PULL_TYPE_IO_1V8_ONLY
3740*4882a593Smuzhiyun 				      ),
3741*4882a593Smuzhiyun 	PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
3742*4882a593Smuzhiyun 			   DRV_TYPE_IO_3V3_ONLY,
3743*4882a593Smuzhiyun 			   DRV_TYPE_IO_3V3_ONLY,
3744*4882a593Smuzhiyun 			   DRV_TYPE_IO_1V8_OR_3V0
3745*4882a593Smuzhiyun 			   ),
3746*4882a593Smuzhiyun 	PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
3747*4882a593Smuzhiyun 			   DRV_TYPE_IO_1V8_3V0_AUTO,
3748*4882a593Smuzhiyun 			   DRV_TYPE_IO_1V8_OR_3V0,
3749*4882a593Smuzhiyun 			   DRV_TYPE_IO_1V8_OR_3V0
3750*4882a593Smuzhiyun 			   ),
3751*4882a593Smuzhiyun };
3752*4882a593Smuzhiyun 
3753*4882a593Smuzhiyun static const struct rockchip_pin_ctrl rk3399_pin_ctrl = {
3754*4882a593Smuzhiyun 	.pin_banks		= rk3399_pin_banks,
3755*4882a593Smuzhiyun 	.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
3756*4882a593Smuzhiyun 	.nr_pins		= 160,
3757*4882a593Smuzhiyun 	.label			= "RK3399-GPIO",
3758*4882a593Smuzhiyun 	.type			= RK3399,
3759*4882a593Smuzhiyun 	.grf_mux_offset		= 0xe000,
3760*4882a593Smuzhiyun 	.pmu_mux_offset		= 0x0,
3761*4882a593Smuzhiyun 	.grf_drv_offset		= 0xe100,
3762*4882a593Smuzhiyun 	.pmu_drv_offset		= 0x80,
3763*4882a593Smuzhiyun 	.iomux_routes		= rk3399_mux_route_data,
3764*4882a593Smuzhiyun 	.niomux_routes		= ARRAY_SIZE(rk3399_mux_route_data),
3765*4882a593Smuzhiyun 	.pull_calc_reg		= rk3399_calc_pull_reg_and_bit,
3766*4882a593Smuzhiyun 	.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
3767*4882a593Smuzhiyun };
3768*4882a593Smuzhiyun 
3769*4882a593Smuzhiyun static const struct udevice_id rockchip_pinctrl_dt_match[] = {
3770*4882a593Smuzhiyun 	{ .compatible = "rockchip,px30-pinctrl",
3771*4882a593Smuzhiyun 		.data = (ulong)&px30_pin_ctrl },
3772*4882a593Smuzhiyun 	{ .compatible = "rockchip,rv1108-pinctrl",
3773*4882a593Smuzhiyun 		.data = (ulong)&rv1108_pin_ctrl },
3774*4882a593Smuzhiyun 	{ .compatible = "rockchip,rv1126-pinctrl-legency",
3775*4882a593Smuzhiyun 		.data = (ulong)&rv1126_pin_ctrl },
3776*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk1808-pinctrl",
3777*4882a593Smuzhiyun 		.data = (ulong)&rk1808_pin_ctrl },
3778*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk2928-pinctrl",
3779*4882a593Smuzhiyun 		.data = (ulong)&rk2928_pin_ctrl },
3780*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3036-pinctrl",
3781*4882a593Smuzhiyun 		.data = (ulong)&rk3036_pin_ctrl },
3782*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3066a-pinctrl",
3783*4882a593Smuzhiyun 		.data = (ulong)&rk3066a_pin_ctrl },
3784*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3066b-pinctrl",
3785*4882a593Smuzhiyun 		.data = (ulong)&rk3066b_pin_ctrl },
3786*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3128-pinctrl",
3787*4882a593Smuzhiyun 		.data = (ulong)&rk3128_pin_ctrl },
3788*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3188-pinctrl",
3789*4882a593Smuzhiyun 		.data = (ulong)&rk3188_pin_ctrl },
3790*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3228-pinctrl",
3791*4882a593Smuzhiyun 		.data = (ulong)&rk3228_pin_ctrl },
3792*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3288-pinctrl",
3793*4882a593Smuzhiyun 		.data = (ulong)&rk3288_pin_ctrl },
3794*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3308-pinctrl",
3795*4882a593Smuzhiyun 		.data = (ulong)&rk3308_pin_ctrl },
3796*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3328-pinctrl",
3797*4882a593Smuzhiyun 		.data = (ulong)&rk3328_pin_ctrl },
3798*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3368-pinctrl",
3799*4882a593Smuzhiyun 		.data = (ulong)&rk3368_pin_ctrl },
3800*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3399-pinctrl",
3801*4882a593Smuzhiyun 		.data = (ulong)&rk3399_pin_ctrl },
3802*4882a593Smuzhiyun 	{},
3803*4882a593Smuzhiyun };
3804*4882a593Smuzhiyun 
3805*4882a593Smuzhiyun U_BOOT_DRIVER(pinctrl_rockchip) = {
3806*4882a593Smuzhiyun 	.name		= "rockchip_pinctrl",
3807*4882a593Smuzhiyun 	.id		= UCLASS_PINCTRL,
3808*4882a593Smuzhiyun 	.of_match	= rockchip_pinctrl_dt_match,
3809*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
3810*4882a593Smuzhiyun 	.ops		= &rockchip_pinctrl_ops,
3811*4882a593Smuzhiyun #if !CONFIG_IS_ENABLED(OF_PLATDATA)
3812*4882a593Smuzhiyun 	.bind		= dm_scan_fdt_dev,
3813*4882a593Smuzhiyun #endif
3814*4882a593Smuzhiyun 	.probe		= rockchip_pinctrl_probe,
3815*4882a593Smuzhiyun };
3816