1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Pinctrl driver for Rockchip SoCs
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2013 MundoReader S.L.
6*4882a593Smuzhiyun * Author: Heiko Stuebner <heiko@sntech.de>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * With some ideas taken from pinctrl-samsung:
9*4882a593Smuzhiyun * Copyright (c) 2012 Samsung Electronics Co., Ltd.
10*4882a593Smuzhiyun * http://www.samsung.com
11*4882a593Smuzhiyun * Copyright (c) 2012 Linaro Ltd
12*4882a593Smuzhiyun * https://www.linaro.org
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * and pinctrl-at91:
15*4882a593Smuzhiyun * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <linux/init.h>
19*4882a593Smuzhiyun #include <linux/module.h>
20*4882a593Smuzhiyun #include <linux/platform_device.h>
21*4882a593Smuzhiyun #include <linux/io.h>
22*4882a593Smuzhiyun #include <linux/bitops.h>
23*4882a593Smuzhiyun #include <linux/gpio/driver.h>
24*4882a593Smuzhiyun #include <linux/of_address.h>
25*4882a593Smuzhiyun #include <linux/of_device.h>
26*4882a593Smuzhiyun #include <linux/of_irq.h>
27*4882a593Smuzhiyun #include <linux/pinctrl/machine.h>
28*4882a593Smuzhiyun #include <linux/pinctrl/pinconf.h>
29*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h>
30*4882a593Smuzhiyun #include <linux/pinctrl/pinmux.h>
31*4882a593Smuzhiyun #include <linux/pinctrl/pinconf-generic.h>
32*4882a593Smuzhiyun #include <linux/irqchip/chained_irq.h>
33*4882a593Smuzhiyun #include <linux/clk.h>
34*4882a593Smuzhiyun #include <linux/regmap.h>
35*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
36*4882a593Smuzhiyun #include <linux/rockchip/cpu.h>
37*4882a593Smuzhiyun #include <dt-bindings/pinctrl/rockchip.h>
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #include "core.h"
40*4882a593Smuzhiyun #include "pinconf.h"
41*4882a593Smuzhiyun #include "pinctrl-rockchip.h"
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun /*
44*4882a593Smuzhiyun * Generate a bitmask for setting a value (v) with a write mask bit in hiword
45*4882a593Smuzhiyun * register 31:16 area.
46*4882a593Smuzhiyun */
47*4882a593Smuzhiyun #define WRITE_MASK_VAL(h, l, v) \
48*4882a593Smuzhiyun (GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun /*
51*4882a593Smuzhiyun * Encode variants of iomux registers into a type variable
52*4882a593Smuzhiyun */
53*4882a593Smuzhiyun #define IOMUX_GPIO_ONLY BIT(0)
54*4882a593Smuzhiyun #define IOMUX_WIDTH_4BIT BIT(1)
55*4882a593Smuzhiyun #define IOMUX_SOURCE_PMU BIT(2)
56*4882a593Smuzhiyun #define IOMUX_UNROUTED BIT(3)
57*4882a593Smuzhiyun #define IOMUX_WIDTH_3BIT BIT(4)
58*4882a593Smuzhiyun #define IOMUX_WIDTH_2BIT BIT(5)
59*4882a593Smuzhiyun #define IOMUX_WRITABLE_32BIT BIT(6)
60*4882a593Smuzhiyun #define IOMUX_L_SOURCE_PMU BIT(7)
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun #define PIN_BANK(id, pins, label) \
63*4882a593Smuzhiyun { \
64*4882a593Smuzhiyun .bank_num = id, \
65*4882a593Smuzhiyun .nr_pins = pins, \
66*4882a593Smuzhiyun .name = label, \
67*4882a593Smuzhiyun .iomux = { \
68*4882a593Smuzhiyun { .offset = -1 }, \
69*4882a593Smuzhiyun { .offset = -1 }, \
70*4882a593Smuzhiyun { .offset = -1 }, \
71*4882a593Smuzhiyun { .offset = -1 }, \
72*4882a593Smuzhiyun }, \
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \
76*4882a593Smuzhiyun { \
77*4882a593Smuzhiyun .bank_num = id, \
78*4882a593Smuzhiyun .nr_pins = pins, \
79*4882a593Smuzhiyun .name = label, \
80*4882a593Smuzhiyun .iomux = { \
81*4882a593Smuzhiyun { .type = iom0, .offset = -1 }, \
82*4882a593Smuzhiyun { .type = iom1, .offset = -1 }, \
83*4882a593Smuzhiyun { .type = iom2, .offset = -1 }, \
84*4882a593Smuzhiyun { .type = iom3, .offset = -1 }, \
85*4882a593Smuzhiyun }, \
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, \
89*4882a593Smuzhiyun iom3, offset0, offset1, offset2, \
90*4882a593Smuzhiyun offset3) \
91*4882a593Smuzhiyun { \
92*4882a593Smuzhiyun .bank_num = id, \
93*4882a593Smuzhiyun .nr_pins = pins, \
94*4882a593Smuzhiyun .name = label, \
95*4882a593Smuzhiyun .iomux = { \
96*4882a593Smuzhiyun { .type = iom0, .offset = offset0 }, \
97*4882a593Smuzhiyun { .type = iom1, .offset = offset1 }, \
98*4882a593Smuzhiyun { .type = iom2, .offset = offset2 }, \
99*4882a593Smuzhiyun { .type = iom3, .offset = offset3 }, \
100*4882a593Smuzhiyun }, \
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
104*4882a593Smuzhiyun { \
105*4882a593Smuzhiyun .bank_num = id, \
106*4882a593Smuzhiyun .nr_pins = pins, \
107*4882a593Smuzhiyun .name = label, \
108*4882a593Smuzhiyun .iomux = { \
109*4882a593Smuzhiyun { .offset = -1 }, \
110*4882a593Smuzhiyun { .offset = -1 }, \
111*4882a593Smuzhiyun { .offset = -1 }, \
112*4882a593Smuzhiyun { .offset = -1 }, \
113*4882a593Smuzhiyun }, \
114*4882a593Smuzhiyun .drv = { \
115*4882a593Smuzhiyun { .drv_type = type0, .offset = -1 }, \
116*4882a593Smuzhiyun { .drv_type = type1, .offset = -1 }, \
117*4882a593Smuzhiyun { .drv_type = type2, .offset = -1 }, \
118*4882a593Smuzhiyun { .drv_type = type3, .offset = -1 }, \
119*4882a593Smuzhiyun }, \
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(id, pins, label, iom0, iom1, \
123*4882a593Smuzhiyun iom2, iom3, pull0, pull1, \
124*4882a593Smuzhiyun pull2, pull3) \
125*4882a593Smuzhiyun { \
126*4882a593Smuzhiyun .bank_num = id, \
127*4882a593Smuzhiyun .nr_pins = pins, \
128*4882a593Smuzhiyun .name = label, \
129*4882a593Smuzhiyun .iomux = { \
130*4882a593Smuzhiyun { .type = iom0, .offset = -1 }, \
131*4882a593Smuzhiyun { .type = iom1, .offset = -1 }, \
132*4882a593Smuzhiyun { .type = iom2, .offset = -1 }, \
133*4882a593Smuzhiyun { .type = iom3, .offset = -1 }, \
134*4882a593Smuzhiyun }, \
135*4882a593Smuzhiyun .pull_type[0] = pull0, \
136*4882a593Smuzhiyun .pull_type[1] = pull1, \
137*4882a593Smuzhiyun .pull_type[2] = pull2, \
138*4882a593Smuzhiyun .pull_type[3] = pull3, \
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \
142*4882a593Smuzhiyun drv2, drv3, pull0, pull1, \
143*4882a593Smuzhiyun pull2, pull3) \
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 .drv = { \
155*4882a593Smuzhiyun { .drv_type = drv0, .offset = -1 }, \
156*4882a593Smuzhiyun { .drv_type = drv1, .offset = -1 }, \
157*4882a593Smuzhiyun { .drv_type = drv2, .offset = -1 }, \
158*4882a593Smuzhiyun { .drv_type = drv3, .offset = -1 }, \
159*4882a593Smuzhiyun }, \
160*4882a593Smuzhiyun .pull_type[0] = pull0, \
161*4882a593Smuzhiyun .pull_type[1] = pull1, \
162*4882a593Smuzhiyun .pull_type[2] = pull2, \
163*4882a593Smuzhiyun .pull_type[3] = pull3, \
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \
167*4882a593Smuzhiyun iom2, iom3, drv0, drv1, drv2, \
168*4882a593Smuzhiyun drv3, offset0, offset1, \
169*4882a593Smuzhiyun offset2, offset3) \
170*4882a593Smuzhiyun { \
171*4882a593Smuzhiyun .bank_num = id, \
172*4882a593Smuzhiyun .nr_pins = pins, \
173*4882a593Smuzhiyun .name = label, \
174*4882a593Smuzhiyun .iomux = { \
175*4882a593Smuzhiyun { .type = iom0, .offset = -1 }, \
176*4882a593Smuzhiyun { .type = iom1, .offset = -1 }, \
177*4882a593Smuzhiyun { .type = iom2, .offset = -1 }, \
178*4882a593Smuzhiyun { .type = iom3, .offset = -1 }, \
179*4882a593Smuzhiyun }, \
180*4882a593Smuzhiyun .drv = { \
181*4882a593Smuzhiyun { .drv_type = drv0, .offset = offset0 }, \
182*4882a593Smuzhiyun { .drv_type = drv1, .offset = offset1 }, \
183*4882a593Smuzhiyun { .drv_type = drv2, .offset = offset2 }, \
184*4882a593Smuzhiyun { .drv_type = drv3, .offset = offset3 }, \
185*4882a593Smuzhiyun }, \
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \
189*4882a593Smuzhiyun label, iom0, iom1, iom2, \
190*4882a593Smuzhiyun iom3, drv0, drv1, drv2, \
191*4882a593Smuzhiyun drv3, offset0, offset1, \
192*4882a593Smuzhiyun offset2, offset3, pull0, \
193*4882a593Smuzhiyun pull1, pull2, pull3) \
194*4882a593Smuzhiyun { \
195*4882a593Smuzhiyun .bank_num = id, \
196*4882a593Smuzhiyun .nr_pins = pins, \
197*4882a593Smuzhiyun .name = label, \
198*4882a593Smuzhiyun .iomux = { \
199*4882a593Smuzhiyun { .type = iom0, .offset = -1 }, \
200*4882a593Smuzhiyun { .type = iom1, .offset = -1 }, \
201*4882a593Smuzhiyun { .type = iom2, .offset = -1 }, \
202*4882a593Smuzhiyun { .type = iom3, .offset = -1 }, \
203*4882a593Smuzhiyun }, \
204*4882a593Smuzhiyun .drv = { \
205*4882a593Smuzhiyun { .drv_type = drv0, .offset = offset0 }, \
206*4882a593Smuzhiyun { .drv_type = drv1, .offset = offset1 }, \
207*4882a593Smuzhiyun { .drv_type = drv2, .offset = offset2 }, \
208*4882a593Smuzhiyun { .drv_type = drv3, .offset = offset3 }, \
209*4882a593Smuzhiyun }, \
210*4882a593Smuzhiyun .pull_type[0] = pull0, \
211*4882a593Smuzhiyun .pull_type[1] = pull1, \
212*4882a593Smuzhiyun .pull_type[2] = pull2, \
213*4882a593Smuzhiyun .pull_type[3] = pull3, \
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \
217*4882a593Smuzhiyun { \
218*4882a593Smuzhiyun .bank_num = ID, \
219*4882a593Smuzhiyun .pin = PIN, \
220*4882a593Smuzhiyun .func = FUNC, \
221*4882a593Smuzhiyun .route_offset = REG, \
222*4882a593Smuzhiyun .route_val = VAL, \
223*4882a593Smuzhiyun .route_location = FLAG, \
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun #define S_PIN_BANK_FLAGS(ID, PIN, LABEL, MTYPE, DTYPE) \
227*4882a593Smuzhiyun PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(ID, PIN, LABEL, \
228*4882a593Smuzhiyun MTYPE, MTYPE, MTYPE, MTYPE, \
229*4882a593Smuzhiyun DTYPE, DTYPE, DTYPE, DTYPE, \
230*4882a593Smuzhiyun -1, -1, -1, -1)
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun #define RK_MUXROUTE_SAME(ID, PIN, FUNC, REG, VAL) \
233*4882a593Smuzhiyun PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_SAME)
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun #define RK_MUXROUTE_GRF(ID, PIN, FUNC, REG, VAL) \
236*4882a593Smuzhiyun PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_GRF)
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun #define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) \
239*4882a593Smuzhiyun PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU)
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun #define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P) \
242*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun static struct pinctrl_dev *g_pctldev;
245*4882a593Smuzhiyun static DEFINE_MUTEX(iomux_lock);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun static struct regmap_config rockchip_regmap_config = {
248*4882a593Smuzhiyun .reg_bits = 32,
249*4882a593Smuzhiyun .val_bits = 32,
250*4882a593Smuzhiyun .reg_stride = 4,
251*4882a593Smuzhiyun };
252*4882a593Smuzhiyun
pinctrl_name_to_group(const struct rockchip_pinctrl * info,const char * name)253*4882a593Smuzhiyun static inline const struct rockchip_pin_group *pinctrl_name_to_group(
254*4882a593Smuzhiyun const struct rockchip_pinctrl *info,
255*4882a593Smuzhiyun const char *name)
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun int i;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun for (i = 0; i < info->ngroups; i++) {
260*4882a593Smuzhiyun if (!strcmp(info->groups[i].name, name))
261*4882a593Smuzhiyun return &info->groups[i];
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun return NULL;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun /*
268*4882a593Smuzhiyun * given a pin number that is local to a pin controller, find out the pin bank
269*4882a593Smuzhiyun * and the register base of the pin bank.
270*4882a593Smuzhiyun */
pin_to_bank(struct rockchip_pinctrl * info,unsigned pin)271*4882a593Smuzhiyun static struct rockchip_pin_bank *pin_to_bank(struct rockchip_pinctrl *info,
272*4882a593Smuzhiyun unsigned pin)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun struct rockchip_pin_bank *b = info->ctrl->pin_banks;
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun while (pin >= (b->pin_base + b->nr_pins))
277*4882a593Smuzhiyun b++;
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun return b;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
bank_num_to_bank(struct rockchip_pinctrl * info,unsigned num)282*4882a593Smuzhiyun static struct rockchip_pin_bank *bank_num_to_bank(
283*4882a593Smuzhiyun struct rockchip_pinctrl *info,
284*4882a593Smuzhiyun unsigned num)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun struct rockchip_pin_bank *b = info->ctrl->pin_banks;
287*4882a593Smuzhiyun int i;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun for (i = 0; i < info->ctrl->nr_banks; i++, b++) {
290*4882a593Smuzhiyun if (b->bank_num == num)
291*4882a593Smuzhiyun return b;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun /*
298*4882a593Smuzhiyun * Pinctrl_ops handling
299*4882a593Smuzhiyun */
300*4882a593Smuzhiyun
rockchip_get_groups_count(struct pinctrl_dev * pctldev)301*4882a593Smuzhiyun static int rockchip_get_groups_count(struct pinctrl_dev *pctldev)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun return info->ngroups;
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun
rockchip_get_group_name(struct pinctrl_dev * pctldev,unsigned selector)308*4882a593Smuzhiyun static const char *rockchip_get_group_name(struct pinctrl_dev *pctldev,
309*4882a593Smuzhiyun unsigned selector)
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun return info->groups[selector].name;
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun
rockchip_get_group_pins(struct pinctrl_dev * pctldev,unsigned selector,const unsigned ** pins,unsigned * npins)316*4882a593Smuzhiyun static int rockchip_get_group_pins(struct pinctrl_dev *pctldev,
317*4882a593Smuzhiyun unsigned selector, const unsigned **pins,
318*4882a593Smuzhiyun unsigned *npins)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun if (selector >= info->ngroups)
323*4882a593Smuzhiyun return -EINVAL;
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun *pins = info->groups[selector].pins;
326*4882a593Smuzhiyun *npins = info->groups[selector].npins;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun return 0;
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
rockchip_dt_node_to_map(struct pinctrl_dev * pctldev,struct device_node * np,struct pinctrl_map ** map,unsigned * num_maps)331*4882a593Smuzhiyun static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
332*4882a593Smuzhiyun struct device_node *np,
333*4882a593Smuzhiyun struct pinctrl_map **map, unsigned *num_maps)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
336*4882a593Smuzhiyun const struct rockchip_pin_group *grp;
337*4882a593Smuzhiyun struct device *dev = info->dev;
338*4882a593Smuzhiyun struct pinctrl_map *new_map;
339*4882a593Smuzhiyun struct device_node *parent;
340*4882a593Smuzhiyun int map_num = 1;
341*4882a593Smuzhiyun int i;
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun /*
344*4882a593Smuzhiyun * first find the group of this node and check if we need to create
345*4882a593Smuzhiyun * config maps for pins
346*4882a593Smuzhiyun */
347*4882a593Smuzhiyun grp = pinctrl_name_to_group(info, np->name);
348*4882a593Smuzhiyun if (!grp) {
349*4882a593Smuzhiyun dev_err(dev, "unable to find group for node %pOFn\n", np);
350*4882a593Smuzhiyun return -EINVAL;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun map_num += grp->npins;
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL);
356*4882a593Smuzhiyun if (!new_map)
357*4882a593Smuzhiyun return -ENOMEM;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun *map = new_map;
360*4882a593Smuzhiyun *num_maps = map_num;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun /* create mux map */
363*4882a593Smuzhiyun parent = of_get_parent(np);
364*4882a593Smuzhiyun if (!parent) {
365*4882a593Smuzhiyun kfree(new_map);
366*4882a593Smuzhiyun return -EINVAL;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
369*4882a593Smuzhiyun new_map[0].data.mux.function = parent->name;
370*4882a593Smuzhiyun new_map[0].data.mux.group = np->name;
371*4882a593Smuzhiyun of_node_put(parent);
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun /* create config map */
374*4882a593Smuzhiyun new_map++;
375*4882a593Smuzhiyun for (i = 0; i < grp->npins; i++) {
376*4882a593Smuzhiyun new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
377*4882a593Smuzhiyun new_map[i].data.configs.group_or_pin =
378*4882a593Smuzhiyun pin_get_name(pctldev, grp->pins[i]);
379*4882a593Smuzhiyun new_map[i].data.configs.configs = grp->data[i].configs;
380*4882a593Smuzhiyun new_map[i].data.configs.num_configs = grp->data[i].nconfigs;
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun dev_dbg(dev, "maps: function %s group %s num %d\n",
384*4882a593Smuzhiyun (*map)->data.mux.function, (*map)->data.mux.group, map_num);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun return 0;
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
rockchip_dt_free_map(struct pinctrl_dev * pctldev,struct pinctrl_map * map,unsigned num_maps)389*4882a593Smuzhiyun static void rockchip_dt_free_map(struct pinctrl_dev *pctldev,
390*4882a593Smuzhiyun struct pinctrl_map *map, unsigned num_maps)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun kfree(map);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun static const struct pinctrl_ops rockchip_pctrl_ops = {
396*4882a593Smuzhiyun .get_groups_count = rockchip_get_groups_count,
397*4882a593Smuzhiyun .get_group_name = rockchip_get_group_name,
398*4882a593Smuzhiyun .get_group_pins = rockchip_get_group_pins,
399*4882a593Smuzhiyun .dt_node_to_map = rockchip_dt_node_to_map,
400*4882a593Smuzhiyun .dt_free_map = rockchip_dt_free_map,
401*4882a593Smuzhiyun };
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun /*
404*4882a593Smuzhiyun * Hardware access
405*4882a593Smuzhiyun */
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun .num = 1,
410*4882a593Smuzhiyun .pin = 0,
411*4882a593Smuzhiyun .reg = 0x418,
412*4882a593Smuzhiyun .bit = 0,
413*4882a593Smuzhiyun .mask = 0x3
414*4882a593Smuzhiyun }, {
415*4882a593Smuzhiyun .num = 1,
416*4882a593Smuzhiyun .pin = 1,
417*4882a593Smuzhiyun .reg = 0x418,
418*4882a593Smuzhiyun .bit = 2,
419*4882a593Smuzhiyun .mask = 0x3
420*4882a593Smuzhiyun }, {
421*4882a593Smuzhiyun .num = 1,
422*4882a593Smuzhiyun .pin = 2,
423*4882a593Smuzhiyun .reg = 0x418,
424*4882a593Smuzhiyun .bit = 4,
425*4882a593Smuzhiyun .mask = 0x3
426*4882a593Smuzhiyun }, {
427*4882a593Smuzhiyun .num = 1,
428*4882a593Smuzhiyun .pin = 3,
429*4882a593Smuzhiyun .reg = 0x418,
430*4882a593Smuzhiyun .bit = 6,
431*4882a593Smuzhiyun .mask = 0x3
432*4882a593Smuzhiyun }, {
433*4882a593Smuzhiyun .num = 1,
434*4882a593Smuzhiyun .pin = 4,
435*4882a593Smuzhiyun .reg = 0x418,
436*4882a593Smuzhiyun .bit = 8,
437*4882a593Smuzhiyun .mask = 0x3
438*4882a593Smuzhiyun }, {
439*4882a593Smuzhiyun .num = 1,
440*4882a593Smuzhiyun .pin = 5,
441*4882a593Smuzhiyun .reg = 0x418,
442*4882a593Smuzhiyun .bit = 10,
443*4882a593Smuzhiyun .mask = 0x3
444*4882a593Smuzhiyun }, {
445*4882a593Smuzhiyun .num = 1,
446*4882a593Smuzhiyun .pin = 6,
447*4882a593Smuzhiyun .reg = 0x418,
448*4882a593Smuzhiyun .bit = 12,
449*4882a593Smuzhiyun .mask = 0x3
450*4882a593Smuzhiyun }, {
451*4882a593Smuzhiyun .num = 1,
452*4882a593Smuzhiyun .pin = 7,
453*4882a593Smuzhiyun .reg = 0x418,
454*4882a593Smuzhiyun .bit = 14,
455*4882a593Smuzhiyun .mask = 0x3
456*4882a593Smuzhiyun }, {
457*4882a593Smuzhiyun .num = 1,
458*4882a593Smuzhiyun .pin = 8,
459*4882a593Smuzhiyun .reg = 0x41c,
460*4882a593Smuzhiyun .bit = 0,
461*4882a593Smuzhiyun .mask = 0x3
462*4882a593Smuzhiyun }, {
463*4882a593Smuzhiyun .num = 1,
464*4882a593Smuzhiyun .pin = 9,
465*4882a593Smuzhiyun .reg = 0x41c,
466*4882a593Smuzhiyun .bit = 2,
467*4882a593Smuzhiyun .mask = 0x3
468*4882a593Smuzhiyun },
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
472*4882a593Smuzhiyun {
473*4882a593Smuzhiyun .num = 0,
474*4882a593Smuzhiyun .pin = 20,
475*4882a593Smuzhiyun .reg = 0x10000,
476*4882a593Smuzhiyun .bit = 0,
477*4882a593Smuzhiyun .mask = 0xf
478*4882a593Smuzhiyun },
479*4882a593Smuzhiyun {
480*4882a593Smuzhiyun .num = 0,
481*4882a593Smuzhiyun .pin = 21,
482*4882a593Smuzhiyun .reg = 0x10000,
483*4882a593Smuzhiyun .bit = 4,
484*4882a593Smuzhiyun .mask = 0xf
485*4882a593Smuzhiyun },
486*4882a593Smuzhiyun {
487*4882a593Smuzhiyun .num = 0,
488*4882a593Smuzhiyun .pin = 22,
489*4882a593Smuzhiyun .reg = 0x10000,
490*4882a593Smuzhiyun .bit = 8,
491*4882a593Smuzhiyun .mask = 0xf
492*4882a593Smuzhiyun },
493*4882a593Smuzhiyun {
494*4882a593Smuzhiyun .num = 0,
495*4882a593Smuzhiyun .pin = 23,
496*4882a593Smuzhiyun .reg = 0x10000,
497*4882a593Smuzhiyun .bit = 12,
498*4882a593Smuzhiyun .mask = 0xf
499*4882a593Smuzhiyun },
500*4882a593Smuzhiyun };
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun .num = 2,
505*4882a593Smuzhiyun .pin = 20,
506*4882a593Smuzhiyun .reg = 0xe8,
507*4882a593Smuzhiyun .bit = 0,
508*4882a593Smuzhiyun .mask = 0x7
509*4882a593Smuzhiyun }, {
510*4882a593Smuzhiyun .num = 2,
511*4882a593Smuzhiyun .pin = 21,
512*4882a593Smuzhiyun .reg = 0xe8,
513*4882a593Smuzhiyun .bit = 4,
514*4882a593Smuzhiyun .mask = 0x7
515*4882a593Smuzhiyun }, {
516*4882a593Smuzhiyun .num = 2,
517*4882a593Smuzhiyun .pin = 22,
518*4882a593Smuzhiyun .reg = 0xe8,
519*4882a593Smuzhiyun .bit = 8,
520*4882a593Smuzhiyun .mask = 0x7
521*4882a593Smuzhiyun }, {
522*4882a593Smuzhiyun .num = 2,
523*4882a593Smuzhiyun .pin = 23,
524*4882a593Smuzhiyun .reg = 0xe8,
525*4882a593Smuzhiyun .bit = 12,
526*4882a593Smuzhiyun .mask = 0x7
527*4882a593Smuzhiyun }, {
528*4882a593Smuzhiyun .num = 2,
529*4882a593Smuzhiyun .pin = 24,
530*4882a593Smuzhiyun .reg = 0xd4,
531*4882a593Smuzhiyun .bit = 12,
532*4882a593Smuzhiyun .mask = 0x7
533*4882a593Smuzhiyun },
534*4882a593Smuzhiyun };
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
537*4882a593Smuzhiyun {
538*4882a593Smuzhiyun /* gpio1b6_sel */
539*4882a593Smuzhiyun .num = 1,
540*4882a593Smuzhiyun .pin = 14,
541*4882a593Smuzhiyun .reg = 0x28,
542*4882a593Smuzhiyun .bit = 12,
543*4882a593Smuzhiyun .mask = 0xf
544*4882a593Smuzhiyun }, {
545*4882a593Smuzhiyun /* gpio1b7_sel */
546*4882a593Smuzhiyun .num = 1,
547*4882a593Smuzhiyun .pin = 15,
548*4882a593Smuzhiyun .reg = 0x2c,
549*4882a593Smuzhiyun .bit = 0,
550*4882a593Smuzhiyun .mask = 0x3
551*4882a593Smuzhiyun }, {
552*4882a593Smuzhiyun /* gpio1c2_sel */
553*4882a593Smuzhiyun .num = 1,
554*4882a593Smuzhiyun .pin = 18,
555*4882a593Smuzhiyun .reg = 0x30,
556*4882a593Smuzhiyun .bit = 4,
557*4882a593Smuzhiyun .mask = 0xf
558*4882a593Smuzhiyun }, {
559*4882a593Smuzhiyun /* gpio1c3_sel */
560*4882a593Smuzhiyun .num = 1,
561*4882a593Smuzhiyun .pin = 19,
562*4882a593Smuzhiyun .reg = 0x30,
563*4882a593Smuzhiyun .bit = 8,
564*4882a593Smuzhiyun .mask = 0xf
565*4882a593Smuzhiyun }, {
566*4882a593Smuzhiyun /* gpio1c4_sel */
567*4882a593Smuzhiyun .num = 1,
568*4882a593Smuzhiyun .pin = 20,
569*4882a593Smuzhiyun .reg = 0x30,
570*4882a593Smuzhiyun .bit = 12,
571*4882a593Smuzhiyun .mask = 0xf
572*4882a593Smuzhiyun }, {
573*4882a593Smuzhiyun /* gpio1c5_sel */
574*4882a593Smuzhiyun .num = 1,
575*4882a593Smuzhiyun .pin = 21,
576*4882a593Smuzhiyun .reg = 0x34,
577*4882a593Smuzhiyun .bit = 0,
578*4882a593Smuzhiyun .mask = 0xf
579*4882a593Smuzhiyun }, {
580*4882a593Smuzhiyun /* gpio1c6_sel */
581*4882a593Smuzhiyun .num = 1,
582*4882a593Smuzhiyun .pin = 22,
583*4882a593Smuzhiyun .reg = 0x34,
584*4882a593Smuzhiyun .bit = 4,
585*4882a593Smuzhiyun .mask = 0xf
586*4882a593Smuzhiyun }, {
587*4882a593Smuzhiyun /* gpio1c7_sel */
588*4882a593Smuzhiyun .num = 1,
589*4882a593Smuzhiyun .pin = 23,
590*4882a593Smuzhiyun .reg = 0x34,
591*4882a593Smuzhiyun .bit = 8,
592*4882a593Smuzhiyun .mask = 0xf
593*4882a593Smuzhiyun }, {
594*4882a593Smuzhiyun /* gpio2a2_sel_plus */
595*4882a593Smuzhiyun .num = 2,
596*4882a593Smuzhiyun .pin = 2,
597*4882a593Smuzhiyun .reg = 0x608,
598*4882a593Smuzhiyun .bit = 0,
599*4882a593Smuzhiyun .mask = 0x7
600*4882a593Smuzhiyun }, {
601*4882a593Smuzhiyun /* gpio2a3_sel_plus */
602*4882a593Smuzhiyun .num = 2,
603*4882a593Smuzhiyun .pin = 3,
604*4882a593Smuzhiyun .reg = 0x608,
605*4882a593Smuzhiyun .bit = 4,
606*4882a593Smuzhiyun .mask = 0x7
607*4882a593Smuzhiyun }, {
608*4882a593Smuzhiyun /* gpio2c0_sel_plus */
609*4882a593Smuzhiyun .num = 2,
610*4882a593Smuzhiyun .pin = 16,
611*4882a593Smuzhiyun .reg = 0x610,
612*4882a593Smuzhiyun .bit = 8,
613*4882a593Smuzhiyun .mask = 0x7
614*4882a593Smuzhiyun }, {
615*4882a593Smuzhiyun /* gpio3b2_sel_plus */
616*4882a593Smuzhiyun .num = 3,
617*4882a593Smuzhiyun .pin = 10,
618*4882a593Smuzhiyun .reg = 0x610,
619*4882a593Smuzhiyun .bit = 0,
620*4882a593Smuzhiyun .mask = 0x7
621*4882a593Smuzhiyun }, {
622*4882a593Smuzhiyun /* gpio3b3_sel_plus */
623*4882a593Smuzhiyun .num = 3,
624*4882a593Smuzhiyun .pin = 11,
625*4882a593Smuzhiyun .reg = 0x610,
626*4882a593Smuzhiyun .bit = 4,
627*4882a593Smuzhiyun .mask = 0x7
628*4882a593Smuzhiyun }, {
629*4882a593Smuzhiyun /* gpio3b4_sel */
630*4882a593Smuzhiyun .num = 3,
631*4882a593Smuzhiyun .pin = 12,
632*4882a593Smuzhiyun .reg = 0x68,
633*4882a593Smuzhiyun .bit = 8,
634*4882a593Smuzhiyun .mask = 0xf
635*4882a593Smuzhiyun }, {
636*4882a593Smuzhiyun /* gpio3b5_sel */
637*4882a593Smuzhiyun .num = 3,
638*4882a593Smuzhiyun .pin = 13,
639*4882a593Smuzhiyun .reg = 0x68,
640*4882a593Smuzhiyun .bit = 12,
641*4882a593Smuzhiyun .mask = 0xf
642*4882a593Smuzhiyun },
643*4882a593Smuzhiyun };
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
646*4882a593Smuzhiyun {
647*4882a593Smuzhiyun .num = 2,
648*4882a593Smuzhiyun .pin = 8,
649*4882a593Smuzhiyun .reg = 0x24,
650*4882a593Smuzhiyun .bit = 0,
651*4882a593Smuzhiyun .mask = 0x3
652*4882a593Smuzhiyun }, {
653*4882a593Smuzhiyun .num = 2,
654*4882a593Smuzhiyun .pin = 9,
655*4882a593Smuzhiyun .reg = 0x24,
656*4882a593Smuzhiyun .bit = 2,
657*4882a593Smuzhiyun .mask = 0x3
658*4882a593Smuzhiyun }, {
659*4882a593Smuzhiyun .num = 2,
660*4882a593Smuzhiyun .pin = 10,
661*4882a593Smuzhiyun .reg = 0x24,
662*4882a593Smuzhiyun .bit = 4,
663*4882a593Smuzhiyun .mask = 0x3
664*4882a593Smuzhiyun }, {
665*4882a593Smuzhiyun .num = 2,
666*4882a593Smuzhiyun .pin = 11,
667*4882a593Smuzhiyun .reg = 0x24,
668*4882a593Smuzhiyun .bit = 6,
669*4882a593Smuzhiyun .mask = 0x3
670*4882a593Smuzhiyun }, {
671*4882a593Smuzhiyun .num = 2,
672*4882a593Smuzhiyun .pin = 12,
673*4882a593Smuzhiyun .reg = 0x24,
674*4882a593Smuzhiyun .bit = 8,
675*4882a593Smuzhiyun .mask = 0x3
676*4882a593Smuzhiyun }, {
677*4882a593Smuzhiyun .num = 2,
678*4882a593Smuzhiyun .pin = 13,
679*4882a593Smuzhiyun .reg = 0x24,
680*4882a593Smuzhiyun .bit = 10,
681*4882a593Smuzhiyun .mask = 0x3
682*4882a593Smuzhiyun }, {
683*4882a593Smuzhiyun .num = 2,
684*4882a593Smuzhiyun .pin = 14,
685*4882a593Smuzhiyun .reg = 0x24,
686*4882a593Smuzhiyun .bit = 12,
687*4882a593Smuzhiyun .mask = 0x3
688*4882a593Smuzhiyun }, {
689*4882a593Smuzhiyun .num = 2,
690*4882a593Smuzhiyun .pin = 15,
691*4882a593Smuzhiyun .reg = 0x28,
692*4882a593Smuzhiyun .bit = 0,
693*4882a593Smuzhiyun .mask = 0x7
694*4882a593Smuzhiyun }, {
695*4882a593Smuzhiyun .num = 2,
696*4882a593Smuzhiyun .pin = 23,
697*4882a593Smuzhiyun .reg = 0x30,
698*4882a593Smuzhiyun .bit = 14,
699*4882a593Smuzhiyun .mask = 0x3
700*4882a593Smuzhiyun },
701*4882a593Smuzhiyun };
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
704*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
705*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
708*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
709*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
712*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
715*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC0, 3, 0x10260, WRITE_MASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC6, 1, 0x10264, WRITE_MASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
718*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD1, 3, 0x10264, WRITE_MASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA4, 5, 0x10264, WRITE_MASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
721*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD4, 7, 0x10264, WRITE_MASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
722*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD6, 3, 0x10264, WRITE_MASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA0, 7, 0x10264, WRITE_MASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
725*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x10264, WRITE_MASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA5, 7, 0x10264, WRITE_MASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
728*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB0, 5, 0x10264, WRITE_MASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
729*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD0, 4, 0x10264, WRITE_MASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC0, 5, 0x10264, WRITE_MASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
732*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PC6, 3, 0x10264, WRITE_MASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
733*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD5, 6, 0x10264, WRITE_MASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x10264, WRITE_MASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
736*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB7, 2, 0x10264, WRITE_MASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA1, 3, 0x10264, WRITE_MASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
739*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA7, 5, 0x10264, WRITE_MASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA4, 6, 0x10268, WRITE_MASK_VAL(0, 0, 0)), /* PWM8_M0 */
742*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD7, 5, 0x10268, WRITE_MASK_VAL(0, 0, 1)), /* PWM8_M1 */
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA5, 6, 0x10268, WRITE_MASK_VAL(2, 2, 0)), /* PWM9_M0 */
745*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD6, 5, 0x10268, WRITE_MASK_VAL(2, 2, 1)), /* PWM9_M1 */
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA6, 6, 0x10268, WRITE_MASK_VAL(4, 4, 0)), /* PWM10_M0 */
748*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD5, 5, 0x10268, WRITE_MASK_VAL(4, 4, 1)), /* PWM10_M1 */
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA7, 6, 0x10268, WRITE_MASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
751*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA1, 5, 0x10268, WRITE_MASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA5, 3, 0x10268, WRITE_MASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
754*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA2, 1, 0x10268, WRITE_MASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC6, 3, 0x10268, WRITE_MASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
757*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA7, 2, 0x10268, WRITE_MASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
758*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA0, 4, 0x10268, WRITE_MASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA4, 4, 0x10268, WRITE_MASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
761*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA6, 4, 0x10268, WRITE_MASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
762*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x10268, WRITE_MASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA6, 4, 0x10268, WRITE_MASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
765*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB0, 4, 0x10268, WRITE_MASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
766*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA0, 3, 0x10268, WRITE_MASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB6, 3, 0x0114, WRITE_MASK_VAL(0, 0, 0)), /* PWM0_M0 */
769*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PB3, 5, 0x0114, WRITE_MASK_VAL(0, 0, 1)), /* PWM0_M1 */
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB7, 3, 0x0114, WRITE_MASK_VAL(2, 2, 0)), /* PWM1_M0 */
772*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PB2, 5, 0x0114, WRITE_MASK_VAL(2, 2, 1)), /* PWM1_M1 */
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC0, 3, 0x0114, WRITE_MASK_VAL(4, 4, 0)), /* PWM2_M0 */
775*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PB1, 5, 0x0114, WRITE_MASK_VAL(4, 4, 1)), /* PWM2_M1 */
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC1, 3, 0x0114, WRITE_MASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
778*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PB0, 5, 0x0114, WRITE_MASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC2, 3, 0x0114, WRITE_MASK_VAL(8, 8, 0)), /* PWM4_M0 */
781*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PA7, 5, 0x0114, WRITE_MASK_VAL(8, 8, 1)), /* PWM4_M1 */
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC3, 3, 0x0114, WRITE_MASK_VAL(10, 10, 0)), /* PWM5_M0 */
784*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PA6, 5, 0x0114, WRITE_MASK_VAL(10, 10, 1)), /* PWM5_M1 */
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB2, 3, 0x0114, WRITE_MASK_VAL(12, 12, 0)), /* PWM6_M0 */
787*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PD4, 5, 0x0114, WRITE_MASK_VAL(12, 12, 1)), /* PWM6_M1 */
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB1, 3, 0x0114, WRITE_MASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
790*4882a593Smuzhiyun RK_MUXROUTE_PMU(3, RK_PA0, 5, 0x0114, WRITE_MASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB0, 1, 0x0118, WRITE_MASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
793*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PA1, 1, 0x0118, WRITE_MASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
794*4882a593Smuzhiyun RK_MUXROUTE_PMU(2, RK_PB2, 6, 0x0118, WRITE_MASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
795*4882a593Smuzhiyun
796*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB6, 2, 0x0118, WRITE_MASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
797*4882a593Smuzhiyun RK_MUXROUTE_PMU(1, RK_PD0, 5, 0x0118, WRITE_MASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
798*4882a593Smuzhiyun };
799*4882a593Smuzhiyun
rockchip_get_recalced_mux(struct rockchip_pin_bank * bank,int pin,int * reg,u8 * bit,int * mask)800*4882a593Smuzhiyun static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
801*4882a593Smuzhiyun int *reg, u8 *bit, int *mask)
802*4882a593Smuzhiyun {
803*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
804*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
805*4882a593Smuzhiyun struct rockchip_mux_recalced_data *data;
806*4882a593Smuzhiyun int i;
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun for (i = 0; i < ctrl->niomux_recalced; i++) {
809*4882a593Smuzhiyun data = &ctrl->iomux_recalced[i];
810*4882a593Smuzhiyun if (data->num == bank->bank_num &&
811*4882a593Smuzhiyun data->pin == pin)
812*4882a593Smuzhiyun break;
813*4882a593Smuzhiyun }
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun if (i >= ctrl->niomux_recalced)
816*4882a593Smuzhiyun return;
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun *reg = data->reg;
819*4882a593Smuzhiyun *mask = data->mask;
820*4882a593Smuzhiyun *bit = data->bit;
821*4882a593Smuzhiyun }
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
824*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x190, BIT(16 + 3)), /* i2c2m0_sda */
825*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x190, BIT(16 + 3) | BIT(3)), /* i2c2m1_sda */
826*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA6, 2, 0x190, BIT(16 + 4)), /* spi2m0_miso */
827*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x190, BIT(16 + 4) | BIT(4)), /* spi2m1_miso */
828*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PB7, 2, 0x190, BIT(16 + 5)), /* spi1m0_miso */
829*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PD2, 3, 0x190, BIT(16 + 5) | BIT(5)), /* spi1m1_miso */
830*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PB0, 2, 0x190, BIT(16 + 13)), /* uart1_rxm0 */
831*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB4, 3, 0x190, BIT(16 + 13) | BIT(13)), /* uart1_rxm1 */
832*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PA3, 2, 0x190, BIT(16 + 14) | BIT(16 + 15)), /* uart2_rxm0 */
833*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PD1, 2, 0x190, BIT(16 + 14) | BIT(16 + 15) | BIT(14)), /* uart2_rxm1 */
834*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PA4, 2, 0x190, BIT(16 + 14) | BIT(16 + 15) | BIT(15)), /* uart2_rxm2 */
835*4882a593Smuzhiyun };
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun static struct rockchip_mux_route_data px30_mux_route_data[] = {
838*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA0, 1, 0x184, BIT(16 + 7)), /* cif-d2m0 */
839*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PA3, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d2m1 */
840*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PC6, 2, 0x184, BIT(16 + 8)), /* pdm-m0 */
841*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PC6, 1, 0x184, BIT(16 + 8) | BIT(8)), /* pdm-m1 */
842*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PD3, 2, 0x184, BIT(16 + 10)), /* uart2-rxm0 */
843*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PB6, 2, 0x184, BIT(16 + 10) | BIT(10)), /* uart2-rxm1 */
844*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PC1, 2, 0x184, BIT(16 + 9)), /* uart3-rxm0 */
845*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB7, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-rxm1 */
846*4882a593Smuzhiyun };
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
849*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB2, 1, 0x144, BIT(16 + 3) | BIT(16 + 4)), /* spi-0 */
850*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PD3, 3, 0x144, BIT(16 + 3) | BIT(16 + 4) | BIT(3)), /* spi-1 */
851*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PB5, 2, 0x144, BIT(16 + 3) | BIT(16 + 4) | BIT(4)), /* spi-2 */
852*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA5, 1, 0x144, BIT(16 + 5)), /* i2s-0 */
853*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PB6, 1, 0x144, BIT(16 + 5) | BIT(5)), /* i2s-1 */
854*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x144, BIT(16 + 6)), /* emmc-0 */
855*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x144, BIT(16 + 6) | BIT(6)), /* emmc-1 */
856*4882a593Smuzhiyun };
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3188_mux_route_data[] = {
859*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PD0, 1, 0xa0, BIT(16 + 11)), /* non-iomuxed emmc/flash pins on flash-dqs */
860*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PD0, 2, 0xa0, BIT(16 + 11) | BIT(11)), /* non-iomuxed emmc/flash pins on emmc-clk */
861*4882a593Smuzhiyun };
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
864*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PD2, 1, 0x50, BIT(16)), /* pwm0-0 */
865*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PC5, 1, 0x50, BIT(16) | BIT(0)), /* pwm0-1 */
866*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PD3, 1, 0x50, BIT(16 + 1)), /* pwm1-0 */
867*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PD6, 2, 0x50, BIT(16 + 1) | BIT(1)), /* pwm1-1 */
868*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PD4, 1, 0x50, BIT(16 + 2)), /* pwm2-0 */
869*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB4, 2, 0x50, BIT(16 + 2) | BIT(2)), /* pwm2-1 */
870*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PD2, 1, 0x50, BIT(16 + 3)), /* pwm3-0 */
871*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB3, 2, 0x50, BIT(16 + 3) | BIT(3)), /* pwm3-1 */
872*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA1, 1, 0x50, BIT(16 + 4)), /* sdio-0_d0 */
873*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PA2, 1, 0x50, BIT(16 + 4) | BIT(4)), /* sdio-1_d0 */
874*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PB5, 2, 0x50, BIT(16 + 5)), /* spi-0_rx */
875*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA0, 2, 0x50, BIT(16 + 5) | BIT(5)), /* spi-1_rx */
876*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x50, BIT(16 + 7)), /* emmc-0_cmd */
877*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x50, BIT(16 + 7) | BIT(7)), /* emmc-1_cmd */
878*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC3, 2, 0x50, BIT(16 + 8)), /* uart2-0_rx */
879*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB2, 2, 0x50, BIT(16 + 8) | BIT(8)), /* uart2-1_rx */
880*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB2, 1, 0x50, BIT(16 + 11)), /* uart1-0_rx */
881*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PB5, 1, 0x50, BIT(16 + 11) | BIT(11)), /* uart1-1_rx */
882*4882a593Smuzhiyun };
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
885*4882a593Smuzhiyun RK_MUXROUTE_SAME(7, RK_PC0, 2, 0x264, BIT(16 + 12) | BIT(12)), /* edphdmi_cecinoutt1 */
886*4882a593Smuzhiyun RK_MUXROUTE_SAME(7, RK_PC7, 4, 0x264, BIT(16 + 12)), /* edphdmi_cecinout */
887*4882a593Smuzhiyun };
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
890*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
891*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
892*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
893*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
894*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
895*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
896*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
897*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
898*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
899*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
900*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
901*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
902*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
903*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
904*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PB2, 3, 0x314, BIT(16 + 9)), /* spi1_miso */
905*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x314, BIT(16 + 9) | BIT(9)), /* spi1_miso_m1 */
906*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PB3, 3, 0x314, BIT(16 + 10) | BIT(16 + 11)), /* owire_m0 */
907*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC6, 7, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* owire_m1 */
908*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA2, 5, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* owire_m2 */
909*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PB3, 2, 0x314, BIT(16 + 12) | BIT(16 + 13)), /* can_rxd_m0 */
910*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC6, 5, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* can_rxd_m1 */
911*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA2, 4, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* can_rxd_m2 */
912*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC4, 3, 0x314, BIT(16 + 14)), /* mac_rxd0_m0 */
913*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PA2, 2, 0x314, BIT(16 + 14) | BIT(14)), /* mac_rxd0_m1 */
914*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PB4, 4, 0x314, BIT(16 + 15)), /* uart3_rx */
915*4882a593Smuzhiyun RK_MUXROUTE_SAME(0, RK_PC1, 3, 0x314, BIT(16 + 15) | BIT(15)), /* uart3_rx_m1 */
916*4882a593Smuzhiyun };
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
919*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PA1, 2, 0x50, BIT(16) | BIT(16 + 1)), /* uart2dbg_rxm0 */
920*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PA1, 1, 0x50, BIT(16) | BIT(16 + 1) | BIT(0)), /* uart2dbg_rxm1 */
921*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB3, 2, 0x50, BIT(16 + 2) | BIT(2)), /* gmac-m1_rxd0 */
922*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x50, BIT(16 + 10) | BIT(10)), /* gmac-m1-optimized_rxd3 */
923*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PC3, 2, 0x50, BIT(16 + 3)), /* pdm_sdi0m0 */
924*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PC7, 3, 0x50, BIT(16 + 3) | BIT(3)), /* pdm_sdi0m1 */
925*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PA2, 4, 0x50, BIT(16 + 4) | BIT(16 + 5) | BIT(5)), /* spi_rxdm2 */
926*4882a593Smuzhiyun RK_MUXROUTE_SAME(1, RK_PD0, 1, 0x50, BIT(16 + 6)), /* i2s2_sdim0 */
927*4882a593Smuzhiyun RK_MUXROUTE_SAME(3, RK_PA2, 6, 0x50, BIT(16 + 6) | BIT(6)), /* i2s2_sdim1 */
928*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PC6, 3, 0x50, BIT(16 + 7) | BIT(7)), /* card_iom1 */
929*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PC0, 3, 0x50, BIT(16 + 8) | BIT(8)), /* tsp_d5m1 */
930*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PC0, 4, 0x50, BIT(16 + 9) | BIT(9)), /* cif_data5m1 */
931*4882a593Smuzhiyun };
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
934*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PB0, 2, 0xe21c, BIT(16 + 10) | BIT(16 + 11)), /* uart2dbga_rx */
935*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PC0, 2, 0xe21c, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* uart2dbgb_rx */
936*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PC3, 1, 0xe21c, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* uart2dbgc_rx */
937*4882a593Smuzhiyun RK_MUXROUTE_SAME(2, RK_PD2, 2, 0xe21c, BIT(16 + 14)), /* pcie_clkreqn */
938*4882a593Smuzhiyun RK_MUXROUTE_SAME(4, RK_PD0, 1, 0xe21c, BIT(16 + 14) | BIT(14)), /* pcie_clkreqnb */
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
942*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB7, 1, 0x0110, WRITE_MASK_VAL(1, 0, 0)), /* PWM0 IO mux M0 */
943*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC7, 2, 0x0110, WRITE_MASK_VAL(1, 0, 1)), /* PWM0 IO mux M1 */
944*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC0, 1, 0x0110, WRITE_MASK_VAL(3, 2, 0)), /* PWM1 IO mux M0 */
945*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB5, 4, 0x0110, WRITE_MASK_VAL(3, 2, 1)), /* PWM1 IO mux M1 */
946*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PC1, 1, 0x0110, WRITE_MASK_VAL(5, 4, 0)), /* PWM2 IO mux M0 */
947*4882a593Smuzhiyun RK_MUXROUTE_PMU(0, RK_PB6, 4, 0x0110, WRITE_MASK_VAL(5, 4, 1)), /* PWM2 IO mux M1 */
948*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PB3, 2, 0x0300, WRITE_MASK_VAL(0, 0, 0)), /* CAN0 IO mux M0 */
949*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA1, 4, 0x0300, WRITE_MASK_VAL(0, 0, 1)), /* CAN0 IO mux M1 */
950*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA1, 3, 0x0300, WRITE_MASK_VAL(2, 2, 0)), /* CAN1 IO mux M0 */
951*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC3, 3, 0x0300, WRITE_MASK_VAL(2, 2, 1)), /* CAN1 IO mux M1 */
952*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PB5, 3, 0x0300, WRITE_MASK_VAL(4, 4, 0)), /* CAN2 IO mux M0 */
953*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB2, 4, 0x0300, WRITE_MASK_VAL(4, 4, 1)), /* CAN2 IO mux M1 */
954*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC4, 1, 0x0300, WRITE_MASK_VAL(6, 6, 0)), /* HPDIN IO mux M0 */
955*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PC2, 2, 0x0300, WRITE_MASK_VAL(6, 6, 1)), /* HPDIN IO mux M1 */
956*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x0300, WRITE_MASK_VAL(8, 8, 0)), /* GMAC1 IO mux M0 */
957*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PA7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */
958*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PB7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */
959*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PD1, 1, 0x0300, WRITE_MASK_VAL(10, 10, 0)), /* HDMITX IO mux M0 */
960*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PC7, 1, 0x0300, WRITE_MASK_VAL(10, 10, 1)), /* HDMITX IO mux M1 */
961*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PB6, 1, 0x0300, WRITE_MASK_VAL(14, 14, 0)), /* I2C2 IO mux M0 */
962*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PB4, 1, 0x0300, WRITE_MASK_VAL(14, 14, 1)), /* I2C2 IO mux M1 */
963*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA0, 1, 0x0304, WRITE_MASK_VAL(0, 0, 0)), /* I2C3 IO mux M0 */
964*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB6, 4, 0x0304, WRITE_MASK_VAL(0, 0, 1)), /* I2C3 IO mux M1 */
965*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PB2, 1, 0x0304, WRITE_MASK_VAL(2, 2, 0)), /* I2C4 IO mux M0 */
966*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x0304, WRITE_MASK_VAL(2, 2, 1)), /* I2C4 IO mux M1 */
967*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB4, 4, 0x0304, WRITE_MASK_VAL(4, 4, 0)), /* I2C5 IO mux M0 */
968*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PD0, 2, 0x0304, WRITE_MASK_VAL(4, 4, 1)), /* I2C5 IO mux M1 */
969*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB1, 5, 0x0304, WRITE_MASK_VAL(14, 14, 0)), /* PWM8 IO mux M0 */
970*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD5, 4, 0x0304, WRITE_MASK_VAL(14, 14, 1)), /* PWM8 IO mux M1 */
971*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB2, 5, 0x0308, WRITE_MASK_VAL(0, 0, 0)), /* PWM9 IO mux M0 */
972*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD6, 4, 0x0308, WRITE_MASK_VAL(0, 0, 1)), /* PWM9 IO mux M1 */
973*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB5, 5, 0x0308, WRITE_MASK_VAL(2, 2, 0)), /* PWM10 IO mux M0 */
974*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA1, 2, 0x0308, WRITE_MASK_VAL(2, 2, 1)), /* PWM10 IO mux M1 */
975*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB6, 5, 0x0308, WRITE_MASK_VAL(4, 4, 0)), /* PWM11 IO mux M0 */
976*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC0, 3, 0x0308, WRITE_MASK_VAL(4, 4, 1)), /* PWM11 IO mux M1 */
977*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB7, 2, 0x0308, WRITE_MASK_VAL(6, 6, 0)), /* PWM12 IO mux M0 */
978*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(6, 6, 1)), /* PWM12 IO mux M1 */
979*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x0308, WRITE_MASK_VAL(8, 8, 0)), /* PWM13 IO mux M0 */
980*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC6, 1, 0x0308, WRITE_MASK_VAL(8, 8, 1)), /* PWM13 IO mux M1 */
981*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC4, 1, 0x0308, WRITE_MASK_VAL(10, 10, 0)), /* PWM14 IO mux M0 */
982*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC2, 1, 0x0308, WRITE_MASK_VAL(10, 10, 1)), /* PWM14 IO mux M1 */
983*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(12, 12, 0)), /* PWM15 IO mux M0 */
984*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC3, 1, 0x0308, WRITE_MASK_VAL(12, 12, 1)), /* PWM15 IO mux M1 */
985*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PD2, 3, 0x0308, WRITE_MASK_VAL(14, 14, 0)), /* SDMMC2 IO mux M0 */
986*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA5, 5, 0x0308, WRITE_MASK_VAL(14, 14, 1)), /* SDMMC2 IO mux M1 */
987*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PB5, 2, 0x030c, WRITE_MASK_VAL(0, 0, 0)), /* SPI0 IO mux M0 */
988*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD3, 3, 0x030c, WRITE_MASK_VAL(0, 0, 1)), /* SPI0 IO mux M1 */
989*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB5, 3, 0x030c, WRITE_MASK_VAL(2, 2, 0)), /* SPI1 IO mux M0 */
990*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC3, 3, 0x030c, WRITE_MASK_VAL(2, 2, 1)), /* SPI1 IO mux M1 */
991*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PC1, 4, 0x030c, WRITE_MASK_VAL(4, 4, 0)), /* SPI2 IO mux M0 */
992*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA0, 3, 0x030c, WRITE_MASK_VAL(4, 4, 1)), /* SPI2 IO mux M1 */
993*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PB3, 4, 0x030c, WRITE_MASK_VAL(6, 6, 0)), /* SPI3 IO mux M0 */
994*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC2, 2, 0x030c, WRITE_MASK_VAL(6, 6, 1)), /* SPI3 IO mux M1 */
995*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB4, 2, 0x030c, WRITE_MASK_VAL(8, 8, 0)), /* UART1 IO mux M0 */
996*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PD6, 4, 0x030c, WRITE_MASK_VAL(8, 8, 1)), /* UART1 IO mux M1 */
997*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PD1, 1, 0x030c, WRITE_MASK_VAL(10, 10, 0)), /* UART2 IO mux M0 */
998*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x030c, WRITE_MASK_VAL(10, 10, 1)), /* UART2 IO mux M1 */
999*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA1, 2, 0x030c, WRITE_MASK_VAL(12, 12, 0)), /* UART3 IO mux M0 */
1000*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB7, 4, 0x030c, WRITE_MASK_VAL(12, 12, 1)), /* UART3 IO mux M1 */
1001*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA6, 2, 0x030c, WRITE_MASK_VAL(14, 14, 0)), /* UART4 IO mux M0 */
1002*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PB2, 4, 0x030c, WRITE_MASK_VAL(14, 14, 1)), /* UART4 IO mux M1 */
1003*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA2, 3, 0x0310, WRITE_MASK_VAL(0, 0, 0)), /* UART5 IO mux M0 */
1004*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC2, 4, 0x0310, WRITE_MASK_VAL(0, 0, 1)), /* UART5 IO mux M1 */
1005*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA4, 3, 0x0310, WRITE_MASK_VAL(2, 2, 0)), /* UART6 IO mux M0 */
1006*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x0310, WRITE_MASK_VAL(2, 2, 1)), /* UART6 IO mux M1 */
1007*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PA6, 3, 0x0310, WRITE_MASK_VAL(5, 4, 0)), /* UART7 IO mux M0 */
1008*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC4, 4, 0x0310, WRITE_MASK_VAL(5, 4, 1)), /* UART7 IO mux M1 */
1009*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(5, 4, 2)), /* UART7 IO mux M2 */
1010*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PC5, 3, 0x0310, WRITE_MASK_VAL(6, 6, 0)), /* UART8 IO mux M0 */
1011*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD7, 4, 0x0310, WRITE_MASK_VAL(6, 6, 1)), /* UART8 IO mux M1 */
1012*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */
1013*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
1014*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
1015*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
1016*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
1017*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
1018*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
1019*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
1020*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
1021*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
1022*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
1023*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
1024*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
1025*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
1026*4882a593Smuzhiyun RK_MUXROUTE_GRF(3, RK_PC4, 5, 0x0314, WRITE_MASK_VAL(1, 0, 2)), /* PDM IO mux M2 */
1027*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PA5, 3, 0x0314, WRITE_MASK_VAL(3, 2, 0)), /* PCIE20 IO mux M0 */
1028*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 1)), /* PCIE20 IO mux M1 */
1029*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PB0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 2)), /* PCIE20 IO mux M2 */
1030*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux M0 */
1031*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD2, 4, 0x0314, WRITE_MASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux M1 */
1032*4882a593Smuzhiyun RK_MUXROUTE_GRF(1, RK_PA5, 4, 0x0314, WRITE_MASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux M2 */
1033*4882a593Smuzhiyun RK_MUXROUTE_GRF(0, RK_PA6, 2, 0x0314, WRITE_MASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux M0 */
1034*4882a593Smuzhiyun RK_MUXROUTE_GRF(2, RK_PD4, 4, 0x0314, WRITE_MASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux M1 */
1035*4882a593Smuzhiyun RK_MUXROUTE_GRF(4, RK_PC2, 4, 0x0314, WRITE_MASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux M2 */
1036*4882a593Smuzhiyun };
1037*4882a593Smuzhiyun
rockchip_get_mux_route(struct rockchip_pin_bank * bank,int pin,int mux,u32 * loc,u32 * reg,u32 * value)1038*4882a593Smuzhiyun static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
1039*4882a593Smuzhiyun int mux, u32 *loc, u32 *reg, u32 *value)
1040*4882a593Smuzhiyun {
1041*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1042*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
1043*4882a593Smuzhiyun struct rockchip_mux_route_data *data;
1044*4882a593Smuzhiyun int i;
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun for (i = 0; i < ctrl->niomux_routes; i++) {
1047*4882a593Smuzhiyun data = &ctrl->iomux_routes[i];
1048*4882a593Smuzhiyun if ((data->bank_num == bank->bank_num) &&
1049*4882a593Smuzhiyun (data->pin == pin) && (data->func == mux))
1050*4882a593Smuzhiyun break;
1051*4882a593Smuzhiyun }
1052*4882a593Smuzhiyun
1053*4882a593Smuzhiyun if (i >= ctrl->niomux_routes)
1054*4882a593Smuzhiyun return false;
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun *loc = data->route_location;
1057*4882a593Smuzhiyun *reg = data->route_offset;
1058*4882a593Smuzhiyun *value = data->route_val;
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun return true;
1061*4882a593Smuzhiyun }
1062*4882a593Smuzhiyun
rockchip_get_mux(struct rockchip_pin_bank * bank,int pin)1063*4882a593Smuzhiyun static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
1064*4882a593Smuzhiyun {
1065*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1066*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
1067*4882a593Smuzhiyun int iomux_num = (pin / 8);
1068*4882a593Smuzhiyun struct regmap *regmap;
1069*4882a593Smuzhiyun unsigned int val;
1070*4882a593Smuzhiyun int reg, ret, mask, mux_type;
1071*4882a593Smuzhiyun u8 bit;
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun if (iomux_num > 3)
1074*4882a593Smuzhiyun return -EINVAL;
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1077*4882a593Smuzhiyun dev_err(info->dev, "pin %d is unrouted\n", pin);
1078*4882a593Smuzhiyun return -EINVAL;
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
1082*4882a593Smuzhiyun return RK_FUNC_GPIO;
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1085*4882a593Smuzhiyun regmap = info->regmap_pmu;
1086*4882a593Smuzhiyun else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1087*4882a593Smuzhiyun regmap = (pin % 8 < 4) ? info->regmap_pmu : info->regmap_base;
1088*4882a593Smuzhiyun else
1089*4882a593Smuzhiyun regmap = info->regmap_base;
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun /* get basic quadrupel of mux registers and the correct reg inside */
1092*4882a593Smuzhiyun mux_type = bank->iomux[iomux_num].type;
1093*4882a593Smuzhiyun reg = bank->iomux[iomux_num].offset;
1094*4882a593Smuzhiyun if (mux_type & IOMUX_WIDTH_4BIT) {
1095*4882a593Smuzhiyun if ((pin % 8) >= 4)
1096*4882a593Smuzhiyun reg += 0x4;
1097*4882a593Smuzhiyun bit = (pin % 4) * 4;
1098*4882a593Smuzhiyun mask = 0xf;
1099*4882a593Smuzhiyun } else if (mux_type & IOMUX_WIDTH_3BIT) {
1100*4882a593Smuzhiyun if ((pin % 8) >= 5)
1101*4882a593Smuzhiyun reg += 0x4;
1102*4882a593Smuzhiyun bit = (pin % 8 % 5) * 3;
1103*4882a593Smuzhiyun mask = 0x7;
1104*4882a593Smuzhiyun } else {
1105*4882a593Smuzhiyun bit = (pin % 8) * 2;
1106*4882a593Smuzhiyun mask = 0x3;
1107*4882a593Smuzhiyun }
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun if (bank->recalced_mask & BIT(pin))
1110*4882a593Smuzhiyun rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask);
1111*4882a593Smuzhiyun
1112*4882a593Smuzhiyun if (ctrl->type == RK3588) {
1113*4882a593Smuzhiyun if (bank->bank_num == 0) {
1114*4882a593Smuzhiyun if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
1115*4882a593Smuzhiyun u32 reg0 = 0;
1116*4882a593Smuzhiyun
1117*4882a593Smuzhiyun reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1118*4882a593Smuzhiyun ret = regmap_read(regmap, reg0, &val);
1119*4882a593Smuzhiyun if (ret)
1120*4882a593Smuzhiyun return ret;
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun if (((val >> bit) & mask) != 8)
1123*4882a593Smuzhiyun return ((val >> bit) & mask);
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun reg = reg + 0x8000; /* BUS_IOC_BASE */
1126*4882a593Smuzhiyun regmap = info->regmap_base;
1127*4882a593Smuzhiyun }
1128*4882a593Smuzhiyun } else if (bank->bank_num > 0) {
1129*4882a593Smuzhiyun reg += 0x8000; /* BUS_IOC_BASE */
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &val);
1134*4882a593Smuzhiyun if (ret)
1135*4882a593Smuzhiyun return ret;
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun return ((val >> bit) & mask);
1138*4882a593Smuzhiyun }
1139*4882a593Smuzhiyun
rockchip_verify_mux(struct rockchip_pin_bank * bank,int pin,int mux)1140*4882a593Smuzhiyun static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
1141*4882a593Smuzhiyun int pin, int mux)
1142*4882a593Smuzhiyun {
1143*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1144*4882a593Smuzhiyun struct device *dev = info->dev;
1145*4882a593Smuzhiyun int iomux_num = (pin / 8);
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun if (iomux_num > 3)
1148*4882a593Smuzhiyun return -EINVAL;
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
1151*4882a593Smuzhiyun dev_err(dev, "pin %d is unrouted\n", pin);
1152*4882a593Smuzhiyun return -EINVAL;
1153*4882a593Smuzhiyun }
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
1156*4882a593Smuzhiyun if (mux != RK_FUNC_GPIO) {
1157*4882a593Smuzhiyun dev_err(dev, "pin %d only supports a gpio mux\n", pin);
1158*4882a593Smuzhiyun return -ENOTSUPP;
1159*4882a593Smuzhiyun }
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun return 0;
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun /*
1166*4882a593Smuzhiyun * Set a new mux function for a pin.
1167*4882a593Smuzhiyun *
1168*4882a593Smuzhiyun * The register is divided into the upper and lower 16 bit. When changing
1169*4882a593Smuzhiyun * a value, the previous register value is not read and changed. Instead
1170*4882a593Smuzhiyun * it seems the changed bits are marked in the upper 16 bit, while the
1171*4882a593Smuzhiyun * changed value gets set in the same offset in the lower 16 bit.
1172*4882a593Smuzhiyun * All pin settings seem to be 2 bit wide in both the upper and lower
1173*4882a593Smuzhiyun * parts.
1174*4882a593Smuzhiyun * @bank: pin bank to change
1175*4882a593Smuzhiyun * @pin: pin to change
1176*4882a593Smuzhiyun * @mux: new mux function to set
1177*4882a593Smuzhiyun */
rockchip_set_mux(struct rockchip_pin_bank * bank,int pin,int mux)1178*4882a593Smuzhiyun static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
1179*4882a593Smuzhiyun {
1180*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1181*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
1182*4882a593Smuzhiyun struct device *dev = info->dev;
1183*4882a593Smuzhiyun int iomux_num = (pin / 8);
1184*4882a593Smuzhiyun struct regmap *regmap;
1185*4882a593Smuzhiyun int reg, ret, mask, mux_type;
1186*4882a593Smuzhiyun u8 bit;
1187*4882a593Smuzhiyun u32 data, rmask, route_location, route_reg, route_val;
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun ret = rockchip_verify_mux(bank, pin, mux);
1190*4882a593Smuzhiyun if (ret < 0)
1191*4882a593Smuzhiyun return ret;
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
1194*4882a593Smuzhiyun return 0;
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
1199*4882a593Smuzhiyun regmap = info->regmap_pmu;
1200*4882a593Smuzhiyun else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
1201*4882a593Smuzhiyun regmap = (pin % 8 < 4) ? info->regmap_pmu : info->regmap_base;
1202*4882a593Smuzhiyun else
1203*4882a593Smuzhiyun regmap = info->regmap_base;
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun /* get basic quadrupel of mux registers and the correct reg inside */
1206*4882a593Smuzhiyun mux_type = bank->iomux[iomux_num].type;
1207*4882a593Smuzhiyun reg = bank->iomux[iomux_num].offset;
1208*4882a593Smuzhiyun if (mux_type & IOMUX_WIDTH_4BIT) {
1209*4882a593Smuzhiyun if ((pin % 8) >= 4)
1210*4882a593Smuzhiyun reg += 0x4;
1211*4882a593Smuzhiyun bit = (pin % 4) * 4;
1212*4882a593Smuzhiyun mask = 0xf;
1213*4882a593Smuzhiyun } else if (mux_type & IOMUX_WIDTH_3BIT) {
1214*4882a593Smuzhiyun if ((pin % 8) >= 5)
1215*4882a593Smuzhiyun reg += 0x4;
1216*4882a593Smuzhiyun bit = (pin % 8 % 5) * 3;
1217*4882a593Smuzhiyun mask = 0x7;
1218*4882a593Smuzhiyun } else {
1219*4882a593Smuzhiyun bit = (pin % 8) * 2;
1220*4882a593Smuzhiyun mask = 0x3;
1221*4882a593Smuzhiyun }
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun if (bank->recalced_mask & BIT(pin))
1224*4882a593Smuzhiyun rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask);
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun /* rk3562 force jtag m1 */
1227*4882a593Smuzhiyun if (ctrl->type == RK3562) {
1228*4882a593Smuzhiyun if (bank->bank_num == 1) {
1229*4882a593Smuzhiyun if ((pin == RK_PB5) || (pin == RK_PB6)) {
1230*4882a593Smuzhiyun if (mux == 1) {
1231*4882a593Smuzhiyun regmap_update_bits(regmap, 0x504, 0x10001, 0x10001);
1232*4882a593Smuzhiyun } else {
1233*4882a593Smuzhiyun regmap_update_bits(regmap, 0x504, 0x10001, 0x10000);
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun }
1237*4882a593Smuzhiyun }
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun if (ctrl->type == RK3588) {
1240*4882a593Smuzhiyun if (bank->bank_num == 0) {
1241*4882a593Smuzhiyun if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
1242*4882a593Smuzhiyun if (mux < 8) {
1243*4882a593Smuzhiyun u32 reg0 = 0;
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1246*4882a593Smuzhiyun data = (mask << (bit + 16));
1247*4882a593Smuzhiyun rmask = data | (data >> 16);
1248*4882a593Smuzhiyun data |= (mux & mask) << bit;
1249*4882a593Smuzhiyun ret = regmap_update_bits(regmap, reg0, rmask, data);
1250*4882a593Smuzhiyun
1251*4882a593Smuzhiyun reg0 = reg + 0x8000; /* BUS_IOC_BASE */
1252*4882a593Smuzhiyun data = (mask << (bit + 16));
1253*4882a593Smuzhiyun rmask = data | (data >> 16);
1254*4882a593Smuzhiyun regmap = info->regmap_base;
1255*4882a593Smuzhiyun ret |= regmap_update_bits(regmap, reg0, rmask, data);
1256*4882a593Smuzhiyun } else {
1257*4882a593Smuzhiyun u32 reg0 = 0;
1258*4882a593Smuzhiyun
1259*4882a593Smuzhiyun reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
1260*4882a593Smuzhiyun data = (mask << (bit + 16));
1261*4882a593Smuzhiyun rmask = data | (data >> 16);
1262*4882a593Smuzhiyun data |= 8 << bit;
1263*4882a593Smuzhiyun ret = regmap_update_bits(regmap, reg0, rmask, data);
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun reg0 = reg + 0x8000; /* BUS_IOC_BASE */
1266*4882a593Smuzhiyun data = (mask << (bit + 16));
1267*4882a593Smuzhiyun rmask = data | (data >> 16);
1268*4882a593Smuzhiyun data |= (mux & mask) << bit;
1269*4882a593Smuzhiyun regmap = info->regmap_base;
1270*4882a593Smuzhiyun ret |= regmap_update_bits(regmap, reg0, rmask, data);
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun } else {
1273*4882a593Smuzhiyun data = (mask << (bit + 16));
1274*4882a593Smuzhiyun rmask = data | (data >> 16);
1275*4882a593Smuzhiyun data |= (mux & mask) << bit;
1276*4882a593Smuzhiyun ret = regmap_update_bits(regmap, reg, rmask, data);
1277*4882a593Smuzhiyun }
1278*4882a593Smuzhiyun return ret;
1279*4882a593Smuzhiyun } else if (bank->bank_num > 0) {
1280*4882a593Smuzhiyun reg += 0x8000; /* BUS_IOC_BASE */
1281*4882a593Smuzhiyun }
1282*4882a593Smuzhiyun }
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun if (mux > mask)
1285*4882a593Smuzhiyun return -EINVAL;
1286*4882a593Smuzhiyun
1287*4882a593Smuzhiyun if (bank->route_mask & BIT(pin)) {
1288*4882a593Smuzhiyun if (rockchip_get_mux_route(bank, pin, mux, &route_location,
1289*4882a593Smuzhiyun &route_reg, &route_val)) {
1290*4882a593Smuzhiyun struct regmap *route_regmap = regmap;
1291*4882a593Smuzhiyun
1292*4882a593Smuzhiyun /* handle special locations */
1293*4882a593Smuzhiyun switch (route_location) {
1294*4882a593Smuzhiyun case ROCKCHIP_ROUTE_PMU:
1295*4882a593Smuzhiyun route_regmap = info->regmap_pmu;
1296*4882a593Smuzhiyun break;
1297*4882a593Smuzhiyun case ROCKCHIP_ROUTE_GRF:
1298*4882a593Smuzhiyun route_regmap = info->regmap_base;
1299*4882a593Smuzhiyun break;
1300*4882a593Smuzhiyun }
1301*4882a593Smuzhiyun
1302*4882a593Smuzhiyun ret = regmap_write(route_regmap, route_reg, route_val);
1303*4882a593Smuzhiyun if (ret)
1304*4882a593Smuzhiyun return ret;
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun }
1307*4882a593Smuzhiyun
1308*4882a593Smuzhiyun if (mux_type & IOMUX_WRITABLE_32BIT) {
1309*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &data);
1310*4882a593Smuzhiyun if (ret)
1311*4882a593Smuzhiyun return ret;
1312*4882a593Smuzhiyun
1313*4882a593Smuzhiyun data &= ~(mask << bit);
1314*4882a593Smuzhiyun data |= (mux & mask) << bit;
1315*4882a593Smuzhiyun ret = regmap_write(regmap, reg, data);
1316*4882a593Smuzhiyun } else {
1317*4882a593Smuzhiyun data = (mask << (bit + 16));
1318*4882a593Smuzhiyun rmask = data | (data >> 16);
1319*4882a593Smuzhiyun data |= (mux & mask) << bit;
1320*4882a593Smuzhiyun ret = regmap_update_bits(regmap, reg, rmask, data);
1321*4882a593Smuzhiyun }
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun return ret;
1324*4882a593Smuzhiyun }
1325*4882a593Smuzhiyun
1326*4882a593Smuzhiyun #define PX30_PULL_PMU_OFFSET 0x10
1327*4882a593Smuzhiyun #define PX30_PULL_GRF_OFFSET 0x60
1328*4882a593Smuzhiyun #define PX30_PULL_BITS_PER_PIN 2
1329*4882a593Smuzhiyun #define PX30_PULL_PINS_PER_REG 8
1330*4882a593Smuzhiyun #define PX30_PULL_BANK_STRIDE 16
1331*4882a593Smuzhiyun
px30_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1332*4882a593Smuzhiyun static int px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1333*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1334*4882a593Smuzhiyun int *reg, u8 *bit)
1335*4882a593Smuzhiyun {
1336*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1337*4882a593Smuzhiyun
1338*4882a593Smuzhiyun /* The first 32 pins of the first bank are located in PMU */
1339*4882a593Smuzhiyun if (bank->bank_num == 0) {
1340*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1341*4882a593Smuzhiyun *reg = PX30_PULL_PMU_OFFSET;
1342*4882a593Smuzhiyun } else {
1343*4882a593Smuzhiyun *regmap = info->regmap_base;
1344*4882a593Smuzhiyun *reg = PX30_PULL_GRF_OFFSET;
1345*4882a593Smuzhiyun
1346*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
1347*4882a593Smuzhiyun *reg -= 0x10;
1348*4882a593Smuzhiyun *reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun
1351*4882a593Smuzhiyun *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
1352*4882a593Smuzhiyun *bit = (pin_num % PX30_PULL_PINS_PER_REG);
1353*4882a593Smuzhiyun *bit *= PX30_PULL_BITS_PER_PIN;
1354*4882a593Smuzhiyun
1355*4882a593Smuzhiyun return 0;
1356*4882a593Smuzhiyun }
1357*4882a593Smuzhiyun
1358*4882a593Smuzhiyun #define PX30_DRV_PMU_OFFSET 0x20
1359*4882a593Smuzhiyun #define PX30_DRV_GRF_OFFSET 0xf0
1360*4882a593Smuzhiyun #define PX30_DRV_BITS_PER_PIN 2
1361*4882a593Smuzhiyun #define PX30_DRV_PINS_PER_REG 8
1362*4882a593Smuzhiyun #define PX30_DRV_BANK_STRIDE 16
1363*4882a593Smuzhiyun
px30_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1364*4882a593Smuzhiyun static int px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1365*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1366*4882a593Smuzhiyun int *reg, u8 *bit)
1367*4882a593Smuzhiyun {
1368*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun /* The first 32 pins of the first bank are located in PMU */
1371*4882a593Smuzhiyun if (bank->bank_num == 0) {
1372*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1373*4882a593Smuzhiyun *reg = PX30_DRV_PMU_OFFSET;
1374*4882a593Smuzhiyun } else {
1375*4882a593Smuzhiyun *regmap = info->regmap_base;
1376*4882a593Smuzhiyun *reg = PX30_DRV_GRF_OFFSET;
1377*4882a593Smuzhiyun
1378*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
1379*4882a593Smuzhiyun *reg -= 0x10;
1380*4882a593Smuzhiyun *reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
1381*4882a593Smuzhiyun }
1382*4882a593Smuzhiyun
1383*4882a593Smuzhiyun *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
1384*4882a593Smuzhiyun *bit = (pin_num % PX30_DRV_PINS_PER_REG);
1385*4882a593Smuzhiyun *bit *= PX30_DRV_BITS_PER_PIN;
1386*4882a593Smuzhiyun
1387*4882a593Smuzhiyun return 0;
1388*4882a593Smuzhiyun }
1389*4882a593Smuzhiyun
1390*4882a593Smuzhiyun #define PX30_SCHMITT_PMU_OFFSET 0x38
1391*4882a593Smuzhiyun #define PX30_SCHMITT_GRF_OFFSET 0xc0
1392*4882a593Smuzhiyun #define PX30_SCHMITT_PINS_PER_PMU_REG 16
1393*4882a593Smuzhiyun #define PX30_SCHMITT_BANK_STRIDE 16
1394*4882a593Smuzhiyun #define PX30_SCHMITT_PINS_PER_GRF_REG 8
1395*4882a593Smuzhiyun
px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1396*4882a593Smuzhiyun static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1397*4882a593Smuzhiyun int pin_num,
1398*4882a593Smuzhiyun struct regmap **regmap,
1399*4882a593Smuzhiyun int *reg, u8 *bit)
1400*4882a593Smuzhiyun {
1401*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1402*4882a593Smuzhiyun int pins_per_reg;
1403*4882a593Smuzhiyun
1404*4882a593Smuzhiyun if (bank->bank_num == 0) {
1405*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1406*4882a593Smuzhiyun *reg = PX30_SCHMITT_PMU_OFFSET;
1407*4882a593Smuzhiyun pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
1408*4882a593Smuzhiyun } else {
1409*4882a593Smuzhiyun *regmap = info->regmap_base;
1410*4882a593Smuzhiyun *reg = PX30_SCHMITT_GRF_OFFSET;
1411*4882a593Smuzhiyun pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
1412*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
1413*4882a593Smuzhiyun }
1414*4882a593Smuzhiyun
1415*4882a593Smuzhiyun *reg += ((pin_num / pins_per_reg) * 4);
1416*4882a593Smuzhiyun *bit = pin_num % pins_per_reg;
1417*4882a593Smuzhiyun
1418*4882a593Smuzhiyun return 0;
1419*4882a593Smuzhiyun }
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun #define RV1106_DRV_BITS_PER_PIN 8
1422*4882a593Smuzhiyun #define RV1106_DRV_PINS_PER_REG 2
1423*4882a593Smuzhiyun #define RV1106_DRV_GPIO0_OFFSET 0x10
1424*4882a593Smuzhiyun #define RV1106_DRV_GPIO1_OFFSET 0x80
1425*4882a593Smuzhiyun #define RV1106_DRV_GPIO2_OFFSET 0x100C0
1426*4882a593Smuzhiyun #define RV1106_DRV_GPIO3_OFFSET 0x20100
1427*4882a593Smuzhiyun #define RV1106_DRV_GPIO4_OFFSET 0x30020
1428*4882a593Smuzhiyun
rv1106_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1429*4882a593Smuzhiyun static int rv1106_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1430*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1431*4882a593Smuzhiyun int *reg, u8 *bit)
1432*4882a593Smuzhiyun {
1433*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1434*4882a593Smuzhiyun
1435*4882a593Smuzhiyun /* GPIO0_IOC is located in PMU */
1436*4882a593Smuzhiyun switch (bank->bank_num) {
1437*4882a593Smuzhiyun case 0:
1438*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1439*4882a593Smuzhiyun *reg = RV1106_DRV_GPIO0_OFFSET;
1440*4882a593Smuzhiyun break;
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun case 1:
1443*4882a593Smuzhiyun *regmap = info->regmap_base;
1444*4882a593Smuzhiyun *reg = RV1106_DRV_GPIO1_OFFSET;
1445*4882a593Smuzhiyun break;
1446*4882a593Smuzhiyun
1447*4882a593Smuzhiyun case 2:
1448*4882a593Smuzhiyun *regmap = info->regmap_base;
1449*4882a593Smuzhiyun *reg = RV1106_DRV_GPIO2_OFFSET;
1450*4882a593Smuzhiyun break;
1451*4882a593Smuzhiyun
1452*4882a593Smuzhiyun case 3:
1453*4882a593Smuzhiyun *regmap = info->regmap_base;
1454*4882a593Smuzhiyun *reg = RV1106_DRV_GPIO3_OFFSET;
1455*4882a593Smuzhiyun break;
1456*4882a593Smuzhiyun
1457*4882a593Smuzhiyun case 4:
1458*4882a593Smuzhiyun *regmap = info->regmap_base;
1459*4882a593Smuzhiyun *reg = RV1106_DRV_GPIO4_OFFSET;
1460*4882a593Smuzhiyun break;
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun default:
1463*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1464*4882a593Smuzhiyun break;
1465*4882a593Smuzhiyun }
1466*4882a593Smuzhiyun
1467*4882a593Smuzhiyun *reg += ((pin_num / RV1106_DRV_PINS_PER_REG) * 4);
1468*4882a593Smuzhiyun *bit = pin_num % RV1106_DRV_PINS_PER_REG;
1469*4882a593Smuzhiyun *bit *= RV1106_DRV_BITS_PER_PIN;
1470*4882a593Smuzhiyun
1471*4882a593Smuzhiyun return 0;
1472*4882a593Smuzhiyun }
1473*4882a593Smuzhiyun
1474*4882a593Smuzhiyun #define RV1106_PULL_BITS_PER_PIN 2
1475*4882a593Smuzhiyun #define RV1106_PULL_PINS_PER_REG 8
1476*4882a593Smuzhiyun #define RV1106_PULL_GPIO0_OFFSET 0x38
1477*4882a593Smuzhiyun #define RV1106_PULL_GPIO1_OFFSET 0x1C0
1478*4882a593Smuzhiyun #define RV1106_PULL_GPIO2_OFFSET 0x101D0
1479*4882a593Smuzhiyun #define RV1106_PULL_GPIO3_OFFSET 0x201E0
1480*4882a593Smuzhiyun #define RV1106_PULL_GPIO4_OFFSET 0x30070
1481*4882a593Smuzhiyun
rv1106_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1482*4882a593Smuzhiyun static int rv1106_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1483*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1484*4882a593Smuzhiyun int *reg, u8 *bit)
1485*4882a593Smuzhiyun {
1486*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1487*4882a593Smuzhiyun
1488*4882a593Smuzhiyun /* GPIO0_IOC is located in PMU */
1489*4882a593Smuzhiyun switch (bank->bank_num) {
1490*4882a593Smuzhiyun case 0:
1491*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1492*4882a593Smuzhiyun *reg = RV1106_PULL_GPIO0_OFFSET;
1493*4882a593Smuzhiyun break;
1494*4882a593Smuzhiyun
1495*4882a593Smuzhiyun case 1:
1496*4882a593Smuzhiyun *regmap = info->regmap_base;
1497*4882a593Smuzhiyun *reg = RV1106_PULL_GPIO1_OFFSET;
1498*4882a593Smuzhiyun break;
1499*4882a593Smuzhiyun
1500*4882a593Smuzhiyun case 2:
1501*4882a593Smuzhiyun *regmap = info->regmap_base;
1502*4882a593Smuzhiyun *reg = RV1106_PULL_GPIO2_OFFSET;
1503*4882a593Smuzhiyun break;
1504*4882a593Smuzhiyun
1505*4882a593Smuzhiyun case 3:
1506*4882a593Smuzhiyun *regmap = info->regmap_base;
1507*4882a593Smuzhiyun *reg = RV1106_PULL_GPIO3_OFFSET;
1508*4882a593Smuzhiyun break;
1509*4882a593Smuzhiyun
1510*4882a593Smuzhiyun case 4:
1511*4882a593Smuzhiyun *regmap = info->regmap_base;
1512*4882a593Smuzhiyun *reg = RV1106_PULL_GPIO4_OFFSET;
1513*4882a593Smuzhiyun break;
1514*4882a593Smuzhiyun
1515*4882a593Smuzhiyun default:
1516*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1517*4882a593Smuzhiyun break;
1518*4882a593Smuzhiyun }
1519*4882a593Smuzhiyun
1520*4882a593Smuzhiyun *reg += ((pin_num / RV1106_PULL_PINS_PER_REG) * 4);
1521*4882a593Smuzhiyun *bit = pin_num % RV1106_PULL_PINS_PER_REG;
1522*4882a593Smuzhiyun *bit *= RV1106_PULL_BITS_PER_PIN;
1523*4882a593Smuzhiyun
1524*4882a593Smuzhiyun return 0;
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun
1527*4882a593Smuzhiyun #define RV1106_SMT_BITS_PER_PIN 1
1528*4882a593Smuzhiyun #define RV1106_SMT_PINS_PER_REG 8
1529*4882a593Smuzhiyun #define RV1106_SMT_GPIO0_OFFSET 0x40
1530*4882a593Smuzhiyun #define RV1106_SMT_GPIO1_OFFSET 0x280
1531*4882a593Smuzhiyun #define RV1106_SMT_GPIO2_OFFSET 0x10290
1532*4882a593Smuzhiyun #define RV1106_SMT_GPIO3_OFFSET 0x202A0
1533*4882a593Smuzhiyun #define RV1106_SMT_GPIO4_OFFSET 0x300A0
1534*4882a593Smuzhiyun
rv1106_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1535*4882a593Smuzhiyun static int rv1106_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1536*4882a593Smuzhiyun int pin_num,
1537*4882a593Smuzhiyun struct regmap **regmap,
1538*4882a593Smuzhiyun int *reg, u8 *bit)
1539*4882a593Smuzhiyun {
1540*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1541*4882a593Smuzhiyun
1542*4882a593Smuzhiyun /* GPIO0_IOC is located in PMU */
1543*4882a593Smuzhiyun switch (bank->bank_num) {
1544*4882a593Smuzhiyun case 0:
1545*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1546*4882a593Smuzhiyun *reg = RV1106_SMT_GPIO0_OFFSET;
1547*4882a593Smuzhiyun break;
1548*4882a593Smuzhiyun
1549*4882a593Smuzhiyun case 1:
1550*4882a593Smuzhiyun *regmap = info->regmap_base;
1551*4882a593Smuzhiyun *reg = RV1106_SMT_GPIO1_OFFSET;
1552*4882a593Smuzhiyun break;
1553*4882a593Smuzhiyun
1554*4882a593Smuzhiyun case 2:
1555*4882a593Smuzhiyun *regmap = info->regmap_base;
1556*4882a593Smuzhiyun *reg = RV1106_SMT_GPIO2_OFFSET;
1557*4882a593Smuzhiyun break;
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun case 3:
1560*4882a593Smuzhiyun *regmap = info->regmap_base;
1561*4882a593Smuzhiyun *reg = RV1106_SMT_GPIO3_OFFSET;
1562*4882a593Smuzhiyun break;
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun case 4:
1565*4882a593Smuzhiyun *regmap = info->regmap_base;
1566*4882a593Smuzhiyun *reg = RV1106_SMT_GPIO4_OFFSET;
1567*4882a593Smuzhiyun break;
1568*4882a593Smuzhiyun
1569*4882a593Smuzhiyun default:
1570*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
1571*4882a593Smuzhiyun break;
1572*4882a593Smuzhiyun }
1573*4882a593Smuzhiyun
1574*4882a593Smuzhiyun *reg += ((pin_num / RV1106_SMT_PINS_PER_REG) * 4);
1575*4882a593Smuzhiyun *bit = pin_num % RV1106_SMT_PINS_PER_REG;
1576*4882a593Smuzhiyun *bit *= RV1106_SMT_BITS_PER_PIN;
1577*4882a593Smuzhiyun
1578*4882a593Smuzhiyun return 0;
1579*4882a593Smuzhiyun }
1580*4882a593Smuzhiyun
1581*4882a593Smuzhiyun #define RV1108_PULL_PMU_OFFSET 0x10
1582*4882a593Smuzhiyun #define RV1108_PULL_OFFSET 0x110
1583*4882a593Smuzhiyun #define RV1108_PULL_PINS_PER_REG 8
1584*4882a593Smuzhiyun #define RV1108_PULL_BITS_PER_PIN 2
1585*4882a593Smuzhiyun #define RV1108_PULL_BANK_STRIDE 16
1586*4882a593Smuzhiyun
rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1587*4882a593Smuzhiyun static int rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1588*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1589*4882a593Smuzhiyun int *reg, u8 *bit)
1590*4882a593Smuzhiyun {
1591*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1592*4882a593Smuzhiyun
1593*4882a593Smuzhiyun /* The first 24 pins of the first bank are located in PMU */
1594*4882a593Smuzhiyun if (bank->bank_num == 0) {
1595*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1596*4882a593Smuzhiyun *reg = RV1108_PULL_PMU_OFFSET;
1597*4882a593Smuzhiyun } else {
1598*4882a593Smuzhiyun *reg = RV1108_PULL_OFFSET;
1599*4882a593Smuzhiyun *regmap = info->regmap_base;
1600*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
1601*4882a593Smuzhiyun *reg -= 0x10;
1602*4882a593Smuzhiyun *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
1603*4882a593Smuzhiyun }
1604*4882a593Smuzhiyun
1605*4882a593Smuzhiyun *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
1606*4882a593Smuzhiyun *bit = (pin_num % RV1108_PULL_PINS_PER_REG);
1607*4882a593Smuzhiyun *bit *= RV1108_PULL_BITS_PER_PIN;
1608*4882a593Smuzhiyun
1609*4882a593Smuzhiyun return 0;
1610*4882a593Smuzhiyun }
1611*4882a593Smuzhiyun
1612*4882a593Smuzhiyun #define RV1108_DRV_PMU_OFFSET 0x20
1613*4882a593Smuzhiyun #define RV1108_DRV_GRF_OFFSET 0x210
1614*4882a593Smuzhiyun #define RV1108_DRV_BITS_PER_PIN 2
1615*4882a593Smuzhiyun #define RV1108_DRV_PINS_PER_REG 8
1616*4882a593Smuzhiyun #define RV1108_DRV_BANK_STRIDE 16
1617*4882a593Smuzhiyun
rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1618*4882a593Smuzhiyun static int rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1619*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1620*4882a593Smuzhiyun int *reg, u8 *bit)
1621*4882a593Smuzhiyun {
1622*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun /* The first 24 pins of the first bank are located in PMU */
1625*4882a593Smuzhiyun if (bank->bank_num == 0) {
1626*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1627*4882a593Smuzhiyun *reg = RV1108_DRV_PMU_OFFSET;
1628*4882a593Smuzhiyun } else {
1629*4882a593Smuzhiyun *regmap = info->regmap_base;
1630*4882a593Smuzhiyun *reg = RV1108_DRV_GRF_OFFSET;
1631*4882a593Smuzhiyun
1632*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
1633*4882a593Smuzhiyun *reg -= 0x10;
1634*4882a593Smuzhiyun *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
1635*4882a593Smuzhiyun }
1636*4882a593Smuzhiyun
1637*4882a593Smuzhiyun *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
1638*4882a593Smuzhiyun *bit = pin_num % RV1108_DRV_PINS_PER_REG;
1639*4882a593Smuzhiyun *bit *= RV1108_DRV_BITS_PER_PIN;
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun return 0;
1642*4882a593Smuzhiyun }
1643*4882a593Smuzhiyun
1644*4882a593Smuzhiyun #define RV1108_SCHMITT_PMU_OFFSET 0x30
1645*4882a593Smuzhiyun #define RV1108_SCHMITT_GRF_OFFSET 0x388
1646*4882a593Smuzhiyun #define RV1108_SCHMITT_BANK_STRIDE 8
1647*4882a593Smuzhiyun #define RV1108_SCHMITT_PINS_PER_GRF_REG 16
1648*4882a593Smuzhiyun #define RV1108_SCHMITT_PINS_PER_PMU_REG 8
1649*4882a593Smuzhiyun
rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1650*4882a593Smuzhiyun static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1651*4882a593Smuzhiyun int pin_num,
1652*4882a593Smuzhiyun struct regmap **regmap,
1653*4882a593Smuzhiyun int *reg, u8 *bit)
1654*4882a593Smuzhiyun {
1655*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1656*4882a593Smuzhiyun int pins_per_reg;
1657*4882a593Smuzhiyun
1658*4882a593Smuzhiyun if (bank->bank_num == 0) {
1659*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1660*4882a593Smuzhiyun *reg = RV1108_SCHMITT_PMU_OFFSET;
1661*4882a593Smuzhiyun pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
1662*4882a593Smuzhiyun } else {
1663*4882a593Smuzhiyun *regmap = info->regmap_base;
1664*4882a593Smuzhiyun *reg = RV1108_SCHMITT_GRF_OFFSET;
1665*4882a593Smuzhiyun pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
1666*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE;
1667*4882a593Smuzhiyun }
1668*4882a593Smuzhiyun *reg += ((pin_num / pins_per_reg) * 4);
1669*4882a593Smuzhiyun *bit = pin_num % pins_per_reg;
1670*4882a593Smuzhiyun
1671*4882a593Smuzhiyun return 0;
1672*4882a593Smuzhiyun }
1673*4882a593Smuzhiyun
1674*4882a593Smuzhiyun #define RV1126_PULL_PMU_OFFSET 0x40
1675*4882a593Smuzhiyun #define RV1126_PULL_GRF_GPIO1A0_OFFSET 0x10108
1676*4882a593Smuzhiyun #define RV1126_PULL_PINS_PER_REG 8
1677*4882a593Smuzhiyun #define RV1126_PULL_BITS_PER_PIN 2
1678*4882a593Smuzhiyun #define RV1126_PULL_BANK_STRIDE 16
1679*4882a593Smuzhiyun #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
1680*4882a593Smuzhiyun
rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1681*4882a593Smuzhiyun static int rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1682*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1683*4882a593Smuzhiyun int *reg, u8 *bit)
1684*4882a593Smuzhiyun {
1685*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1686*4882a593Smuzhiyun
1687*4882a593Smuzhiyun /* The first 24 pins of the first bank are located in PMU */
1688*4882a593Smuzhiyun if (bank->bank_num == 0) {
1689*4882a593Smuzhiyun if (RV1126_GPIO_C4_D7(pin_num)) {
1690*4882a593Smuzhiyun *regmap = info->regmap_base;
1691*4882a593Smuzhiyun *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1692*4882a593Smuzhiyun *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
1693*4882a593Smuzhiyun *bit = pin_num % RV1126_PULL_PINS_PER_REG;
1694*4882a593Smuzhiyun *bit *= RV1126_PULL_BITS_PER_PIN;
1695*4882a593Smuzhiyun return 0;
1696*4882a593Smuzhiyun }
1697*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1698*4882a593Smuzhiyun *reg = RV1126_PULL_PMU_OFFSET;
1699*4882a593Smuzhiyun } else {
1700*4882a593Smuzhiyun *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
1701*4882a593Smuzhiyun *regmap = info->regmap_base;
1702*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
1703*4882a593Smuzhiyun }
1704*4882a593Smuzhiyun
1705*4882a593Smuzhiyun *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
1706*4882a593Smuzhiyun *bit = (pin_num % RV1126_PULL_PINS_PER_REG);
1707*4882a593Smuzhiyun *bit *= RV1126_PULL_BITS_PER_PIN;
1708*4882a593Smuzhiyun
1709*4882a593Smuzhiyun return 0;
1710*4882a593Smuzhiyun }
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun #define RV1126_DRV_PMU_OFFSET 0x20
1713*4882a593Smuzhiyun #define RV1126_DRV_GRF_GPIO1A0_OFFSET 0x10090
1714*4882a593Smuzhiyun #define RV1126_DRV_BITS_PER_PIN 4
1715*4882a593Smuzhiyun #define RV1126_DRV_PINS_PER_REG 4
1716*4882a593Smuzhiyun #define RV1126_DRV_BANK_STRIDE 32
1717*4882a593Smuzhiyun
rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1718*4882a593Smuzhiyun static int rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1719*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1720*4882a593Smuzhiyun int *reg, u8 *bit)
1721*4882a593Smuzhiyun {
1722*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1723*4882a593Smuzhiyun
1724*4882a593Smuzhiyun /* The first 24 pins of the first bank are located in PMU */
1725*4882a593Smuzhiyun if (bank->bank_num == 0) {
1726*4882a593Smuzhiyun if (RV1126_GPIO_C4_D7(pin_num)) {
1727*4882a593Smuzhiyun *regmap = info->regmap_base;
1728*4882a593Smuzhiyun *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1729*4882a593Smuzhiyun *reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
1730*4882a593Smuzhiyun *reg -= 0x4;
1731*4882a593Smuzhiyun *bit = pin_num % RV1126_DRV_PINS_PER_REG;
1732*4882a593Smuzhiyun *bit *= RV1126_DRV_BITS_PER_PIN;
1733*4882a593Smuzhiyun return 0;
1734*4882a593Smuzhiyun }
1735*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1736*4882a593Smuzhiyun *reg = RV1126_DRV_PMU_OFFSET;
1737*4882a593Smuzhiyun } else {
1738*4882a593Smuzhiyun *regmap = info->regmap_base;
1739*4882a593Smuzhiyun *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
1740*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
1741*4882a593Smuzhiyun }
1742*4882a593Smuzhiyun
1743*4882a593Smuzhiyun *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
1744*4882a593Smuzhiyun *bit = pin_num % RV1126_DRV_PINS_PER_REG;
1745*4882a593Smuzhiyun *bit *= RV1126_DRV_BITS_PER_PIN;
1746*4882a593Smuzhiyun
1747*4882a593Smuzhiyun return 0;
1748*4882a593Smuzhiyun }
1749*4882a593Smuzhiyun
1750*4882a593Smuzhiyun #define RV1126_SCHMITT_PMU_OFFSET 0x60
1751*4882a593Smuzhiyun #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET 0x10188
1752*4882a593Smuzhiyun #define RV1126_SCHMITT_BANK_STRIDE 16
1753*4882a593Smuzhiyun #define RV1126_SCHMITT_PINS_PER_GRF_REG 8
1754*4882a593Smuzhiyun #define RV1126_SCHMITT_PINS_PER_PMU_REG 8
1755*4882a593Smuzhiyun
rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1756*4882a593Smuzhiyun static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1757*4882a593Smuzhiyun int pin_num,
1758*4882a593Smuzhiyun struct regmap **regmap,
1759*4882a593Smuzhiyun int *reg, u8 *bit)
1760*4882a593Smuzhiyun {
1761*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1762*4882a593Smuzhiyun int pins_per_reg;
1763*4882a593Smuzhiyun
1764*4882a593Smuzhiyun if (bank->bank_num == 0) {
1765*4882a593Smuzhiyun if (RV1126_GPIO_C4_D7(pin_num)) {
1766*4882a593Smuzhiyun *regmap = info->regmap_base;
1767*4882a593Smuzhiyun *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
1768*4882a593Smuzhiyun *reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
1769*4882a593Smuzhiyun *bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
1770*4882a593Smuzhiyun return 0;
1771*4882a593Smuzhiyun }
1772*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1773*4882a593Smuzhiyun *reg = RV1126_SCHMITT_PMU_OFFSET;
1774*4882a593Smuzhiyun pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
1775*4882a593Smuzhiyun } else {
1776*4882a593Smuzhiyun *regmap = info->regmap_base;
1777*4882a593Smuzhiyun *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
1778*4882a593Smuzhiyun pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
1779*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
1780*4882a593Smuzhiyun }
1781*4882a593Smuzhiyun *reg += ((pin_num / pins_per_reg) * 4);
1782*4882a593Smuzhiyun *bit = pin_num % pins_per_reg;
1783*4882a593Smuzhiyun
1784*4882a593Smuzhiyun return 0;
1785*4882a593Smuzhiyun }
1786*4882a593Smuzhiyun
1787*4882a593Smuzhiyun #define RK3308_SCHMITT_PINS_PER_REG 8
1788*4882a593Smuzhiyun #define RK3308_SCHMITT_BANK_STRIDE 16
1789*4882a593Smuzhiyun #define RK3308_SCHMITT_GRF_OFFSET 0x1a0
1790*4882a593Smuzhiyun
rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1791*4882a593Smuzhiyun static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1792*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1793*4882a593Smuzhiyun int *reg, u8 *bit)
1794*4882a593Smuzhiyun {
1795*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1796*4882a593Smuzhiyun
1797*4882a593Smuzhiyun *regmap = info->regmap_base;
1798*4882a593Smuzhiyun *reg = RK3308_SCHMITT_GRF_OFFSET;
1799*4882a593Smuzhiyun
1800*4882a593Smuzhiyun *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
1801*4882a593Smuzhiyun *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
1802*4882a593Smuzhiyun *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
1803*4882a593Smuzhiyun
1804*4882a593Smuzhiyun return 0;
1805*4882a593Smuzhiyun }
1806*4882a593Smuzhiyun
1807*4882a593Smuzhiyun #define RK1808_PULL_PMU_OFFSET 0x10
1808*4882a593Smuzhiyun #define RK1808_PULL_GRF_OFFSET 0x80
1809*4882a593Smuzhiyun #define RK1808_PULL_PINS_PER_REG 8
1810*4882a593Smuzhiyun #define RK1808_PULL_BITS_PER_PIN 2
1811*4882a593Smuzhiyun #define RK1808_PULL_BANK_STRIDE 16
1812*4882a593Smuzhiyun
rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1813*4882a593Smuzhiyun static int rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1814*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1815*4882a593Smuzhiyun int *reg, u8 *bit)
1816*4882a593Smuzhiyun {
1817*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1818*4882a593Smuzhiyun
1819*4882a593Smuzhiyun if (bank->bank_num == 0) {
1820*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1821*4882a593Smuzhiyun *reg = RK1808_PULL_PMU_OFFSET;
1822*4882a593Smuzhiyun } else {
1823*4882a593Smuzhiyun *reg = RK1808_PULL_GRF_OFFSET;
1824*4882a593Smuzhiyun *regmap = info->regmap_base;
1825*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK1808_PULL_BANK_STRIDE;
1826*4882a593Smuzhiyun }
1827*4882a593Smuzhiyun
1828*4882a593Smuzhiyun *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * 4);
1829*4882a593Smuzhiyun *bit = (pin_num % RK1808_PULL_PINS_PER_REG);
1830*4882a593Smuzhiyun *bit *= RK1808_PULL_BITS_PER_PIN;
1831*4882a593Smuzhiyun
1832*4882a593Smuzhiyun return 0;
1833*4882a593Smuzhiyun }
1834*4882a593Smuzhiyun
1835*4882a593Smuzhiyun #define RK1808_DRV_PMU_OFFSET 0x20
1836*4882a593Smuzhiyun #define RK1808_DRV_GRF_OFFSET 0x140
1837*4882a593Smuzhiyun #define RK1808_DRV_BITS_PER_PIN 2
1838*4882a593Smuzhiyun #define RK1808_DRV_PINS_PER_REG 8
1839*4882a593Smuzhiyun #define RK1808_DRV_BANK_STRIDE 16
1840*4882a593Smuzhiyun
rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1841*4882a593Smuzhiyun static int rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
1842*4882a593Smuzhiyun int pin_num,
1843*4882a593Smuzhiyun struct regmap **regmap,
1844*4882a593Smuzhiyun int *reg, u8 *bit)
1845*4882a593Smuzhiyun {
1846*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1847*4882a593Smuzhiyun
1848*4882a593Smuzhiyun if (bank->bank_num == 0) {
1849*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1850*4882a593Smuzhiyun *reg = RK1808_DRV_PMU_OFFSET;
1851*4882a593Smuzhiyun } else {
1852*4882a593Smuzhiyun *regmap = info->regmap_base;
1853*4882a593Smuzhiyun *reg = RK1808_DRV_GRF_OFFSET;
1854*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK1808_DRV_BANK_STRIDE;
1855*4882a593Smuzhiyun }
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * 4);
1858*4882a593Smuzhiyun *bit = pin_num % RK1808_DRV_PINS_PER_REG;
1859*4882a593Smuzhiyun *bit *= RK1808_DRV_BITS_PER_PIN;
1860*4882a593Smuzhiyun
1861*4882a593Smuzhiyun return 0;
1862*4882a593Smuzhiyun }
1863*4882a593Smuzhiyun
1864*4882a593Smuzhiyun #define RK1808_SR_PMU_OFFSET 0x0030
1865*4882a593Smuzhiyun #define RK1808_SR_GRF_OFFSET 0x00c0
1866*4882a593Smuzhiyun #define RK1808_SR_BANK_STRIDE 16
1867*4882a593Smuzhiyun #define RK1808_SR_PINS_PER_REG 8
1868*4882a593Smuzhiyun
rk1808_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1869*4882a593Smuzhiyun static int rk1808_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
1870*4882a593Smuzhiyun int pin_num,
1871*4882a593Smuzhiyun struct regmap **regmap,
1872*4882a593Smuzhiyun int *reg, u8 *bit)
1873*4882a593Smuzhiyun {
1874*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1875*4882a593Smuzhiyun
1876*4882a593Smuzhiyun if (bank->bank_num == 0) {
1877*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1878*4882a593Smuzhiyun *reg = RK1808_SR_PMU_OFFSET;
1879*4882a593Smuzhiyun } else {
1880*4882a593Smuzhiyun *regmap = info->regmap_base;
1881*4882a593Smuzhiyun *reg = RK1808_SR_GRF_OFFSET;
1882*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK1808_SR_BANK_STRIDE;
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun *reg += ((pin_num / RK1808_SR_PINS_PER_REG) * 4);
1885*4882a593Smuzhiyun *bit = pin_num % RK1808_SR_PINS_PER_REG;
1886*4882a593Smuzhiyun
1887*4882a593Smuzhiyun return 0;
1888*4882a593Smuzhiyun }
1889*4882a593Smuzhiyun
1890*4882a593Smuzhiyun #define RK1808_SCHMITT_PMU_OFFSET 0x0040
1891*4882a593Smuzhiyun #define RK1808_SCHMITT_GRF_OFFSET 0x0100
1892*4882a593Smuzhiyun #define RK1808_SCHMITT_BANK_STRIDE 16
1893*4882a593Smuzhiyun #define RK1808_SCHMITT_PINS_PER_REG 8
1894*4882a593Smuzhiyun
rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1895*4882a593Smuzhiyun static int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
1896*4882a593Smuzhiyun int pin_num,
1897*4882a593Smuzhiyun struct regmap **regmap,
1898*4882a593Smuzhiyun int *reg, u8 *bit)
1899*4882a593Smuzhiyun {
1900*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1901*4882a593Smuzhiyun
1902*4882a593Smuzhiyun if (bank->bank_num == 0) {
1903*4882a593Smuzhiyun *regmap = info->regmap_pmu;
1904*4882a593Smuzhiyun *reg = RK1808_SCHMITT_PMU_OFFSET;
1905*4882a593Smuzhiyun } else {
1906*4882a593Smuzhiyun *regmap = info->regmap_base;
1907*4882a593Smuzhiyun *reg = RK1808_SCHMITT_GRF_OFFSET;
1908*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK1808_SCHMITT_BANK_STRIDE;
1909*4882a593Smuzhiyun }
1910*4882a593Smuzhiyun *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * 4);
1911*4882a593Smuzhiyun *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG;
1912*4882a593Smuzhiyun
1913*4882a593Smuzhiyun return 0;
1914*4882a593Smuzhiyun }
1915*4882a593Smuzhiyun
1916*4882a593Smuzhiyun #define RK2928_PULL_OFFSET 0x118
1917*4882a593Smuzhiyun #define RK2928_PULL_PINS_PER_REG 16
1918*4882a593Smuzhiyun #define RK2928_PULL_BANK_STRIDE 8
1919*4882a593Smuzhiyun
rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1920*4882a593Smuzhiyun static int rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1921*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1922*4882a593Smuzhiyun int *reg, u8 *bit)
1923*4882a593Smuzhiyun {
1924*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1925*4882a593Smuzhiyun
1926*4882a593Smuzhiyun *regmap = info->regmap_base;
1927*4882a593Smuzhiyun *reg = RK2928_PULL_OFFSET;
1928*4882a593Smuzhiyun *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
1929*4882a593Smuzhiyun *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
1930*4882a593Smuzhiyun
1931*4882a593Smuzhiyun *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1932*4882a593Smuzhiyun
1933*4882a593Smuzhiyun return 0;
1934*4882a593Smuzhiyun };
1935*4882a593Smuzhiyun
1936*4882a593Smuzhiyun #define RK3128_PULL_OFFSET 0x118
1937*4882a593Smuzhiyun
rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1938*4882a593Smuzhiyun static int rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1939*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1940*4882a593Smuzhiyun int *reg, u8 *bit)
1941*4882a593Smuzhiyun {
1942*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1943*4882a593Smuzhiyun
1944*4882a593Smuzhiyun *regmap = info->regmap_base;
1945*4882a593Smuzhiyun *reg = RK3128_PULL_OFFSET;
1946*4882a593Smuzhiyun *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
1947*4882a593Smuzhiyun *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
1948*4882a593Smuzhiyun
1949*4882a593Smuzhiyun *bit = pin_num % RK2928_PULL_PINS_PER_REG;
1950*4882a593Smuzhiyun
1951*4882a593Smuzhiyun return 0;
1952*4882a593Smuzhiyun }
1953*4882a593Smuzhiyun
1954*4882a593Smuzhiyun #define RK3188_PULL_OFFSET 0x164
1955*4882a593Smuzhiyun #define RK3188_PULL_BITS_PER_PIN 2
1956*4882a593Smuzhiyun #define RK3188_PULL_PINS_PER_REG 8
1957*4882a593Smuzhiyun #define RK3188_PULL_BANK_STRIDE 16
1958*4882a593Smuzhiyun #define RK3188_PULL_PMU_OFFSET 0x64
1959*4882a593Smuzhiyun
rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)1960*4882a593Smuzhiyun static int rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1961*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1962*4882a593Smuzhiyun int *reg, u8 *bit)
1963*4882a593Smuzhiyun {
1964*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
1965*4882a593Smuzhiyun
1966*4882a593Smuzhiyun /* The first 12 pins of the first bank are located elsewhere */
1967*4882a593Smuzhiyun if (bank->bank_num == 0 && pin_num < 12) {
1968*4882a593Smuzhiyun *regmap = info->regmap_pmu ? info->regmap_pmu
1969*4882a593Smuzhiyun : bank->regmap_pull;
1970*4882a593Smuzhiyun *reg = info->regmap_pmu ? RK3188_PULL_PMU_OFFSET : 0;
1971*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
1972*4882a593Smuzhiyun *bit = pin_num % RK3188_PULL_PINS_PER_REG;
1973*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
1974*4882a593Smuzhiyun } else {
1975*4882a593Smuzhiyun *regmap = info->regmap_pull ? info->regmap_pull
1976*4882a593Smuzhiyun : info->regmap_base;
1977*4882a593Smuzhiyun *reg = info->regmap_pull ? 0 : RK3188_PULL_OFFSET;
1978*4882a593Smuzhiyun
1979*4882a593Smuzhiyun /* correct the offset, as it is the 2nd pull register */
1980*4882a593Smuzhiyun *reg -= 4;
1981*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
1982*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
1983*4882a593Smuzhiyun
1984*4882a593Smuzhiyun /*
1985*4882a593Smuzhiyun * The bits in these registers have an inverse ordering
1986*4882a593Smuzhiyun * with the lowest pin being in bits 15:14 and the highest
1987*4882a593Smuzhiyun * pin in bits 1:0
1988*4882a593Smuzhiyun */
1989*4882a593Smuzhiyun *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
1990*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
1991*4882a593Smuzhiyun }
1992*4882a593Smuzhiyun
1993*4882a593Smuzhiyun return 0;
1994*4882a593Smuzhiyun }
1995*4882a593Smuzhiyun
1996*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)1997*4882a593Smuzhiyun static int rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
1998*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
1999*4882a593Smuzhiyun int *reg, u8 *bit)
2000*4882a593Smuzhiyun {
2001*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2002*4882a593Smuzhiyun
2003*4882a593Smuzhiyun /* The first 24 pins of the first bank are located in PMU */
2004*4882a593Smuzhiyun if (bank->bank_num == 0) {
2005*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2006*4882a593Smuzhiyun *reg = RK3188_PULL_PMU_OFFSET;
2007*4882a593Smuzhiyun
2008*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2009*4882a593Smuzhiyun *bit = pin_num % RK3188_PULL_PINS_PER_REG;
2010*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2011*4882a593Smuzhiyun } else {
2012*4882a593Smuzhiyun *regmap = info->regmap_base;
2013*4882a593Smuzhiyun *reg = RK3288_PULL_OFFSET;
2014*4882a593Smuzhiyun
2015*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
2016*4882a593Smuzhiyun *reg -= 0x10;
2017*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2018*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2019*4882a593Smuzhiyun
2020*4882a593Smuzhiyun *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2021*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2022*4882a593Smuzhiyun }
2023*4882a593Smuzhiyun
2024*4882a593Smuzhiyun return 0;
2025*4882a593Smuzhiyun }
2026*4882a593Smuzhiyun
2027*4882a593Smuzhiyun #define RK3288_DRV_PMU_OFFSET 0x70
2028*4882a593Smuzhiyun #define RK3288_DRV_GRF_OFFSET 0x1c0
2029*4882a593Smuzhiyun #define RK3288_DRV_BITS_PER_PIN 2
2030*4882a593Smuzhiyun #define RK3288_DRV_PINS_PER_REG 8
2031*4882a593Smuzhiyun #define RK3288_DRV_BANK_STRIDE 16
2032*4882a593Smuzhiyun
rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2033*4882a593Smuzhiyun static int rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2034*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2035*4882a593Smuzhiyun int *reg, u8 *bit)
2036*4882a593Smuzhiyun {
2037*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2038*4882a593Smuzhiyun
2039*4882a593Smuzhiyun /* The first 24 pins of the first bank are located in PMU */
2040*4882a593Smuzhiyun if (bank->bank_num == 0) {
2041*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2042*4882a593Smuzhiyun *reg = RK3288_DRV_PMU_OFFSET;
2043*4882a593Smuzhiyun
2044*4882a593Smuzhiyun *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2045*4882a593Smuzhiyun *bit = pin_num % RK3288_DRV_PINS_PER_REG;
2046*4882a593Smuzhiyun *bit *= RK3288_DRV_BITS_PER_PIN;
2047*4882a593Smuzhiyun } else {
2048*4882a593Smuzhiyun *regmap = info->regmap_base;
2049*4882a593Smuzhiyun *reg = RK3288_DRV_GRF_OFFSET;
2050*4882a593Smuzhiyun
2051*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
2052*4882a593Smuzhiyun *reg -= 0x10;
2053*4882a593Smuzhiyun *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2054*4882a593Smuzhiyun *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2055*4882a593Smuzhiyun
2056*4882a593Smuzhiyun *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2057*4882a593Smuzhiyun *bit *= RK3288_DRV_BITS_PER_PIN;
2058*4882a593Smuzhiyun }
2059*4882a593Smuzhiyun
2060*4882a593Smuzhiyun return 0;
2061*4882a593Smuzhiyun }
2062*4882a593Smuzhiyun
2063*4882a593Smuzhiyun #define RK3228_PULL_OFFSET 0x100
2064*4882a593Smuzhiyun
rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2065*4882a593Smuzhiyun static int rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2066*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2067*4882a593Smuzhiyun int *reg, u8 *bit)
2068*4882a593Smuzhiyun {
2069*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2070*4882a593Smuzhiyun
2071*4882a593Smuzhiyun *regmap = info->regmap_base;
2072*4882a593Smuzhiyun *reg = RK3228_PULL_OFFSET;
2073*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2074*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2075*4882a593Smuzhiyun
2076*4882a593Smuzhiyun *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2077*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2078*4882a593Smuzhiyun
2079*4882a593Smuzhiyun return 0;
2080*4882a593Smuzhiyun }
2081*4882a593Smuzhiyun
2082*4882a593Smuzhiyun #define RK3228_DRV_GRF_OFFSET 0x200
2083*4882a593Smuzhiyun
rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2084*4882a593Smuzhiyun static int rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2085*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2086*4882a593Smuzhiyun int *reg, u8 *bit)
2087*4882a593Smuzhiyun {
2088*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2089*4882a593Smuzhiyun
2090*4882a593Smuzhiyun *regmap = info->regmap_base;
2091*4882a593Smuzhiyun *reg = RK3228_DRV_GRF_OFFSET;
2092*4882a593Smuzhiyun *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2093*4882a593Smuzhiyun *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2094*4882a593Smuzhiyun
2095*4882a593Smuzhiyun *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2096*4882a593Smuzhiyun *bit *= RK3288_DRV_BITS_PER_PIN;
2097*4882a593Smuzhiyun
2098*4882a593Smuzhiyun return 0;
2099*4882a593Smuzhiyun }
2100*4882a593Smuzhiyun
2101*4882a593Smuzhiyun #define RK3308_PULL_OFFSET 0xa0
2102*4882a593Smuzhiyun
rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2103*4882a593Smuzhiyun static int rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2104*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2105*4882a593Smuzhiyun int *reg, u8 *bit)
2106*4882a593Smuzhiyun {
2107*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2108*4882a593Smuzhiyun
2109*4882a593Smuzhiyun *regmap = info->regmap_base;
2110*4882a593Smuzhiyun *reg = RK3308_PULL_OFFSET;
2111*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2112*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2113*4882a593Smuzhiyun
2114*4882a593Smuzhiyun *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2115*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2116*4882a593Smuzhiyun
2117*4882a593Smuzhiyun return 0;
2118*4882a593Smuzhiyun }
2119*4882a593Smuzhiyun
2120*4882a593Smuzhiyun #define RK3308_DRV_GRF_OFFSET 0x100
2121*4882a593Smuzhiyun
rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2122*4882a593Smuzhiyun static int rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2123*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2124*4882a593Smuzhiyun int *reg, u8 *bit)
2125*4882a593Smuzhiyun {
2126*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2127*4882a593Smuzhiyun
2128*4882a593Smuzhiyun *regmap = info->regmap_base;
2129*4882a593Smuzhiyun *reg = RK3308_DRV_GRF_OFFSET;
2130*4882a593Smuzhiyun *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2131*4882a593Smuzhiyun *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2132*4882a593Smuzhiyun
2133*4882a593Smuzhiyun *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2134*4882a593Smuzhiyun *bit *= RK3288_DRV_BITS_PER_PIN;
2135*4882a593Smuzhiyun
2136*4882a593Smuzhiyun return 0;
2137*4882a593Smuzhiyun }
2138*4882a593Smuzhiyun
2139*4882a593Smuzhiyun #define RK3308_SLEW_RATE_GRF_OFFSET 0x150
2140*4882a593Smuzhiyun #define RK3308_SLEW_RATE_BANK_STRIDE 16
2141*4882a593Smuzhiyun #define RK3308_SLEW_RATE_PINS_PER_GRF_REG 8
2142*4882a593Smuzhiyun
rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2143*4882a593Smuzhiyun static int rk3308_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2144*4882a593Smuzhiyun int pin_num,
2145*4882a593Smuzhiyun struct regmap **regmap,
2146*4882a593Smuzhiyun int *reg, u8 *bit)
2147*4882a593Smuzhiyun {
2148*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2149*4882a593Smuzhiyun int pins_per_reg;
2150*4882a593Smuzhiyun
2151*4882a593Smuzhiyun *regmap = info->regmap_base;
2152*4882a593Smuzhiyun *reg = RK3308_SLEW_RATE_GRF_OFFSET;
2153*4882a593Smuzhiyun *reg += (bank->bank_num) * RK3308_SLEW_RATE_BANK_STRIDE;
2154*4882a593Smuzhiyun pins_per_reg = RK3308_SLEW_RATE_PINS_PER_GRF_REG;
2155*4882a593Smuzhiyun
2156*4882a593Smuzhiyun *reg += ((pin_num / pins_per_reg) * 4);
2157*4882a593Smuzhiyun *bit = pin_num % pins_per_reg;
2158*4882a593Smuzhiyun
2159*4882a593Smuzhiyun return 0;
2160*4882a593Smuzhiyun }
2161*4882a593Smuzhiyun
2162*4882a593Smuzhiyun #define RK3368_PULL_GRF_OFFSET 0x100
2163*4882a593Smuzhiyun #define RK3368_PULL_PMU_OFFSET 0x10
2164*4882a593Smuzhiyun
rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2165*4882a593Smuzhiyun static int rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2166*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2167*4882a593Smuzhiyun int *reg, u8 *bit)
2168*4882a593Smuzhiyun {
2169*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2170*4882a593Smuzhiyun
2171*4882a593Smuzhiyun /* The first 32 pins of the first bank are located in PMU */
2172*4882a593Smuzhiyun if (bank->bank_num == 0) {
2173*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2174*4882a593Smuzhiyun *reg = RK3368_PULL_PMU_OFFSET;
2175*4882a593Smuzhiyun
2176*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2177*4882a593Smuzhiyun *bit = pin_num % RK3188_PULL_PINS_PER_REG;
2178*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2179*4882a593Smuzhiyun } else {
2180*4882a593Smuzhiyun *regmap = info->regmap_base;
2181*4882a593Smuzhiyun *reg = RK3368_PULL_GRF_OFFSET;
2182*4882a593Smuzhiyun
2183*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
2184*4882a593Smuzhiyun *reg -= 0x10;
2185*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2186*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2187*4882a593Smuzhiyun
2188*4882a593Smuzhiyun *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2189*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2190*4882a593Smuzhiyun }
2191*4882a593Smuzhiyun
2192*4882a593Smuzhiyun return 0;
2193*4882a593Smuzhiyun }
2194*4882a593Smuzhiyun
2195*4882a593Smuzhiyun #define RK3368_DRV_PMU_OFFSET 0x20
2196*4882a593Smuzhiyun #define RK3368_DRV_GRF_OFFSET 0x200
2197*4882a593Smuzhiyun
rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2198*4882a593Smuzhiyun static int rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2199*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2200*4882a593Smuzhiyun int *reg, u8 *bit)
2201*4882a593Smuzhiyun {
2202*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2203*4882a593Smuzhiyun
2204*4882a593Smuzhiyun /* The first 32 pins of the first bank are located in PMU */
2205*4882a593Smuzhiyun if (bank->bank_num == 0) {
2206*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2207*4882a593Smuzhiyun *reg = RK3368_DRV_PMU_OFFSET;
2208*4882a593Smuzhiyun
2209*4882a593Smuzhiyun *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2210*4882a593Smuzhiyun *bit = pin_num % RK3288_DRV_PINS_PER_REG;
2211*4882a593Smuzhiyun *bit *= RK3288_DRV_BITS_PER_PIN;
2212*4882a593Smuzhiyun } else {
2213*4882a593Smuzhiyun *regmap = info->regmap_base;
2214*4882a593Smuzhiyun *reg = RK3368_DRV_GRF_OFFSET;
2215*4882a593Smuzhiyun
2216*4882a593Smuzhiyun /* correct the offset, as we're starting with the 2nd bank */
2217*4882a593Smuzhiyun *reg -= 0x10;
2218*4882a593Smuzhiyun *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
2219*4882a593Smuzhiyun *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
2220*4882a593Smuzhiyun
2221*4882a593Smuzhiyun *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
2222*4882a593Smuzhiyun *bit *= RK3288_DRV_BITS_PER_PIN;
2223*4882a593Smuzhiyun }
2224*4882a593Smuzhiyun
2225*4882a593Smuzhiyun return 0;
2226*4882a593Smuzhiyun }
2227*4882a593Smuzhiyun
2228*4882a593Smuzhiyun #define RK3399_PULL_GRF_OFFSET 0xe040
2229*4882a593Smuzhiyun #define RK3399_PULL_PMU_OFFSET 0x40
2230*4882a593Smuzhiyun #define RK3399_DRV_3BITS_PER_PIN 3
2231*4882a593Smuzhiyun
rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2232*4882a593Smuzhiyun static int rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2233*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2234*4882a593Smuzhiyun int *reg, u8 *bit)
2235*4882a593Smuzhiyun {
2236*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2237*4882a593Smuzhiyun
2238*4882a593Smuzhiyun /* The bank0:16 and bank1:32 pins are located in PMU */
2239*4882a593Smuzhiyun if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
2240*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2241*4882a593Smuzhiyun *reg = RK3399_PULL_PMU_OFFSET;
2242*4882a593Smuzhiyun
2243*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2244*4882a593Smuzhiyun
2245*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2246*4882a593Smuzhiyun *bit = pin_num % RK3188_PULL_PINS_PER_REG;
2247*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2248*4882a593Smuzhiyun } else {
2249*4882a593Smuzhiyun *regmap = info->regmap_base;
2250*4882a593Smuzhiyun *reg = RK3399_PULL_GRF_OFFSET;
2251*4882a593Smuzhiyun
2252*4882a593Smuzhiyun /* correct the offset, as we're starting with the 3rd bank */
2253*4882a593Smuzhiyun *reg -= 0x20;
2254*4882a593Smuzhiyun *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
2255*4882a593Smuzhiyun *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
2256*4882a593Smuzhiyun
2257*4882a593Smuzhiyun *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
2258*4882a593Smuzhiyun *bit *= RK3188_PULL_BITS_PER_PIN;
2259*4882a593Smuzhiyun }
2260*4882a593Smuzhiyun
2261*4882a593Smuzhiyun return 0;
2262*4882a593Smuzhiyun }
2263*4882a593Smuzhiyun
rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2264*4882a593Smuzhiyun static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2265*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2266*4882a593Smuzhiyun int *reg, u8 *bit)
2267*4882a593Smuzhiyun {
2268*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2269*4882a593Smuzhiyun int drv_num = (pin_num / 8);
2270*4882a593Smuzhiyun
2271*4882a593Smuzhiyun /* The bank0:16 and bank1:32 pins are located in PMU */
2272*4882a593Smuzhiyun if ((bank->bank_num == 0) || (bank->bank_num == 1))
2273*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2274*4882a593Smuzhiyun else
2275*4882a593Smuzhiyun *regmap = info->regmap_base;
2276*4882a593Smuzhiyun
2277*4882a593Smuzhiyun *reg = bank->drv[drv_num].offset;
2278*4882a593Smuzhiyun if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
2279*4882a593Smuzhiyun (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
2280*4882a593Smuzhiyun *bit = (pin_num % 8) * 3;
2281*4882a593Smuzhiyun else
2282*4882a593Smuzhiyun *bit = (pin_num % 8) * 2;
2283*4882a593Smuzhiyun
2284*4882a593Smuzhiyun return 0;
2285*4882a593Smuzhiyun }
2286*4882a593Smuzhiyun
2287*4882a593Smuzhiyun #define RK3528_DRV_BITS_PER_PIN 8
2288*4882a593Smuzhiyun #define RK3528_DRV_PINS_PER_REG 2
2289*4882a593Smuzhiyun #define RK3528_DRV_GPIO0_OFFSET 0x100
2290*4882a593Smuzhiyun #define RK3528_DRV_GPIO1_OFFSET 0x20120
2291*4882a593Smuzhiyun #define RK3528_DRV_GPIO2_OFFSET 0x30160
2292*4882a593Smuzhiyun #define RK3528_DRV_GPIO3_OFFSET 0x20190
2293*4882a593Smuzhiyun #define RK3528_DRV_GPIO4_OFFSET 0x101C0
2294*4882a593Smuzhiyun
rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2295*4882a593Smuzhiyun static int rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2296*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2297*4882a593Smuzhiyun int *reg, u8 *bit)
2298*4882a593Smuzhiyun {
2299*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2300*4882a593Smuzhiyun
2301*4882a593Smuzhiyun *regmap = info->regmap_base;
2302*4882a593Smuzhiyun switch (bank->bank_num) {
2303*4882a593Smuzhiyun case 0:
2304*4882a593Smuzhiyun *reg = RK3528_DRV_GPIO0_OFFSET;
2305*4882a593Smuzhiyun break;
2306*4882a593Smuzhiyun
2307*4882a593Smuzhiyun case 1:
2308*4882a593Smuzhiyun *reg = RK3528_DRV_GPIO1_OFFSET;
2309*4882a593Smuzhiyun break;
2310*4882a593Smuzhiyun
2311*4882a593Smuzhiyun case 2:
2312*4882a593Smuzhiyun *reg = RK3528_DRV_GPIO2_OFFSET;
2313*4882a593Smuzhiyun break;
2314*4882a593Smuzhiyun
2315*4882a593Smuzhiyun case 3:
2316*4882a593Smuzhiyun *reg = RK3528_DRV_GPIO3_OFFSET;
2317*4882a593Smuzhiyun break;
2318*4882a593Smuzhiyun
2319*4882a593Smuzhiyun case 4:
2320*4882a593Smuzhiyun *reg = RK3528_DRV_GPIO4_OFFSET;
2321*4882a593Smuzhiyun break;
2322*4882a593Smuzhiyun
2323*4882a593Smuzhiyun default:
2324*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2325*4882a593Smuzhiyun break;
2326*4882a593Smuzhiyun }
2327*4882a593Smuzhiyun
2328*4882a593Smuzhiyun *reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4);
2329*4882a593Smuzhiyun *bit = pin_num % RK3528_DRV_PINS_PER_REG;
2330*4882a593Smuzhiyun *bit *= RK3528_DRV_BITS_PER_PIN;
2331*4882a593Smuzhiyun
2332*4882a593Smuzhiyun return 0;
2333*4882a593Smuzhiyun }
2334*4882a593Smuzhiyun
2335*4882a593Smuzhiyun #define RK3528_PULL_BITS_PER_PIN 2
2336*4882a593Smuzhiyun #define RK3528_PULL_PINS_PER_REG 8
2337*4882a593Smuzhiyun #define RK3528_PULL_GPIO0_OFFSET 0x200
2338*4882a593Smuzhiyun #define RK3528_PULL_GPIO1_OFFSET 0x20210
2339*4882a593Smuzhiyun #define RK3528_PULL_GPIO2_OFFSET 0x30220
2340*4882a593Smuzhiyun #define RK3528_PULL_GPIO3_OFFSET 0x20230
2341*4882a593Smuzhiyun #define RK3528_PULL_GPIO4_OFFSET 0x10240
2342*4882a593Smuzhiyun
rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2343*4882a593Smuzhiyun static int rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2344*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2345*4882a593Smuzhiyun int *reg, u8 *bit)
2346*4882a593Smuzhiyun {
2347*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2348*4882a593Smuzhiyun
2349*4882a593Smuzhiyun *regmap = info->regmap_base;
2350*4882a593Smuzhiyun switch (bank->bank_num) {
2351*4882a593Smuzhiyun case 0:
2352*4882a593Smuzhiyun *reg = RK3528_PULL_GPIO0_OFFSET;
2353*4882a593Smuzhiyun break;
2354*4882a593Smuzhiyun
2355*4882a593Smuzhiyun case 1:
2356*4882a593Smuzhiyun *reg = RK3528_PULL_GPIO1_OFFSET;
2357*4882a593Smuzhiyun break;
2358*4882a593Smuzhiyun
2359*4882a593Smuzhiyun case 2:
2360*4882a593Smuzhiyun *reg = RK3528_PULL_GPIO2_OFFSET;
2361*4882a593Smuzhiyun break;
2362*4882a593Smuzhiyun
2363*4882a593Smuzhiyun case 3:
2364*4882a593Smuzhiyun *reg = RK3528_PULL_GPIO3_OFFSET;
2365*4882a593Smuzhiyun break;
2366*4882a593Smuzhiyun
2367*4882a593Smuzhiyun case 4:
2368*4882a593Smuzhiyun *reg = RK3528_PULL_GPIO4_OFFSET;
2369*4882a593Smuzhiyun break;
2370*4882a593Smuzhiyun
2371*4882a593Smuzhiyun default:
2372*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2373*4882a593Smuzhiyun break;
2374*4882a593Smuzhiyun }
2375*4882a593Smuzhiyun
2376*4882a593Smuzhiyun *reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4);
2377*4882a593Smuzhiyun *bit = pin_num % RK3528_PULL_PINS_PER_REG;
2378*4882a593Smuzhiyun *bit *= RK3528_PULL_BITS_PER_PIN;
2379*4882a593Smuzhiyun
2380*4882a593Smuzhiyun return 0;
2381*4882a593Smuzhiyun }
2382*4882a593Smuzhiyun
2383*4882a593Smuzhiyun #define RK3528_SMT_BITS_PER_PIN 1
2384*4882a593Smuzhiyun #define RK3528_SMT_PINS_PER_REG 8
2385*4882a593Smuzhiyun #define RK3528_SMT_GPIO0_OFFSET 0x400
2386*4882a593Smuzhiyun #define RK3528_SMT_GPIO1_OFFSET 0x20410
2387*4882a593Smuzhiyun #define RK3528_SMT_GPIO2_OFFSET 0x30420
2388*4882a593Smuzhiyun #define RK3528_SMT_GPIO3_OFFSET 0x20430
2389*4882a593Smuzhiyun #define RK3528_SMT_GPIO4_OFFSET 0x10440
2390*4882a593Smuzhiyun
rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2391*4882a593Smuzhiyun static int rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2392*4882a593Smuzhiyun int pin_num,
2393*4882a593Smuzhiyun struct regmap **regmap,
2394*4882a593Smuzhiyun int *reg, u8 *bit)
2395*4882a593Smuzhiyun {
2396*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2397*4882a593Smuzhiyun
2398*4882a593Smuzhiyun *regmap = info->regmap_base;
2399*4882a593Smuzhiyun switch (bank->bank_num) {
2400*4882a593Smuzhiyun case 0:
2401*4882a593Smuzhiyun *reg = RK3528_SMT_GPIO0_OFFSET;
2402*4882a593Smuzhiyun break;
2403*4882a593Smuzhiyun
2404*4882a593Smuzhiyun case 1:
2405*4882a593Smuzhiyun *reg = RK3528_SMT_GPIO1_OFFSET;
2406*4882a593Smuzhiyun break;
2407*4882a593Smuzhiyun
2408*4882a593Smuzhiyun case 2:
2409*4882a593Smuzhiyun *reg = RK3528_SMT_GPIO2_OFFSET;
2410*4882a593Smuzhiyun break;
2411*4882a593Smuzhiyun
2412*4882a593Smuzhiyun case 3:
2413*4882a593Smuzhiyun *reg = RK3528_SMT_GPIO3_OFFSET;
2414*4882a593Smuzhiyun break;
2415*4882a593Smuzhiyun
2416*4882a593Smuzhiyun case 4:
2417*4882a593Smuzhiyun *reg = RK3528_SMT_GPIO4_OFFSET;
2418*4882a593Smuzhiyun break;
2419*4882a593Smuzhiyun
2420*4882a593Smuzhiyun default:
2421*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2422*4882a593Smuzhiyun break;
2423*4882a593Smuzhiyun }
2424*4882a593Smuzhiyun
2425*4882a593Smuzhiyun *reg += ((pin_num / RK3528_SMT_PINS_PER_REG) * 4);
2426*4882a593Smuzhiyun *bit = pin_num % RK3528_SMT_PINS_PER_REG;
2427*4882a593Smuzhiyun *bit *= RK3528_SMT_BITS_PER_PIN;
2428*4882a593Smuzhiyun return 0;
2429*4882a593Smuzhiyun }
2430*4882a593Smuzhiyun
2431*4882a593Smuzhiyun #define RK3562_DRV_BITS_PER_PIN 8
2432*4882a593Smuzhiyun #define RK3562_DRV_PINS_PER_REG 2
2433*4882a593Smuzhiyun #define RK3562_DRV_GPIO0_OFFSET 0x20070
2434*4882a593Smuzhiyun #define RK3562_DRV_GPIO1_OFFSET 0x200
2435*4882a593Smuzhiyun #define RK3562_DRV_GPIO2_OFFSET 0x240
2436*4882a593Smuzhiyun #define RK3562_DRV_GPIO3_OFFSET 0x10280
2437*4882a593Smuzhiyun #define RK3562_DRV_GPIO4_OFFSET 0x102C0
2438*4882a593Smuzhiyun
rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2439*4882a593Smuzhiyun static int rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2440*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2441*4882a593Smuzhiyun int *reg, u8 *bit)
2442*4882a593Smuzhiyun {
2443*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2444*4882a593Smuzhiyun
2445*4882a593Smuzhiyun *regmap = info->regmap_base;
2446*4882a593Smuzhiyun switch (bank->bank_num) {
2447*4882a593Smuzhiyun case 0:
2448*4882a593Smuzhiyun *reg = RK3562_DRV_GPIO0_OFFSET;
2449*4882a593Smuzhiyun break;
2450*4882a593Smuzhiyun
2451*4882a593Smuzhiyun case 1:
2452*4882a593Smuzhiyun *reg = RK3562_DRV_GPIO1_OFFSET;
2453*4882a593Smuzhiyun break;
2454*4882a593Smuzhiyun
2455*4882a593Smuzhiyun case 2:
2456*4882a593Smuzhiyun *reg = RK3562_DRV_GPIO2_OFFSET;
2457*4882a593Smuzhiyun break;
2458*4882a593Smuzhiyun
2459*4882a593Smuzhiyun case 3:
2460*4882a593Smuzhiyun *reg = RK3562_DRV_GPIO3_OFFSET;
2461*4882a593Smuzhiyun break;
2462*4882a593Smuzhiyun
2463*4882a593Smuzhiyun case 4:
2464*4882a593Smuzhiyun *reg = RK3562_DRV_GPIO4_OFFSET;
2465*4882a593Smuzhiyun break;
2466*4882a593Smuzhiyun
2467*4882a593Smuzhiyun default:
2468*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2469*4882a593Smuzhiyun break;
2470*4882a593Smuzhiyun }
2471*4882a593Smuzhiyun
2472*4882a593Smuzhiyun *reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4);
2473*4882a593Smuzhiyun *bit = pin_num % RK3562_DRV_PINS_PER_REG;
2474*4882a593Smuzhiyun *bit *= RK3562_DRV_BITS_PER_PIN;
2475*4882a593Smuzhiyun
2476*4882a593Smuzhiyun return 0;
2477*4882a593Smuzhiyun }
2478*4882a593Smuzhiyun
2479*4882a593Smuzhiyun #define RK3562_PULL_BITS_PER_PIN 2
2480*4882a593Smuzhiyun #define RK3562_PULL_PINS_PER_REG 8
2481*4882a593Smuzhiyun #define RK3562_PULL_GPIO0_OFFSET 0x20020
2482*4882a593Smuzhiyun #define RK3562_PULL_GPIO1_OFFSET 0x80
2483*4882a593Smuzhiyun #define RK3562_PULL_GPIO2_OFFSET 0x90
2484*4882a593Smuzhiyun #define RK3562_PULL_GPIO3_OFFSET 0x100A0
2485*4882a593Smuzhiyun #define RK3562_PULL_GPIO4_OFFSET 0x100B0
2486*4882a593Smuzhiyun
rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2487*4882a593Smuzhiyun static int rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2488*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2489*4882a593Smuzhiyun int *reg, u8 *bit)
2490*4882a593Smuzhiyun {
2491*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2492*4882a593Smuzhiyun
2493*4882a593Smuzhiyun *regmap = info->regmap_base;
2494*4882a593Smuzhiyun switch (bank->bank_num) {
2495*4882a593Smuzhiyun case 0:
2496*4882a593Smuzhiyun *reg = RK3562_PULL_GPIO0_OFFSET;
2497*4882a593Smuzhiyun break;
2498*4882a593Smuzhiyun
2499*4882a593Smuzhiyun case 1:
2500*4882a593Smuzhiyun *reg = RK3562_PULL_GPIO1_OFFSET;
2501*4882a593Smuzhiyun break;
2502*4882a593Smuzhiyun
2503*4882a593Smuzhiyun case 2:
2504*4882a593Smuzhiyun *reg = RK3562_PULL_GPIO2_OFFSET;
2505*4882a593Smuzhiyun break;
2506*4882a593Smuzhiyun
2507*4882a593Smuzhiyun case 3:
2508*4882a593Smuzhiyun *reg = RK3562_PULL_GPIO3_OFFSET;
2509*4882a593Smuzhiyun break;
2510*4882a593Smuzhiyun
2511*4882a593Smuzhiyun case 4:
2512*4882a593Smuzhiyun *reg = RK3562_PULL_GPIO4_OFFSET;
2513*4882a593Smuzhiyun break;
2514*4882a593Smuzhiyun
2515*4882a593Smuzhiyun default:
2516*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2517*4882a593Smuzhiyun break;
2518*4882a593Smuzhiyun }
2519*4882a593Smuzhiyun
2520*4882a593Smuzhiyun *reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4);
2521*4882a593Smuzhiyun *bit = pin_num % RK3562_PULL_PINS_PER_REG;
2522*4882a593Smuzhiyun *bit *= RK3562_PULL_BITS_PER_PIN;
2523*4882a593Smuzhiyun
2524*4882a593Smuzhiyun return 0;
2525*4882a593Smuzhiyun }
2526*4882a593Smuzhiyun
2527*4882a593Smuzhiyun #define RK3562_SMT_BITS_PER_PIN 2
2528*4882a593Smuzhiyun #define RK3562_SMT_PINS_PER_REG 8
2529*4882a593Smuzhiyun #define RK3562_SMT_GPIO0_OFFSET 0x20030
2530*4882a593Smuzhiyun #define RK3562_SMT_GPIO1_OFFSET 0xC0
2531*4882a593Smuzhiyun #define RK3562_SMT_GPIO2_OFFSET 0xD0
2532*4882a593Smuzhiyun #define RK3562_SMT_GPIO3_OFFSET 0x100E0
2533*4882a593Smuzhiyun #define RK3562_SMT_GPIO4_OFFSET 0x100F0
2534*4882a593Smuzhiyun
rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2535*4882a593Smuzhiyun static int rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2536*4882a593Smuzhiyun int pin_num,
2537*4882a593Smuzhiyun struct regmap **regmap,
2538*4882a593Smuzhiyun int *reg, u8 *bit)
2539*4882a593Smuzhiyun {
2540*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2541*4882a593Smuzhiyun
2542*4882a593Smuzhiyun *regmap = info->regmap_base;
2543*4882a593Smuzhiyun switch (bank->bank_num) {
2544*4882a593Smuzhiyun case 0:
2545*4882a593Smuzhiyun *reg = RK3562_SMT_GPIO0_OFFSET;
2546*4882a593Smuzhiyun break;
2547*4882a593Smuzhiyun
2548*4882a593Smuzhiyun case 1:
2549*4882a593Smuzhiyun *reg = RK3562_SMT_GPIO1_OFFSET;
2550*4882a593Smuzhiyun break;
2551*4882a593Smuzhiyun
2552*4882a593Smuzhiyun case 2:
2553*4882a593Smuzhiyun *reg = RK3562_SMT_GPIO2_OFFSET;
2554*4882a593Smuzhiyun break;
2555*4882a593Smuzhiyun
2556*4882a593Smuzhiyun case 3:
2557*4882a593Smuzhiyun *reg = RK3562_SMT_GPIO3_OFFSET;
2558*4882a593Smuzhiyun break;
2559*4882a593Smuzhiyun
2560*4882a593Smuzhiyun case 4:
2561*4882a593Smuzhiyun *reg = RK3562_SMT_GPIO4_OFFSET;
2562*4882a593Smuzhiyun break;
2563*4882a593Smuzhiyun
2564*4882a593Smuzhiyun default:
2565*4882a593Smuzhiyun dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
2566*4882a593Smuzhiyun break;
2567*4882a593Smuzhiyun }
2568*4882a593Smuzhiyun
2569*4882a593Smuzhiyun *reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4);
2570*4882a593Smuzhiyun *bit = pin_num % RK3562_SMT_PINS_PER_REG;
2571*4882a593Smuzhiyun *bit *= RK3562_SMT_BITS_PER_PIN;
2572*4882a593Smuzhiyun
2573*4882a593Smuzhiyun return 0;
2574*4882a593Smuzhiyun }
2575*4882a593Smuzhiyun
2576*4882a593Smuzhiyun #define RK3568_SR_PMU_OFFSET 0x60
2577*4882a593Smuzhiyun #define RK3568_SR_GRF_OFFSET 0x0180
2578*4882a593Smuzhiyun #define RK3568_SR_BANK_STRIDE 0x10
2579*4882a593Smuzhiyun #define RK3568_SR_BITS_PER_PIN 2
2580*4882a593Smuzhiyun #define RK3568_SR_PINS_PER_REG 8
2581*4882a593Smuzhiyun
rk3568_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2582*4882a593Smuzhiyun static int rk3568_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
2583*4882a593Smuzhiyun int pin_num,
2584*4882a593Smuzhiyun struct regmap **regmap,
2585*4882a593Smuzhiyun int *reg, u8 *bit)
2586*4882a593Smuzhiyun {
2587*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2588*4882a593Smuzhiyun
2589*4882a593Smuzhiyun if (bank->bank_num == 0) {
2590*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2591*4882a593Smuzhiyun *reg = RK3568_SR_PMU_OFFSET;
2592*4882a593Smuzhiyun } else {
2593*4882a593Smuzhiyun *regmap = info->regmap_base;
2594*4882a593Smuzhiyun *reg = RK3568_SR_GRF_OFFSET;
2595*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK3568_SR_BANK_STRIDE;
2596*4882a593Smuzhiyun }
2597*4882a593Smuzhiyun *reg += ((pin_num / RK3568_SR_PINS_PER_REG) * 4);
2598*4882a593Smuzhiyun *bit = pin_num % RK3568_SR_PINS_PER_REG;
2599*4882a593Smuzhiyun *bit *= RK3568_SR_BITS_PER_PIN;
2600*4882a593Smuzhiyun
2601*4882a593Smuzhiyun return 0;
2602*4882a593Smuzhiyun }
2603*4882a593Smuzhiyun
2604*4882a593Smuzhiyun #define RK3568_PULL_PMU_OFFSET 0x20
2605*4882a593Smuzhiyun #define RK3568_PULL_GRF_OFFSET 0x80
2606*4882a593Smuzhiyun #define RK3568_PULL_BITS_PER_PIN 2
2607*4882a593Smuzhiyun #define RK3568_PULL_PINS_PER_REG 8
2608*4882a593Smuzhiyun #define RK3568_PULL_BANK_STRIDE 0x10
2609*4882a593Smuzhiyun
rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2610*4882a593Smuzhiyun static int rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2611*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2612*4882a593Smuzhiyun int *reg, u8 *bit)
2613*4882a593Smuzhiyun {
2614*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2615*4882a593Smuzhiyun
2616*4882a593Smuzhiyun if (bank->bank_num == 0) {
2617*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2618*4882a593Smuzhiyun *reg = RK3568_PULL_PMU_OFFSET;
2619*4882a593Smuzhiyun *reg += bank->bank_num * RK3568_PULL_BANK_STRIDE;
2620*4882a593Smuzhiyun *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4);
2621*4882a593Smuzhiyun
2622*4882a593Smuzhiyun *bit = pin_num % RK3568_PULL_PINS_PER_REG;
2623*4882a593Smuzhiyun *bit *= RK3568_PULL_BITS_PER_PIN;
2624*4882a593Smuzhiyun } else {
2625*4882a593Smuzhiyun *regmap = info->regmap_base;
2626*4882a593Smuzhiyun *reg = RK3568_PULL_GRF_OFFSET;
2627*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK3568_PULL_BANK_STRIDE;
2628*4882a593Smuzhiyun *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4);
2629*4882a593Smuzhiyun
2630*4882a593Smuzhiyun *bit = (pin_num % RK3568_PULL_PINS_PER_REG);
2631*4882a593Smuzhiyun *bit *= RK3568_PULL_BITS_PER_PIN;
2632*4882a593Smuzhiyun }
2633*4882a593Smuzhiyun
2634*4882a593Smuzhiyun return 0;
2635*4882a593Smuzhiyun }
2636*4882a593Smuzhiyun
2637*4882a593Smuzhiyun #define RK3568_DRV_PMU_OFFSET 0x70
2638*4882a593Smuzhiyun #define RK3568_DRV_GRF_OFFSET 0x200
2639*4882a593Smuzhiyun #define RK3568_DRV_BITS_PER_PIN 8
2640*4882a593Smuzhiyun #define RK3568_DRV_PINS_PER_REG 2
2641*4882a593Smuzhiyun #define RK3568_DRV_BANK_STRIDE 0x40
2642*4882a593Smuzhiyun
rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2643*4882a593Smuzhiyun static int rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2644*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2645*4882a593Smuzhiyun int *reg, u8 *bit)
2646*4882a593Smuzhiyun {
2647*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2648*4882a593Smuzhiyun
2649*4882a593Smuzhiyun /* The first 32 pins of the first bank are located in PMU */
2650*4882a593Smuzhiyun if (bank->bank_num == 0) {
2651*4882a593Smuzhiyun *regmap = info->regmap_pmu;
2652*4882a593Smuzhiyun *reg = RK3568_DRV_PMU_OFFSET;
2653*4882a593Smuzhiyun *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4);
2654*4882a593Smuzhiyun
2655*4882a593Smuzhiyun *bit = pin_num % RK3568_DRV_PINS_PER_REG;
2656*4882a593Smuzhiyun *bit *= RK3568_DRV_BITS_PER_PIN;
2657*4882a593Smuzhiyun } else {
2658*4882a593Smuzhiyun *regmap = info->regmap_base;
2659*4882a593Smuzhiyun *reg = RK3568_DRV_GRF_OFFSET;
2660*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK3568_DRV_BANK_STRIDE;
2661*4882a593Smuzhiyun *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4);
2662*4882a593Smuzhiyun
2663*4882a593Smuzhiyun *bit = (pin_num % RK3568_DRV_PINS_PER_REG);
2664*4882a593Smuzhiyun *bit *= RK3568_DRV_BITS_PER_PIN;
2665*4882a593Smuzhiyun }
2666*4882a593Smuzhiyun
2667*4882a593Smuzhiyun if (rockchip_get_cpu_version() == 0)
2668*4882a593Smuzhiyun if ((bank->bank_num == 1 && (pin_num == 15 || pin_num == 23 || pin_num == 31)) ||
2669*4882a593Smuzhiyun ((bank->bank_num == 2 || bank->bank_num == 3 || bank->bank_num == 4) &&
2670*4882a593Smuzhiyun (pin_num == 7 || pin_num == 15 || pin_num == 23 || pin_num == 31)))
2671*4882a593Smuzhiyun *bit -= RK3568_DRV_BITS_PER_PIN;
2672*4882a593Smuzhiyun
2673*4882a593Smuzhiyun return 0;
2674*4882a593Smuzhiyun }
2675*4882a593Smuzhiyun
2676*4882a593Smuzhiyun #define RK3588_PMU1_IOC_REG (0x0000)
2677*4882a593Smuzhiyun #define RK3588_PMU2_IOC_REG (0x4000)
2678*4882a593Smuzhiyun #define RK3588_BUS_IOC_REG (0x8000)
2679*4882a593Smuzhiyun #define RK3588_VCCIO1_4_IOC_REG (0x9000)
2680*4882a593Smuzhiyun #define RK3588_VCCIO3_5_IOC_REG (0xA000)
2681*4882a593Smuzhiyun #define RK3588_VCCIO2_IOC_REG (0xB000)
2682*4882a593Smuzhiyun #define RK3588_VCCIO6_IOC_REG (0xC000)
2683*4882a593Smuzhiyun #define RK3588_EMMC_IOC_REG (0xD000)
2684*4882a593Smuzhiyun
2685*4882a593Smuzhiyun static const u32 rk3588_ds_regs[][2] = {
2686*4882a593Smuzhiyun {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0010},
2687*4882a593Smuzhiyun {RK_GPIO0_A4, RK3588_PMU1_IOC_REG + 0x0014},
2688*4882a593Smuzhiyun {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0018},
2689*4882a593Smuzhiyun {RK_GPIO0_B4, RK3588_PMU2_IOC_REG + 0x0014},
2690*4882a593Smuzhiyun {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0018},
2691*4882a593Smuzhiyun {RK_GPIO0_C4, RK3588_PMU2_IOC_REG + 0x001C},
2692*4882a593Smuzhiyun {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0020},
2693*4882a593Smuzhiyun {RK_GPIO0_D4, RK3588_PMU2_IOC_REG + 0x0024},
2694*4882a593Smuzhiyun {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0020},
2695*4882a593Smuzhiyun {RK_GPIO1_A4, RK3588_VCCIO1_4_IOC_REG + 0x0024},
2696*4882a593Smuzhiyun {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0028},
2697*4882a593Smuzhiyun {RK_GPIO1_B4, RK3588_VCCIO1_4_IOC_REG + 0x002C},
2698*4882a593Smuzhiyun {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0030},
2699*4882a593Smuzhiyun {RK_GPIO1_C4, RK3588_VCCIO1_4_IOC_REG + 0x0034},
2700*4882a593Smuzhiyun {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x0038},
2701*4882a593Smuzhiyun {RK_GPIO1_D4, RK3588_VCCIO1_4_IOC_REG + 0x003C},
2702*4882a593Smuzhiyun {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0040},
2703*4882a593Smuzhiyun {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0044},
2704*4882a593Smuzhiyun {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0048},
2705*4882a593Smuzhiyun {RK_GPIO2_B4, RK3588_VCCIO3_5_IOC_REG + 0x004C},
2706*4882a593Smuzhiyun {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0050},
2707*4882a593Smuzhiyun {RK_GPIO2_C4, RK3588_VCCIO3_5_IOC_REG + 0x0054},
2708*4882a593Smuzhiyun {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x0058},
2709*4882a593Smuzhiyun {RK_GPIO2_D4, RK3588_EMMC_IOC_REG + 0x005C},
2710*4882a593Smuzhiyun {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0060},
2711*4882a593Smuzhiyun {RK_GPIO3_A4, RK3588_VCCIO3_5_IOC_REG + 0x0064},
2712*4882a593Smuzhiyun {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0068},
2713*4882a593Smuzhiyun {RK_GPIO3_B4, RK3588_VCCIO3_5_IOC_REG + 0x006C},
2714*4882a593Smuzhiyun {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0070},
2715*4882a593Smuzhiyun {RK_GPIO3_C4, RK3588_VCCIO3_5_IOC_REG + 0x0074},
2716*4882a593Smuzhiyun {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x0078},
2717*4882a593Smuzhiyun {RK_GPIO3_D4, RK3588_VCCIO3_5_IOC_REG + 0x007C},
2718*4882a593Smuzhiyun {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0080},
2719*4882a593Smuzhiyun {RK_GPIO4_A4, RK3588_VCCIO6_IOC_REG + 0x0084},
2720*4882a593Smuzhiyun {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0088},
2721*4882a593Smuzhiyun {RK_GPIO4_B4, RK3588_VCCIO6_IOC_REG + 0x008C},
2722*4882a593Smuzhiyun {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0090},
2723*4882a593Smuzhiyun {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0090},
2724*4882a593Smuzhiyun {RK_GPIO4_C4, RK3588_VCCIO3_5_IOC_REG + 0x0094},
2725*4882a593Smuzhiyun {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x0098},
2726*4882a593Smuzhiyun };
2727*4882a593Smuzhiyun
2728*4882a593Smuzhiyun static const u32 rk3588_p_regs[][2] = {
2729*4882a593Smuzhiyun {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0020},
2730*4882a593Smuzhiyun {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0024},
2731*4882a593Smuzhiyun {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0028},
2732*4882a593Smuzhiyun {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x002C},
2733*4882a593Smuzhiyun {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0030},
2734*4882a593Smuzhiyun {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0110},
2735*4882a593Smuzhiyun {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0114},
2736*4882a593Smuzhiyun {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0118},
2737*4882a593Smuzhiyun {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x011C},
2738*4882a593Smuzhiyun {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0120},
2739*4882a593Smuzhiyun {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0120},
2740*4882a593Smuzhiyun {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0124},
2741*4882a593Smuzhiyun {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0128},
2742*4882a593Smuzhiyun {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x012C},
2743*4882a593Smuzhiyun {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0130},
2744*4882a593Smuzhiyun {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0134},
2745*4882a593Smuzhiyun {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0138},
2746*4882a593Smuzhiyun {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x013C},
2747*4882a593Smuzhiyun {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0140},
2748*4882a593Smuzhiyun {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0144},
2749*4882a593Smuzhiyun {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0148},
2750*4882a593Smuzhiyun {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0148},
2751*4882a593Smuzhiyun {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x014C},
2752*4882a593Smuzhiyun };
2753*4882a593Smuzhiyun
2754*4882a593Smuzhiyun static const u32 rk3588_smt_regs[][2] = {
2755*4882a593Smuzhiyun {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0030},
2756*4882a593Smuzhiyun {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0034},
2757*4882a593Smuzhiyun {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0040},
2758*4882a593Smuzhiyun {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0044},
2759*4882a593Smuzhiyun {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0048},
2760*4882a593Smuzhiyun {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0210},
2761*4882a593Smuzhiyun {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0214},
2762*4882a593Smuzhiyun {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0218},
2763*4882a593Smuzhiyun {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x021C},
2764*4882a593Smuzhiyun {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0220},
2765*4882a593Smuzhiyun {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0220},
2766*4882a593Smuzhiyun {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0224},
2767*4882a593Smuzhiyun {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0228},
2768*4882a593Smuzhiyun {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x022C},
2769*4882a593Smuzhiyun {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0230},
2770*4882a593Smuzhiyun {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0234},
2771*4882a593Smuzhiyun {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0238},
2772*4882a593Smuzhiyun {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x023C},
2773*4882a593Smuzhiyun {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0240},
2774*4882a593Smuzhiyun {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0244},
2775*4882a593Smuzhiyun {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0248},
2776*4882a593Smuzhiyun {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0248},
2777*4882a593Smuzhiyun {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x024C},
2778*4882a593Smuzhiyun };
2779*4882a593Smuzhiyun
2780*4882a593Smuzhiyun #define RK3588_PULL_BITS_PER_PIN 2
2781*4882a593Smuzhiyun #define RK3588_PULL_PINS_PER_REG 8
2782*4882a593Smuzhiyun
rk3588_calc_pull_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2783*4882a593Smuzhiyun static int rk3588_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
2784*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2785*4882a593Smuzhiyun int *reg, u8 *bit)
2786*4882a593Smuzhiyun {
2787*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2788*4882a593Smuzhiyun u8 bank_num = bank->bank_num;
2789*4882a593Smuzhiyun u32 pin = bank_num * 32 + pin_num;
2790*4882a593Smuzhiyun int i;
2791*4882a593Smuzhiyun
2792*4882a593Smuzhiyun for (i = ARRAY_SIZE(rk3588_p_regs) - 1; i >= 0; i--) {
2793*4882a593Smuzhiyun if (pin >= rk3588_p_regs[i][0]) {
2794*4882a593Smuzhiyun *reg = rk3588_p_regs[i][1];
2795*4882a593Smuzhiyun break;
2796*4882a593Smuzhiyun }
2797*4882a593Smuzhiyun BUG_ON(i == 0);
2798*4882a593Smuzhiyun }
2799*4882a593Smuzhiyun
2800*4882a593Smuzhiyun *regmap = info->regmap_base;
2801*4882a593Smuzhiyun *reg += ((pin - rk3588_p_regs[i][0]) / RK3588_PULL_PINS_PER_REG) * 4;
2802*4882a593Smuzhiyun *bit = pin_num % RK3588_PULL_PINS_PER_REG;
2803*4882a593Smuzhiyun *bit *= RK3588_PULL_BITS_PER_PIN;
2804*4882a593Smuzhiyun
2805*4882a593Smuzhiyun return 0;
2806*4882a593Smuzhiyun }
2807*4882a593Smuzhiyun
2808*4882a593Smuzhiyun #define RK3588_DRV_BITS_PER_PIN 4
2809*4882a593Smuzhiyun #define RK3588_DRV_PINS_PER_REG 4
2810*4882a593Smuzhiyun
rk3588_calc_drv_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2811*4882a593Smuzhiyun static int rk3588_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
2812*4882a593Smuzhiyun int pin_num, struct regmap **regmap,
2813*4882a593Smuzhiyun int *reg, u8 *bit)
2814*4882a593Smuzhiyun {
2815*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2816*4882a593Smuzhiyun u8 bank_num = bank->bank_num;
2817*4882a593Smuzhiyun u32 pin = bank_num * 32 + pin_num;
2818*4882a593Smuzhiyun int i;
2819*4882a593Smuzhiyun
2820*4882a593Smuzhiyun for (i = ARRAY_SIZE(rk3588_ds_regs) - 1; i >= 0; i--) {
2821*4882a593Smuzhiyun if (pin >= rk3588_ds_regs[i][0]) {
2822*4882a593Smuzhiyun *reg = rk3588_ds_regs[i][1];
2823*4882a593Smuzhiyun break;
2824*4882a593Smuzhiyun }
2825*4882a593Smuzhiyun BUG_ON(i == 0);
2826*4882a593Smuzhiyun }
2827*4882a593Smuzhiyun
2828*4882a593Smuzhiyun *regmap = info->regmap_base;
2829*4882a593Smuzhiyun *reg += ((pin - rk3588_ds_regs[i][0]) / RK3588_DRV_PINS_PER_REG) * 4;
2830*4882a593Smuzhiyun *bit = pin_num % RK3588_DRV_PINS_PER_REG;
2831*4882a593Smuzhiyun *bit *= RK3588_DRV_BITS_PER_PIN;
2832*4882a593Smuzhiyun
2833*4882a593Smuzhiyun return 0;
2834*4882a593Smuzhiyun }
2835*4882a593Smuzhiyun
2836*4882a593Smuzhiyun #define RK3588_SMT_BITS_PER_PIN 1
2837*4882a593Smuzhiyun #define RK3588_SMT_PINS_PER_REG 8
2838*4882a593Smuzhiyun
rk3588_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)2839*4882a593Smuzhiyun static int rk3588_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
2840*4882a593Smuzhiyun int pin_num,
2841*4882a593Smuzhiyun struct regmap **regmap,
2842*4882a593Smuzhiyun int *reg, u8 *bit)
2843*4882a593Smuzhiyun {
2844*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2845*4882a593Smuzhiyun u8 bank_num = bank->bank_num;
2846*4882a593Smuzhiyun u32 pin = bank_num * 32 + pin_num;
2847*4882a593Smuzhiyun int i;
2848*4882a593Smuzhiyun
2849*4882a593Smuzhiyun for (i = ARRAY_SIZE(rk3588_smt_regs) - 1; i >= 0; i--) {
2850*4882a593Smuzhiyun if (pin >= rk3588_smt_regs[i][0]) {
2851*4882a593Smuzhiyun *reg = rk3588_smt_regs[i][1];
2852*4882a593Smuzhiyun break;
2853*4882a593Smuzhiyun }
2854*4882a593Smuzhiyun BUG_ON(i == 0);
2855*4882a593Smuzhiyun }
2856*4882a593Smuzhiyun
2857*4882a593Smuzhiyun *regmap = info->regmap_base;
2858*4882a593Smuzhiyun *reg += ((pin - rk3588_smt_regs[i][0]) / RK3588_SMT_PINS_PER_REG) * 4;
2859*4882a593Smuzhiyun *bit = pin_num % RK3588_SMT_PINS_PER_REG;
2860*4882a593Smuzhiyun *bit *= RK3588_SMT_BITS_PER_PIN;
2861*4882a593Smuzhiyun
2862*4882a593Smuzhiyun return 0;
2863*4882a593Smuzhiyun }
2864*4882a593Smuzhiyun
2865*4882a593Smuzhiyun static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
2866*4882a593Smuzhiyun { 2, 4, 8, 12, -1, -1, -1, -1 },
2867*4882a593Smuzhiyun { 3, 6, 9, 12, -1, -1, -1, -1 },
2868*4882a593Smuzhiyun { 5, 10, 15, 20, -1, -1, -1, -1 },
2869*4882a593Smuzhiyun { 4, 6, 8, 10, 12, 14, 16, 18 },
2870*4882a593Smuzhiyun { 4, 7, 10, 13, 16, 19, 22, 26 },
2871*4882a593Smuzhiyun { 0, 2, 4, 6, 6, 8, 10, 12 }
2872*4882a593Smuzhiyun };
2873*4882a593Smuzhiyun
rockchip_get_drive_perpin(struct rockchip_pin_bank * bank,int pin_num)2874*4882a593Smuzhiyun static int rockchip_get_drive_perpin(struct rockchip_pin_bank *bank,
2875*4882a593Smuzhiyun int pin_num)
2876*4882a593Smuzhiyun {
2877*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2878*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
2879*4882a593Smuzhiyun struct device *dev = info->dev;
2880*4882a593Smuzhiyun struct regmap *regmap;
2881*4882a593Smuzhiyun int reg, ret;
2882*4882a593Smuzhiyun u32 data, temp, rmask_bits;
2883*4882a593Smuzhiyun u8 bit;
2884*4882a593Smuzhiyun int drv_type = bank->drv[pin_num / 8].drv_type;
2885*4882a593Smuzhiyun
2886*4882a593Smuzhiyun ret = ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit);
2887*4882a593Smuzhiyun if (ret)
2888*4882a593Smuzhiyun return ret;
2889*4882a593Smuzhiyun
2890*4882a593Smuzhiyun switch (drv_type) {
2891*4882a593Smuzhiyun case DRV_TYPE_IO_1V8_3V0_AUTO:
2892*4882a593Smuzhiyun case DRV_TYPE_IO_3V3_ONLY:
2893*4882a593Smuzhiyun rmask_bits = RK3399_DRV_3BITS_PER_PIN;
2894*4882a593Smuzhiyun switch (bit) {
2895*4882a593Smuzhiyun case 0 ... 12:
2896*4882a593Smuzhiyun /* regular case, nothing to do */
2897*4882a593Smuzhiyun break;
2898*4882a593Smuzhiyun case 15:
2899*4882a593Smuzhiyun /*
2900*4882a593Smuzhiyun * drive-strength offset is special, as it is
2901*4882a593Smuzhiyun * spread over 2 registers
2902*4882a593Smuzhiyun */
2903*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &data);
2904*4882a593Smuzhiyun if (ret)
2905*4882a593Smuzhiyun return ret;
2906*4882a593Smuzhiyun
2907*4882a593Smuzhiyun ret = regmap_read(regmap, reg + 0x4, &temp);
2908*4882a593Smuzhiyun if (ret)
2909*4882a593Smuzhiyun return ret;
2910*4882a593Smuzhiyun
2911*4882a593Smuzhiyun /*
2912*4882a593Smuzhiyun * the bit data[15] contains bit 0 of the value
2913*4882a593Smuzhiyun * while temp[1:0] contains bits 2 and 1
2914*4882a593Smuzhiyun */
2915*4882a593Smuzhiyun data >>= 15;
2916*4882a593Smuzhiyun temp &= 0x3;
2917*4882a593Smuzhiyun temp <<= 1;
2918*4882a593Smuzhiyun data |= temp;
2919*4882a593Smuzhiyun
2920*4882a593Smuzhiyun return rockchip_perpin_drv_list[drv_type][data];
2921*4882a593Smuzhiyun case 18 ... 21:
2922*4882a593Smuzhiyun /* setting fully enclosed in the second register */
2923*4882a593Smuzhiyun reg += 4;
2924*4882a593Smuzhiyun bit -= 16;
2925*4882a593Smuzhiyun break;
2926*4882a593Smuzhiyun default:
2927*4882a593Smuzhiyun dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
2928*4882a593Smuzhiyun bit, drv_type);
2929*4882a593Smuzhiyun return -EINVAL;
2930*4882a593Smuzhiyun }
2931*4882a593Smuzhiyun
2932*4882a593Smuzhiyun break;
2933*4882a593Smuzhiyun case DRV_TYPE_IO_DEFAULT:
2934*4882a593Smuzhiyun case DRV_TYPE_IO_1V8_OR_3V0:
2935*4882a593Smuzhiyun case DRV_TYPE_IO_1V8_ONLY:
2936*4882a593Smuzhiyun case DRV_TYPE_IO_SMIC:
2937*4882a593Smuzhiyun rmask_bits = RK3288_DRV_BITS_PER_PIN;
2938*4882a593Smuzhiyun break;
2939*4882a593Smuzhiyun default:
2940*4882a593Smuzhiyun dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
2941*4882a593Smuzhiyun return -EINVAL;
2942*4882a593Smuzhiyun }
2943*4882a593Smuzhiyun
2944*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &data);
2945*4882a593Smuzhiyun if (ret)
2946*4882a593Smuzhiyun return ret;
2947*4882a593Smuzhiyun
2948*4882a593Smuzhiyun data >>= bit;
2949*4882a593Smuzhiyun data &= (1 << rmask_bits) - 1;
2950*4882a593Smuzhiyun
2951*4882a593Smuzhiyun if (drv_type == DRV_TYPE_IO_SMIC) {
2952*4882a593Smuzhiyun u32 tmp = 0;
2953*4882a593Smuzhiyun
2954*4882a593Smuzhiyun ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit);
2955*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &tmp);
2956*4882a593Smuzhiyun if (ret)
2957*4882a593Smuzhiyun return ret;
2958*4882a593Smuzhiyun
2959*4882a593Smuzhiyun tmp >>= bit;
2960*4882a593Smuzhiyun tmp &= 0x1;
2961*4882a593Smuzhiyun
2962*4882a593Smuzhiyun data |= tmp << 2;
2963*4882a593Smuzhiyun }
2964*4882a593Smuzhiyun
2965*4882a593Smuzhiyun return rockchip_perpin_drv_list[drv_type][data];
2966*4882a593Smuzhiyun }
2967*4882a593Smuzhiyun
rockchip_set_drive_perpin(struct rockchip_pin_bank * bank,int pin_num,int strength)2968*4882a593Smuzhiyun static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
2969*4882a593Smuzhiyun int pin_num, int strength)
2970*4882a593Smuzhiyun {
2971*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
2972*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
2973*4882a593Smuzhiyun struct device *dev = info->dev;
2974*4882a593Smuzhiyun struct regmap *regmap;
2975*4882a593Smuzhiyun int reg, ret, i, err;
2976*4882a593Smuzhiyun u32 data, rmask, rmask_bits, temp;
2977*4882a593Smuzhiyun u8 bit;
2978*4882a593Smuzhiyun int drv_type = bank->drv[pin_num / 8].drv_type;
2979*4882a593Smuzhiyun
2980*4882a593Smuzhiyun dev_dbg(dev, "setting drive of GPIO%d-%d to %d\n",
2981*4882a593Smuzhiyun bank->bank_num, pin_num, strength);
2982*4882a593Smuzhiyun
2983*4882a593Smuzhiyun ret = ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit);
2984*4882a593Smuzhiyun if (ret)
2985*4882a593Smuzhiyun return ret;
2986*4882a593Smuzhiyun
2987*4882a593Smuzhiyun if (ctrl->type == RV1126 || ctrl->type == RK3588) {
2988*4882a593Smuzhiyun rmask_bits = RV1126_DRV_BITS_PER_PIN;
2989*4882a593Smuzhiyun ret = strength;
2990*4882a593Smuzhiyun goto config;
2991*4882a593Smuzhiyun } else if (ctrl->type == RV1106 ||
2992*4882a593Smuzhiyun ctrl->type == RK3528 ||
2993*4882a593Smuzhiyun ctrl->type == RK3562 ||
2994*4882a593Smuzhiyun ctrl->type == RK3568) {
2995*4882a593Smuzhiyun rmask_bits = RK3568_DRV_BITS_PER_PIN;
2996*4882a593Smuzhiyun ret = (1 << (strength + 1)) - 1;
2997*4882a593Smuzhiyun goto config;
2998*4882a593Smuzhiyun }
2999*4882a593Smuzhiyun
3000*4882a593Smuzhiyun ret = -EINVAL;
3001*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
3002*4882a593Smuzhiyun if (rockchip_perpin_drv_list[drv_type][i] == strength) {
3003*4882a593Smuzhiyun ret = i;
3004*4882a593Smuzhiyun break;
3005*4882a593Smuzhiyun } else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
3006*4882a593Smuzhiyun ret = rockchip_perpin_drv_list[drv_type][i];
3007*4882a593Smuzhiyun break;
3008*4882a593Smuzhiyun }
3009*4882a593Smuzhiyun }
3010*4882a593Smuzhiyun
3011*4882a593Smuzhiyun if (ret < 0) {
3012*4882a593Smuzhiyun dev_err(dev, "unsupported driver strength %d\n", strength);
3013*4882a593Smuzhiyun return ret;
3014*4882a593Smuzhiyun }
3015*4882a593Smuzhiyun
3016*4882a593Smuzhiyun switch (drv_type) {
3017*4882a593Smuzhiyun case DRV_TYPE_IO_1V8_3V0_AUTO:
3018*4882a593Smuzhiyun case DRV_TYPE_IO_3V3_ONLY:
3019*4882a593Smuzhiyun rmask_bits = RK3399_DRV_3BITS_PER_PIN;
3020*4882a593Smuzhiyun switch (bit) {
3021*4882a593Smuzhiyun case 0 ... 12:
3022*4882a593Smuzhiyun /* regular case, nothing to do */
3023*4882a593Smuzhiyun break;
3024*4882a593Smuzhiyun case 15:
3025*4882a593Smuzhiyun /*
3026*4882a593Smuzhiyun * drive-strength offset is special, as it is spread
3027*4882a593Smuzhiyun * over 2 registers, the bit data[15] contains bit 0
3028*4882a593Smuzhiyun * of the value while temp[1:0] contains bits 2 and 1
3029*4882a593Smuzhiyun */
3030*4882a593Smuzhiyun data = (ret & 0x1) << 15;
3031*4882a593Smuzhiyun temp = (ret >> 0x1) & 0x3;
3032*4882a593Smuzhiyun
3033*4882a593Smuzhiyun rmask = BIT(15) | BIT(31);
3034*4882a593Smuzhiyun data |= BIT(31);
3035*4882a593Smuzhiyun err = regmap_update_bits(regmap, reg, rmask, data);
3036*4882a593Smuzhiyun if (err)
3037*4882a593Smuzhiyun return err;
3038*4882a593Smuzhiyun
3039*4882a593Smuzhiyun rmask = 0x3 | (0x3 << 16);
3040*4882a593Smuzhiyun temp |= (0x3 << 16);
3041*4882a593Smuzhiyun reg += 0x4;
3042*4882a593Smuzhiyun err = regmap_update_bits(regmap, reg, rmask, temp);
3043*4882a593Smuzhiyun
3044*4882a593Smuzhiyun return err;
3045*4882a593Smuzhiyun case 18 ... 21:
3046*4882a593Smuzhiyun /* setting fully enclosed in the second register */
3047*4882a593Smuzhiyun reg += 4;
3048*4882a593Smuzhiyun bit -= 16;
3049*4882a593Smuzhiyun break;
3050*4882a593Smuzhiyun default:
3051*4882a593Smuzhiyun dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
3052*4882a593Smuzhiyun bit, drv_type);
3053*4882a593Smuzhiyun return -EINVAL;
3054*4882a593Smuzhiyun }
3055*4882a593Smuzhiyun break;
3056*4882a593Smuzhiyun case DRV_TYPE_IO_DEFAULT:
3057*4882a593Smuzhiyun case DRV_TYPE_IO_1V8_OR_3V0:
3058*4882a593Smuzhiyun case DRV_TYPE_IO_1V8_ONLY:
3059*4882a593Smuzhiyun case DRV_TYPE_IO_SMIC:
3060*4882a593Smuzhiyun rmask_bits = RK3288_DRV_BITS_PER_PIN;
3061*4882a593Smuzhiyun break;
3062*4882a593Smuzhiyun default:
3063*4882a593Smuzhiyun dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
3064*4882a593Smuzhiyun return -EINVAL;
3065*4882a593Smuzhiyun }
3066*4882a593Smuzhiyun
3067*4882a593Smuzhiyun config:
3068*4882a593Smuzhiyun /* enable the write to the equivalent lower bits */
3069*4882a593Smuzhiyun data = ((1 << rmask_bits) - 1) << (bit + 16);
3070*4882a593Smuzhiyun rmask = data | (data >> 16);
3071*4882a593Smuzhiyun data |= (ret << bit);
3072*4882a593Smuzhiyun
3073*4882a593Smuzhiyun err = regmap_update_bits(regmap, reg, rmask, data);
3074*4882a593Smuzhiyun if (err)
3075*4882a593Smuzhiyun return err;
3076*4882a593Smuzhiyun
3077*4882a593Smuzhiyun if (ctrl->type == RK3568 && rockchip_get_cpu_version() == 0) {
3078*4882a593Smuzhiyun if (bank->bank_num == 1 && pin_num == 21)
3079*4882a593Smuzhiyun reg = 0x0840;
3080*4882a593Smuzhiyun else if (bank->bank_num == 2 && pin_num == 2)
3081*4882a593Smuzhiyun reg = 0x0844;
3082*4882a593Smuzhiyun else if (bank->bank_num == 2 && pin_num == 8)
3083*4882a593Smuzhiyun reg = 0x0848;
3084*4882a593Smuzhiyun else if (bank->bank_num == 3 && pin_num == 0)
3085*4882a593Smuzhiyun reg = 0x084c;
3086*4882a593Smuzhiyun else if (bank->bank_num == 3 && pin_num == 6)
3087*4882a593Smuzhiyun reg = 0x0850;
3088*4882a593Smuzhiyun else if (bank->bank_num == 4 && pin_num == 0)
3089*4882a593Smuzhiyun reg = 0x0854;
3090*4882a593Smuzhiyun else
3091*4882a593Smuzhiyun return 0;
3092*4882a593Smuzhiyun
3093*4882a593Smuzhiyun data = ((1 << rmask_bits) - 1) << 16;
3094*4882a593Smuzhiyun rmask = data | (data >> 16);
3095*4882a593Smuzhiyun data |= (1 << (strength + 1)) - 1;
3096*4882a593Smuzhiyun
3097*4882a593Smuzhiyun err = regmap_update_bits(regmap, reg, rmask, data);
3098*4882a593Smuzhiyun if (err)
3099*4882a593Smuzhiyun return err;
3100*4882a593Smuzhiyun }
3101*4882a593Smuzhiyun
3102*4882a593Smuzhiyun if (drv_type == DRV_TYPE_IO_SMIC) {
3103*4882a593Smuzhiyun ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit);
3104*4882a593Smuzhiyun data = BIT(bit + 16) | (((ret >> 2) & 0x1) << bit);
3105*4882a593Smuzhiyun err = regmap_write(regmap, reg, data);
3106*4882a593Smuzhiyun if (err)
3107*4882a593Smuzhiyun return err;
3108*4882a593Smuzhiyun }
3109*4882a593Smuzhiyun
3110*4882a593Smuzhiyun return 0;
3111*4882a593Smuzhiyun }
3112*4882a593Smuzhiyun
3113*4882a593Smuzhiyun static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
3114*4882a593Smuzhiyun {
3115*4882a593Smuzhiyun PIN_CONFIG_BIAS_DISABLE,
3116*4882a593Smuzhiyun PIN_CONFIG_BIAS_PULL_UP,
3117*4882a593Smuzhiyun PIN_CONFIG_BIAS_PULL_DOWN,
3118*4882a593Smuzhiyun PIN_CONFIG_BIAS_BUS_HOLD
3119*4882a593Smuzhiyun },
3120*4882a593Smuzhiyun {
3121*4882a593Smuzhiyun PIN_CONFIG_BIAS_DISABLE,
3122*4882a593Smuzhiyun PIN_CONFIG_BIAS_PULL_DOWN,
3123*4882a593Smuzhiyun PIN_CONFIG_BIAS_DISABLE,
3124*4882a593Smuzhiyun PIN_CONFIG_BIAS_PULL_UP
3125*4882a593Smuzhiyun },
3126*4882a593Smuzhiyun };
3127*4882a593Smuzhiyun
rockchip_get_pull(struct rockchip_pin_bank * bank,int pin_num)3128*4882a593Smuzhiyun static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
3129*4882a593Smuzhiyun {
3130*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3131*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
3132*4882a593Smuzhiyun struct device *dev = info->dev;
3133*4882a593Smuzhiyun struct regmap *regmap;
3134*4882a593Smuzhiyun int reg, ret, pull_type;
3135*4882a593Smuzhiyun u8 bit;
3136*4882a593Smuzhiyun u32 data;
3137*4882a593Smuzhiyun
3138*4882a593Smuzhiyun /* rk3066b does support any pulls */
3139*4882a593Smuzhiyun if (ctrl->type == RK3066B)
3140*4882a593Smuzhiyun return PIN_CONFIG_BIAS_DISABLE;
3141*4882a593Smuzhiyun
3142*4882a593Smuzhiyun ret = ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit);
3143*4882a593Smuzhiyun if (ret)
3144*4882a593Smuzhiyun return ret;
3145*4882a593Smuzhiyun
3146*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &data);
3147*4882a593Smuzhiyun if (ret)
3148*4882a593Smuzhiyun return ret;
3149*4882a593Smuzhiyun
3150*4882a593Smuzhiyun switch (ctrl->type) {
3151*4882a593Smuzhiyun case RK2928:
3152*4882a593Smuzhiyun case RK3128:
3153*4882a593Smuzhiyun return !(data & BIT(bit))
3154*4882a593Smuzhiyun ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
3155*4882a593Smuzhiyun : PIN_CONFIG_BIAS_DISABLE;
3156*4882a593Smuzhiyun case PX30:
3157*4882a593Smuzhiyun case RV1106:
3158*4882a593Smuzhiyun case RV1108:
3159*4882a593Smuzhiyun case RV1126:
3160*4882a593Smuzhiyun case RK1808:
3161*4882a593Smuzhiyun case RK3188:
3162*4882a593Smuzhiyun case RK3288:
3163*4882a593Smuzhiyun case RK3308:
3164*4882a593Smuzhiyun case RK3368:
3165*4882a593Smuzhiyun case RK3399:
3166*4882a593Smuzhiyun case RK3528:
3167*4882a593Smuzhiyun case RK3562:
3168*4882a593Smuzhiyun case RK3568:
3169*4882a593Smuzhiyun case RK3588:
3170*4882a593Smuzhiyun pull_type = bank->pull_type[pin_num / 8];
3171*4882a593Smuzhiyun data >>= bit;
3172*4882a593Smuzhiyun data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
3173*4882a593Smuzhiyun
3174*4882a593Smuzhiyun return rockchip_pull_list[pull_type][data];
3175*4882a593Smuzhiyun default:
3176*4882a593Smuzhiyun dev_err(dev, "unsupported pinctrl type\n");
3177*4882a593Smuzhiyun return -EINVAL;
3178*4882a593Smuzhiyun };
3179*4882a593Smuzhiyun }
3180*4882a593Smuzhiyun
rockchip_set_pull(struct rockchip_pin_bank * bank,int pin_num,int pull)3181*4882a593Smuzhiyun static int rockchip_set_pull(struct rockchip_pin_bank *bank,
3182*4882a593Smuzhiyun int pin_num, int pull)
3183*4882a593Smuzhiyun {
3184*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3185*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
3186*4882a593Smuzhiyun struct device *dev = info->dev;
3187*4882a593Smuzhiyun struct regmap *regmap;
3188*4882a593Smuzhiyun int reg, ret, i, pull_type;
3189*4882a593Smuzhiyun u8 bit;
3190*4882a593Smuzhiyun u32 data, rmask;
3191*4882a593Smuzhiyun
3192*4882a593Smuzhiyun dev_dbg(dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull);
3193*4882a593Smuzhiyun
3194*4882a593Smuzhiyun /* rk3066b does support any pulls */
3195*4882a593Smuzhiyun if (ctrl->type == RK3066B)
3196*4882a593Smuzhiyun return pull ? -EINVAL : 0;
3197*4882a593Smuzhiyun
3198*4882a593Smuzhiyun ret = ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit);
3199*4882a593Smuzhiyun if (ret)
3200*4882a593Smuzhiyun return ret;
3201*4882a593Smuzhiyun
3202*4882a593Smuzhiyun switch (ctrl->type) {
3203*4882a593Smuzhiyun case RK2928:
3204*4882a593Smuzhiyun case RK3128:
3205*4882a593Smuzhiyun data = BIT(bit + 16);
3206*4882a593Smuzhiyun if (pull == PIN_CONFIG_BIAS_DISABLE)
3207*4882a593Smuzhiyun data |= BIT(bit);
3208*4882a593Smuzhiyun ret = regmap_write(regmap, reg, data);
3209*4882a593Smuzhiyun break;
3210*4882a593Smuzhiyun case PX30:
3211*4882a593Smuzhiyun case RV1106:
3212*4882a593Smuzhiyun case RV1108:
3213*4882a593Smuzhiyun case RV1126:
3214*4882a593Smuzhiyun case RK1808:
3215*4882a593Smuzhiyun case RK3188:
3216*4882a593Smuzhiyun case RK3288:
3217*4882a593Smuzhiyun case RK3308:
3218*4882a593Smuzhiyun case RK3368:
3219*4882a593Smuzhiyun case RK3399:
3220*4882a593Smuzhiyun case RK3528:
3221*4882a593Smuzhiyun case RK3562:
3222*4882a593Smuzhiyun case RK3568:
3223*4882a593Smuzhiyun case RK3588:
3224*4882a593Smuzhiyun pull_type = bank->pull_type[pin_num / 8];
3225*4882a593Smuzhiyun ret = -EINVAL;
3226*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
3227*4882a593Smuzhiyun i++) {
3228*4882a593Smuzhiyun if (rockchip_pull_list[pull_type][i] == pull) {
3229*4882a593Smuzhiyun ret = i;
3230*4882a593Smuzhiyun break;
3231*4882a593Smuzhiyun }
3232*4882a593Smuzhiyun }
3233*4882a593Smuzhiyun /*
3234*4882a593Smuzhiyun * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
3235*4882a593Smuzhiyun * where that pull up value becomes 3.
3236*4882a593Smuzhiyun */
3237*4882a593Smuzhiyun if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
3238*4882a593Smuzhiyun if (ret == 1)
3239*4882a593Smuzhiyun ret = 3;
3240*4882a593Smuzhiyun }
3241*4882a593Smuzhiyun
3242*4882a593Smuzhiyun if (ret < 0) {
3243*4882a593Smuzhiyun dev_err(dev, "unsupported pull setting %d\n", pull);
3244*4882a593Smuzhiyun return ret;
3245*4882a593Smuzhiyun }
3246*4882a593Smuzhiyun
3247*4882a593Smuzhiyun /* enable the write to the equivalent lower bits */
3248*4882a593Smuzhiyun data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
3249*4882a593Smuzhiyun rmask = data | (data >> 16);
3250*4882a593Smuzhiyun data |= (ret << bit);
3251*4882a593Smuzhiyun
3252*4882a593Smuzhiyun ret = regmap_update_bits(regmap, reg, rmask, data);
3253*4882a593Smuzhiyun break;
3254*4882a593Smuzhiyun default:
3255*4882a593Smuzhiyun dev_err(dev, "unsupported pinctrl type\n");
3256*4882a593Smuzhiyun return -EINVAL;
3257*4882a593Smuzhiyun }
3258*4882a593Smuzhiyun
3259*4882a593Smuzhiyun return ret;
3260*4882a593Smuzhiyun }
3261*4882a593Smuzhiyun
3262*4882a593Smuzhiyun #define RK3328_SCHMITT_BITS_PER_PIN 1
3263*4882a593Smuzhiyun #define RK3328_SCHMITT_PINS_PER_REG 16
3264*4882a593Smuzhiyun #define RK3328_SCHMITT_BANK_STRIDE 8
3265*4882a593Smuzhiyun #define RK3328_SCHMITT_GRF_OFFSET 0x380
3266*4882a593Smuzhiyun
rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)3267*4882a593Smuzhiyun static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
3268*4882a593Smuzhiyun int pin_num,
3269*4882a593Smuzhiyun struct regmap **regmap,
3270*4882a593Smuzhiyun int *reg, u8 *bit)
3271*4882a593Smuzhiyun {
3272*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3273*4882a593Smuzhiyun
3274*4882a593Smuzhiyun *regmap = info->regmap_base;
3275*4882a593Smuzhiyun *reg = RK3328_SCHMITT_GRF_OFFSET;
3276*4882a593Smuzhiyun
3277*4882a593Smuzhiyun *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
3278*4882a593Smuzhiyun *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
3279*4882a593Smuzhiyun *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
3280*4882a593Smuzhiyun
3281*4882a593Smuzhiyun return 0;
3282*4882a593Smuzhiyun }
3283*4882a593Smuzhiyun
3284*4882a593Smuzhiyun #define RK3568_SCHMITT_BITS_PER_PIN 2
3285*4882a593Smuzhiyun #define RK3568_SCHMITT_PINS_PER_REG 8
3286*4882a593Smuzhiyun #define RK3568_SCHMITT_BANK_STRIDE 0x10
3287*4882a593Smuzhiyun #define RK3568_SCHMITT_GRF_OFFSET 0xc0
3288*4882a593Smuzhiyun #define RK3568_SCHMITT_PMUGRF_OFFSET 0x30
3289*4882a593Smuzhiyun
rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)3290*4882a593Smuzhiyun static int rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
3291*4882a593Smuzhiyun int pin_num,
3292*4882a593Smuzhiyun struct regmap **regmap,
3293*4882a593Smuzhiyun int *reg, u8 *bit)
3294*4882a593Smuzhiyun {
3295*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3296*4882a593Smuzhiyun
3297*4882a593Smuzhiyun if (bank->bank_num == 0) {
3298*4882a593Smuzhiyun *regmap = info->regmap_pmu;
3299*4882a593Smuzhiyun *reg = RK3568_SCHMITT_PMUGRF_OFFSET;
3300*4882a593Smuzhiyun } else {
3301*4882a593Smuzhiyun *regmap = info->regmap_base;
3302*4882a593Smuzhiyun *reg = RK3568_SCHMITT_GRF_OFFSET;
3303*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * RK3568_SCHMITT_BANK_STRIDE;
3304*4882a593Smuzhiyun }
3305*4882a593Smuzhiyun
3306*4882a593Smuzhiyun *reg += ((pin_num / RK3568_SCHMITT_PINS_PER_REG) * 4);
3307*4882a593Smuzhiyun *bit = pin_num % RK3568_SCHMITT_PINS_PER_REG;
3308*4882a593Smuzhiyun *bit *= RK3568_SCHMITT_BITS_PER_PIN;
3309*4882a593Smuzhiyun
3310*4882a593Smuzhiyun return 0;
3311*4882a593Smuzhiyun }
3312*4882a593Smuzhiyun
rockchip_get_schmitt(struct rockchip_pin_bank * bank,int pin_num)3313*4882a593Smuzhiyun static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num)
3314*4882a593Smuzhiyun {
3315*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3316*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
3317*4882a593Smuzhiyun struct regmap *regmap;
3318*4882a593Smuzhiyun int reg, ret;
3319*4882a593Smuzhiyun u8 bit;
3320*4882a593Smuzhiyun u32 data;
3321*4882a593Smuzhiyun
3322*4882a593Smuzhiyun ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit);
3323*4882a593Smuzhiyun if (ret)
3324*4882a593Smuzhiyun return ret;
3325*4882a593Smuzhiyun
3326*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &data);
3327*4882a593Smuzhiyun if (ret)
3328*4882a593Smuzhiyun return ret;
3329*4882a593Smuzhiyun
3330*4882a593Smuzhiyun data >>= bit;
3331*4882a593Smuzhiyun switch (ctrl->type) {
3332*4882a593Smuzhiyun case RK3562:
3333*4882a593Smuzhiyun case RK3568:
3334*4882a593Smuzhiyun return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
3335*4882a593Smuzhiyun default:
3336*4882a593Smuzhiyun break;
3337*4882a593Smuzhiyun }
3338*4882a593Smuzhiyun
3339*4882a593Smuzhiyun return data & 0x1;
3340*4882a593Smuzhiyun }
3341*4882a593Smuzhiyun
rockchip_set_schmitt(struct rockchip_pin_bank * bank,int pin_num,int enable)3342*4882a593Smuzhiyun static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
3343*4882a593Smuzhiyun int pin_num, int enable)
3344*4882a593Smuzhiyun {
3345*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3346*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
3347*4882a593Smuzhiyun struct device *dev = info->dev;
3348*4882a593Smuzhiyun struct regmap *regmap;
3349*4882a593Smuzhiyun int reg, ret;
3350*4882a593Smuzhiyun u8 bit;
3351*4882a593Smuzhiyun u32 data, rmask;
3352*4882a593Smuzhiyun
3353*4882a593Smuzhiyun dev_dbg(dev, "setting input schmitt of GPIO%d-%d to %d\n",
3354*4882a593Smuzhiyun bank->bank_num, pin_num, enable);
3355*4882a593Smuzhiyun
3356*4882a593Smuzhiyun ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit);
3357*4882a593Smuzhiyun if (ret)
3358*4882a593Smuzhiyun return ret;
3359*4882a593Smuzhiyun
3360*4882a593Smuzhiyun /* enable the write to the equivalent lower bits */
3361*4882a593Smuzhiyun switch (ctrl->type) {
3362*4882a593Smuzhiyun case RK3562:
3363*4882a593Smuzhiyun case RK3568:
3364*4882a593Smuzhiyun data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
3365*4882a593Smuzhiyun rmask = data | (data >> 16);
3366*4882a593Smuzhiyun data |= ((enable ? 0x2 : 0x1) << bit);
3367*4882a593Smuzhiyun break;
3368*4882a593Smuzhiyun default:
3369*4882a593Smuzhiyun data = BIT(bit + 16) | (enable << bit);
3370*4882a593Smuzhiyun rmask = BIT(bit + 16) | BIT(bit);
3371*4882a593Smuzhiyun break;
3372*4882a593Smuzhiyun }
3373*4882a593Smuzhiyun
3374*4882a593Smuzhiyun return regmap_update_bits(regmap, reg, rmask, data);
3375*4882a593Smuzhiyun }
3376*4882a593Smuzhiyun
3377*4882a593Smuzhiyun #define PX30_SLEW_RATE_PMU_OFFSET 0x30
3378*4882a593Smuzhiyun #define PX30_SLEW_RATE_GRF_OFFSET 0x90
3379*4882a593Smuzhiyun #define PX30_SLEW_RATE_PINS_PER_PMU_REG 16
3380*4882a593Smuzhiyun #define PX30_SLEW_RATE_BANK_STRIDE 16
3381*4882a593Smuzhiyun #define PX30_SLEW_RATE_PINS_PER_GRF_REG 8
3382*4882a593Smuzhiyun
px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank * bank,int pin_num,struct regmap ** regmap,int * reg,u8 * bit)3383*4882a593Smuzhiyun static int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank,
3384*4882a593Smuzhiyun int pin_num,
3385*4882a593Smuzhiyun struct regmap **regmap,
3386*4882a593Smuzhiyun int *reg, u8 *bit)
3387*4882a593Smuzhiyun {
3388*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3389*4882a593Smuzhiyun int pins_per_reg;
3390*4882a593Smuzhiyun
3391*4882a593Smuzhiyun if (bank->bank_num == 0) {
3392*4882a593Smuzhiyun *regmap = info->regmap_pmu;
3393*4882a593Smuzhiyun *reg = PX30_SLEW_RATE_PMU_OFFSET;
3394*4882a593Smuzhiyun pins_per_reg = PX30_SLEW_RATE_PINS_PER_PMU_REG;
3395*4882a593Smuzhiyun } else {
3396*4882a593Smuzhiyun *regmap = info->regmap_base;
3397*4882a593Smuzhiyun *reg = PX30_SLEW_RATE_GRF_OFFSET;
3398*4882a593Smuzhiyun pins_per_reg = PX30_SLEW_RATE_PINS_PER_GRF_REG;
3399*4882a593Smuzhiyun *reg += (bank->bank_num - 1) * PX30_SLEW_RATE_BANK_STRIDE;
3400*4882a593Smuzhiyun }
3401*4882a593Smuzhiyun *reg += ((pin_num / pins_per_reg) * 4);
3402*4882a593Smuzhiyun *bit = pin_num % pins_per_reg;
3403*4882a593Smuzhiyun
3404*4882a593Smuzhiyun return 0;
3405*4882a593Smuzhiyun }
3406*4882a593Smuzhiyun
rockchip_get_slew_rate(struct rockchip_pin_bank * bank,int pin_num)3407*4882a593Smuzhiyun static int rockchip_get_slew_rate(struct rockchip_pin_bank *bank, int pin_num)
3408*4882a593Smuzhiyun {
3409*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3410*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
3411*4882a593Smuzhiyun struct regmap *regmap;
3412*4882a593Smuzhiyun int reg, ret;
3413*4882a593Smuzhiyun u8 bit;
3414*4882a593Smuzhiyun u32 data;
3415*4882a593Smuzhiyun int drv_type = bank->drv[pin_num / 8].drv_type;
3416*4882a593Smuzhiyun
3417*4882a593Smuzhiyun if (drv_type == DRV_TYPE_IO_SMIC)
3418*4882a593Smuzhiyun return 0;
3419*4882a593Smuzhiyun
3420*4882a593Smuzhiyun ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit);
3421*4882a593Smuzhiyun if (ret)
3422*4882a593Smuzhiyun return ret;
3423*4882a593Smuzhiyun
3424*4882a593Smuzhiyun ret = regmap_read(regmap, reg, &data);
3425*4882a593Smuzhiyun if (ret)
3426*4882a593Smuzhiyun return ret;
3427*4882a593Smuzhiyun
3428*4882a593Smuzhiyun data >>= bit;
3429*4882a593Smuzhiyun return data & 0x1;
3430*4882a593Smuzhiyun }
3431*4882a593Smuzhiyun
rockchip_set_slew_rate(struct rockchip_pin_bank * bank,int pin_num,int speed)3432*4882a593Smuzhiyun static int rockchip_set_slew_rate(struct rockchip_pin_bank *bank,
3433*4882a593Smuzhiyun int pin_num, int speed)
3434*4882a593Smuzhiyun {
3435*4882a593Smuzhiyun struct rockchip_pinctrl *info = bank->drvdata;
3436*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl = info->ctrl;
3437*4882a593Smuzhiyun struct regmap *regmap;
3438*4882a593Smuzhiyun int reg, ret;
3439*4882a593Smuzhiyun u8 bit;
3440*4882a593Smuzhiyun u32 data, rmask;
3441*4882a593Smuzhiyun int drv_type = bank->drv[pin_num / 8].drv_type;
3442*4882a593Smuzhiyun
3443*4882a593Smuzhiyun if (drv_type == DRV_TYPE_IO_SMIC)
3444*4882a593Smuzhiyun return 0;
3445*4882a593Smuzhiyun
3446*4882a593Smuzhiyun dev_dbg(info->dev, "setting slew rate of GPIO%d-%d to %d\n",
3447*4882a593Smuzhiyun bank->bank_num, pin_num, speed);
3448*4882a593Smuzhiyun
3449*4882a593Smuzhiyun ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit);
3450*4882a593Smuzhiyun if (ret)
3451*4882a593Smuzhiyun return ret;
3452*4882a593Smuzhiyun
3453*4882a593Smuzhiyun /* enable the write to the equivalent lower bits */
3454*4882a593Smuzhiyun data = BIT(bit + 16) | (speed << bit);
3455*4882a593Smuzhiyun rmask = BIT(bit + 16) | BIT(bit);
3456*4882a593Smuzhiyun
3457*4882a593Smuzhiyun return regmap_update_bits(regmap, reg, rmask, data);
3458*4882a593Smuzhiyun }
3459*4882a593Smuzhiyun
3460*4882a593Smuzhiyun /*
3461*4882a593Smuzhiyun * Pinmux_ops handling
3462*4882a593Smuzhiyun */
3463*4882a593Smuzhiyun
rockchip_pmx_get_funcs_count(struct pinctrl_dev * pctldev)3464*4882a593Smuzhiyun static int rockchip_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
3465*4882a593Smuzhiyun {
3466*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
3467*4882a593Smuzhiyun
3468*4882a593Smuzhiyun return info->nfunctions;
3469*4882a593Smuzhiyun }
3470*4882a593Smuzhiyun
rockchip_pmx_get_func_name(struct pinctrl_dev * pctldev,unsigned selector)3471*4882a593Smuzhiyun static const char *rockchip_pmx_get_func_name(struct pinctrl_dev *pctldev,
3472*4882a593Smuzhiyun unsigned selector)
3473*4882a593Smuzhiyun {
3474*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
3475*4882a593Smuzhiyun
3476*4882a593Smuzhiyun return info->functions[selector].name;
3477*4882a593Smuzhiyun }
3478*4882a593Smuzhiyun
rockchip_pmx_get_groups(struct pinctrl_dev * pctldev,unsigned selector,const char * const ** groups,unsigned * const num_groups)3479*4882a593Smuzhiyun static int rockchip_pmx_get_groups(struct pinctrl_dev *pctldev,
3480*4882a593Smuzhiyun unsigned selector, const char * const **groups,
3481*4882a593Smuzhiyun unsigned * const num_groups)
3482*4882a593Smuzhiyun {
3483*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
3484*4882a593Smuzhiyun
3485*4882a593Smuzhiyun *groups = info->functions[selector].groups;
3486*4882a593Smuzhiyun *num_groups = info->functions[selector].ngroups;
3487*4882a593Smuzhiyun
3488*4882a593Smuzhiyun return 0;
3489*4882a593Smuzhiyun }
3490*4882a593Smuzhiyun
rockchip_pmx_set(struct pinctrl_dev * pctldev,unsigned selector,unsigned group)3491*4882a593Smuzhiyun static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
3492*4882a593Smuzhiyun unsigned group)
3493*4882a593Smuzhiyun {
3494*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
3495*4882a593Smuzhiyun const unsigned int *pins = info->groups[group].pins;
3496*4882a593Smuzhiyun const struct rockchip_pin_config *data = info->groups[group].data;
3497*4882a593Smuzhiyun struct device *dev = info->dev;
3498*4882a593Smuzhiyun struct rockchip_pin_bank *bank;
3499*4882a593Smuzhiyun int cnt, ret = 0;
3500*4882a593Smuzhiyun
3501*4882a593Smuzhiyun dev_dbg(dev, "enable function %s group %s\n",
3502*4882a593Smuzhiyun info->functions[selector].name, info->groups[group].name);
3503*4882a593Smuzhiyun
3504*4882a593Smuzhiyun /*
3505*4882a593Smuzhiyun * for each pin in the pin group selected, program the corresponding
3506*4882a593Smuzhiyun * pin function number in the config register.
3507*4882a593Smuzhiyun */
3508*4882a593Smuzhiyun for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
3509*4882a593Smuzhiyun bank = pin_to_bank(info, pins[cnt]);
3510*4882a593Smuzhiyun ret = rockchip_set_mux(bank, pins[cnt] - bank->pin_base,
3511*4882a593Smuzhiyun data[cnt].func);
3512*4882a593Smuzhiyun if (ret)
3513*4882a593Smuzhiyun break;
3514*4882a593Smuzhiyun }
3515*4882a593Smuzhiyun
3516*4882a593Smuzhiyun if (ret && cnt) {
3517*4882a593Smuzhiyun /* revert the already done pin settings */
3518*4882a593Smuzhiyun for (cnt--; cnt >= 0 && !data[cnt].func; cnt--)
3519*4882a593Smuzhiyun rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
3520*4882a593Smuzhiyun
3521*4882a593Smuzhiyun return ret;
3522*4882a593Smuzhiyun }
3523*4882a593Smuzhiyun
3524*4882a593Smuzhiyun return 0;
3525*4882a593Smuzhiyun }
3526*4882a593Smuzhiyun
3527*4882a593Smuzhiyun static const struct pinmux_ops rockchip_pmx_ops = {
3528*4882a593Smuzhiyun .get_functions_count = rockchip_pmx_get_funcs_count,
3529*4882a593Smuzhiyun .get_function_name = rockchip_pmx_get_func_name,
3530*4882a593Smuzhiyun .get_function_groups = rockchip_pmx_get_groups,
3531*4882a593Smuzhiyun .set_mux = rockchip_pmx_set,
3532*4882a593Smuzhiyun };
3533*4882a593Smuzhiyun
3534*4882a593Smuzhiyun /*
3535*4882a593Smuzhiyun * Pinconf_ops handling
3536*4882a593Smuzhiyun */
3537*4882a593Smuzhiyun
rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl * ctrl,enum pin_config_param pull)3538*4882a593Smuzhiyun static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
3539*4882a593Smuzhiyun enum pin_config_param pull)
3540*4882a593Smuzhiyun {
3541*4882a593Smuzhiyun switch (ctrl->type) {
3542*4882a593Smuzhiyun case RK2928:
3543*4882a593Smuzhiyun case RK3128:
3544*4882a593Smuzhiyun return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
3545*4882a593Smuzhiyun pull == PIN_CONFIG_BIAS_DISABLE);
3546*4882a593Smuzhiyun case RK3066B:
3547*4882a593Smuzhiyun return pull ? false : true;
3548*4882a593Smuzhiyun case PX30:
3549*4882a593Smuzhiyun case RV1106:
3550*4882a593Smuzhiyun case RV1108:
3551*4882a593Smuzhiyun case RV1126:
3552*4882a593Smuzhiyun case RK1808:
3553*4882a593Smuzhiyun case RK3188:
3554*4882a593Smuzhiyun case RK3288:
3555*4882a593Smuzhiyun case RK3308:
3556*4882a593Smuzhiyun case RK3368:
3557*4882a593Smuzhiyun case RK3399:
3558*4882a593Smuzhiyun case RK3528:
3559*4882a593Smuzhiyun case RK3562:
3560*4882a593Smuzhiyun case RK3568:
3561*4882a593Smuzhiyun case RK3588:
3562*4882a593Smuzhiyun return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
3563*4882a593Smuzhiyun }
3564*4882a593Smuzhiyun
3565*4882a593Smuzhiyun return false;
3566*4882a593Smuzhiyun }
3567*4882a593Smuzhiyun
rockchip_pinconf_defer_pin(struct rockchip_pin_bank * bank,unsigned int pin,u32 param,u32 arg)3568*4882a593Smuzhiyun static int rockchip_pinconf_defer_pin(struct rockchip_pin_bank *bank,
3569*4882a593Smuzhiyun unsigned int pin, u32 param, u32 arg)
3570*4882a593Smuzhiyun {
3571*4882a593Smuzhiyun struct rockchip_pin_deferred *cfg;
3572*4882a593Smuzhiyun
3573*4882a593Smuzhiyun cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
3574*4882a593Smuzhiyun if (!cfg)
3575*4882a593Smuzhiyun return -ENOMEM;
3576*4882a593Smuzhiyun
3577*4882a593Smuzhiyun cfg->pin = pin;
3578*4882a593Smuzhiyun cfg->param = param;
3579*4882a593Smuzhiyun cfg->arg = arg;
3580*4882a593Smuzhiyun
3581*4882a593Smuzhiyun list_add_tail(&cfg->head, &bank->deferred_pins);
3582*4882a593Smuzhiyun
3583*4882a593Smuzhiyun return 0;
3584*4882a593Smuzhiyun }
3585*4882a593Smuzhiyun
3586*4882a593Smuzhiyun /* set the pin config settings for a specified pin */
rockchip_pinconf_set(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * configs,unsigned num_configs)3587*4882a593Smuzhiyun static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
3588*4882a593Smuzhiyun unsigned long *configs, unsigned num_configs)
3589*4882a593Smuzhiyun {
3590*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
3591*4882a593Smuzhiyun struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
3592*4882a593Smuzhiyun struct gpio_chip *gpio = &bank->gpio_chip;
3593*4882a593Smuzhiyun enum pin_config_param param;
3594*4882a593Smuzhiyun u32 arg;
3595*4882a593Smuzhiyun int i;
3596*4882a593Smuzhiyun int rc;
3597*4882a593Smuzhiyun
3598*4882a593Smuzhiyun for (i = 0; i < num_configs; i++) {
3599*4882a593Smuzhiyun param = pinconf_to_config_param(configs[i]);
3600*4882a593Smuzhiyun arg = pinconf_to_config_argument(configs[i]);
3601*4882a593Smuzhiyun
3602*4882a593Smuzhiyun if (param == PIN_CONFIG_OUTPUT || param == PIN_CONFIG_INPUT_ENABLE) {
3603*4882a593Smuzhiyun /*
3604*4882a593Smuzhiyun * Check for gpio driver not being probed yet.
3605*4882a593Smuzhiyun * The lock makes sure that either gpio-probe has completed
3606*4882a593Smuzhiyun * or the gpio driver hasn't probed yet.
3607*4882a593Smuzhiyun */
3608*4882a593Smuzhiyun mutex_lock(&bank->deferred_lock);
3609*4882a593Smuzhiyun if (!gpio || !gpio->direction_output) {
3610*4882a593Smuzhiyun rc = rockchip_pinconf_defer_pin(bank, pin - bank->pin_base, param,
3611*4882a593Smuzhiyun arg);
3612*4882a593Smuzhiyun mutex_unlock(&bank->deferred_lock);
3613*4882a593Smuzhiyun if (rc)
3614*4882a593Smuzhiyun return rc;
3615*4882a593Smuzhiyun
3616*4882a593Smuzhiyun break;
3617*4882a593Smuzhiyun }
3618*4882a593Smuzhiyun mutex_unlock(&bank->deferred_lock);
3619*4882a593Smuzhiyun }
3620*4882a593Smuzhiyun
3621*4882a593Smuzhiyun switch (param) {
3622*4882a593Smuzhiyun case PIN_CONFIG_BIAS_DISABLE:
3623*4882a593Smuzhiyun rc = rockchip_set_pull(bank, pin - bank->pin_base,
3624*4882a593Smuzhiyun param);
3625*4882a593Smuzhiyun if (rc)
3626*4882a593Smuzhiyun return rc;
3627*4882a593Smuzhiyun break;
3628*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_UP:
3629*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_DOWN:
3630*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
3631*4882a593Smuzhiyun case PIN_CONFIG_BIAS_BUS_HOLD:
3632*4882a593Smuzhiyun if (!rockchip_pinconf_pull_valid(info->ctrl, param))
3633*4882a593Smuzhiyun return -ENOTSUPP;
3634*4882a593Smuzhiyun
3635*4882a593Smuzhiyun if (!arg)
3636*4882a593Smuzhiyun return -EINVAL;
3637*4882a593Smuzhiyun
3638*4882a593Smuzhiyun rc = rockchip_set_pull(bank, pin - bank->pin_base,
3639*4882a593Smuzhiyun param);
3640*4882a593Smuzhiyun if (rc)
3641*4882a593Smuzhiyun return rc;
3642*4882a593Smuzhiyun break;
3643*4882a593Smuzhiyun case PIN_CONFIG_OUTPUT:
3644*4882a593Smuzhiyun rc = rockchip_set_mux(bank, pin - bank->pin_base,
3645*4882a593Smuzhiyun RK_FUNC_GPIO);
3646*4882a593Smuzhiyun if (rc != RK_FUNC_GPIO)
3647*4882a593Smuzhiyun return -EINVAL;
3648*4882a593Smuzhiyun
3649*4882a593Smuzhiyun rc = gpio->direction_output(gpio, pin - bank->pin_base,
3650*4882a593Smuzhiyun arg);
3651*4882a593Smuzhiyun if (rc)
3652*4882a593Smuzhiyun return rc;
3653*4882a593Smuzhiyun break;
3654*4882a593Smuzhiyun case PIN_CONFIG_INPUT_ENABLE:
3655*4882a593Smuzhiyun rc = rockchip_set_mux(bank, pin - bank->pin_base,
3656*4882a593Smuzhiyun RK_FUNC_GPIO);
3657*4882a593Smuzhiyun if (rc != RK_FUNC_GPIO)
3658*4882a593Smuzhiyun return -EINVAL;
3659*4882a593Smuzhiyun
3660*4882a593Smuzhiyun rc = gpio->direction_input(gpio, pin - bank->pin_base);
3661*4882a593Smuzhiyun if (rc)
3662*4882a593Smuzhiyun return rc;
3663*4882a593Smuzhiyun break;
3664*4882a593Smuzhiyun case PIN_CONFIG_DRIVE_STRENGTH:
3665*4882a593Smuzhiyun /* rk3288 is the first with per-pin drive-strength */
3666*4882a593Smuzhiyun if (!info->ctrl->drv_calc_reg)
3667*4882a593Smuzhiyun return -ENOTSUPP;
3668*4882a593Smuzhiyun
3669*4882a593Smuzhiyun rc = rockchip_set_drive_perpin(bank,
3670*4882a593Smuzhiyun pin - bank->pin_base, arg);
3671*4882a593Smuzhiyun if (rc < 0)
3672*4882a593Smuzhiyun return rc;
3673*4882a593Smuzhiyun break;
3674*4882a593Smuzhiyun case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
3675*4882a593Smuzhiyun if (!info->ctrl->schmitt_calc_reg)
3676*4882a593Smuzhiyun return -ENOTSUPP;
3677*4882a593Smuzhiyun
3678*4882a593Smuzhiyun rc = rockchip_set_schmitt(bank,
3679*4882a593Smuzhiyun pin - bank->pin_base, arg);
3680*4882a593Smuzhiyun if (rc < 0)
3681*4882a593Smuzhiyun return rc;
3682*4882a593Smuzhiyun break;
3683*4882a593Smuzhiyun case PIN_CONFIG_SLEW_RATE:
3684*4882a593Smuzhiyun if (!info->ctrl->slew_rate_calc_reg)
3685*4882a593Smuzhiyun return -ENOTSUPP;
3686*4882a593Smuzhiyun
3687*4882a593Smuzhiyun rc = rockchip_set_slew_rate(bank,
3688*4882a593Smuzhiyun pin - bank->pin_base, arg);
3689*4882a593Smuzhiyun if (rc < 0)
3690*4882a593Smuzhiyun return rc;
3691*4882a593Smuzhiyun break;
3692*4882a593Smuzhiyun default:
3693*4882a593Smuzhiyun return -ENOTSUPP;
3694*4882a593Smuzhiyun }
3695*4882a593Smuzhiyun } /* for each config */
3696*4882a593Smuzhiyun
3697*4882a593Smuzhiyun return 0;
3698*4882a593Smuzhiyun }
3699*4882a593Smuzhiyun
3700*4882a593Smuzhiyun /* get the pin config settings for a specified pin */
rockchip_pinconf_get(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * config)3701*4882a593Smuzhiyun static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
3702*4882a593Smuzhiyun unsigned long *config)
3703*4882a593Smuzhiyun {
3704*4882a593Smuzhiyun struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
3705*4882a593Smuzhiyun struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
3706*4882a593Smuzhiyun struct gpio_chip *gpio = &bank->gpio_chip;
3707*4882a593Smuzhiyun enum pin_config_param param = pinconf_to_config_param(*config);
3708*4882a593Smuzhiyun u16 arg;
3709*4882a593Smuzhiyun int rc;
3710*4882a593Smuzhiyun
3711*4882a593Smuzhiyun switch (param) {
3712*4882a593Smuzhiyun case PIN_CONFIG_BIAS_DISABLE:
3713*4882a593Smuzhiyun if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
3714*4882a593Smuzhiyun return -EINVAL;
3715*4882a593Smuzhiyun
3716*4882a593Smuzhiyun arg = 0;
3717*4882a593Smuzhiyun break;
3718*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_UP:
3719*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_DOWN:
3720*4882a593Smuzhiyun case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
3721*4882a593Smuzhiyun case PIN_CONFIG_BIAS_BUS_HOLD:
3722*4882a593Smuzhiyun if (!rockchip_pinconf_pull_valid(info->ctrl, param))
3723*4882a593Smuzhiyun return -ENOTSUPP;
3724*4882a593Smuzhiyun
3725*4882a593Smuzhiyun if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
3726*4882a593Smuzhiyun return -EINVAL;
3727*4882a593Smuzhiyun
3728*4882a593Smuzhiyun arg = 1;
3729*4882a593Smuzhiyun break;
3730*4882a593Smuzhiyun case PIN_CONFIG_OUTPUT:
3731*4882a593Smuzhiyun rc = rockchip_get_mux(bank, pin - bank->pin_base);
3732*4882a593Smuzhiyun if (rc != RK_FUNC_GPIO)
3733*4882a593Smuzhiyun return -EINVAL;
3734*4882a593Smuzhiyun
3735*4882a593Smuzhiyun if (!gpio || !gpio->get) {
3736*4882a593Smuzhiyun arg = 0;
3737*4882a593Smuzhiyun break;
3738*4882a593Smuzhiyun }
3739*4882a593Smuzhiyun
3740*4882a593Smuzhiyun rc = gpio->get(gpio, pin - bank->pin_base);
3741*4882a593Smuzhiyun if (rc < 0)
3742*4882a593Smuzhiyun return rc;
3743*4882a593Smuzhiyun
3744*4882a593Smuzhiyun arg = rc ? 1 : 0;
3745*4882a593Smuzhiyun break;
3746*4882a593Smuzhiyun case PIN_CONFIG_DRIVE_STRENGTH:
3747*4882a593Smuzhiyun /* rk3288 is the first with per-pin drive-strength */
3748*4882a593Smuzhiyun if (!info->ctrl->drv_calc_reg)
3749*4882a593Smuzhiyun return -ENOTSUPP;
3750*4882a593Smuzhiyun
3751*4882a593Smuzhiyun rc = rockchip_get_drive_perpin(bank, pin - bank->pin_base);
3752*4882a593Smuzhiyun if (rc < 0)
3753*4882a593Smuzhiyun return rc;
3754*4882a593Smuzhiyun
3755*4882a593Smuzhiyun arg = rc;
3756*4882a593Smuzhiyun break;
3757*4882a593Smuzhiyun case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
3758*4882a593Smuzhiyun if (!info->ctrl->schmitt_calc_reg)
3759*4882a593Smuzhiyun return -ENOTSUPP;
3760*4882a593Smuzhiyun
3761*4882a593Smuzhiyun rc = rockchip_get_schmitt(bank, pin - bank->pin_base);
3762*4882a593Smuzhiyun if (rc < 0)
3763*4882a593Smuzhiyun return rc;
3764*4882a593Smuzhiyun
3765*4882a593Smuzhiyun arg = rc;
3766*4882a593Smuzhiyun break;
3767*4882a593Smuzhiyun case PIN_CONFIG_SLEW_RATE:
3768*4882a593Smuzhiyun if (!info->ctrl->slew_rate_calc_reg)
3769*4882a593Smuzhiyun return -ENOTSUPP;
3770*4882a593Smuzhiyun
3771*4882a593Smuzhiyun rc = rockchip_get_slew_rate(bank, pin - bank->pin_base);
3772*4882a593Smuzhiyun if (rc < 0)
3773*4882a593Smuzhiyun return rc;
3774*4882a593Smuzhiyun
3775*4882a593Smuzhiyun arg = rc;
3776*4882a593Smuzhiyun break;
3777*4882a593Smuzhiyun default:
3778*4882a593Smuzhiyun return -ENOTSUPP;
3779*4882a593Smuzhiyun }
3780*4882a593Smuzhiyun
3781*4882a593Smuzhiyun *config = pinconf_to_config_packed(param, arg);
3782*4882a593Smuzhiyun
3783*4882a593Smuzhiyun return 0;
3784*4882a593Smuzhiyun }
3785*4882a593Smuzhiyun
3786*4882a593Smuzhiyun static const struct pinconf_ops rockchip_pinconf_ops = {
3787*4882a593Smuzhiyun .pin_config_get = rockchip_pinconf_get,
3788*4882a593Smuzhiyun .pin_config_set = rockchip_pinconf_set,
3789*4882a593Smuzhiyun .is_generic = true,
3790*4882a593Smuzhiyun };
3791*4882a593Smuzhiyun
3792*4882a593Smuzhiyun static const struct of_device_id rockchip_bank_match[] = {
3793*4882a593Smuzhiyun { .compatible = "rockchip,gpio-bank" },
3794*4882a593Smuzhiyun { .compatible = "rockchip,rk3188-gpio-bank0" },
3795*4882a593Smuzhiyun {},
3796*4882a593Smuzhiyun };
3797*4882a593Smuzhiyun
rockchip_pinctrl_child_count(struct rockchip_pinctrl * info,struct device_node * np)3798*4882a593Smuzhiyun static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
3799*4882a593Smuzhiyun struct device_node *np)
3800*4882a593Smuzhiyun {
3801*4882a593Smuzhiyun struct device_node *child;
3802*4882a593Smuzhiyun
3803*4882a593Smuzhiyun for_each_child_of_node(np, child) {
3804*4882a593Smuzhiyun if (of_match_node(rockchip_bank_match, child))
3805*4882a593Smuzhiyun continue;
3806*4882a593Smuzhiyun
3807*4882a593Smuzhiyun info->nfunctions++;
3808*4882a593Smuzhiyun info->ngroups += of_get_child_count(child);
3809*4882a593Smuzhiyun }
3810*4882a593Smuzhiyun }
3811*4882a593Smuzhiyun
rockchip_pinctrl_parse_groups(struct device_node * np,struct rockchip_pin_group * grp,struct rockchip_pinctrl * info,u32 index)3812*4882a593Smuzhiyun static int rockchip_pinctrl_parse_groups(struct device_node *np,
3813*4882a593Smuzhiyun struct rockchip_pin_group *grp,
3814*4882a593Smuzhiyun struct rockchip_pinctrl *info,
3815*4882a593Smuzhiyun u32 index)
3816*4882a593Smuzhiyun {
3817*4882a593Smuzhiyun struct device *dev = info->dev;
3818*4882a593Smuzhiyun struct rockchip_pin_bank *bank;
3819*4882a593Smuzhiyun int size;
3820*4882a593Smuzhiyun const __be32 *list;
3821*4882a593Smuzhiyun int num;
3822*4882a593Smuzhiyun int i, j;
3823*4882a593Smuzhiyun int ret;
3824*4882a593Smuzhiyun
3825*4882a593Smuzhiyun dev_dbg(dev, "group(%d): %pOFn\n", index, np);
3826*4882a593Smuzhiyun
3827*4882a593Smuzhiyun /* Initialise group */
3828*4882a593Smuzhiyun grp->name = np->name;
3829*4882a593Smuzhiyun
3830*4882a593Smuzhiyun /*
3831*4882a593Smuzhiyun * the binding format is rockchip,pins = <bank pin mux CONFIG>,
3832*4882a593Smuzhiyun * do sanity check and calculate pins number
3833*4882a593Smuzhiyun */
3834*4882a593Smuzhiyun list = of_get_property(np, "rockchip,pins", &size);
3835*4882a593Smuzhiyun /* we do not check return since it's safe node passed down */
3836*4882a593Smuzhiyun size /= sizeof(*list);
3837*4882a593Smuzhiyun if (!size || size % 4)
3838*4882a593Smuzhiyun return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
3839*4882a593Smuzhiyun
3840*4882a593Smuzhiyun grp->npins = size / 4;
3841*4882a593Smuzhiyun
3842*4882a593Smuzhiyun grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
3843*4882a593Smuzhiyun grp->data = devm_kcalloc(dev, grp->npins, sizeof(*grp->data), GFP_KERNEL);
3844*4882a593Smuzhiyun if (!grp->pins || !grp->data)
3845*4882a593Smuzhiyun return -ENOMEM;
3846*4882a593Smuzhiyun
3847*4882a593Smuzhiyun for (i = 0, j = 0; i < size; i += 4, j++) {
3848*4882a593Smuzhiyun const __be32 *phandle;
3849*4882a593Smuzhiyun struct device_node *np_config;
3850*4882a593Smuzhiyun
3851*4882a593Smuzhiyun num = be32_to_cpu(*list++);
3852*4882a593Smuzhiyun bank = bank_num_to_bank(info, num);
3853*4882a593Smuzhiyun if (IS_ERR(bank))
3854*4882a593Smuzhiyun return PTR_ERR(bank);
3855*4882a593Smuzhiyun
3856*4882a593Smuzhiyun grp->pins[j] = bank->pin_base + be32_to_cpu(*list++);
3857*4882a593Smuzhiyun grp->data[j].func = be32_to_cpu(*list++);
3858*4882a593Smuzhiyun
3859*4882a593Smuzhiyun phandle = list++;
3860*4882a593Smuzhiyun if (!phandle)
3861*4882a593Smuzhiyun return -EINVAL;
3862*4882a593Smuzhiyun
3863*4882a593Smuzhiyun np_config = of_find_node_by_phandle(be32_to_cpup(phandle));
3864*4882a593Smuzhiyun ret = pinconf_generic_parse_dt_config(np_config, NULL,
3865*4882a593Smuzhiyun &grp->data[j].configs, &grp->data[j].nconfigs);
3866*4882a593Smuzhiyun if (ret)
3867*4882a593Smuzhiyun return ret;
3868*4882a593Smuzhiyun }
3869*4882a593Smuzhiyun
3870*4882a593Smuzhiyun return 0;
3871*4882a593Smuzhiyun }
3872*4882a593Smuzhiyun
rockchip_pinctrl_parse_functions(struct device_node * np,struct rockchip_pinctrl * info,u32 index)3873*4882a593Smuzhiyun static int rockchip_pinctrl_parse_functions(struct device_node *np,
3874*4882a593Smuzhiyun struct rockchip_pinctrl *info,
3875*4882a593Smuzhiyun u32 index)
3876*4882a593Smuzhiyun {
3877*4882a593Smuzhiyun struct device *dev = info->dev;
3878*4882a593Smuzhiyun struct device_node *child;
3879*4882a593Smuzhiyun struct rockchip_pmx_func *func;
3880*4882a593Smuzhiyun struct rockchip_pin_group *grp;
3881*4882a593Smuzhiyun int ret;
3882*4882a593Smuzhiyun static u32 grp_index;
3883*4882a593Smuzhiyun u32 i = 0;
3884*4882a593Smuzhiyun
3885*4882a593Smuzhiyun dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
3886*4882a593Smuzhiyun
3887*4882a593Smuzhiyun func = &info->functions[index];
3888*4882a593Smuzhiyun
3889*4882a593Smuzhiyun /* Initialise function */
3890*4882a593Smuzhiyun func->name = np->name;
3891*4882a593Smuzhiyun func->ngroups = of_get_child_count(np);
3892*4882a593Smuzhiyun if (func->ngroups <= 0)
3893*4882a593Smuzhiyun return 0;
3894*4882a593Smuzhiyun
3895*4882a593Smuzhiyun func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
3896*4882a593Smuzhiyun if (!func->groups)
3897*4882a593Smuzhiyun return -ENOMEM;
3898*4882a593Smuzhiyun
3899*4882a593Smuzhiyun for_each_child_of_node(np, child) {
3900*4882a593Smuzhiyun func->groups[i] = child->name;
3901*4882a593Smuzhiyun grp = &info->groups[grp_index++];
3902*4882a593Smuzhiyun ret = rockchip_pinctrl_parse_groups(child, grp, info, i++);
3903*4882a593Smuzhiyun if (ret) {
3904*4882a593Smuzhiyun of_node_put(child);
3905*4882a593Smuzhiyun return ret;
3906*4882a593Smuzhiyun }
3907*4882a593Smuzhiyun }
3908*4882a593Smuzhiyun
3909*4882a593Smuzhiyun return 0;
3910*4882a593Smuzhiyun }
3911*4882a593Smuzhiyun
rockchip_pinctrl_parse_dt(struct platform_device * pdev,struct rockchip_pinctrl * info)3912*4882a593Smuzhiyun static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
3913*4882a593Smuzhiyun struct rockchip_pinctrl *info)
3914*4882a593Smuzhiyun {
3915*4882a593Smuzhiyun struct device *dev = &pdev->dev;
3916*4882a593Smuzhiyun struct device_node *np = dev->of_node;
3917*4882a593Smuzhiyun struct device_node *child;
3918*4882a593Smuzhiyun int ret;
3919*4882a593Smuzhiyun int i;
3920*4882a593Smuzhiyun
3921*4882a593Smuzhiyun rockchip_pinctrl_child_count(info, np);
3922*4882a593Smuzhiyun
3923*4882a593Smuzhiyun dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
3924*4882a593Smuzhiyun dev_dbg(dev, "ngroups = %d\n", info->ngroups);
3925*4882a593Smuzhiyun
3926*4882a593Smuzhiyun info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
3927*4882a593Smuzhiyun if (!info->functions)
3928*4882a593Smuzhiyun return -ENOMEM;
3929*4882a593Smuzhiyun
3930*4882a593Smuzhiyun info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
3931*4882a593Smuzhiyun if (!info->groups)
3932*4882a593Smuzhiyun return -ENOMEM;
3933*4882a593Smuzhiyun
3934*4882a593Smuzhiyun i = 0;
3935*4882a593Smuzhiyun
3936*4882a593Smuzhiyun for_each_child_of_node(np, child) {
3937*4882a593Smuzhiyun if (of_match_node(rockchip_bank_match, child))
3938*4882a593Smuzhiyun continue;
3939*4882a593Smuzhiyun
3940*4882a593Smuzhiyun ret = rockchip_pinctrl_parse_functions(child, info, i++);
3941*4882a593Smuzhiyun if (ret) {
3942*4882a593Smuzhiyun dev_err(dev, "failed to parse function\n");
3943*4882a593Smuzhiyun of_node_put(child);
3944*4882a593Smuzhiyun return ret;
3945*4882a593Smuzhiyun }
3946*4882a593Smuzhiyun }
3947*4882a593Smuzhiyun
3948*4882a593Smuzhiyun return 0;
3949*4882a593Smuzhiyun }
3950*4882a593Smuzhiyun
rockchip_pinctrl_register(struct platform_device * pdev,struct rockchip_pinctrl * info)3951*4882a593Smuzhiyun static int rockchip_pinctrl_register(struct platform_device *pdev,
3952*4882a593Smuzhiyun struct rockchip_pinctrl *info)
3953*4882a593Smuzhiyun {
3954*4882a593Smuzhiyun struct pinctrl_desc *ctrldesc = &info->pctl;
3955*4882a593Smuzhiyun struct pinctrl_pin_desc *pindesc, *pdesc;
3956*4882a593Smuzhiyun struct rockchip_pin_bank *pin_bank;
3957*4882a593Smuzhiyun struct device *dev = &pdev->dev;
3958*4882a593Smuzhiyun int pin, bank, ret;
3959*4882a593Smuzhiyun int k;
3960*4882a593Smuzhiyun
3961*4882a593Smuzhiyun ctrldesc->name = "rockchip-pinctrl";
3962*4882a593Smuzhiyun ctrldesc->owner = THIS_MODULE;
3963*4882a593Smuzhiyun ctrldesc->pctlops = &rockchip_pctrl_ops;
3964*4882a593Smuzhiyun ctrldesc->pmxops = &rockchip_pmx_ops;
3965*4882a593Smuzhiyun ctrldesc->confops = &rockchip_pinconf_ops;
3966*4882a593Smuzhiyun
3967*4882a593Smuzhiyun pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
3968*4882a593Smuzhiyun if (!pindesc)
3969*4882a593Smuzhiyun return -ENOMEM;
3970*4882a593Smuzhiyun
3971*4882a593Smuzhiyun ctrldesc->pins = pindesc;
3972*4882a593Smuzhiyun ctrldesc->npins = info->ctrl->nr_pins;
3973*4882a593Smuzhiyun
3974*4882a593Smuzhiyun pdesc = pindesc;
3975*4882a593Smuzhiyun for (bank = 0, k = 0; bank < info->ctrl->nr_banks; bank++) {
3976*4882a593Smuzhiyun pin_bank = &info->ctrl->pin_banks[bank];
3977*4882a593Smuzhiyun for (pin = 0; pin < pin_bank->nr_pins; pin++, k++) {
3978*4882a593Smuzhiyun pdesc->number = k;
3979*4882a593Smuzhiyun pdesc->name = kasprintf(GFP_KERNEL, "%s-%d",
3980*4882a593Smuzhiyun pin_bank->name, pin);
3981*4882a593Smuzhiyun pdesc++;
3982*4882a593Smuzhiyun }
3983*4882a593Smuzhiyun
3984*4882a593Smuzhiyun INIT_LIST_HEAD(&pin_bank->deferred_pins);
3985*4882a593Smuzhiyun mutex_init(&pin_bank->deferred_lock);
3986*4882a593Smuzhiyun }
3987*4882a593Smuzhiyun
3988*4882a593Smuzhiyun ret = rockchip_pinctrl_parse_dt(pdev, info);
3989*4882a593Smuzhiyun if (ret)
3990*4882a593Smuzhiyun return ret;
3991*4882a593Smuzhiyun
3992*4882a593Smuzhiyun info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
3993*4882a593Smuzhiyun if (IS_ERR(info->pctl_dev))
3994*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(info->pctl_dev), "could not register pinctrl driver\n");
3995*4882a593Smuzhiyun
3996*4882a593Smuzhiyun return 0;
3997*4882a593Smuzhiyun }
3998*4882a593Smuzhiyun
3999*4882a593Smuzhiyun static const struct of_device_id rockchip_pinctrl_dt_match[];
4000*4882a593Smuzhiyun static struct rockchip_pin_bank rk3308bs_pin_banks[];
4001*4882a593Smuzhiyun static struct rockchip_pin_bank px30s_pin_banks[];
4002*4882a593Smuzhiyun
4003*4882a593Smuzhiyun /* retrieve the soc specific data */
rockchip_pinctrl_get_soc_data(struct rockchip_pinctrl * d,struct platform_device * pdev)4004*4882a593Smuzhiyun static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
4005*4882a593Smuzhiyun struct rockchip_pinctrl *d,
4006*4882a593Smuzhiyun struct platform_device *pdev)
4007*4882a593Smuzhiyun {
4008*4882a593Smuzhiyun struct device *dev = &pdev->dev;
4009*4882a593Smuzhiyun struct device_node *node = dev->of_node;
4010*4882a593Smuzhiyun const struct of_device_id *match;
4011*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl;
4012*4882a593Smuzhiyun struct rockchip_pin_bank *bank;
4013*4882a593Smuzhiyun int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
4014*4882a593Smuzhiyun
4015*4882a593Smuzhiyun match = of_match_node(rockchip_pinctrl_dt_match, node);
4016*4882a593Smuzhiyun ctrl = (struct rockchip_pin_ctrl *)match->data;
4017*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_CPU_RK3308) && soc_is_rk3308bs())
4018*4882a593Smuzhiyun ctrl->pin_banks = rk3308bs_pin_banks;
4019*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_CPU_PX30) && soc_is_px30s())
4020*4882a593Smuzhiyun ctrl->pin_banks = px30s_pin_banks;
4021*4882a593Smuzhiyun
4022*4882a593Smuzhiyun grf_offs = ctrl->grf_mux_offset;
4023*4882a593Smuzhiyun pmu_offs = ctrl->pmu_mux_offset;
4024*4882a593Smuzhiyun drv_pmu_offs = ctrl->pmu_drv_offset;
4025*4882a593Smuzhiyun drv_grf_offs = ctrl->grf_drv_offset;
4026*4882a593Smuzhiyun bank = ctrl->pin_banks;
4027*4882a593Smuzhiyun for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
4028*4882a593Smuzhiyun int bank_pins = 0;
4029*4882a593Smuzhiyun
4030*4882a593Smuzhiyun raw_spin_lock_init(&bank->slock);
4031*4882a593Smuzhiyun bank->drvdata = d;
4032*4882a593Smuzhiyun bank->pin_base = ctrl->nr_pins;
4033*4882a593Smuzhiyun ctrl->nr_pins += bank->nr_pins;
4034*4882a593Smuzhiyun
4035*4882a593Smuzhiyun /* calculate iomux and drv offsets */
4036*4882a593Smuzhiyun for (j = 0; j < 4; j++) {
4037*4882a593Smuzhiyun struct rockchip_iomux *iom = &bank->iomux[j];
4038*4882a593Smuzhiyun struct rockchip_drv *drv = &bank->drv[j];
4039*4882a593Smuzhiyun int inc;
4040*4882a593Smuzhiyun
4041*4882a593Smuzhiyun if (bank_pins >= bank->nr_pins)
4042*4882a593Smuzhiyun break;
4043*4882a593Smuzhiyun
4044*4882a593Smuzhiyun /* preset iomux offset value, set new start value */
4045*4882a593Smuzhiyun if (iom->offset >= 0) {
4046*4882a593Smuzhiyun if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
4047*4882a593Smuzhiyun pmu_offs = iom->offset;
4048*4882a593Smuzhiyun else
4049*4882a593Smuzhiyun grf_offs = iom->offset;
4050*4882a593Smuzhiyun } else { /* set current iomux offset */
4051*4882a593Smuzhiyun iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
4052*4882a593Smuzhiyun (iom->type & IOMUX_L_SOURCE_PMU)) ?
4053*4882a593Smuzhiyun pmu_offs : grf_offs;
4054*4882a593Smuzhiyun }
4055*4882a593Smuzhiyun
4056*4882a593Smuzhiyun /* preset drv offset value, set new start value */
4057*4882a593Smuzhiyun if (drv->offset >= 0) {
4058*4882a593Smuzhiyun if (iom->type & IOMUX_SOURCE_PMU)
4059*4882a593Smuzhiyun drv_pmu_offs = drv->offset;
4060*4882a593Smuzhiyun else
4061*4882a593Smuzhiyun drv_grf_offs = drv->offset;
4062*4882a593Smuzhiyun } else { /* set current drv offset */
4063*4882a593Smuzhiyun drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
4064*4882a593Smuzhiyun drv_pmu_offs : drv_grf_offs;
4065*4882a593Smuzhiyun }
4066*4882a593Smuzhiyun
4067*4882a593Smuzhiyun dev_dbg(dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
4068*4882a593Smuzhiyun i, j, iom->offset, drv->offset);
4069*4882a593Smuzhiyun
4070*4882a593Smuzhiyun /*
4071*4882a593Smuzhiyun * Increase offset according to iomux width.
4072*4882a593Smuzhiyun * 4bit iomux'es are spread over two registers.
4073*4882a593Smuzhiyun */
4074*4882a593Smuzhiyun inc = (iom->type & (IOMUX_WIDTH_4BIT |
4075*4882a593Smuzhiyun IOMUX_WIDTH_3BIT |
4076*4882a593Smuzhiyun IOMUX_WIDTH_2BIT)) ? 8 : 4;
4077*4882a593Smuzhiyun if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
4078*4882a593Smuzhiyun pmu_offs += inc;
4079*4882a593Smuzhiyun else
4080*4882a593Smuzhiyun grf_offs += inc;
4081*4882a593Smuzhiyun
4082*4882a593Smuzhiyun /*
4083*4882a593Smuzhiyun * Increase offset according to drv width.
4084*4882a593Smuzhiyun * 3bit drive-strenth'es are spread over two registers.
4085*4882a593Smuzhiyun */
4086*4882a593Smuzhiyun if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
4087*4882a593Smuzhiyun (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
4088*4882a593Smuzhiyun inc = 8;
4089*4882a593Smuzhiyun else
4090*4882a593Smuzhiyun inc = 4;
4091*4882a593Smuzhiyun
4092*4882a593Smuzhiyun if (iom->type & IOMUX_SOURCE_PMU)
4093*4882a593Smuzhiyun drv_pmu_offs += inc;
4094*4882a593Smuzhiyun else
4095*4882a593Smuzhiyun drv_grf_offs += inc;
4096*4882a593Smuzhiyun
4097*4882a593Smuzhiyun bank_pins += 8;
4098*4882a593Smuzhiyun }
4099*4882a593Smuzhiyun
4100*4882a593Smuzhiyun /* calculate the per-bank recalced_mask */
4101*4882a593Smuzhiyun for (j = 0; j < ctrl->niomux_recalced; j++) {
4102*4882a593Smuzhiyun int pin = 0;
4103*4882a593Smuzhiyun
4104*4882a593Smuzhiyun if (ctrl->iomux_recalced[j].num == bank->bank_num) {
4105*4882a593Smuzhiyun pin = ctrl->iomux_recalced[j].pin;
4106*4882a593Smuzhiyun bank->recalced_mask |= BIT(pin);
4107*4882a593Smuzhiyun }
4108*4882a593Smuzhiyun }
4109*4882a593Smuzhiyun
4110*4882a593Smuzhiyun /* calculate the per-bank route_mask */
4111*4882a593Smuzhiyun for (j = 0; j < ctrl->niomux_routes; j++) {
4112*4882a593Smuzhiyun int pin = 0;
4113*4882a593Smuzhiyun
4114*4882a593Smuzhiyun if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
4115*4882a593Smuzhiyun pin = ctrl->iomux_routes[j].pin;
4116*4882a593Smuzhiyun bank->route_mask |= BIT(pin);
4117*4882a593Smuzhiyun }
4118*4882a593Smuzhiyun }
4119*4882a593Smuzhiyun }
4120*4882a593Smuzhiyun
4121*4882a593Smuzhiyun return ctrl;
4122*4882a593Smuzhiyun }
4123*4882a593Smuzhiyun
4124*4882a593Smuzhiyun #define RK3288_GRF_GPIO6C_IOMUX 0x64
4125*4882a593Smuzhiyun #define GPIO6C6_SEL_WRITE_ENABLE BIT(28)
4126*4882a593Smuzhiyun
4127*4882a593Smuzhiyun static u32 rk3288_grf_gpio6c_iomux;
4128*4882a593Smuzhiyun
rockchip_pinctrl_suspend(struct device * dev)4129*4882a593Smuzhiyun static int __maybe_unused rockchip_pinctrl_suspend(struct device *dev)
4130*4882a593Smuzhiyun {
4131*4882a593Smuzhiyun struct rockchip_pinctrl *info = dev_get_drvdata(dev);
4132*4882a593Smuzhiyun int ret = pinctrl_force_sleep(info->pctl_dev);
4133*4882a593Smuzhiyun
4134*4882a593Smuzhiyun if (ret)
4135*4882a593Smuzhiyun return ret;
4136*4882a593Smuzhiyun
4137*4882a593Smuzhiyun /*
4138*4882a593Smuzhiyun * RK3288 GPIO6_C6 mux would be modified by Maskrom when resume, so save
4139*4882a593Smuzhiyun * the setting here, and restore it at resume.
4140*4882a593Smuzhiyun */
4141*4882a593Smuzhiyun if (info->ctrl->type == RK3288) {
4142*4882a593Smuzhiyun ret = regmap_read(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX,
4143*4882a593Smuzhiyun &rk3288_grf_gpio6c_iomux);
4144*4882a593Smuzhiyun if (ret) {
4145*4882a593Smuzhiyun pinctrl_force_default(info->pctl_dev);
4146*4882a593Smuzhiyun return ret;
4147*4882a593Smuzhiyun }
4148*4882a593Smuzhiyun }
4149*4882a593Smuzhiyun
4150*4882a593Smuzhiyun return 0;
4151*4882a593Smuzhiyun }
4152*4882a593Smuzhiyun
rockchip_pinctrl_resume(struct device * dev)4153*4882a593Smuzhiyun static int __maybe_unused rockchip_pinctrl_resume(struct device *dev)
4154*4882a593Smuzhiyun {
4155*4882a593Smuzhiyun struct rockchip_pinctrl *info = dev_get_drvdata(dev);
4156*4882a593Smuzhiyun int ret;
4157*4882a593Smuzhiyun
4158*4882a593Smuzhiyun if (info->ctrl->type == RK3288) {
4159*4882a593Smuzhiyun ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX,
4160*4882a593Smuzhiyun rk3288_grf_gpio6c_iomux |
4161*4882a593Smuzhiyun GPIO6C6_SEL_WRITE_ENABLE);
4162*4882a593Smuzhiyun if (ret)
4163*4882a593Smuzhiyun return ret;
4164*4882a593Smuzhiyun }
4165*4882a593Smuzhiyun
4166*4882a593Smuzhiyun return pinctrl_force_default(info->pctl_dev);
4167*4882a593Smuzhiyun }
4168*4882a593Smuzhiyun
4169*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(rockchip_pinctrl_dev_pm_ops, rockchip_pinctrl_suspend,
4170*4882a593Smuzhiyun rockchip_pinctrl_resume);
4171*4882a593Smuzhiyun
4172*4882a593Smuzhiyun /* SoC data specially handle */
4173*4882a593Smuzhiyun
4174*4882a593Smuzhiyun /* rk3308 SoC data initialize */
4175*4882a593Smuzhiyun #define RK3308_GRF_SOC_CON13 0x608
4176*4882a593Smuzhiyun #define RK3308_GRF_SOC_CON15 0x610
4177*4882a593Smuzhiyun
4178*4882a593Smuzhiyun /* RK3308_GRF_SOC_CON13 */
4179*4882a593Smuzhiyun #define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
4180*4882a593Smuzhiyun #define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4181*4882a593Smuzhiyun #define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
4182*4882a593Smuzhiyun
4183*4882a593Smuzhiyun /* RK3308_GRF_SOC_CON15 */
4184*4882a593Smuzhiyun #define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
4185*4882a593Smuzhiyun #define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
4186*4882a593Smuzhiyun #define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
4187*4882a593Smuzhiyun
rk3308_soc_data_init(struct rockchip_pinctrl * info)4188*4882a593Smuzhiyun static int rk3308_soc_data_init(struct rockchip_pinctrl *info)
4189*4882a593Smuzhiyun {
4190*4882a593Smuzhiyun int ret;
4191*4882a593Smuzhiyun
4192*4882a593Smuzhiyun /*
4193*4882a593Smuzhiyun * Enable the special ctrl of selected sources.
4194*4882a593Smuzhiyun */
4195*4882a593Smuzhiyun
4196*4882a593Smuzhiyun ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13,
4197*4882a593Smuzhiyun RK3308_GRF_I2C3_IOFUNC_SRC_CTRL |
4198*4882a593Smuzhiyun RK3308_GRF_GPIO2A3_SEL_SRC_CTRL |
4199*4882a593Smuzhiyun RK3308_GRF_GPIO2A2_SEL_SRC_CTRL);
4200*4882a593Smuzhiyun if (ret)
4201*4882a593Smuzhiyun return ret;
4202*4882a593Smuzhiyun
4203*4882a593Smuzhiyun ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15,
4204*4882a593Smuzhiyun RK3308_GRF_GPIO2C0_SEL_SRC_CTRL |
4205*4882a593Smuzhiyun RK3308_GRF_GPIO3B3_SEL_SRC_CTRL |
4206*4882a593Smuzhiyun RK3308_GRF_GPIO3B2_SEL_SRC_CTRL);
4207*4882a593Smuzhiyun
4208*4882a593Smuzhiyun return ret;
4209*4882a593Smuzhiyun
4210*4882a593Smuzhiyun }
4211*4882a593Smuzhiyun
rockchip_pinctrl_probe(struct platform_device * pdev)4212*4882a593Smuzhiyun static int rockchip_pinctrl_probe(struct platform_device *pdev)
4213*4882a593Smuzhiyun {
4214*4882a593Smuzhiyun struct rockchip_pinctrl *info;
4215*4882a593Smuzhiyun struct device *dev = &pdev->dev;
4216*4882a593Smuzhiyun struct device_node *np = dev->of_node, *node;
4217*4882a593Smuzhiyun struct rockchip_pin_ctrl *ctrl;
4218*4882a593Smuzhiyun struct resource *res;
4219*4882a593Smuzhiyun void __iomem *base;
4220*4882a593Smuzhiyun int ret;
4221*4882a593Smuzhiyun
4222*4882a593Smuzhiyun if (!dev->of_node)
4223*4882a593Smuzhiyun return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
4224*4882a593Smuzhiyun
4225*4882a593Smuzhiyun info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
4226*4882a593Smuzhiyun if (!info)
4227*4882a593Smuzhiyun return -ENOMEM;
4228*4882a593Smuzhiyun
4229*4882a593Smuzhiyun info->dev = dev;
4230*4882a593Smuzhiyun
4231*4882a593Smuzhiyun ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
4232*4882a593Smuzhiyun if (!ctrl)
4233*4882a593Smuzhiyun return dev_err_probe(dev, -EINVAL, "driver data not available\n");
4234*4882a593Smuzhiyun info->ctrl = ctrl;
4235*4882a593Smuzhiyun
4236*4882a593Smuzhiyun node = of_parse_phandle(np, "rockchip,grf", 0);
4237*4882a593Smuzhiyun if (node) {
4238*4882a593Smuzhiyun info->regmap_base = syscon_node_to_regmap(node);
4239*4882a593Smuzhiyun of_node_put(node);
4240*4882a593Smuzhiyun if (IS_ERR(info->regmap_base))
4241*4882a593Smuzhiyun return PTR_ERR(info->regmap_base);
4242*4882a593Smuzhiyun } else {
4243*4882a593Smuzhiyun base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
4244*4882a593Smuzhiyun if (IS_ERR(base))
4245*4882a593Smuzhiyun return PTR_ERR(base);
4246*4882a593Smuzhiyun
4247*4882a593Smuzhiyun rockchip_regmap_config.max_register = resource_size(res) - 4;
4248*4882a593Smuzhiyun rockchip_regmap_config.name = "rockchip,pinctrl";
4249*4882a593Smuzhiyun info->regmap_base =
4250*4882a593Smuzhiyun devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
4251*4882a593Smuzhiyun
4252*4882a593Smuzhiyun /* to check for the old dt-bindings */
4253*4882a593Smuzhiyun info->reg_size = resource_size(res);
4254*4882a593Smuzhiyun
4255*4882a593Smuzhiyun /* Honor the old binding, with pull registers as 2nd resource */
4256*4882a593Smuzhiyun if (ctrl->type == RK3188 && info->reg_size < 0x200) {
4257*4882a593Smuzhiyun base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
4258*4882a593Smuzhiyun if (IS_ERR(base))
4259*4882a593Smuzhiyun return PTR_ERR(base);
4260*4882a593Smuzhiyun
4261*4882a593Smuzhiyun rockchip_regmap_config.max_register = resource_size(res) - 4;
4262*4882a593Smuzhiyun rockchip_regmap_config.name = "rockchip,pinctrl-pull";
4263*4882a593Smuzhiyun info->regmap_pull =
4264*4882a593Smuzhiyun devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
4265*4882a593Smuzhiyun }
4266*4882a593Smuzhiyun }
4267*4882a593Smuzhiyun
4268*4882a593Smuzhiyun /* try to find the optional reference to the pmu syscon */
4269*4882a593Smuzhiyun node = of_parse_phandle(np, "rockchip,pmu", 0);
4270*4882a593Smuzhiyun if (node) {
4271*4882a593Smuzhiyun info->regmap_pmu = syscon_node_to_regmap(node);
4272*4882a593Smuzhiyun of_node_put(node);
4273*4882a593Smuzhiyun if (IS_ERR(info->regmap_pmu))
4274*4882a593Smuzhiyun return PTR_ERR(info->regmap_pmu);
4275*4882a593Smuzhiyun }
4276*4882a593Smuzhiyun
4277*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_CPU_RK3308) && ctrl->type == RK3308) {
4278*4882a593Smuzhiyun ret = rk3308_soc_data_init(info);
4279*4882a593Smuzhiyun if (ret)
4280*4882a593Smuzhiyun return ret;
4281*4882a593Smuzhiyun }
4282*4882a593Smuzhiyun
4283*4882a593Smuzhiyun ret = rockchip_pinctrl_register(pdev, info);
4284*4882a593Smuzhiyun if (ret)
4285*4882a593Smuzhiyun return ret;
4286*4882a593Smuzhiyun
4287*4882a593Smuzhiyun platform_set_drvdata(pdev, info);
4288*4882a593Smuzhiyun g_pctldev = info->pctl_dev;
4289*4882a593Smuzhiyun
4290*4882a593Smuzhiyun ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
4291*4882a593Smuzhiyun if (ret)
4292*4882a593Smuzhiyun return dev_err_probe(dev, ret, "failed to register gpio device\n");
4293*4882a593Smuzhiyun
4294*4882a593Smuzhiyun dev_info(dev, "probed %s\n", dev_name(dev));
4295*4882a593Smuzhiyun
4296*4882a593Smuzhiyun return 0;
4297*4882a593Smuzhiyun }
4298*4882a593Smuzhiyun
rockchip_pinctrl_remove(struct platform_device * pdev)4299*4882a593Smuzhiyun static int rockchip_pinctrl_remove(struct platform_device *pdev)
4300*4882a593Smuzhiyun {
4301*4882a593Smuzhiyun struct rockchip_pinctrl *info = platform_get_drvdata(pdev);
4302*4882a593Smuzhiyun struct rockchip_pin_bank *bank;
4303*4882a593Smuzhiyun struct rockchip_pin_deferred *cfg;
4304*4882a593Smuzhiyun int i;
4305*4882a593Smuzhiyun
4306*4882a593Smuzhiyun g_pctldev = NULL;
4307*4882a593Smuzhiyun of_platform_depopulate(&pdev->dev);
4308*4882a593Smuzhiyun
4309*4882a593Smuzhiyun for (i = 0; i < info->ctrl->nr_banks; i++) {
4310*4882a593Smuzhiyun bank = &info->ctrl->pin_banks[i];
4311*4882a593Smuzhiyun
4312*4882a593Smuzhiyun mutex_lock(&bank->deferred_lock);
4313*4882a593Smuzhiyun while (!list_empty(&bank->deferred_pins)) {
4314*4882a593Smuzhiyun cfg = list_first_entry(&bank->deferred_pins,
4315*4882a593Smuzhiyun struct rockchip_pin_deferred, head);
4316*4882a593Smuzhiyun list_del(&cfg->head);
4317*4882a593Smuzhiyun kfree(cfg);
4318*4882a593Smuzhiyun }
4319*4882a593Smuzhiyun mutex_unlock(&bank->deferred_lock);
4320*4882a593Smuzhiyun }
4321*4882a593Smuzhiyun
4322*4882a593Smuzhiyun return 0;
4323*4882a593Smuzhiyun }
4324*4882a593Smuzhiyun
4325*4882a593Smuzhiyun static struct rockchip_pin_bank px30s_pin_banks[] __maybe_unused = {
4326*4882a593Smuzhiyun S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU, DRV_TYPE_IO_SMIC),
4327*4882a593Smuzhiyun S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4328*4882a593Smuzhiyun S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4329*4882a593Smuzhiyun S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, DRV_TYPE_IO_SMIC),
4330*4882a593Smuzhiyun };
4331*4882a593Smuzhiyun
4332*4882a593Smuzhiyun static struct rockchip_pin_bank px30_pin_banks[] = {
4333*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
4334*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4335*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4336*4882a593Smuzhiyun IOMUX_SOURCE_PMU
4337*4882a593Smuzhiyun ),
4338*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
4339*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4340*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4341*4882a593Smuzhiyun IOMUX_WIDTH_4BIT
4342*4882a593Smuzhiyun ),
4343*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
4344*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4345*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4346*4882a593Smuzhiyun IOMUX_WIDTH_4BIT
4347*4882a593Smuzhiyun ),
4348*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
4349*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4350*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4351*4882a593Smuzhiyun IOMUX_WIDTH_4BIT
4352*4882a593Smuzhiyun ),
4353*4882a593Smuzhiyun };
4354*4882a593Smuzhiyun
4355*4882a593Smuzhiyun static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
4356*4882a593Smuzhiyun .pin_banks = px30_pin_banks,
4357*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(px30_pin_banks),
4358*4882a593Smuzhiyun .label = "PX30-GPIO",
4359*4882a593Smuzhiyun .type = PX30,
4360*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4361*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4362*4882a593Smuzhiyun .iomux_routes = px30_mux_route_data,
4363*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(px30_mux_route_data),
4364*4882a593Smuzhiyun .pull_calc_reg = px30_calc_pull_reg_and_bit,
4365*4882a593Smuzhiyun .drv_calc_reg = px30_calc_drv_reg_and_bit,
4366*4882a593Smuzhiyun .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
4367*4882a593Smuzhiyun .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit,
4368*4882a593Smuzhiyun };
4369*4882a593Smuzhiyun
4370*4882a593Smuzhiyun static struct rockchip_pin_bank rv1106_pin_banks[] = {
4371*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
4372*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4373*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4374*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4375*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU),
4376*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4377*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4378*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4379*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4380*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4381*4882a593Smuzhiyun 0, 0x08, 0x10, 0x18),
4382*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4383*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4384*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4385*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4386*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4387*4882a593Smuzhiyun 0x10020, 0x10028, 0, 0),
4388*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4389*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4390*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4391*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4392*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4393*4882a593Smuzhiyun 0x20040, 0x20048, 0x20050, 0x20058),
4394*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(4, 24, "gpio4",
4395*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4396*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4397*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4398*4882a593Smuzhiyun 0,
4399*4882a593Smuzhiyun 0x30000, 0x30008, 0x30010, 0),
4400*4882a593Smuzhiyun };
4401*4882a593Smuzhiyun
4402*4882a593Smuzhiyun static struct rockchip_pin_ctrl rv1106_pin_ctrl __maybe_unused = {
4403*4882a593Smuzhiyun .pin_banks = rv1106_pin_banks,
4404*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rv1106_pin_banks),
4405*4882a593Smuzhiyun .label = "RV1106-GPIO",
4406*4882a593Smuzhiyun .type = RV1106,
4407*4882a593Smuzhiyun .pull_calc_reg = rv1106_calc_pull_reg_and_bit,
4408*4882a593Smuzhiyun .drv_calc_reg = rv1106_calc_drv_reg_and_bit,
4409*4882a593Smuzhiyun .schmitt_calc_reg = rv1106_calc_schmitt_reg_and_bit,
4410*4882a593Smuzhiyun };
4411*4882a593Smuzhiyun
4412*4882a593Smuzhiyun static struct rockchip_pin_bank rv1108_pin_banks[] = {
4413*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
4414*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4415*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4416*4882a593Smuzhiyun IOMUX_SOURCE_PMU),
4417*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
4418*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
4419*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
4420*4882a593Smuzhiyun };
4421*4882a593Smuzhiyun
4422*4882a593Smuzhiyun static struct rockchip_pin_ctrl rv1108_pin_ctrl __maybe_unused = {
4423*4882a593Smuzhiyun .pin_banks = rv1108_pin_banks,
4424*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rv1108_pin_banks),
4425*4882a593Smuzhiyun .label = "RV1108-GPIO",
4426*4882a593Smuzhiyun .type = RV1108,
4427*4882a593Smuzhiyun .grf_mux_offset = 0x10,
4428*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4429*4882a593Smuzhiyun .iomux_recalced = rv1108_mux_recalced_data,
4430*4882a593Smuzhiyun .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data),
4431*4882a593Smuzhiyun .pull_calc_reg = rv1108_calc_pull_reg_and_bit,
4432*4882a593Smuzhiyun .drv_calc_reg = rv1108_calc_drv_reg_and_bit,
4433*4882a593Smuzhiyun .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit,
4434*4882a593Smuzhiyun };
4435*4882a593Smuzhiyun
4436*4882a593Smuzhiyun static struct rockchip_pin_bank rv1126_pin_banks[] = {
4437*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
4438*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4439*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
4440*4882a593Smuzhiyun IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
4441*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4442*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4443*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4444*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4445*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4446*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4447*4882a593Smuzhiyun 0x10010, 0x10018, 0x10020, 0x10028),
4448*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
4449*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4450*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4451*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4452*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4453*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
4454*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4455*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4456*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4457*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4458*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
4459*4882a593Smuzhiyun IOMUX_WIDTH_4BIT, 0, 0, 0),
4460*4882a593Smuzhiyun };
4461*4882a593Smuzhiyun
4462*4882a593Smuzhiyun static struct rockchip_pin_ctrl rv1126_pin_ctrl __maybe_unused = {
4463*4882a593Smuzhiyun .pin_banks = rv1126_pin_banks,
4464*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rv1126_pin_banks),
4465*4882a593Smuzhiyun .label = "RV1126-GPIO",
4466*4882a593Smuzhiyun .type = RV1126,
4467*4882a593Smuzhiyun .grf_mux_offset = 0x10004, /* mux offset from GPIO0_D0 */
4468*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4469*4882a593Smuzhiyun .iomux_routes = rv1126_mux_route_data,
4470*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rv1126_mux_route_data),
4471*4882a593Smuzhiyun .iomux_recalced = rv1126_mux_recalced_data,
4472*4882a593Smuzhiyun .niomux_recalced = ARRAY_SIZE(rv1126_mux_recalced_data),
4473*4882a593Smuzhiyun .pull_calc_reg = rv1126_calc_pull_reg_and_bit,
4474*4882a593Smuzhiyun .drv_calc_reg = rv1126_calc_drv_reg_and_bit,
4475*4882a593Smuzhiyun .schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit,
4476*4882a593Smuzhiyun };
4477*4882a593Smuzhiyun
4478*4882a593Smuzhiyun static struct rockchip_pin_bank rk1808_pin_banks[] = {
4479*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
4480*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4481*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4482*4882a593Smuzhiyun IOMUX_SOURCE_PMU),
4483*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
4484*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4485*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4486*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4487*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
4488*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4489*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4490*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4491*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
4492*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4493*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4494*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4495*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
4496*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4497*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4498*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4499*4882a593Smuzhiyun };
4500*4882a593Smuzhiyun
4501*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk1808_pin_ctrl __maybe_unused = {
4502*4882a593Smuzhiyun .pin_banks = rk1808_pin_banks,
4503*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk1808_pin_banks),
4504*4882a593Smuzhiyun .label = "RK1808-GPIO",
4505*4882a593Smuzhiyun .type = RK1808,
4506*4882a593Smuzhiyun .iomux_routes = rk1808_mux_route_data,
4507*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data),
4508*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4509*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4510*4882a593Smuzhiyun .pull_calc_reg = rk1808_calc_pull_reg_and_bit,
4511*4882a593Smuzhiyun .drv_calc_reg = rk1808_calc_drv_reg_and_bit,
4512*4882a593Smuzhiyun .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit,
4513*4882a593Smuzhiyun .slew_rate_calc_reg = rk1808_calc_slew_rate_reg_and_bit,
4514*4882a593Smuzhiyun };
4515*4882a593Smuzhiyun
4516*4882a593Smuzhiyun static struct rockchip_pin_bank rk2928_pin_banks[] = {
4517*4882a593Smuzhiyun PIN_BANK(0, 32, "gpio0"),
4518*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4519*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4520*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4521*4882a593Smuzhiyun };
4522*4882a593Smuzhiyun
4523*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk2928_pin_ctrl __maybe_unused = {
4524*4882a593Smuzhiyun .pin_banks = rk2928_pin_banks,
4525*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk2928_pin_banks),
4526*4882a593Smuzhiyun .label = "RK2928-GPIO",
4527*4882a593Smuzhiyun .type = RK2928,
4528*4882a593Smuzhiyun .grf_mux_offset = 0xa8,
4529*4882a593Smuzhiyun .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
4530*4882a593Smuzhiyun };
4531*4882a593Smuzhiyun
4532*4882a593Smuzhiyun static struct rockchip_pin_bank rk3036_pin_banks[] = {
4533*4882a593Smuzhiyun PIN_BANK(0, 32, "gpio0"),
4534*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4535*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4536*4882a593Smuzhiyun };
4537*4882a593Smuzhiyun
4538*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3036_pin_ctrl __maybe_unused = {
4539*4882a593Smuzhiyun .pin_banks = rk3036_pin_banks,
4540*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3036_pin_banks),
4541*4882a593Smuzhiyun .label = "RK3036-GPIO",
4542*4882a593Smuzhiyun .type = RK2928,
4543*4882a593Smuzhiyun .grf_mux_offset = 0xa8,
4544*4882a593Smuzhiyun .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
4545*4882a593Smuzhiyun };
4546*4882a593Smuzhiyun
4547*4882a593Smuzhiyun static struct rockchip_pin_bank rk3066a_pin_banks[] = {
4548*4882a593Smuzhiyun PIN_BANK(0, 32, "gpio0"),
4549*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4550*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4551*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4552*4882a593Smuzhiyun PIN_BANK(4, 32, "gpio4"),
4553*4882a593Smuzhiyun PIN_BANK(6, 16, "gpio6"),
4554*4882a593Smuzhiyun };
4555*4882a593Smuzhiyun
4556*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3066a_pin_ctrl __maybe_unused = {
4557*4882a593Smuzhiyun .pin_banks = rk3066a_pin_banks,
4558*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3066a_pin_banks),
4559*4882a593Smuzhiyun .label = "RK3066a-GPIO",
4560*4882a593Smuzhiyun .type = RK2928,
4561*4882a593Smuzhiyun .grf_mux_offset = 0xa8,
4562*4882a593Smuzhiyun .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
4563*4882a593Smuzhiyun };
4564*4882a593Smuzhiyun
4565*4882a593Smuzhiyun static struct rockchip_pin_bank rk3066b_pin_banks[] = {
4566*4882a593Smuzhiyun PIN_BANK(0, 32, "gpio0"),
4567*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4568*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4569*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4570*4882a593Smuzhiyun };
4571*4882a593Smuzhiyun
4572*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3066b_pin_ctrl __maybe_unused = {
4573*4882a593Smuzhiyun .pin_banks = rk3066b_pin_banks,
4574*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3066b_pin_banks),
4575*4882a593Smuzhiyun .label = "RK3066b-GPIO",
4576*4882a593Smuzhiyun .type = RK3066B,
4577*4882a593Smuzhiyun .grf_mux_offset = 0x60,
4578*4882a593Smuzhiyun };
4579*4882a593Smuzhiyun
4580*4882a593Smuzhiyun static struct rockchip_pin_bank rk3128_pin_banks[] = {
4581*4882a593Smuzhiyun PIN_BANK(0, 32, "gpio0"),
4582*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4583*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4584*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4585*4882a593Smuzhiyun };
4586*4882a593Smuzhiyun
4587*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3128_pin_ctrl __maybe_unused = {
4588*4882a593Smuzhiyun .pin_banks = rk3128_pin_banks,
4589*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3128_pin_banks),
4590*4882a593Smuzhiyun .label = "RK3128-GPIO",
4591*4882a593Smuzhiyun .type = RK3128,
4592*4882a593Smuzhiyun .grf_mux_offset = 0xa8,
4593*4882a593Smuzhiyun .iomux_recalced = rk3128_mux_recalced_data,
4594*4882a593Smuzhiyun .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data),
4595*4882a593Smuzhiyun .iomux_routes = rk3128_mux_route_data,
4596*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data),
4597*4882a593Smuzhiyun .pull_calc_reg = rk3128_calc_pull_reg_and_bit,
4598*4882a593Smuzhiyun };
4599*4882a593Smuzhiyun
4600*4882a593Smuzhiyun static struct rockchip_pin_bank rk3188_pin_banks[] = {
4601*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
4602*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4603*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4604*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4605*4882a593Smuzhiyun };
4606*4882a593Smuzhiyun
4607*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3188_pin_ctrl __maybe_unused = {
4608*4882a593Smuzhiyun .pin_banks = rk3188_pin_banks,
4609*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3188_pin_banks),
4610*4882a593Smuzhiyun .label = "RK3188-GPIO",
4611*4882a593Smuzhiyun .type = RK3188,
4612*4882a593Smuzhiyun .grf_mux_offset = 0x60,
4613*4882a593Smuzhiyun .iomux_routes = rk3188_mux_route_data,
4614*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3188_mux_route_data),
4615*4882a593Smuzhiyun .pull_calc_reg = rk3188_calc_pull_reg_and_bit,
4616*4882a593Smuzhiyun };
4617*4882a593Smuzhiyun
4618*4882a593Smuzhiyun static struct rockchip_pin_bank rk3228_pin_banks[] = {
4619*4882a593Smuzhiyun PIN_BANK(0, 32, "gpio0"),
4620*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4621*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4622*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4623*4882a593Smuzhiyun };
4624*4882a593Smuzhiyun
4625*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3228_pin_ctrl __maybe_unused = {
4626*4882a593Smuzhiyun .pin_banks = rk3228_pin_banks,
4627*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3228_pin_banks),
4628*4882a593Smuzhiyun .label = "RK3228-GPIO",
4629*4882a593Smuzhiyun .type = RK3288,
4630*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4631*4882a593Smuzhiyun .iomux_routes = rk3228_mux_route_data,
4632*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data),
4633*4882a593Smuzhiyun .pull_calc_reg = rk3228_calc_pull_reg_and_bit,
4634*4882a593Smuzhiyun .drv_calc_reg = rk3228_calc_drv_reg_and_bit,
4635*4882a593Smuzhiyun };
4636*4882a593Smuzhiyun
4637*4882a593Smuzhiyun static struct rockchip_pin_bank rk3288_pin_banks[] = {
4638*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
4639*4882a593Smuzhiyun IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
4640*4882a593Smuzhiyun IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT,
4641*4882a593Smuzhiyun IOMUX_UNROUTED
4642*4882a593Smuzhiyun ),
4643*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
4644*4882a593Smuzhiyun IOMUX_UNROUTED,
4645*4882a593Smuzhiyun IOMUX_UNROUTED,
4646*4882a593Smuzhiyun 0
4647*4882a593Smuzhiyun ),
4648*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
4649*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
4650*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
4651*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4652*4882a593Smuzhiyun 0,
4653*4882a593Smuzhiyun 0
4654*4882a593Smuzhiyun ),
4655*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
4656*4882a593Smuzhiyun 0,
4657*4882a593Smuzhiyun 0,
4658*4882a593Smuzhiyun IOMUX_UNROUTED
4659*4882a593Smuzhiyun ),
4660*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
4661*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
4662*4882a593Smuzhiyun 0,
4663*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4664*4882a593Smuzhiyun IOMUX_UNROUTED
4665*4882a593Smuzhiyun ),
4666*4882a593Smuzhiyun PIN_BANK(8, 16, "gpio8"),
4667*4882a593Smuzhiyun };
4668*4882a593Smuzhiyun
4669*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3288_pin_ctrl __maybe_unused = {
4670*4882a593Smuzhiyun .pin_banks = rk3288_pin_banks,
4671*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3288_pin_banks),
4672*4882a593Smuzhiyun .label = "RK3288-GPIO",
4673*4882a593Smuzhiyun .type = RK3288,
4674*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4675*4882a593Smuzhiyun .pmu_mux_offset = 0x84,
4676*4882a593Smuzhiyun .iomux_routes = rk3288_mux_route_data,
4677*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data),
4678*4882a593Smuzhiyun .pull_calc_reg = rk3288_calc_pull_reg_and_bit,
4679*4882a593Smuzhiyun .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
4680*4882a593Smuzhiyun };
4681*4882a593Smuzhiyun
4682*4882a593Smuzhiyun static struct rockchip_pin_bank rk3308bs_pin_banks[] __maybe_unused = {
4683*4882a593Smuzhiyun S_PIN_BANK_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4684*4882a593Smuzhiyun S_PIN_BANK_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4685*4882a593Smuzhiyun S_PIN_BANK_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4686*4882a593Smuzhiyun S_PIN_BANK_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4687*4882a593Smuzhiyun S_PIN_BANK_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT, DRV_TYPE_IO_SMIC),
4688*4882a593Smuzhiyun };
4689*4882a593Smuzhiyun
4690*4882a593Smuzhiyun static struct rockchip_pin_bank rk3308_pin_banks[] = {
4691*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
4692*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4693*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4694*4882a593Smuzhiyun IOMUX_WIDTH_2BIT),
4695*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT,
4696*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4697*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4698*4882a593Smuzhiyun IOMUX_WIDTH_2BIT),
4699*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT,
4700*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4701*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4702*4882a593Smuzhiyun IOMUX_WIDTH_2BIT),
4703*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT,
4704*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4705*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4706*4882a593Smuzhiyun IOMUX_WIDTH_2BIT),
4707*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT,
4708*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4709*4882a593Smuzhiyun IOMUX_WIDTH_2BIT,
4710*4882a593Smuzhiyun IOMUX_WIDTH_2BIT),
4711*4882a593Smuzhiyun };
4712*4882a593Smuzhiyun
4713*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3308_pin_ctrl __maybe_unused = {
4714*4882a593Smuzhiyun .pin_banks = rk3308_pin_banks,
4715*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3308_pin_banks),
4716*4882a593Smuzhiyun .label = "RK3308-GPIO",
4717*4882a593Smuzhiyun .type = RK3308,
4718*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4719*4882a593Smuzhiyun .iomux_recalced = rk3308_mux_recalced_data,
4720*4882a593Smuzhiyun .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
4721*4882a593Smuzhiyun .iomux_routes = rk3308_mux_route_data,
4722*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data),
4723*4882a593Smuzhiyun .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
4724*4882a593Smuzhiyun .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
4725*4882a593Smuzhiyun .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
4726*4882a593Smuzhiyun .slew_rate_calc_reg = rk3308_calc_slew_rate_reg_and_bit,
4727*4882a593Smuzhiyun };
4728*4882a593Smuzhiyun
4729*4882a593Smuzhiyun static struct rockchip_pin_bank rk3328_pin_banks[] = {
4730*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
4731*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
4732*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
4733*4882a593Smuzhiyun IOMUX_WIDTH_3BIT,
4734*4882a593Smuzhiyun IOMUX_WIDTH_3BIT,
4735*4882a593Smuzhiyun 0),
4736*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
4737*4882a593Smuzhiyun IOMUX_WIDTH_3BIT,
4738*4882a593Smuzhiyun IOMUX_WIDTH_3BIT,
4739*4882a593Smuzhiyun 0,
4740*4882a593Smuzhiyun 0),
4741*4882a593Smuzhiyun };
4742*4882a593Smuzhiyun
4743*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3328_pin_ctrl __maybe_unused = {
4744*4882a593Smuzhiyun .pin_banks = rk3328_pin_banks,
4745*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3328_pin_banks),
4746*4882a593Smuzhiyun .label = "RK3328-GPIO",
4747*4882a593Smuzhiyun .type = RK3288,
4748*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4749*4882a593Smuzhiyun .iomux_recalced = rk3328_mux_recalced_data,
4750*4882a593Smuzhiyun .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data),
4751*4882a593Smuzhiyun .iomux_routes = rk3328_mux_route_data,
4752*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data),
4753*4882a593Smuzhiyun .pull_calc_reg = rk3228_calc_pull_reg_and_bit,
4754*4882a593Smuzhiyun .drv_calc_reg = rk3228_calc_drv_reg_and_bit,
4755*4882a593Smuzhiyun .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit,
4756*4882a593Smuzhiyun };
4757*4882a593Smuzhiyun
4758*4882a593Smuzhiyun static struct rockchip_pin_bank rk3368_pin_banks[] = {
4759*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
4760*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4761*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4762*4882a593Smuzhiyun IOMUX_SOURCE_PMU
4763*4882a593Smuzhiyun ),
4764*4882a593Smuzhiyun PIN_BANK(1, 32, "gpio1"),
4765*4882a593Smuzhiyun PIN_BANK(2, 32, "gpio2"),
4766*4882a593Smuzhiyun PIN_BANK(3, 32, "gpio3"),
4767*4882a593Smuzhiyun };
4768*4882a593Smuzhiyun
4769*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3368_pin_ctrl __maybe_unused = {
4770*4882a593Smuzhiyun .pin_banks = rk3368_pin_banks,
4771*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3368_pin_banks),
4772*4882a593Smuzhiyun .label = "RK3368-GPIO",
4773*4882a593Smuzhiyun .type = RK3368,
4774*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4775*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4776*4882a593Smuzhiyun .pull_calc_reg = rk3368_calc_pull_reg_and_bit,
4777*4882a593Smuzhiyun .drv_calc_reg = rk3368_calc_drv_reg_and_bit,
4778*4882a593Smuzhiyun };
4779*4882a593Smuzhiyun
4780*4882a593Smuzhiyun static struct rockchip_pin_bank rk3399_pin_banks[] = {
4781*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
4782*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4783*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4784*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4785*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4786*4882a593Smuzhiyun DRV_TYPE_IO_1V8_ONLY,
4787*4882a593Smuzhiyun DRV_TYPE_IO_1V8_ONLY,
4788*4882a593Smuzhiyun DRV_TYPE_IO_DEFAULT,
4789*4882a593Smuzhiyun DRV_TYPE_IO_DEFAULT,
4790*4882a593Smuzhiyun 0x80,
4791*4882a593Smuzhiyun 0x88,
4792*4882a593Smuzhiyun -1,
4793*4882a593Smuzhiyun -1,
4794*4882a593Smuzhiyun PULL_TYPE_IO_1V8_ONLY,
4795*4882a593Smuzhiyun PULL_TYPE_IO_1V8_ONLY,
4796*4882a593Smuzhiyun PULL_TYPE_IO_DEFAULT,
4797*4882a593Smuzhiyun PULL_TYPE_IO_DEFAULT
4798*4882a593Smuzhiyun ),
4799*4882a593Smuzhiyun PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
4800*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4801*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4802*4882a593Smuzhiyun IOMUX_SOURCE_PMU,
4803*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0,
4804*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0,
4805*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0,
4806*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0,
4807*4882a593Smuzhiyun 0xa0,
4808*4882a593Smuzhiyun 0xa8,
4809*4882a593Smuzhiyun 0xb0,
4810*4882a593Smuzhiyun 0xb8
4811*4882a593Smuzhiyun ),
4812*4882a593Smuzhiyun PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
4813*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0,
4814*4882a593Smuzhiyun DRV_TYPE_IO_1V8_ONLY,
4815*4882a593Smuzhiyun DRV_TYPE_IO_1V8_ONLY,
4816*4882a593Smuzhiyun PULL_TYPE_IO_DEFAULT,
4817*4882a593Smuzhiyun PULL_TYPE_IO_DEFAULT,
4818*4882a593Smuzhiyun PULL_TYPE_IO_1V8_ONLY,
4819*4882a593Smuzhiyun PULL_TYPE_IO_1V8_ONLY
4820*4882a593Smuzhiyun ),
4821*4882a593Smuzhiyun PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
4822*4882a593Smuzhiyun DRV_TYPE_IO_3V3_ONLY,
4823*4882a593Smuzhiyun DRV_TYPE_IO_3V3_ONLY,
4824*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0
4825*4882a593Smuzhiyun ),
4826*4882a593Smuzhiyun PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
4827*4882a593Smuzhiyun DRV_TYPE_IO_1V8_3V0_AUTO,
4828*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0,
4829*4882a593Smuzhiyun DRV_TYPE_IO_1V8_OR_3V0
4830*4882a593Smuzhiyun ),
4831*4882a593Smuzhiyun };
4832*4882a593Smuzhiyun
4833*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3399_pin_ctrl __maybe_unused = {
4834*4882a593Smuzhiyun .pin_banks = rk3399_pin_banks,
4835*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3399_pin_banks),
4836*4882a593Smuzhiyun .label = "RK3399-GPIO",
4837*4882a593Smuzhiyun .type = RK3399,
4838*4882a593Smuzhiyun .grf_mux_offset = 0xe000,
4839*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4840*4882a593Smuzhiyun .grf_drv_offset = 0xe100,
4841*4882a593Smuzhiyun .pmu_drv_offset = 0x80,
4842*4882a593Smuzhiyun .iomux_routes = rk3399_mux_route_data,
4843*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data),
4844*4882a593Smuzhiyun .pull_calc_reg = rk3399_calc_pull_reg_and_bit,
4845*4882a593Smuzhiyun .drv_calc_reg = rk3399_calc_drv_reg_and_bit,
4846*4882a593Smuzhiyun };
4847*4882a593Smuzhiyun
4848*4882a593Smuzhiyun static struct rockchip_pin_bank rk3528_pin_banks[] = {
4849*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4850*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4851*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4852*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4853*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4854*4882a593Smuzhiyun 0, 0, 0, 0),
4855*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4856*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4857*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4858*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4859*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4860*4882a593Smuzhiyun 0x20020, 0x20028, 0x20030, 0x20038),
4861*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4862*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4863*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4864*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4865*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4866*4882a593Smuzhiyun 0x30040, 0, 0, 0),
4867*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4868*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4869*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4870*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4871*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4872*4882a593Smuzhiyun 0x20060, 0x20068, 0x20070, 0),
4873*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4",
4874*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4875*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4876*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4877*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4878*4882a593Smuzhiyun 0x10080, 0x10088, 0x10090, 0x10098),
4879*4882a593Smuzhiyun };
4880*4882a593Smuzhiyun
4881*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3528_pin_ctrl __maybe_unused = {
4882*4882a593Smuzhiyun .pin_banks = rk3528_pin_banks,
4883*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3528_pin_banks),
4884*4882a593Smuzhiyun .label = "RK3528-GPIO",
4885*4882a593Smuzhiyun .type = RK3528,
4886*4882a593Smuzhiyun .pull_calc_reg = rk3528_calc_pull_reg_and_bit,
4887*4882a593Smuzhiyun .drv_calc_reg = rk3528_calc_drv_reg_and_bit,
4888*4882a593Smuzhiyun .schmitt_calc_reg = rk3528_calc_schmitt_reg_and_bit,
4889*4882a593Smuzhiyun };
4890*4882a593Smuzhiyun
4891*4882a593Smuzhiyun static struct rockchip_pin_bank rk3562_pin_banks[] = {
4892*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
4893*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4894*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4895*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4896*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4897*4882a593Smuzhiyun 0x20000, 0x20008, 0x20010, 0x20018),
4898*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
4899*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4900*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4901*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4902*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4903*4882a593Smuzhiyun 0, 0x08, 0x10, 0x18),
4904*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
4905*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4906*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4907*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4908*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4909*4882a593Smuzhiyun 0x20, 0, 0, 0),
4910*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
4911*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4912*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4913*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4914*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4915*4882a593Smuzhiyun 0x10040, 0x10048, 0x10050, 0x10058),
4916*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
4917*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4918*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4919*4882a593Smuzhiyun 0,
4920*4882a593Smuzhiyun 0,
4921*4882a593Smuzhiyun 0x10060, 0x10068, 0, 0),
4922*4882a593Smuzhiyun };
4923*4882a593Smuzhiyun
4924*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = {
4925*4882a593Smuzhiyun .pin_banks = rk3562_pin_banks,
4926*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3562_pin_banks),
4927*4882a593Smuzhiyun .label = "RK3562-GPIO",
4928*4882a593Smuzhiyun .type = RK3562,
4929*4882a593Smuzhiyun .pull_calc_reg = rk3562_calc_pull_reg_and_bit,
4930*4882a593Smuzhiyun .drv_calc_reg = rk3562_calc_drv_reg_and_bit,
4931*4882a593Smuzhiyun .schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit,
4932*4882a593Smuzhiyun };
4933*4882a593Smuzhiyun
4934*4882a593Smuzhiyun static struct rockchip_pin_bank rk3568_pin_banks[] = {
4935*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
4936*4882a593Smuzhiyun IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
4937*4882a593Smuzhiyun IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
4938*4882a593Smuzhiyun IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT),
4939*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
4940*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4941*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4942*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4943*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
4944*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4945*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4946*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4947*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
4948*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4949*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4950*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4951*4882a593Smuzhiyun PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
4952*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4953*4882a593Smuzhiyun IOMUX_WIDTH_4BIT,
4954*4882a593Smuzhiyun IOMUX_WIDTH_4BIT),
4955*4882a593Smuzhiyun };
4956*4882a593Smuzhiyun
4957*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3568_pin_ctrl __maybe_unused = {
4958*4882a593Smuzhiyun .pin_banks = rk3568_pin_banks,
4959*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3568_pin_banks),
4960*4882a593Smuzhiyun .label = "RK3568-GPIO",
4961*4882a593Smuzhiyun .type = RK3568,
4962*4882a593Smuzhiyun .grf_mux_offset = 0x0,
4963*4882a593Smuzhiyun .pmu_mux_offset = 0x0,
4964*4882a593Smuzhiyun .grf_drv_offset = 0x0200,
4965*4882a593Smuzhiyun .pmu_drv_offset = 0x0070,
4966*4882a593Smuzhiyun .iomux_routes = rk3568_mux_route_data,
4967*4882a593Smuzhiyun .niomux_routes = ARRAY_SIZE(rk3568_mux_route_data),
4968*4882a593Smuzhiyun .pull_calc_reg = rk3568_calc_pull_reg_and_bit,
4969*4882a593Smuzhiyun .drv_calc_reg = rk3568_calc_drv_reg_and_bit,
4970*4882a593Smuzhiyun .slew_rate_calc_reg = rk3568_calc_slew_rate_reg_and_bit,
4971*4882a593Smuzhiyun .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
4972*4882a593Smuzhiyun };
4973*4882a593Smuzhiyun
4974*4882a593Smuzhiyun static struct rockchip_pin_bank rk3588_pin_banks[] = {
4975*4882a593Smuzhiyun RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
4976*4882a593Smuzhiyun IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4977*4882a593Smuzhiyun RK3588_PIN_BANK_FLAGS(1, 32, "gpio1",
4978*4882a593Smuzhiyun IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4979*4882a593Smuzhiyun RK3588_PIN_BANK_FLAGS(2, 32, "gpio2",
4980*4882a593Smuzhiyun IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4981*4882a593Smuzhiyun RK3588_PIN_BANK_FLAGS(3, 32, "gpio3",
4982*4882a593Smuzhiyun IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4983*4882a593Smuzhiyun RK3588_PIN_BANK_FLAGS(4, 32, "gpio4",
4984*4882a593Smuzhiyun IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
4985*4882a593Smuzhiyun };
4986*4882a593Smuzhiyun
4987*4882a593Smuzhiyun static struct rockchip_pin_ctrl rk3588_pin_ctrl __maybe_unused = {
4988*4882a593Smuzhiyun .pin_banks = rk3588_pin_banks,
4989*4882a593Smuzhiyun .nr_banks = ARRAY_SIZE(rk3588_pin_banks),
4990*4882a593Smuzhiyun .label = "RK3588-GPIO",
4991*4882a593Smuzhiyun .type = RK3588,
4992*4882a593Smuzhiyun .pull_calc_reg = rk3588_calc_pull_reg_and_bit,
4993*4882a593Smuzhiyun .drv_calc_reg = rk3588_calc_drv_reg_and_bit,
4994*4882a593Smuzhiyun .schmitt_calc_reg = rk3588_calc_schmitt_reg_and_bit,
4995*4882a593Smuzhiyun };
4996*4882a593Smuzhiyun
4997*4882a593Smuzhiyun static const struct of_device_id rockchip_pinctrl_dt_match[] = {
4998*4882a593Smuzhiyun #ifdef CONFIG_CPU_PX30
4999*4882a593Smuzhiyun { .compatible = "rockchip,px30-pinctrl",
5000*4882a593Smuzhiyun .data = &px30_pin_ctrl },
5001*4882a593Smuzhiyun #endif
5002*4882a593Smuzhiyun #ifdef CONFIG_CPU_RV1106
5003*4882a593Smuzhiyun { .compatible = "rockchip,rv1106-pinctrl",
5004*4882a593Smuzhiyun .data = &rv1106_pin_ctrl },
5005*4882a593Smuzhiyun #endif
5006*4882a593Smuzhiyun #ifdef CONFIG_CPU_RV1108
5007*4882a593Smuzhiyun { .compatible = "rockchip,rv1108-pinctrl",
5008*4882a593Smuzhiyun .data = &rv1108_pin_ctrl },
5009*4882a593Smuzhiyun #endif
5010*4882a593Smuzhiyun #ifdef CONFIG_CPU_RV1126
5011*4882a593Smuzhiyun { .compatible = "rockchip,rv1126-pinctrl",
5012*4882a593Smuzhiyun .data = &rv1126_pin_ctrl },
5013*4882a593Smuzhiyun #endif
5014*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK1808
5015*4882a593Smuzhiyun { .compatible = "rockchip,rk1808-pinctrl",
5016*4882a593Smuzhiyun .data = &rk1808_pin_ctrl },
5017*4882a593Smuzhiyun #endif
5018*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK2928
5019*4882a593Smuzhiyun { .compatible = "rockchip,rk2928-pinctrl",
5020*4882a593Smuzhiyun .data = &rk2928_pin_ctrl },
5021*4882a593Smuzhiyun #endif
5022*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3036
5023*4882a593Smuzhiyun { .compatible = "rockchip,rk3036-pinctrl",
5024*4882a593Smuzhiyun .data = &rk3036_pin_ctrl },
5025*4882a593Smuzhiyun #endif
5026*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK30XX
5027*4882a593Smuzhiyun { .compatible = "rockchip,rk3066a-pinctrl",
5028*4882a593Smuzhiyun .data = &rk3066a_pin_ctrl },
5029*4882a593Smuzhiyun { .compatible = "rockchip,rk3066b-pinctrl",
5030*4882a593Smuzhiyun .data = &rk3066b_pin_ctrl },
5031*4882a593Smuzhiyun #endif
5032*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK312X
5033*4882a593Smuzhiyun { .compatible = "rockchip,rk3128-pinctrl",
5034*4882a593Smuzhiyun .data = (void *)&rk3128_pin_ctrl },
5035*4882a593Smuzhiyun #endif
5036*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3188
5037*4882a593Smuzhiyun { .compatible = "rockchip,rk3188-pinctrl",
5038*4882a593Smuzhiyun .data = &rk3188_pin_ctrl },
5039*4882a593Smuzhiyun #endif
5040*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK322X
5041*4882a593Smuzhiyun { .compatible = "rockchip,rk3228-pinctrl",
5042*4882a593Smuzhiyun .data = &rk3228_pin_ctrl },
5043*4882a593Smuzhiyun #endif
5044*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3288
5045*4882a593Smuzhiyun { .compatible = "rockchip,rk3288-pinctrl",
5046*4882a593Smuzhiyun .data = &rk3288_pin_ctrl },
5047*4882a593Smuzhiyun #endif
5048*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3308
5049*4882a593Smuzhiyun { .compatible = "rockchip,rk3308-pinctrl",
5050*4882a593Smuzhiyun .data = &rk3308_pin_ctrl },
5051*4882a593Smuzhiyun #endif
5052*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3328
5053*4882a593Smuzhiyun { .compatible = "rockchip,rk3328-pinctrl",
5054*4882a593Smuzhiyun .data = &rk3328_pin_ctrl },
5055*4882a593Smuzhiyun #endif
5056*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3368
5057*4882a593Smuzhiyun { .compatible = "rockchip,rk3368-pinctrl",
5058*4882a593Smuzhiyun .data = &rk3368_pin_ctrl },
5059*4882a593Smuzhiyun #endif
5060*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3399
5061*4882a593Smuzhiyun { .compatible = "rockchip,rk3399-pinctrl",
5062*4882a593Smuzhiyun .data = &rk3399_pin_ctrl },
5063*4882a593Smuzhiyun #endif
5064*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3528
5065*4882a593Smuzhiyun { .compatible = "rockchip,rk3528-pinctrl",
5066*4882a593Smuzhiyun .data = &rk3528_pin_ctrl },
5067*4882a593Smuzhiyun #endif
5068*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3562
5069*4882a593Smuzhiyun { .compatible = "rockchip,rk3562-pinctrl",
5070*4882a593Smuzhiyun .data = &rk3562_pin_ctrl },
5071*4882a593Smuzhiyun #endif
5072*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3568
5073*4882a593Smuzhiyun { .compatible = "rockchip,rk3568-pinctrl",
5074*4882a593Smuzhiyun .data = &rk3568_pin_ctrl },
5075*4882a593Smuzhiyun #endif
5076*4882a593Smuzhiyun #ifdef CONFIG_CPU_RK3588
5077*4882a593Smuzhiyun { .compatible = "rockchip,rk3588-pinctrl",
5078*4882a593Smuzhiyun .data = &rk3588_pin_ctrl },
5079*4882a593Smuzhiyun #endif
5080*4882a593Smuzhiyun {},
5081*4882a593Smuzhiyun };
5082*4882a593Smuzhiyun
5083*4882a593Smuzhiyun static struct platform_driver rockchip_pinctrl_driver = {
5084*4882a593Smuzhiyun .probe = rockchip_pinctrl_probe,
5085*4882a593Smuzhiyun .remove = rockchip_pinctrl_remove,
5086*4882a593Smuzhiyun .driver = {
5087*4882a593Smuzhiyun .name = "rockchip-pinctrl",
5088*4882a593Smuzhiyun .pm = &rockchip_pinctrl_dev_pm_ops,
5089*4882a593Smuzhiyun .of_match_table = rockchip_pinctrl_dt_match,
5090*4882a593Smuzhiyun },
5091*4882a593Smuzhiyun };
5092*4882a593Smuzhiyun
rockchip_pinctrl_drv_register(void)5093*4882a593Smuzhiyun static int __init rockchip_pinctrl_drv_register(void)
5094*4882a593Smuzhiyun {
5095*4882a593Smuzhiyun return platform_driver_register(&rockchip_pinctrl_driver);
5096*4882a593Smuzhiyun }
5097*4882a593Smuzhiyun postcore_initcall(rockchip_pinctrl_drv_register);
5098*4882a593Smuzhiyun
rockchip_pinctrl_drv_unregister(void)5099*4882a593Smuzhiyun static void __exit rockchip_pinctrl_drv_unregister(void)
5100*4882a593Smuzhiyun {
5101*4882a593Smuzhiyun platform_driver_unregister(&rockchip_pinctrl_driver);
5102*4882a593Smuzhiyun }
5103*4882a593Smuzhiyun module_exit(rockchip_pinctrl_drv_unregister);
5104*4882a593Smuzhiyun
5105*4882a593Smuzhiyun /**
5106*4882a593Smuzhiyun * rk_iomux_set - set the rockchip iomux by pin number.
5107*4882a593Smuzhiyun *
5108*4882a593Smuzhiyun * @bank: the gpio bank index, from 0 to the max bank num.
5109*4882a593Smuzhiyun * @pin: the gpio pin index, from 0 to 31.
5110*4882a593Smuzhiyun * @mux: the pointer to store mux value.
5111*4882a593Smuzhiyun *
5112*4882a593Smuzhiyun * Return 0 if set success, else return error code.
5113*4882a593Smuzhiyun */
rk_iomux_set(int bank,int pin,int mux)5114*4882a593Smuzhiyun int rk_iomux_set(int bank, int pin, int mux)
5115*4882a593Smuzhiyun {
5116*4882a593Smuzhiyun struct pinctrl_dev *pctldev = g_pctldev;
5117*4882a593Smuzhiyun struct rockchip_pinctrl *info;
5118*4882a593Smuzhiyun struct rockchip_pin_bank *gpio;
5119*4882a593Smuzhiyun struct rockchip_pin_group *grp = NULL;
5120*4882a593Smuzhiyun struct rockchip_pin_config *cfg = NULL;
5121*4882a593Smuzhiyun int i, j, ret;
5122*4882a593Smuzhiyun
5123*4882a593Smuzhiyun if (!g_pctldev)
5124*4882a593Smuzhiyun return -ENODEV;
5125*4882a593Smuzhiyun
5126*4882a593Smuzhiyun info = pinctrl_dev_get_drvdata(pctldev);
5127*4882a593Smuzhiyun if (bank >= info->ctrl->nr_banks)
5128*4882a593Smuzhiyun return -EINVAL;
5129*4882a593Smuzhiyun
5130*4882a593Smuzhiyun if (pin > 31 || pin < 0)
5131*4882a593Smuzhiyun return -EINVAL;
5132*4882a593Smuzhiyun
5133*4882a593Smuzhiyun gpio = &info->ctrl->pin_banks[bank];
5134*4882a593Smuzhiyun
5135*4882a593Smuzhiyun mutex_lock(&iomux_lock);
5136*4882a593Smuzhiyun for (i = 0; i < info->ngroups; i++) {
5137*4882a593Smuzhiyun grp = &info->groups[i];
5138*4882a593Smuzhiyun for (j = 0; j < grp->npins; i++) {
5139*4882a593Smuzhiyun if (grp->pins[i] == (gpio->pin_base + pin)) {
5140*4882a593Smuzhiyun cfg = grp->data;
5141*4882a593Smuzhiyun break;
5142*4882a593Smuzhiyun }
5143*4882a593Smuzhiyun }
5144*4882a593Smuzhiyun }
5145*4882a593Smuzhiyun
5146*4882a593Smuzhiyun ret = rockchip_set_mux(gpio, pin, mux);
5147*4882a593Smuzhiyun if (ret) {
5148*4882a593Smuzhiyun dev_err(info->dev, "mux GPIO%d-%d %d fail\n", bank, pin, mux);
5149*4882a593Smuzhiyun goto out;
5150*4882a593Smuzhiyun }
5151*4882a593Smuzhiyun
5152*4882a593Smuzhiyun if (cfg && (cfg->func != mux))
5153*4882a593Smuzhiyun cfg->func = mux;
5154*4882a593Smuzhiyun
5155*4882a593Smuzhiyun out:
5156*4882a593Smuzhiyun mutex_unlock(&iomux_lock);
5157*4882a593Smuzhiyun
5158*4882a593Smuzhiyun return ret;
5159*4882a593Smuzhiyun }
5160*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rk_iomux_set);
5161*4882a593Smuzhiyun
5162*4882a593Smuzhiyun /**
5163*4882a593Smuzhiyun * rk_iomux_get - get the rockchip iomux by pin number.
5164*4882a593Smuzhiyun *
5165*4882a593Smuzhiyun * @bank: the gpio bank index, from 0 to the max bank num.
5166*4882a593Smuzhiyun * @pin: the gpio pin index, from 0 to 31.
5167*4882a593Smuzhiyun * @mux: the pointer to store mux value.
5168*4882a593Smuzhiyun *
5169*4882a593Smuzhiyun * Return 0 if get success, else return error code.
5170*4882a593Smuzhiyun */
rk_iomux_get(int bank,int pin,int * mux)5171*4882a593Smuzhiyun int rk_iomux_get(int bank, int pin, int *mux)
5172*4882a593Smuzhiyun {
5173*4882a593Smuzhiyun struct pinctrl_dev *pctldev = g_pctldev;
5174*4882a593Smuzhiyun struct rockchip_pinctrl *info;
5175*4882a593Smuzhiyun struct rockchip_pin_bank *gpio;
5176*4882a593Smuzhiyun int ret;
5177*4882a593Smuzhiyun
5178*4882a593Smuzhiyun if (!g_pctldev)
5179*4882a593Smuzhiyun return -ENODEV;
5180*4882a593Smuzhiyun if (!mux)
5181*4882a593Smuzhiyun return -EINVAL;
5182*4882a593Smuzhiyun
5183*4882a593Smuzhiyun info = pinctrl_dev_get_drvdata(pctldev);
5184*4882a593Smuzhiyun if (bank >= info->ctrl->nr_banks)
5185*4882a593Smuzhiyun return -EINVAL;
5186*4882a593Smuzhiyun
5187*4882a593Smuzhiyun if (pin > 31 || pin < 0)
5188*4882a593Smuzhiyun return -EINVAL;
5189*4882a593Smuzhiyun
5190*4882a593Smuzhiyun gpio = &info->ctrl->pin_banks[bank];
5191*4882a593Smuzhiyun
5192*4882a593Smuzhiyun mutex_lock(&iomux_lock);
5193*4882a593Smuzhiyun ret = rockchip_get_mux(gpio, pin);
5194*4882a593Smuzhiyun mutex_unlock(&iomux_lock);
5195*4882a593Smuzhiyun
5196*4882a593Smuzhiyun *mux = ret;
5197*4882a593Smuzhiyun
5198*4882a593Smuzhiyun return (ret >= 0) ? 0 : ret;
5199*4882a593Smuzhiyun }
5200*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rk_iomux_get);
5201*4882a593Smuzhiyun
5202*4882a593Smuzhiyun MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
5203*4882a593Smuzhiyun MODULE_LICENSE("GPL");
5204*4882a593Smuzhiyun MODULE_ALIAS("platform:pinctrl-rockchip");
5205*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);
5206