xref: /rk3399_rockchip-uboot/drivers/pinctrl/rockchip/pinctrl-rv1103b.c (revision b73745f4bfe57b0a3ff47ae0bd8eea687a26f456)
1*b73745f4SYe Zhang // SPDX-License-Identifier: GPL-2.0+
2*b73745f4SYe Zhang /*
3*b73745f4SYe Zhang  * (C) Copyright 2024 Rockchip Electronics Co., Ltd
4*b73745f4SYe Zhang  */
5*b73745f4SYe Zhang 
6*b73745f4SYe Zhang #include <common.h>
7*b73745f4SYe Zhang #include <dm.h>
8*b73745f4SYe Zhang #include <dm/pinctrl.h>
9*b73745f4SYe Zhang #include <regmap.h>
10*b73745f4SYe Zhang #include <syscon.h>
11*b73745f4SYe Zhang 
12*b73745f4SYe Zhang #include "pinctrl-rockchip.h"
13*b73745f4SYe Zhang 
rv1103b_set_mux(struct rockchip_pin_bank * bank,int pin,int mux)14*b73745f4SYe Zhang static int rv1103b_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
15*b73745f4SYe Zhang {
16*b73745f4SYe Zhang 	struct rockchip_pinctrl_priv *priv = bank->priv;
17*b73745f4SYe Zhang 	int iomux_num = (pin / 8);
18*b73745f4SYe Zhang 	struct regmap *regmap;
19*b73745f4SYe Zhang 	int reg, ret, mask;
20*b73745f4SYe Zhang 	u8 bit;
21*b73745f4SYe Zhang 	u32 data;
22*b73745f4SYe Zhang 
23*b73745f4SYe Zhang 	debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
24*b73745f4SYe Zhang 
25*b73745f4SYe Zhang 	if (bank->bank_num == 2 && pin >= 12)
26*b73745f4SYe Zhang 		return 0;
27*b73745f4SYe Zhang 
28*b73745f4SYe Zhang 	regmap = priv->regmap_base;
29*b73745f4SYe Zhang 	reg = bank->iomux[iomux_num].offset;
30*b73745f4SYe Zhang 	if ((pin % 8) >= 4)
31*b73745f4SYe Zhang 		reg += 0x4;
32*b73745f4SYe Zhang 	bit = (pin % 4) * 4;
33*b73745f4SYe Zhang 	mask = 0xf;
34*b73745f4SYe Zhang 
35*b73745f4SYe Zhang 	if (bank->recalced_mask & BIT(pin))
36*b73745f4SYe Zhang 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
37*b73745f4SYe Zhang 	data = (mask << (bit + 16));
38*b73745f4SYe Zhang 	data |= (mux & mask) << bit;
39*b73745f4SYe Zhang 
40*b73745f4SYe Zhang 	debug("iomux write reg = %x data = %x\n", reg, data);
41*b73745f4SYe Zhang 
42*b73745f4SYe Zhang 	ret = regmap_write(regmap, reg, data);
43*b73745f4SYe Zhang 
44*b73745f4SYe Zhang 	return ret;
45*b73745f4SYe Zhang }
46*b73745f4SYe Zhang 
47*b73745f4SYe Zhang #define RV1103B_DRV_BITS_PER_PIN		8
48*b73745f4SYe Zhang #define RV1103B_DRV_PINS_PER_REG		2
49*b73745f4SYe Zhang #define RV1103B_DRV_GPIO0_A_OFFSET		0x40100
50*b73745f4SYe Zhang #define RV1103B_DRV_GPIO0_B_OFFSET		0x50110
51*b73745f4SYe Zhang #define RV1103B_DRV_GPIO1_A01_OFFSET		0x140
52*b73745f4SYe Zhang #define RV1103B_DRV_GPIO1_A67_OFFSET		0x1014C
53*b73745f4SYe Zhang #define RV1103B_DRV_GPIO2_OFFSET		0x30180
54*b73745f4SYe Zhang #define RV1103B_DRV_GPIO2_SARADC_OFFSET		0x3080C
55*b73745f4SYe Zhang 
rv1103b_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)56*b73745f4SYe Zhang static int rv1103b_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
57*b73745f4SYe Zhang 				       int pin_num, struct regmap **regmap,
58*b73745f4SYe Zhang 				       int *reg, u8 *bit)
59*b73745f4SYe Zhang {
60*b73745f4SYe Zhang 	struct rockchip_pinctrl_priv *priv = bank->priv;
61*b73745f4SYe Zhang 	int ret = 0;
62*b73745f4SYe Zhang 
63*b73745f4SYe Zhang 	*regmap = priv->regmap_base;
64*b73745f4SYe Zhang 	switch (bank->bank_num) {
65*b73745f4SYe Zhang 	case 0:
66*b73745f4SYe Zhang 		if (pin_num < 7)
67*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO0_A_OFFSET;
68*b73745f4SYe Zhang 		else if (pin_num > 7 && pin_num < 14)
69*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO0_B_OFFSET - 0x10;
70*b73745f4SYe Zhang 		else
71*b73745f4SYe Zhang 			ret = -EINVAL;
72*b73745f4SYe Zhang 		break;
73*b73745f4SYe Zhang 
74*b73745f4SYe Zhang 	case 1:
75*b73745f4SYe Zhang 		if (pin_num < 6)
76*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO1_A01_OFFSET;
77*b73745f4SYe Zhang 		else if (pin_num >= 6 && pin_num < 23)
78*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO1_A67_OFFSET - 0xc;
79*b73745f4SYe Zhang 		else if (pin_num >= 24 && pin_num < 30)
80*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO1_A67_OFFSET - 0xc;
81*b73745f4SYe Zhang 		else
82*b73745f4SYe Zhang 			ret = -EINVAL;
83*b73745f4SYe Zhang 		break;
84*b73745f4SYe Zhang 
85*b73745f4SYe Zhang 	case 2:
86*b73745f4SYe Zhang 		if (pin_num < 12) {
87*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO2_OFFSET;
88*b73745f4SYe Zhang 		} else if (pin_num >= 16) {
89*b73745f4SYe Zhang 			ret = -EINVAL;
90*b73745f4SYe Zhang 		} else {
91*b73745f4SYe Zhang 			*reg = RV1103B_DRV_GPIO2_SARADC_OFFSET;
92*b73745f4SYe Zhang 			*bit = 10;
93*b73745f4SYe Zhang 
94*b73745f4SYe Zhang 			return 0;
95*b73745f4SYe Zhang 		}
96*b73745f4SYe Zhang 		break;
97*b73745f4SYe Zhang 
98*b73745f4SYe Zhang 	default:
99*b73745f4SYe Zhang 		ret = -EINVAL;
100*b73745f4SYe Zhang 		break;
101*b73745f4SYe Zhang 
102*b73745f4SYe Zhang 	}
103*b73745f4SYe Zhang 	if (ret) {
104*b73745f4SYe Zhang 		dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
105*b73745f4SYe Zhang 
106*b73745f4SYe Zhang 		return ret;
107*b73745f4SYe Zhang 	}
108*b73745f4SYe Zhang 
109*b73745f4SYe Zhang 	*reg += ((pin_num / RV1103B_DRV_PINS_PER_REG) * 4);
110*b73745f4SYe Zhang 	*bit = pin_num % RV1103B_DRV_PINS_PER_REG;
111*b73745f4SYe Zhang 	*bit *= RV1103B_DRV_BITS_PER_PIN;
112*b73745f4SYe Zhang 
113*b73745f4SYe Zhang 	return 0;
114*b73745f4SYe Zhang }
115*b73745f4SYe Zhang 
rv1103b_set_drive(struct rockchip_pin_bank * bank,int pin_num,int strength)116*b73745f4SYe Zhang static int rv1103b_set_drive(struct rockchip_pin_bank *bank,
117*b73745f4SYe Zhang 			    int pin_num, int strength)
118*b73745f4SYe Zhang {
119*b73745f4SYe Zhang 	struct regmap *regmap;
120*b73745f4SYe Zhang 	int reg, ret, i;
121*b73745f4SYe Zhang 	u32 data;
122*b73745f4SYe Zhang 	u8 bit;
123*b73745f4SYe Zhang 	int rmask_bits = RV1103B_DRV_BITS_PER_PIN;
124*b73745f4SYe Zhang 
125*b73745f4SYe Zhang 	ret = rv1103b_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
126*b73745f4SYe Zhang 	if (ret)
127*b73745f4SYe Zhang 		return ret;
128*b73745f4SYe Zhang 
129*b73745f4SYe Zhang 	for (i = 0, ret = 1; i < strength; i++)
130*b73745f4SYe Zhang 		ret = (ret << 1) | 1;
131*b73745f4SYe Zhang 
132*b73745f4SYe Zhang 	if (bank->bank_num == 2 && pin_num >= 12) {
133*b73745f4SYe Zhang 		rmask_bits = 2;
134*b73745f4SYe Zhang 		ret = strength;
135*b73745f4SYe Zhang 	}
136*b73745f4SYe Zhang 
137*b73745f4SYe Zhang 	/* enable the write to the equivalent lower bits */
138*b73745f4SYe Zhang 	data = ((1 << rmask_bits) - 1) << (bit + 16);
139*b73745f4SYe Zhang 	data |= (ret << bit);
140*b73745f4SYe Zhang 	ret = regmap_write(regmap, reg, data);
141*b73745f4SYe Zhang 
142*b73745f4SYe Zhang 	return ret;
143*b73745f4SYe Zhang }
144*b73745f4SYe Zhang 
145*b73745f4SYe Zhang #define RV1103B_PULL_BITS_PER_PIN		2
146*b73745f4SYe Zhang #define RV1103B_PULL_PINS_PER_REG		8
147*b73745f4SYe Zhang #define RV1103B_PULL_GPIO0_A_OFFSET		0x40200
148*b73745f4SYe Zhang #define RV1103B_PULL_GPIO0_B_OFFSET		0x50204
149*b73745f4SYe Zhang #define RV1103B_PULL_GPIO1_A01_OFFSET		0x210
150*b73745f4SYe Zhang #define RV1103B_PULL_GPIO1_A67_OFFSET		0x10210
151*b73745f4SYe Zhang #define RV1103B_PULL_GPIO2_OFFSET		0x30220
152*b73745f4SYe Zhang #define RV1103B_PULL_GPIO2_SARADC_OFFSET	0x3080C
153*b73745f4SYe Zhang 
rv1103b_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)154*b73745f4SYe Zhang static int rv1103b_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
155*b73745f4SYe Zhang 					int pin_num, struct regmap **regmap,
156*b73745f4SYe Zhang 					int *reg, u8 *bit)
157*b73745f4SYe Zhang {
158*b73745f4SYe Zhang 	struct rockchip_pinctrl_priv *priv = bank->priv;
159*b73745f4SYe Zhang 	int ret = 0;
160*b73745f4SYe Zhang 
161*b73745f4SYe Zhang 	*regmap = priv->regmap_base;
162*b73745f4SYe Zhang 	switch (bank->bank_num) {
163*b73745f4SYe Zhang 	case 0:
164*b73745f4SYe Zhang 		if (pin_num < 7)
165*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO0_A_OFFSET;
166*b73745f4SYe Zhang 		else if (pin_num > 7 && pin_num < 14)
167*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO0_B_OFFSET - 0x4;
168*b73745f4SYe Zhang 		else
169*b73745f4SYe Zhang 			ret = -EINVAL;
170*b73745f4SYe Zhang 		break;
171*b73745f4SYe Zhang 
172*b73745f4SYe Zhang 	case 1:
173*b73745f4SYe Zhang 		if (pin_num < 6)
174*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO1_A01_OFFSET;
175*b73745f4SYe Zhang 		else if (pin_num >= 6 && pin_num < 23)
176*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO1_A67_OFFSET;
177*b73745f4SYe Zhang 		else if (pin_num >= 24 && pin_num < 30)
178*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO1_A67_OFFSET;
179*b73745f4SYe Zhang 		else
180*b73745f4SYe Zhang 			ret = -EINVAL;
181*b73745f4SYe Zhang 		break;
182*b73745f4SYe Zhang 
183*b73745f4SYe Zhang 	case 2:
184*b73745f4SYe Zhang 		if (pin_num < 12) {
185*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO2_OFFSET;
186*b73745f4SYe Zhang 		} else if (pin_num >= 16) {
187*b73745f4SYe Zhang 			ret = -EINVAL;
188*b73745f4SYe Zhang 		} else {
189*b73745f4SYe Zhang 			*reg = RV1103B_PULL_GPIO2_SARADC_OFFSET;
190*b73745f4SYe Zhang 			*bit = 13;
191*b73745f4SYe Zhang 
192*b73745f4SYe Zhang 			return 0;
193*b73745f4SYe Zhang 		}
194*b73745f4SYe Zhang 		break;
195*b73745f4SYe Zhang 
196*b73745f4SYe Zhang 	default:
197*b73745f4SYe Zhang 		ret = -EINVAL;
198*b73745f4SYe Zhang 		break;
199*b73745f4SYe Zhang 	}
200*b73745f4SYe Zhang 
201*b73745f4SYe Zhang 	if (ret) {
202*b73745f4SYe Zhang 		dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
203*b73745f4SYe Zhang 
204*b73745f4SYe Zhang 		return ret;
205*b73745f4SYe Zhang 	}
206*b73745f4SYe Zhang 
207*b73745f4SYe Zhang 	*reg += ((pin_num / RV1103B_PULL_PINS_PER_REG) * 4);
208*b73745f4SYe Zhang 	*bit = pin_num % RV1103B_PULL_PINS_PER_REG;
209*b73745f4SYe Zhang 	*bit *= RV1103B_PULL_BITS_PER_PIN;
210*b73745f4SYe Zhang 
211*b73745f4SYe Zhang 	return 0;
212*b73745f4SYe Zhang }
213*b73745f4SYe Zhang 
rv1103b_set_pull(struct rockchip_pin_bank * bank,int pin_num,int pull)214*b73745f4SYe Zhang static int rv1103b_set_pull(struct rockchip_pin_bank *bank,
215*b73745f4SYe Zhang 			   int pin_num, int pull)
216*b73745f4SYe Zhang {
217*b73745f4SYe Zhang 	struct regmap *regmap;
218*b73745f4SYe Zhang 	int reg, ret;
219*b73745f4SYe Zhang 	u8 bit, type;
220*b73745f4SYe Zhang 	u32 data;
221*b73745f4SYe Zhang 
222*b73745f4SYe Zhang 	if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
223*b73745f4SYe Zhang 		return -ENOTSUPP;
224*b73745f4SYe Zhang 
225*b73745f4SYe Zhang 	ret = rv1103b_calc_pull_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
226*b73745f4SYe Zhang 	if (ret)
227*b73745f4SYe Zhang 		return ret;
228*b73745f4SYe Zhang 	type = bank->pull_type[pin_num / 8];
229*b73745f4SYe Zhang 
230*b73745f4SYe Zhang 	if (bank->bank_num == 2 && pin_num >= 12)
231*b73745f4SYe Zhang 		type = 1;
232*b73745f4SYe Zhang 
233*b73745f4SYe Zhang 	ret = rockchip_translate_pull_value(type, pull);
234*b73745f4SYe Zhang 	if (ret < 0) {
235*b73745f4SYe Zhang 		debug("unsupported pull setting %d\n", pull);
236*b73745f4SYe Zhang 
237*b73745f4SYe Zhang 		return ret;
238*b73745f4SYe Zhang 	}
239*b73745f4SYe Zhang 
240*b73745f4SYe Zhang 	/* enable the write to the equivalent lower bits */
241*b73745f4SYe Zhang 	data = ((1 << RV1103B_PULL_BITS_PER_PIN) - 1) << (bit + 16);
242*b73745f4SYe Zhang 
243*b73745f4SYe Zhang 	data |= (ret << bit);
244*b73745f4SYe Zhang 	ret = regmap_write(regmap, reg, data);
245*b73745f4SYe Zhang 
246*b73745f4SYe Zhang 	return ret;
247*b73745f4SYe Zhang }
248*b73745f4SYe Zhang 
249*b73745f4SYe Zhang #define RV1103B_SMT_BITS_PER_PIN		1
250*b73745f4SYe Zhang #define RV1103B_SMT_PINS_PER_REG		8
251*b73745f4SYe Zhang #define RV1103B_SMT_GPIO0_A_OFFSET		0x40400
252*b73745f4SYe Zhang #define RV1103B_SMT_GPIO0_B_OFFSET		0x50404
253*b73745f4SYe Zhang #define RV1103B_SMT_GPIO1_A01_OFFSET		0x410
254*b73745f4SYe Zhang #define RV1103B_SMT_GPIO1_A67_OFFSET		0x10410
255*b73745f4SYe Zhang #define RV1103B_SMT_GPIO2_OFFSET		0x30420
256*b73745f4SYe Zhang #define RV1103B_SMT_GPIO2_SARADC_OFFSET		0x3080C
257*b73745f4SYe Zhang 
rv1103b_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)258*b73745f4SYe Zhang static int rv1103b_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
259*b73745f4SYe Zhang 					   int pin_num,
260*b73745f4SYe Zhang 					   struct regmap **regmap,
261*b73745f4SYe Zhang 					   int *reg, u8 *bit)
262*b73745f4SYe Zhang {
263*b73745f4SYe Zhang 	struct rockchip_pinctrl_priv *priv = bank->priv;
264*b73745f4SYe Zhang 	int ret = 0;
265*b73745f4SYe Zhang 
266*b73745f4SYe Zhang 	*regmap = priv->regmap_base;
267*b73745f4SYe Zhang 	switch (bank->bank_num) {
268*b73745f4SYe Zhang 	case 0:
269*b73745f4SYe Zhang 		if (pin_num < 7)
270*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO0_A_OFFSET;
271*b73745f4SYe Zhang 		else if (pin_num > 7 && pin_num < 14)
272*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO0_B_OFFSET - 0x4;
273*b73745f4SYe Zhang 		else
274*b73745f4SYe Zhang 			ret = -EINVAL;
275*b73745f4SYe Zhang 		break;
276*b73745f4SYe Zhang 
277*b73745f4SYe Zhang 	case 1:
278*b73745f4SYe Zhang 		if (pin_num < 6)
279*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO1_A01_OFFSET;
280*b73745f4SYe Zhang 		else if (pin_num >= 6 && pin_num < 23)
281*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO1_A67_OFFSET;
282*b73745f4SYe Zhang 		else if (pin_num >= 24 && pin_num < 30)
283*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO1_A67_OFFSET;
284*b73745f4SYe Zhang 		else
285*b73745f4SYe Zhang 			ret = -EINVAL;
286*b73745f4SYe Zhang 		break;
287*b73745f4SYe Zhang 
288*b73745f4SYe Zhang 	case 2:
289*b73745f4SYe Zhang 		if (pin_num < 12) {
290*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO2_OFFSET;
291*b73745f4SYe Zhang 		} else if (pin_num >= 16) {
292*b73745f4SYe Zhang 			ret = -EINVAL;
293*b73745f4SYe Zhang 		} else {
294*b73745f4SYe Zhang 			*reg = RV1103B_SMT_GPIO2_SARADC_OFFSET;
295*b73745f4SYe Zhang 			*bit = 8;
296*b73745f4SYe Zhang 
297*b73745f4SYe Zhang 			return 0;
298*b73745f4SYe Zhang 		}
299*b73745f4SYe Zhang 		break;
300*b73745f4SYe Zhang 
301*b73745f4SYe Zhang 	default:
302*b73745f4SYe Zhang 		ret = -EINVAL;
303*b73745f4SYe Zhang 		break;
304*b73745f4SYe Zhang 
305*b73745f4SYe Zhang 	}
306*b73745f4SYe Zhang 	if (ret) {
307*b73745f4SYe Zhang 		dev_err(info->dev, "unsupported bank_num %d pin_num %d\n", bank->bank_num, pin_num);
308*b73745f4SYe Zhang 
309*b73745f4SYe Zhang 		return ret;
310*b73745f4SYe Zhang 	}
311*b73745f4SYe Zhang 
312*b73745f4SYe Zhang 	*reg += ((pin_num / RV1103B_SMT_PINS_PER_REG) * 4);
313*b73745f4SYe Zhang 	*bit = pin_num % RV1103B_SMT_PINS_PER_REG;
314*b73745f4SYe Zhang 	*bit *= RV1103B_SMT_BITS_PER_PIN;
315*b73745f4SYe Zhang 
316*b73745f4SYe Zhang 	return 0;
317*b73745f4SYe Zhang }
318*b73745f4SYe Zhang 
rv1103b_set_schmitt(struct rockchip_pin_bank * bank,int pin_num,int enable)319*b73745f4SYe Zhang static int rv1103b_set_schmitt(struct rockchip_pin_bank *bank,
320*b73745f4SYe Zhang 			      int pin_num, int enable)
321*b73745f4SYe Zhang {
322*b73745f4SYe Zhang 	struct regmap *regmap;
323*b73745f4SYe Zhang 	int reg, ret;
324*b73745f4SYe Zhang 	u32 data;
325*b73745f4SYe Zhang 	u8 bit;
326*b73745f4SYe Zhang 
327*b73745f4SYe Zhang 	ret = rv1103b_calc_schmitt_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
328*b73745f4SYe Zhang 	if (ret)
329*b73745f4SYe Zhang 		return ret;
330*b73745f4SYe Zhang 
331*b73745f4SYe Zhang 	/* enable the write to the equivalent lower bits */
332*b73745f4SYe Zhang 	data = ((1 << RV1103B_SMT_BITS_PER_PIN) - 1) << (bit + 16);
333*b73745f4SYe Zhang 	data |= (enable << bit);
334*b73745f4SYe Zhang 
335*b73745f4SYe Zhang 	if (bank->bank_num == 2 && pin_num >= 12) {
336*b73745f4SYe Zhang 		data = 0x3 << (bit + 16);
337*b73745f4SYe Zhang 		data |= ((enable ? 0x3 : 0) << bit);
338*b73745f4SYe Zhang 	}
339*b73745f4SYe Zhang 	ret = regmap_write(regmap, reg, data);
340*b73745f4SYe Zhang 
341*b73745f4SYe Zhang 	return ret;
342*b73745f4SYe Zhang }
343*b73745f4SYe Zhang 
344*b73745f4SYe Zhang static struct rockchip_mux_recalced_data rv1103b_mux_recalced_data[] = {
345*b73745f4SYe Zhang 	{
346*b73745f4SYe Zhang 		.num = 1,
347*b73745f4SYe Zhang 		.pin = 6,
348*b73745f4SYe Zhang 		.reg = 0x10024,
349*b73745f4SYe Zhang 		.bit = 8,
350*b73745f4SYe Zhang 		.mask = 0xf
351*b73745f4SYe Zhang 	}, {
352*b73745f4SYe Zhang 		.num = 1,
353*b73745f4SYe Zhang 		.pin = 7,
354*b73745f4SYe Zhang 		.reg = 0x10024,
355*b73745f4SYe Zhang 		.bit = 12,
356*b73745f4SYe Zhang 		.mask = 0xf
357*b73745f4SYe Zhang 	},
358*b73745f4SYe Zhang };
359*b73745f4SYe Zhang 
360*b73745f4SYe Zhang static struct rockchip_pin_bank rv1103b_pin_banks[] = {
361*b73745f4SYe Zhang 	PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
362*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
363*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
364*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
365*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
366*b73745f4SYe Zhang 				    0x40000, 0x50008, 0x50010, 0x50018),
367*b73745f4SYe Zhang 	PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
368*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
369*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
370*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
371*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
372*b73745f4SYe Zhang 				    0x20, 0x10028, 0x10030, 0x10038),
373*b73745f4SYe Zhang 	PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
374*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
375*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
376*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
377*b73745f4SYe Zhang 				    IOMUX_WIDTH_4BIT,
378*b73745f4SYe Zhang 				    0x30040, 0x30048, 0x30050, 0x30058),
379*b73745f4SYe Zhang };
380*b73745f4SYe Zhang 
381*b73745f4SYe Zhang static const struct rockchip_pin_ctrl rv1103b_pin_ctrl = {
382*b73745f4SYe Zhang 	.pin_banks		= rv1103b_pin_banks,
383*b73745f4SYe Zhang 	.nr_banks		= ARRAY_SIZE(rv1103b_pin_banks),
384*b73745f4SYe Zhang 	.nr_pins		= 96,
385*b73745f4SYe Zhang 	.iomux_recalced		= rv1103b_mux_recalced_data,
386*b73745f4SYe Zhang 	.niomux_recalced	= ARRAY_SIZE(rv1103b_mux_recalced_data),
387*b73745f4SYe Zhang 	.set_mux		= rv1103b_set_mux,
388*b73745f4SYe Zhang 	.set_pull		= rv1103b_set_pull,
389*b73745f4SYe Zhang 	.set_drive		= rv1103b_set_drive,
390*b73745f4SYe Zhang 	.set_schmitt		= rv1103b_set_schmitt,
391*b73745f4SYe Zhang };
392*b73745f4SYe Zhang 
393*b73745f4SYe Zhang static const struct udevice_id rv1103b_pinctrl_ids[] = {
394*b73745f4SYe Zhang 	{
395*b73745f4SYe Zhang 		.compatible = "rockchip,rv1103b-pinctrl",
396*b73745f4SYe Zhang 		.data = (ulong)&rv1103b_pin_ctrl
397*b73745f4SYe Zhang 	},
398*b73745f4SYe Zhang 	{ }
399*b73745f4SYe Zhang };
400*b73745f4SYe Zhang 
401*b73745f4SYe Zhang U_BOOT_DRIVER(pinctrl_rv1103b) = {
402*b73745f4SYe Zhang 	.name		= "rockchip_rv1103b_pinctrl",
403*b73745f4SYe Zhang 	.id		= UCLASS_PINCTRL,
404*b73745f4SYe Zhang 	.of_match	= rv1103b_pinctrl_ids,
405*b73745f4SYe Zhang 	.priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv),
406*b73745f4SYe Zhang 	.ops		= &rockchip_pinctrl_ops,
407*b73745f4SYe Zhang #if !CONFIG_IS_ENABLED(OF_PLATDATA)
408*b73745f4SYe Zhang 	.bind		= dm_scan_fdt_dev,
409*b73745f4SYe Zhang #endif
410*b73745f4SYe Zhang 	.probe		= rockchip_pinctrl_probe,
411*b73745f4SYe Zhang };
412