1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // Copyright (C) 2016 Freescale Semiconductor, Inc.
4*4882a593Smuzhiyun // Copyright (C) 2017 NXP
5*4882a593Smuzhiyun //
6*4882a593Smuzhiyun // Author: Dong Aisheng <aisheng.dong@nxp.com>
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/err.h>
9*4882a593Smuzhiyun #include <linux/init.h>
10*4882a593Smuzhiyun #include <linux/io.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/of.h>
13*4882a593Smuzhiyun #include <linux/of_device.h>
14*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h>
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include "pinctrl-imx.h"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun enum imx7ulp_pads {
19*4882a593Smuzhiyun IMX7ULP_PAD_PTC0 = 0,
20*4882a593Smuzhiyun IMX7ULP_PAD_PTC1,
21*4882a593Smuzhiyun IMX7ULP_PAD_PTC2,
22*4882a593Smuzhiyun IMX7ULP_PAD_PTC3,
23*4882a593Smuzhiyun IMX7ULP_PAD_PTC4,
24*4882a593Smuzhiyun IMX7ULP_PAD_PTC5,
25*4882a593Smuzhiyun IMX7ULP_PAD_PTC6,
26*4882a593Smuzhiyun IMX7ULP_PAD_PTC7,
27*4882a593Smuzhiyun IMX7ULP_PAD_PTC8,
28*4882a593Smuzhiyun IMX7ULP_PAD_PTC9,
29*4882a593Smuzhiyun IMX7ULP_PAD_PTC10,
30*4882a593Smuzhiyun IMX7ULP_PAD_PTC11,
31*4882a593Smuzhiyun IMX7ULP_PAD_PTC12,
32*4882a593Smuzhiyun IMX7ULP_PAD_PTC13,
33*4882a593Smuzhiyun IMX7ULP_PAD_PTC14,
34*4882a593Smuzhiyun IMX7ULP_PAD_PTC15,
35*4882a593Smuzhiyun IMX7ULP_PAD_PTC16,
36*4882a593Smuzhiyun IMX7ULP_PAD_PTC17,
37*4882a593Smuzhiyun IMX7ULP_PAD_PTC18,
38*4882a593Smuzhiyun IMX7ULP_PAD_PTC19,
39*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE0,
40*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE1,
41*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE2,
42*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE3,
43*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE4,
44*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE5,
45*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE6,
46*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE7,
47*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE8,
48*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE9,
49*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE10,
50*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE11,
51*4882a593Smuzhiyun IMX7ULP_PAD_PTD0,
52*4882a593Smuzhiyun IMX7ULP_PAD_PTD1,
53*4882a593Smuzhiyun IMX7ULP_PAD_PTD2,
54*4882a593Smuzhiyun IMX7ULP_PAD_PTD3,
55*4882a593Smuzhiyun IMX7ULP_PAD_PTD4,
56*4882a593Smuzhiyun IMX7ULP_PAD_PTD5,
57*4882a593Smuzhiyun IMX7ULP_PAD_PTD6,
58*4882a593Smuzhiyun IMX7ULP_PAD_PTD7,
59*4882a593Smuzhiyun IMX7ULP_PAD_PTD8,
60*4882a593Smuzhiyun IMX7ULP_PAD_PTD9,
61*4882a593Smuzhiyun IMX7ULP_PAD_PTD10,
62*4882a593Smuzhiyun IMX7ULP_PAD_PTD11,
63*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE12,
64*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE13,
65*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE14,
66*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE15,
67*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE16,
68*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE17,
69*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE18,
70*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE19,
71*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE20,
72*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE21,
73*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE22,
74*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE23,
75*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE24,
76*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE25,
77*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE26,
78*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE27,
79*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE28,
80*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE29,
81*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE30,
82*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE31,
83*4882a593Smuzhiyun IMX7ULP_PAD_PTE0,
84*4882a593Smuzhiyun IMX7ULP_PAD_PTE1,
85*4882a593Smuzhiyun IMX7ULP_PAD_PTE2,
86*4882a593Smuzhiyun IMX7ULP_PAD_PTE3,
87*4882a593Smuzhiyun IMX7ULP_PAD_PTE4,
88*4882a593Smuzhiyun IMX7ULP_PAD_PTE5,
89*4882a593Smuzhiyun IMX7ULP_PAD_PTE6,
90*4882a593Smuzhiyun IMX7ULP_PAD_PTE7,
91*4882a593Smuzhiyun IMX7ULP_PAD_PTE8,
92*4882a593Smuzhiyun IMX7ULP_PAD_PTE9,
93*4882a593Smuzhiyun IMX7ULP_PAD_PTE10,
94*4882a593Smuzhiyun IMX7ULP_PAD_PTE11,
95*4882a593Smuzhiyun IMX7ULP_PAD_PTE12,
96*4882a593Smuzhiyun IMX7ULP_PAD_PTE13,
97*4882a593Smuzhiyun IMX7ULP_PAD_PTE14,
98*4882a593Smuzhiyun IMX7ULP_PAD_PTE15,
99*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE32,
100*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE33,
101*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE34,
102*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE35,
103*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE36,
104*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE37,
105*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE38,
106*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE39,
107*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE40,
108*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE41,
109*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE42,
110*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE43,
111*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE44,
112*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE45,
113*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE46,
114*4882a593Smuzhiyun IMX7ULP_PAD_RESERVE47,
115*4882a593Smuzhiyun IMX7ULP_PAD_PTF0,
116*4882a593Smuzhiyun IMX7ULP_PAD_PTF1,
117*4882a593Smuzhiyun IMX7ULP_PAD_PTF2,
118*4882a593Smuzhiyun IMX7ULP_PAD_PTF3,
119*4882a593Smuzhiyun IMX7ULP_PAD_PTF4,
120*4882a593Smuzhiyun IMX7ULP_PAD_PTF5,
121*4882a593Smuzhiyun IMX7ULP_PAD_PTF6,
122*4882a593Smuzhiyun IMX7ULP_PAD_PTF7,
123*4882a593Smuzhiyun IMX7ULP_PAD_PTF8,
124*4882a593Smuzhiyun IMX7ULP_PAD_PTF9,
125*4882a593Smuzhiyun IMX7ULP_PAD_PTF10,
126*4882a593Smuzhiyun IMX7ULP_PAD_PTF11,
127*4882a593Smuzhiyun IMX7ULP_PAD_PTF12,
128*4882a593Smuzhiyun IMX7ULP_PAD_PTF13,
129*4882a593Smuzhiyun IMX7ULP_PAD_PTF14,
130*4882a593Smuzhiyun IMX7ULP_PAD_PTF15,
131*4882a593Smuzhiyun IMX7ULP_PAD_PTF16,
132*4882a593Smuzhiyun IMX7ULP_PAD_PTF17,
133*4882a593Smuzhiyun IMX7ULP_PAD_PTF18,
134*4882a593Smuzhiyun IMX7ULP_PAD_PTF19,
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /* Pad names for the pinmux subsystem */
138*4882a593Smuzhiyun static const struct pinctrl_pin_desc imx7ulp_pinctrl_pads[] = {
139*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC0),
140*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC1),
141*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC2),
142*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC3),
143*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC4),
144*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC5),
145*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC6),
146*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC7),
147*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC8),
148*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC9),
149*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC10),
150*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC11),
151*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC12),
152*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC13),
153*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC14),
154*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC15),
155*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC16),
156*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC17),
157*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC18),
158*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC19),
159*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE0),
160*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE1),
161*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE2),
162*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE3),
163*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE4),
164*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE5),
165*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE6),
166*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE7),
167*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE8),
168*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE9),
169*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE10),
170*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE11),
171*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD0),
172*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD1),
173*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD2),
174*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD3),
175*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD4),
176*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD5),
177*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD6),
178*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD7),
179*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD8),
180*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD9),
181*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD10),
182*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD11),
183*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE12),
184*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE13),
185*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE14),
186*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE15),
187*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE16),
188*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE17),
189*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE18),
190*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE19),
191*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE20),
192*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE21),
193*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE22),
194*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE23),
195*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE24),
196*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE25),
197*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE26),
198*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE27),
199*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE28),
200*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE29),
201*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE30),
202*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE31),
203*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE0),
204*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE1),
205*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE2),
206*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE3),
207*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE4),
208*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE5),
209*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE6),
210*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE7),
211*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE8),
212*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE9),
213*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE10),
214*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE11),
215*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE12),
216*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE13),
217*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE14),
218*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE15),
219*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE32),
220*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE33),
221*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE34),
222*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE35),
223*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE36),
224*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE37),
225*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE38),
226*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE39),
227*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE40),
228*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE41),
229*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE42),
230*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE43),
231*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE44),
232*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE45),
233*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE46),
234*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE47),
235*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF0),
236*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF1),
237*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF2),
238*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF3),
239*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF4),
240*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF5),
241*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF6),
242*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF7),
243*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF8),
244*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF9),
245*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF10),
246*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF11),
247*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF12),
248*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF13),
249*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF14),
250*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF15),
251*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF16),
252*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF17),
253*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF18),
254*4882a593Smuzhiyun IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF19),
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun #define BM_OBE_ENABLED BIT(17)
258*4882a593Smuzhiyun #define BM_IBE_ENABLED BIT(16)
259*4882a593Smuzhiyun #define BM_MUX_MODE 0xf00
260*4882a593Smuzhiyun #define BP_MUX_MODE 8
261*4882a593Smuzhiyun
imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned offset,bool input)262*4882a593Smuzhiyun static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
263*4882a593Smuzhiyun struct pinctrl_gpio_range *range,
264*4882a593Smuzhiyun unsigned offset, bool input)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
267*4882a593Smuzhiyun const struct imx_pin_reg *pin_reg;
268*4882a593Smuzhiyun u32 reg;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun pin_reg = &ipctl->pin_regs[offset];
271*4882a593Smuzhiyun if (pin_reg->mux_reg == -1)
272*4882a593Smuzhiyun return -EINVAL;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun reg = readl(ipctl->base + pin_reg->mux_reg);
275*4882a593Smuzhiyun if (input)
276*4882a593Smuzhiyun reg = (reg & ~BM_OBE_ENABLED) | BM_IBE_ENABLED;
277*4882a593Smuzhiyun else
278*4882a593Smuzhiyun reg = (reg & ~BM_IBE_ENABLED) | BM_OBE_ENABLED;
279*4882a593Smuzhiyun writel(reg, ipctl->base + pin_reg->mux_reg);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun return 0;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun static const struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
285*4882a593Smuzhiyun .pins = imx7ulp_pinctrl_pads,
286*4882a593Smuzhiyun .npins = ARRAY_SIZE(imx7ulp_pinctrl_pads),
287*4882a593Smuzhiyun .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
288*4882a593Smuzhiyun .gpio_set_direction = imx7ulp_pmx_gpio_set_direction,
289*4882a593Smuzhiyun .mux_mask = BM_MUX_MODE,
290*4882a593Smuzhiyun .mux_shift = BP_MUX_MODE,
291*4882a593Smuzhiyun };
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun static const struct of_device_id imx7ulp_pinctrl_of_match[] = {
294*4882a593Smuzhiyun { .compatible = "fsl,imx7ulp-iomuxc1", },
295*4882a593Smuzhiyun { /* sentinel */ }
296*4882a593Smuzhiyun };
297*4882a593Smuzhiyun
imx7ulp_pinctrl_probe(struct platform_device * pdev)298*4882a593Smuzhiyun static int imx7ulp_pinctrl_probe(struct platform_device *pdev)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun return imx_pinctrl_probe(pdev, &imx7ulp_pinctrl_info);
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun static struct platform_driver imx7ulp_pinctrl_driver = {
304*4882a593Smuzhiyun .driver = {
305*4882a593Smuzhiyun .name = "imx7ulp-pinctrl",
306*4882a593Smuzhiyun .of_match_table = of_match_ptr(imx7ulp_pinctrl_of_match),
307*4882a593Smuzhiyun .suppress_bind_attrs = true,
308*4882a593Smuzhiyun },
309*4882a593Smuzhiyun .probe = imx7ulp_pinctrl_probe,
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun
imx7ulp_pinctrl_init(void)312*4882a593Smuzhiyun static int __init imx7ulp_pinctrl_init(void)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun return platform_driver_register(&imx7ulp_pinctrl_driver);
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun arch_initcall(imx7ulp_pinctrl_init);
317