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, ®, &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, ®map, ®, &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, ®map, ®, &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, ®map, ®, &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