diff options
Diffstat (limited to 'drivers/pinctrl/pinctrl-sunxi.c')
-rw-r--r-- | drivers/pinctrl/pinctrl-sunxi.c | 1505 |
1 files changed, 1505 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/pinctrl-sunxi.c new file mode 100644 index 000000000000..80b11e3415bc --- /dev/null +++ b/drivers/pinctrl/pinctrl-sunxi.c | |||
@@ -0,0 +1,1505 @@ | |||
1 | /* | ||
2 | * Allwinner A1X SoCs pinctrl driver. | ||
3 | * | ||
4 | * Copyright (C) 2012 Maxime Ripard | ||
5 | * | ||
6 | * Maxime Ripard <maxime.ripard@free-electrons.com> | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <linux/io.h> | ||
14 | #include <linux/gpio.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/of.h> | ||
17 | #include <linux/of_address.h> | ||
18 | #include <linux/of_device.h> | ||
19 | #include <linux/pinctrl/consumer.h> | ||
20 | #include <linux/pinctrl/machine.h> | ||
21 | #include <linux/pinctrl/pinctrl.h> | ||
22 | #include <linux/pinctrl/pinconf-generic.h> | ||
23 | #include <linux/pinctrl/pinmux.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | #include <linux/slab.h> | ||
26 | |||
27 | #include "core.h" | ||
28 | #include "pinctrl-sunxi.h" | ||
29 | |||
30 | static const struct sunxi_desc_pin sun4i_a10_pins[] = { | ||
31 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA0, | ||
32 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
33 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
34 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA1, | ||
35 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
36 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
37 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA2, | ||
38 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
39 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
40 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA3, | ||
41 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
42 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
43 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA4, | ||
44 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
45 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
46 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5, | ||
47 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
48 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
49 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6, | ||
50 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
51 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
52 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7, | ||
53 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
54 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
55 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8, | ||
56 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
57 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
58 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9, | ||
59 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
60 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
61 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA10, | ||
62 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
63 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
64 | SUNXI_FUNCTION(0x4, "uart1")), /* TX */ | ||
65 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA11, | ||
66 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
67 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
68 | SUNXI_FUNCTION(0x4, "uart1")), /* RX */ | ||
69 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA12, | ||
70 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
71 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
72 | SUNXI_FUNCTION(0x4, "uart1")), /* RTS */ | ||
73 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA13, | ||
74 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
75 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
76 | SUNXI_FUNCTION(0x4, "uart1")), /* CTS */ | ||
77 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA14, | ||
78 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
79 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
80 | SUNXI_FUNCTION(0x4, "uart1")), /* DTR */ | ||
81 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA15, | ||
82 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
83 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
84 | SUNXI_FUNCTION(0x4, "uart1")), /* DSR */ | ||
85 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA16, | ||
86 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
87 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
88 | SUNXI_FUNCTION(0x4, "uart1")), /* DCD */ | ||
89 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PA17, | ||
90 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
91 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
92 | SUNXI_FUNCTION(0x4, "uart1")), /* RING */ | ||
93 | /* Hole */ | ||
94 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, | ||
95 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
96 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
97 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, | ||
98 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
99 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
100 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, | ||
101 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
102 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
103 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, | ||
104 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
105 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
106 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, | ||
107 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
108 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
109 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB5, | ||
110 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
111 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
112 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB6, | ||
113 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
114 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
115 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB7, | ||
116 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
117 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
118 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB8, | ||
119 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
120 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
121 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB9, | ||
122 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
123 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
124 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10, | ||
125 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
126 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
127 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB11, | ||
128 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
129 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
130 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB12, | ||
131 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
132 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
133 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB13, | ||
134 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
135 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
136 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB14, | ||
137 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
138 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
139 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15, | ||
140 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
141 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
142 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16, | ||
143 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
144 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
145 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17, | ||
146 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
147 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
148 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18, | ||
149 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
150 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
151 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB19, | ||
152 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
153 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
154 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB20, | ||
155 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
156 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
157 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB21, | ||
158 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
159 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
160 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB22, | ||
161 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
162 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
163 | SUNXI_FUNCTION(0x2, "uart0")), /* TX */ | ||
164 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB23, | ||
165 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
166 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
167 | SUNXI_FUNCTION(0x2, "uart0")), /* RX */ | ||
168 | /* Hole */ | ||
169 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, | ||
170 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
171 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
172 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, | ||
173 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
174 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
175 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, | ||
176 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
177 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
178 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, | ||
179 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
180 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
181 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, | ||
182 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
183 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
184 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, | ||
185 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
186 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
187 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, | ||
188 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
189 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
190 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, | ||
191 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
192 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
193 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, | ||
194 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
195 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
196 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, | ||
197 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
198 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
199 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, | ||
200 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
201 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
202 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, | ||
203 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
204 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
205 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, | ||
206 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
207 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
208 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, | ||
209 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
210 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
211 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, | ||
212 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
213 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
214 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, | ||
215 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
216 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
217 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC16, | ||
218 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
219 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
220 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC17, | ||
221 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
222 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
223 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC18, | ||
224 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
225 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
226 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, | ||
227 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
228 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
229 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC20, | ||
230 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
231 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
232 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC21, | ||
233 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
234 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
235 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC22, | ||
236 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
237 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
238 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC23, | ||
239 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
240 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
241 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC24, | ||
242 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
243 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
244 | /* Hole */ | ||
245 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD0, | ||
246 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
247 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
248 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD1, | ||
249 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
250 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
251 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, | ||
252 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
253 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
254 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, | ||
255 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
256 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
257 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, | ||
258 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
259 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
260 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, | ||
261 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
262 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
263 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, | ||
264 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
265 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
266 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, | ||
267 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
268 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
269 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD8, | ||
270 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
271 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
272 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD9, | ||
273 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
274 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
275 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, | ||
276 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
277 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
278 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, | ||
279 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
280 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
281 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, | ||
282 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
283 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
284 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, | ||
285 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
286 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
287 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, | ||
288 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
289 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
290 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, | ||
291 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
292 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
293 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD16, | ||
294 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
295 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
296 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD17, | ||
297 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
298 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
299 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, | ||
300 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
301 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
302 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, | ||
303 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
304 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
305 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, | ||
306 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
307 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
308 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, | ||
309 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
310 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
311 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, | ||
312 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
313 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
314 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, | ||
315 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
316 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
317 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, | ||
318 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
319 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
320 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, | ||
321 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
322 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
323 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, | ||
324 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
325 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
326 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, | ||
327 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
328 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
329 | /* Hole */ | ||
330 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, | ||
331 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
332 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
333 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, | ||
334 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
335 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
336 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, | ||
337 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
338 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
339 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, | ||
340 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
341 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
342 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, | ||
343 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
344 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
345 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, | ||
346 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
347 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
348 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, | ||
349 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
350 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
351 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, | ||
352 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
353 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
354 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, | ||
355 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
356 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
357 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, | ||
358 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
359 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
360 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, | ||
361 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
362 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
363 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, | ||
364 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
365 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
366 | /* Hole */ | ||
367 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, | ||
368 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
369 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
370 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, | ||
371 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
372 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
373 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, | ||
374 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
375 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
376 | SUNXI_FUNCTION(0x4, "uart0")), /* TX */ | ||
377 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, | ||
378 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
379 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
380 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, | ||
381 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
382 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
383 | SUNXI_FUNCTION(0x4, "uart0")), /* RX */ | ||
384 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, | ||
385 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
386 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
387 | /* Hole */ | ||
388 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, | ||
389 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
390 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
391 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, | ||
392 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
393 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
394 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, | ||
395 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
396 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
397 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, | ||
398 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
399 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
400 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, | ||
401 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
402 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
403 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG5, | ||
404 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
405 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
406 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG6, | ||
407 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
408 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
409 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG7, | ||
410 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
411 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
412 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG8, | ||
413 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
414 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
415 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, | ||
416 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
417 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
418 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, | ||
419 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
420 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
421 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, | ||
422 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
423 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
424 | /* Hole */ | ||
425 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH0, | ||
426 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
427 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
428 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH1, | ||
429 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
430 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
431 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH2, | ||
432 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
433 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
434 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH3, | ||
435 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
436 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
437 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH4, | ||
438 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
439 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
440 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH5, | ||
441 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
442 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
443 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH6, | ||
444 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
445 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
446 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH7, | ||
447 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
448 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
449 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH8, | ||
450 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
451 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
452 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH9, | ||
453 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
454 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
455 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH10, | ||
456 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
457 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
458 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH11, | ||
459 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
460 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
461 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH12, | ||
462 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
463 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
464 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH13, | ||
465 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
466 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
467 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH14, | ||
468 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
469 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
470 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH15, | ||
471 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
472 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
473 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH16, | ||
474 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
475 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
476 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH17, | ||
477 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
478 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
479 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH18, | ||
480 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
481 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
482 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH19, | ||
483 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
484 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
485 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH20, | ||
486 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
487 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
488 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH21, | ||
489 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
490 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
491 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH22, | ||
492 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
493 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
494 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH23, | ||
495 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
496 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
497 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH24, | ||
498 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
499 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
500 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH25, | ||
501 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
502 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
503 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH26, | ||
504 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
505 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
506 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PH27, | ||
507 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
508 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
509 | /* Hole */ | ||
510 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI0, | ||
511 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
512 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
513 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI1, | ||
514 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
515 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
516 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI2, | ||
517 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
518 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
519 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI3, | ||
520 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
521 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
522 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI4, | ||
523 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
524 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
525 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI5, | ||
526 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
527 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
528 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI6, | ||
529 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
530 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
531 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI7, | ||
532 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
533 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
534 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI8, | ||
535 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
536 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
537 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI9, | ||
538 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
539 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
540 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI10, | ||
541 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
542 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
543 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI11, | ||
544 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
545 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
546 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI12, | ||
547 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
548 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
549 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI13, | ||
550 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
551 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
552 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI14, | ||
553 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
554 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
555 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI15, | ||
556 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
557 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
558 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI16, | ||
559 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
560 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
561 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI17, | ||
562 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
563 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
564 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI18, | ||
565 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
566 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
567 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI19, | ||
568 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
569 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
570 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI20, | ||
571 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
572 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
573 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PI21, | ||
574 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
575 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
576 | }; | ||
577 | |||
578 | static const struct sunxi_desc_pin sun5i_a13_pins[] = { | ||
579 | /* Hole */ | ||
580 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, | ||
581 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
582 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
583 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, | ||
584 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
585 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
586 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, | ||
587 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
588 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
589 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, | ||
590 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
591 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
592 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, | ||
593 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
594 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
595 | /* Hole */ | ||
596 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10, | ||
597 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
598 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
599 | /* Hole */ | ||
600 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15, | ||
601 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
602 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
603 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16, | ||
604 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
605 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
606 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17, | ||
607 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
608 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
609 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18, | ||
610 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
611 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
612 | /* Hole */ | ||
613 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, | ||
614 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
615 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
616 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, | ||
617 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
618 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
619 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, | ||
620 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
621 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
622 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, | ||
623 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
624 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
625 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, | ||
626 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
627 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
628 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, | ||
629 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
630 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
631 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, | ||
632 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
633 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
634 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, | ||
635 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
636 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
637 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, | ||
638 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
639 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
640 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, | ||
641 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
642 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
643 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, | ||
644 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
645 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
646 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, | ||
647 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
648 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
649 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, | ||
650 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
651 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
652 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, | ||
653 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
654 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
655 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, | ||
656 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
657 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
658 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, | ||
659 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
660 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
661 | /* Hole */ | ||
662 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, | ||
663 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
664 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
665 | /* Hole */ | ||
666 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, | ||
667 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
668 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
669 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, | ||
670 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
671 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
672 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, | ||
673 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
674 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
675 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, | ||
676 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
677 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
678 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, | ||
679 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
680 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
681 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, | ||
682 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
683 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
684 | /* Hole */ | ||
685 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, | ||
686 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
687 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
688 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, | ||
689 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
690 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
691 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, | ||
692 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
693 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
694 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, | ||
695 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
696 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
697 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, | ||
698 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
699 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
700 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, | ||
701 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
702 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
703 | /* Hole */ | ||
704 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, | ||
705 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
706 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
707 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, | ||
708 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
709 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
710 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, | ||
711 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
712 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
713 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, | ||
714 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
715 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
716 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, | ||
717 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
718 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
719 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, | ||
720 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
721 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
722 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, | ||
723 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
724 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
725 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, | ||
726 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
727 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
728 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, | ||
729 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
730 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
731 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, | ||
732 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
733 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
734 | /* Hole */ | ||
735 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, | ||
736 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
737 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
738 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, | ||
739 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
740 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
741 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, | ||
742 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
743 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
744 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, | ||
745 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
746 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
747 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, | ||
748 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
749 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
750 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, | ||
751 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
752 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
753 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, | ||
754 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
755 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
756 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, | ||
757 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
758 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
759 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, | ||
760 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
761 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
762 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, | ||
763 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
764 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
765 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, | ||
766 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
767 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
768 | SUNXI_FUNCTION(0x4, "uart1")), /* TX */ | ||
769 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, | ||
770 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
771 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
772 | SUNXI_FUNCTION(0x4, "uart1")), /* RX */ | ||
773 | /* Hole */ | ||
774 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, | ||
775 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
776 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
777 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, | ||
778 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
779 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
780 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, | ||
781 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
782 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
783 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, | ||
784 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
785 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
786 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, | ||
787 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
788 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
789 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, | ||
790 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
791 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
792 | /* Hole */ | ||
793 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, | ||
794 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
795 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
796 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, | ||
797 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
798 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
799 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, | ||
800 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
801 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
802 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, | ||
803 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
804 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
805 | SUNXI_FUNCTION(0x4, "uart1")), /* TX */ | ||
806 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, | ||
807 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
808 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
809 | SUNXI_FUNCTION(0x4, "uart1")), /* RX */ | ||
810 | /* Hole */ | ||
811 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, | ||
812 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
813 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
814 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, | ||
815 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
816 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
817 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, | ||
818 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
819 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
820 | SUNXI_PIN(SUNXI_PINCTRL_PIN_PG12, | ||
821 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
822 | SUNXI_FUNCTION(0x1, "gpio_out")), | ||
823 | }; | ||
824 | |||
825 | static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = { | ||
826 | .pins = sun4i_a10_pins, | ||
827 | .npins = ARRAY_SIZE(sun4i_a10_pins), | ||
828 | }; | ||
829 | |||
830 | static const struct sunxi_pinctrl_desc sun5i_a13_pinctrl_data = { | ||
831 | .pins = sun5i_a13_pins, | ||
832 | .npins = ARRAY_SIZE(sun5i_a13_pins), | ||
833 | }; | ||
834 | |||
835 | static struct sunxi_pinctrl_group * | ||
836 | sunxi_pinctrl_find_group_by_name(struct sunxi_pinctrl *pctl, const char *group) | ||
837 | { | ||
838 | int i; | ||
839 | |||
840 | for (i = 0; i < pctl->ngroups; i++) { | ||
841 | struct sunxi_pinctrl_group *grp = pctl->groups + i; | ||
842 | |||
843 | if (!strcmp(grp->name, group)) | ||
844 | return grp; | ||
845 | } | ||
846 | |||
847 | return NULL; | ||
848 | } | ||
849 | |||
850 | static struct sunxi_pinctrl_function * | ||
851 | sunxi_pinctrl_find_function_by_name(struct sunxi_pinctrl *pctl, | ||
852 | const char *name) | ||
853 | { | ||
854 | struct sunxi_pinctrl_function *func = pctl->functions; | ||
855 | int i; | ||
856 | |||
857 | for (i = 0; i < pctl->nfunctions; i++) { | ||
858 | if (!func[i].name) | ||
859 | break; | ||
860 | |||
861 | if (!strcmp(func[i].name, name)) | ||
862 | return func + i; | ||
863 | } | ||
864 | |||
865 | return NULL; | ||
866 | } | ||
867 | |||
868 | static struct sunxi_desc_function * | ||
869 | sunxi_pinctrl_desc_find_function_by_name(struct sunxi_pinctrl *pctl, | ||
870 | const char *pin_name, | ||
871 | const char *func_name) | ||
872 | { | ||
873 | int i; | ||
874 | |||
875 | for (i = 0; i < pctl->desc->npins; i++) { | ||
876 | const struct sunxi_desc_pin *pin = pctl->desc->pins + i; | ||
877 | |||
878 | if (!strcmp(pin->pin.name, pin_name)) { | ||
879 | struct sunxi_desc_function *func = pin->functions; | ||
880 | |||
881 | while (func->name) { | ||
882 | if (!strcmp(func->name, func_name)) | ||
883 | return func; | ||
884 | |||
885 | func++; | ||
886 | } | ||
887 | } | ||
888 | } | ||
889 | |||
890 | return NULL; | ||
891 | } | ||
892 | |||
893 | static int sunxi_pctrl_get_groups_count(struct pinctrl_dev *pctldev) | ||
894 | { | ||
895 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
896 | |||
897 | return pctl->ngroups; | ||
898 | } | ||
899 | |||
900 | static const char *sunxi_pctrl_get_group_name(struct pinctrl_dev *pctldev, | ||
901 | unsigned group) | ||
902 | { | ||
903 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
904 | |||
905 | return pctl->groups[group].name; | ||
906 | } | ||
907 | |||
908 | static int sunxi_pctrl_get_group_pins(struct pinctrl_dev *pctldev, | ||
909 | unsigned group, | ||
910 | const unsigned **pins, | ||
911 | unsigned *num_pins) | ||
912 | { | ||
913 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
914 | |||
915 | *pins = (unsigned *)&pctl->groups[group].pin; | ||
916 | *num_pins = 1; | ||
917 | |||
918 | return 0; | ||
919 | } | ||
920 | |||
921 | static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
922 | struct device_node *node, | ||
923 | struct pinctrl_map **map, | ||
924 | unsigned *num_maps) | ||
925 | { | ||
926 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
927 | unsigned long *pinconfig; | ||
928 | struct property *prop; | ||
929 | const char *function; | ||
930 | const char *group; | ||
931 | int ret, nmaps, i = 0; | ||
932 | u32 val; | ||
933 | |||
934 | *map = NULL; | ||
935 | *num_maps = 0; | ||
936 | |||
937 | ret = of_property_read_string(node, "allwinner,function", &function); | ||
938 | if (ret) { | ||
939 | dev_err(pctl->dev, | ||
940 | "missing allwinner,function property in node %s\n", | ||
941 | node->name); | ||
942 | return -EINVAL; | ||
943 | } | ||
944 | |||
945 | nmaps = of_property_count_strings(node, "allwinner,pins") * 2; | ||
946 | if (nmaps < 0) { | ||
947 | dev_err(pctl->dev, | ||
948 | "missing allwinner,pins property in node %s\n", | ||
949 | node->name); | ||
950 | return -EINVAL; | ||
951 | } | ||
952 | |||
953 | *map = kmalloc(nmaps * sizeof(struct pinctrl_map), GFP_KERNEL); | ||
954 | if (!map) | ||
955 | return -ENOMEM; | ||
956 | |||
957 | of_property_for_each_string(node, "allwinner,pins", prop, group) { | ||
958 | struct sunxi_pinctrl_group *grp = | ||
959 | sunxi_pinctrl_find_group_by_name(pctl, group); | ||
960 | int j = 0, configlen = 0; | ||
961 | |||
962 | if (!grp) { | ||
963 | dev_err(pctl->dev, "unknown pin %s", group); | ||
964 | continue; | ||
965 | } | ||
966 | |||
967 | if (!sunxi_pinctrl_desc_find_function_by_name(pctl, | ||
968 | grp->name, | ||
969 | function)) { | ||
970 | dev_err(pctl->dev, "unsupported function %s on pin %s", | ||
971 | function, group); | ||
972 | continue; | ||
973 | } | ||
974 | |||
975 | (*map)[i].type = PIN_MAP_TYPE_MUX_GROUP; | ||
976 | (*map)[i].data.mux.group = group; | ||
977 | (*map)[i].data.mux.function = function; | ||
978 | |||
979 | i++; | ||
980 | |||
981 | (*map)[i].type = PIN_MAP_TYPE_CONFIGS_GROUP; | ||
982 | (*map)[i].data.configs.group_or_pin = group; | ||
983 | |||
984 | if (of_find_property(node, "allwinner,drive", NULL)) | ||
985 | configlen++; | ||
986 | if (of_find_property(node, "allwinner,pull", NULL)) | ||
987 | configlen++; | ||
988 | |||
989 | pinconfig = kzalloc(configlen * sizeof(*pinconfig), GFP_KERNEL); | ||
990 | |||
991 | if (!of_property_read_u32(node, "allwinner,drive", &val)) { | ||
992 | u16 strength = (val + 1) * 10; | ||
993 | pinconfig[j++] = | ||
994 | pinconf_to_config_packed(PIN_CONFIG_DRIVE_STRENGTH, | ||
995 | strength); | ||
996 | } | ||
997 | |||
998 | if (!of_property_read_u32(node, "allwinner,pull", &val)) { | ||
999 | enum pin_config_param pull = PIN_CONFIG_END; | ||
1000 | if (val == 1) | ||
1001 | pull = PIN_CONFIG_BIAS_PULL_UP; | ||
1002 | else if (val == 2) | ||
1003 | pull = PIN_CONFIG_BIAS_PULL_DOWN; | ||
1004 | pinconfig[j++] = pinconf_to_config_packed(pull, 0); | ||
1005 | } | ||
1006 | |||
1007 | (*map)[i].data.configs.configs = pinconfig; | ||
1008 | (*map)[i].data.configs.num_configs = configlen; | ||
1009 | |||
1010 | i++; | ||
1011 | } | ||
1012 | |||
1013 | *num_maps = nmaps; | ||
1014 | |||
1015 | return 0; | ||
1016 | } | ||
1017 | |||
1018 | static void sunxi_pctrl_dt_free_map(struct pinctrl_dev *pctldev, | ||
1019 | struct pinctrl_map *map, | ||
1020 | unsigned num_maps) | ||
1021 | { | ||
1022 | int i; | ||
1023 | |||
1024 | for (i = 0; i < num_maps; i++) { | ||
1025 | if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP) | ||
1026 | kfree(map[i].data.configs.configs); | ||
1027 | } | ||
1028 | |||
1029 | kfree(map); | ||
1030 | } | ||
1031 | |||
1032 | static struct pinctrl_ops sunxi_pctrl_ops = { | ||
1033 | .dt_node_to_map = sunxi_pctrl_dt_node_to_map, | ||
1034 | .dt_free_map = sunxi_pctrl_dt_free_map, | ||
1035 | .get_groups_count = sunxi_pctrl_get_groups_count, | ||
1036 | .get_group_name = sunxi_pctrl_get_group_name, | ||
1037 | .get_group_pins = sunxi_pctrl_get_group_pins, | ||
1038 | }; | ||
1039 | |||
1040 | static int sunxi_pconf_group_get(struct pinctrl_dev *pctldev, | ||
1041 | unsigned group, | ||
1042 | unsigned long *config) | ||
1043 | { | ||
1044 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1045 | |||
1046 | *config = pctl->groups[group].config; | ||
1047 | |||
1048 | return 0; | ||
1049 | } | ||
1050 | |||
1051 | static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev, | ||
1052 | unsigned group, | ||
1053 | unsigned long config) | ||
1054 | { | ||
1055 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1056 | struct sunxi_pinctrl_group *g = &pctl->groups[group]; | ||
1057 | u32 val, mask; | ||
1058 | u16 strength; | ||
1059 | u8 dlevel; | ||
1060 | |||
1061 | switch (pinconf_to_config_param(config)) { | ||
1062 | case PIN_CONFIG_DRIVE_STRENGTH: | ||
1063 | strength = pinconf_to_config_argument(config); | ||
1064 | if (strength > 40) | ||
1065 | return -EINVAL; | ||
1066 | /* | ||
1067 | * We convert from mA to what the register expects: | ||
1068 | * 0: 10mA | ||
1069 | * 1: 20mA | ||
1070 | * 2: 30mA | ||
1071 | * 3: 40mA | ||
1072 | */ | ||
1073 | dlevel = strength / 10 - 1; | ||
1074 | val = readl(pctl->membase + sunxi_dlevel_reg(g->pin)); | ||
1075 | mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin); | ||
1076 | writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin), | ||
1077 | pctl->membase + sunxi_dlevel_reg(g->pin)); | ||
1078 | break; | ||
1079 | case PIN_CONFIG_BIAS_PULL_UP: | ||
1080 | val = readl(pctl->membase + sunxi_pull_reg(g->pin)); | ||
1081 | mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); | ||
1082 | writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin), | ||
1083 | pctl->membase + sunxi_pull_reg(g->pin)); | ||
1084 | break; | ||
1085 | case PIN_CONFIG_BIAS_PULL_DOWN: | ||
1086 | val = readl(pctl->membase + sunxi_pull_reg(g->pin)); | ||
1087 | mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); | ||
1088 | writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin), | ||
1089 | pctl->membase + sunxi_pull_reg(g->pin)); | ||
1090 | break; | ||
1091 | default: | ||
1092 | break; | ||
1093 | } | ||
1094 | |||
1095 | /* cache the config value */ | ||
1096 | g->config = config; | ||
1097 | |||
1098 | return 0; | ||
1099 | } | ||
1100 | |||
1101 | static struct pinconf_ops sunxi_pconf_ops = { | ||
1102 | .pin_config_group_get = sunxi_pconf_group_get, | ||
1103 | .pin_config_group_set = sunxi_pconf_group_set, | ||
1104 | }; | ||
1105 | |||
1106 | static int sunxi_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev) | ||
1107 | { | ||
1108 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1109 | |||
1110 | return pctl->nfunctions; | ||
1111 | } | ||
1112 | |||
1113 | static const char *sunxi_pmx_get_func_name(struct pinctrl_dev *pctldev, | ||
1114 | unsigned function) | ||
1115 | { | ||
1116 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1117 | |||
1118 | return pctl->functions[function].name; | ||
1119 | } | ||
1120 | |||
1121 | static int sunxi_pmx_get_func_groups(struct pinctrl_dev *pctldev, | ||
1122 | unsigned function, | ||
1123 | const char * const **groups, | ||
1124 | unsigned * const num_groups) | ||
1125 | { | ||
1126 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1127 | |||
1128 | *groups = pctl->functions[function].groups; | ||
1129 | *num_groups = pctl->functions[function].ngroups; | ||
1130 | |||
1131 | return 0; | ||
1132 | } | ||
1133 | |||
1134 | static void sunxi_pmx_set(struct pinctrl_dev *pctldev, | ||
1135 | unsigned pin, | ||
1136 | u8 config) | ||
1137 | { | ||
1138 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1139 | |||
1140 | u32 val = readl(pctl->membase + sunxi_mux_reg(pin)); | ||
1141 | u32 mask = MUX_PINS_MASK << sunxi_mux_offset(pin); | ||
1142 | writel((val & ~mask) | config << sunxi_mux_offset(pin), | ||
1143 | pctl->membase + sunxi_mux_reg(pin)); | ||
1144 | } | ||
1145 | |||
1146 | static int sunxi_pmx_enable(struct pinctrl_dev *pctldev, | ||
1147 | unsigned function, | ||
1148 | unsigned group) | ||
1149 | { | ||
1150 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1151 | struct sunxi_pinctrl_group *g = pctl->groups + group; | ||
1152 | struct sunxi_pinctrl_function *func = pctl->functions + function; | ||
1153 | struct sunxi_desc_function *desc = | ||
1154 | sunxi_pinctrl_desc_find_function_by_name(pctl, | ||
1155 | g->name, | ||
1156 | func->name); | ||
1157 | |||
1158 | if (!desc) | ||
1159 | return -EINVAL; | ||
1160 | |||
1161 | sunxi_pmx_set(pctldev, g->pin, desc->muxval); | ||
1162 | |||
1163 | return 0; | ||
1164 | } | ||
1165 | |||
1166 | static int | ||
1167 | sunxi_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, | ||
1168 | struct pinctrl_gpio_range *range, | ||
1169 | unsigned offset, | ||
1170 | bool input) | ||
1171 | { | ||
1172 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1173 | struct sunxi_desc_function *desc; | ||
1174 | char pin_name[SUNXI_PIN_NAME_MAX_LEN]; | ||
1175 | const char *func; | ||
1176 | u8 bank, pin; | ||
1177 | int ret; | ||
1178 | |||
1179 | bank = (offset) / PINS_PER_BANK; | ||
1180 | pin = (offset) % PINS_PER_BANK; | ||
1181 | |||
1182 | ret = sprintf(pin_name, "P%c%d", 'A' + bank, pin); | ||
1183 | if (!ret) | ||
1184 | goto error; | ||
1185 | |||
1186 | if (input) | ||
1187 | func = "gpio_in"; | ||
1188 | else | ||
1189 | func = "gpio_out"; | ||
1190 | |||
1191 | desc = sunxi_pinctrl_desc_find_function_by_name(pctl, | ||
1192 | pin_name, | ||
1193 | func); | ||
1194 | if (!desc) { | ||
1195 | ret = -EINVAL; | ||
1196 | goto error; | ||
1197 | } | ||
1198 | |||
1199 | sunxi_pmx_set(pctldev, offset, desc->muxval); | ||
1200 | |||
1201 | ret = 0; | ||
1202 | |||
1203 | error: | ||
1204 | return ret; | ||
1205 | } | ||
1206 | |||
1207 | static struct pinmux_ops sunxi_pmx_ops = { | ||
1208 | .get_functions_count = sunxi_pmx_get_funcs_cnt, | ||
1209 | .get_function_name = sunxi_pmx_get_func_name, | ||
1210 | .get_function_groups = sunxi_pmx_get_func_groups, | ||
1211 | .enable = sunxi_pmx_enable, | ||
1212 | .gpio_set_direction = sunxi_pmx_gpio_set_direction, | ||
1213 | }; | ||
1214 | |||
1215 | static struct pinctrl_desc sunxi_pctrl_desc = { | ||
1216 | .confops = &sunxi_pconf_ops, | ||
1217 | .pctlops = &sunxi_pctrl_ops, | ||
1218 | .pmxops = &sunxi_pmx_ops, | ||
1219 | }; | ||
1220 | |||
1221 | static int sunxi_pinctrl_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
1222 | { | ||
1223 | return pinctrl_request_gpio(chip->base + offset); | ||
1224 | } | ||
1225 | |||
1226 | static void sunxi_pinctrl_gpio_free(struct gpio_chip *chip, unsigned offset) | ||
1227 | { | ||
1228 | pinctrl_free_gpio(chip->base + offset); | ||
1229 | } | ||
1230 | |||
1231 | static int sunxi_pinctrl_gpio_direction_input(struct gpio_chip *chip, | ||
1232 | unsigned offset) | ||
1233 | { | ||
1234 | return pinctrl_gpio_direction_input(chip->base + offset); | ||
1235 | } | ||
1236 | |||
1237 | static int sunxi_pinctrl_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
1238 | { | ||
1239 | struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); | ||
1240 | |||
1241 | u32 reg = sunxi_data_reg(offset); | ||
1242 | u8 index = sunxi_data_offset(offset); | ||
1243 | u32 val = (readl(pctl->membase + reg) >> index) & DATA_PINS_MASK; | ||
1244 | |||
1245 | return val; | ||
1246 | } | ||
1247 | |||
1248 | static int sunxi_pinctrl_gpio_direction_output(struct gpio_chip *chip, | ||
1249 | unsigned offset, int value) | ||
1250 | { | ||
1251 | return pinctrl_gpio_direction_output(chip->base + offset); | ||
1252 | } | ||
1253 | |||
1254 | static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip, | ||
1255 | unsigned offset, int value) | ||
1256 | { | ||
1257 | struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); | ||
1258 | u32 reg = sunxi_data_reg(offset); | ||
1259 | u8 index = sunxi_data_offset(offset); | ||
1260 | |||
1261 | writel((value & DATA_PINS_MASK) << index, pctl->membase + reg); | ||
1262 | } | ||
1263 | |||
1264 | static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc, | ||
1265 | const struct of_phandle_args *gpiospec, | ||
1266 | u32 *flags) | ||
1267 | { | ||
1268 | int pin, base; | ||
1269 | |||
1270 | base = PINS_PER_BANK * gpiospec->args[0]; | ||
1271 | pin = base + gpiospec->args[1]; | ||
1272 | |||
1273 | if (pin > (gc->base + gc->ngpio)) | ||
1274 | return -EINVAL; | ||
1275 | |||
1276 | if (flags) | ||
1277 | *flags = gpiospec->args[2]; | ||
1278 | |||
1279 | return pin; | ||
1280 | } | ||
1281 | |||
1282 | static struct gpio_chip sunxi_pinctrl_gpio_chip = { | ||
1283 | .owner = THIS_MODULE, | ||
1284 | .request = sunxi_pinctrl_gpio_request, | ||
1285 | .free = sunxi_pinctrl_gpio_free, | ||
1286 | .direction_input = sunxi_pinctrl_gpio_direction_input, | ||
1287 | .direction_output = sunxi_pinctrl_gpio_direction_output, | ||
1288 | .get = sunxi_pinctrl_gpio_get, | ||
1289 | .set = sunxi_pinctrl_gpio_set, | ||
1290 | .of_xlate = sunxi_pinctrl_gpio_of_xlate, | ||
1291 | .of_gpio_n_cells = 3, | ||
1292 | .can_sleep = 0, | ||
1293 | }; | ||
1294 | |||
1295 | static struct of_device_id sunxi_pinctrl_match[] = { | ||
1296 | { .compatible = "allwinner,sun4i-a10-pinctrl", .data = (void *)&sun4i_a10_pinctrl_data }, | ||
1297 | { .compatible = "allwinner,sun5i-a13-pinctrl", .data = (void *)&sun5i_a13_pinctrl_data }, | ||
1298 | {} | ||
1299 | }; | ||
1300 | MODULE_DEVICE_TABLE(of, sunxi_pinctrl_match); | ||
1301 | |||
1302 | static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl, | ||
1303 | const char *name) | ||
1304 | { | ||
1305 | struct sunxi_pinctrl_function *func = pctl->functions; | ||
1306 | |||
1307 | while (func->name) { | ||
1308 | /* function already there */ | ||
1309 | if (strcmp(func->name, name) == 0) { | ||
1310 | func->ngroups++; | ||
1311 | return -EEXIST; | ||
1312 | } | ||
1313 | func++; | ||
1314 | } | ||
1315 | |||
1316 | func->name = name; | ||
1317 | func->ngroups = 1; | ||
1318 | |||
1319 | pctl->nfunctions++; | ||
1320 | |||
1321 | return 0; | ||
1322 | } | ||
1323 | |||
1324 | static int sunxi_pinctrl_build_state(struct platform_device *pdev) | ||
1325 | { | ||
1326 | struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev); | ||
1327 | int i; | ||
1328 | |||
1329 | pctl->ngroups = pctl->desc->npins; | ||
1330 | |||
1331 | /* Allocate groups */ | ||
1332 | pctl->groups = devm_kzalloc(&pdev->dev, | ||
1333 | pctl->ngroups * sizeof(*pctl->groups), | ||
1334 | GFP_KERNEL); | ||
1335 | if (!pctl->groups) | ||
1336 | return -ENOMEM; | ||
1337 | |||
1338 | for (i = 0; i < pctl->desc->npins; i++) { | ||
1339 | const struct sunxi_desc_pin *pin = pctl->desc->pins + i; | ||
1340 | struct sunxi_pinctrl_group *group = pctl->groups + i; | ||
1341 | |||
1342 | group->name = pin->pin.name; | ||
1343 | group->pin = pin->pin.number; | ||
1344 | } | ||
1345 | |||
1346 | /* | ||
1347 | * We suppose that we won't have any more functions than pins, | ||
1348 | * we'll reallocate that later anyway | ||
1349 | */ | ||
1350 | pctl->functions = devm_kzalloc(&pdev->dev, | ||
1351 | pctl->desc->npins * sizeof(*pctl->functions), | ||
1352 | GFP_KERNEL); | ||
1353 | if (!pctl->functions) | ||
1354 | return -ENOMEM; | ||
1355 | |||
1356 | /* Count functions and their associated groups */ | ||
1357 | for (i = 0; i < pctl->desc->npins; i++) { | ||
1358 | const struct sunxi_desc_pin *pin = pctl->desc->pins + i; | ||
1359 | struct sunxi_desc_function *func = pin->functions; | ||
1360 | |||
1361 | while (func->name) { | ||
1362 | sunxi_pinctrl_add_function(pctl, func->name); | ||
1363 | func++; | ||
1364 | } | ||
1365 | } | ||
1366 | |||
1367 | pctl->functions = krealloc(pctl->functions, | ||
1368 | pctl->nfunctions * sizeof(*pctl->functions), | ||
1369 | GFP_KERNEL); | ||
1370 | |||
1371 | for (i = 0; i < pctl->desc->npins; i++) { | ||
1372 | const struct sunxi_desc_pin *pin = pctl->desc->pins + i; | ||
1373 | struct sunxi_desc_function *func = pin->functions; | ||
1374 | |||
1375 | while (func->name) { | ||
1376 | struct sunxi_pinctrl_function *func_item; | ||
1377 | const char **func_grp; | ||
1378 | |||
1379 | func_item = sunxi_pinctrl_find_function_by_name(pctl, | ||
1380 | func->name); | ||
1381 | if (!func_item) | ||
1382 | return -EINVAL; | ||
1383 | |||
1384 | if (!func_item->groups) { | ||
1385 | func_item->groups = | ||
1386 | devm_kzalloc(&pdev->dev, | ||
1387 | func_item->ngroups * sizeof(*func_item->groups), | ||
1388 | GFP_KERNEL); | ||
1389 | if (!func_item->groups) | ||
1390 | return -ENOMEM; | ||
1391 | } | ||
1392 | |||
1393 | func_grp = func_item->groups; | ||
1394 | while (*func_grp) | ||
1395 | func_grp++; | ||
1396 | |||
1397 | *func_grp = pin->pin.name; | ||
1398 | func++; | ||
1399 | } | ||
1400 | } | ||
1401 | |||
1402 | return 0; | ||
1403 | } | ||
1404 | |||
1405 | static int sunxi_pinctrl_probe(struct platform_device *pdev) | ||
1406 | { | ||
1407 | struct device_node *node = pdev->dev.of_node; | ||
1408 | const struct of_device_id *device; | ||
1409 | struct pinctrl_pin_desc *pins; | ||
1410 | struct sunxi_pinctrl *pctl; | ||
1411 | int i, ret, last_pin; | ||
1412 | |||
1413 | pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); | ||
1414 | if (!pctl) | ||
1415 | return -ENOMEM; | ||
1416 | platform_set_drvdata(pdev, pctl); | ||
1417 | |||
1418 | pctl->membase = of_iomap(node, 0); | ||
1419 | if (!pctl->membase) | ||
1420 | return -ENOMEM; | ||
1421 | |||
1422 | device = of_match_device(sunxi_pinctrl_match, &pdev->dev); | ||
1423 | if (!device) | ||
1424 | return -ENODEV; | ||
1425 | |||
1426 | pctl->desc = (struct sunxi_pinctrl_desc *)device->data; | ||
1427 | |||
1428 | ret = sunxi_pinctrl_build_state(pdev); | ||
1429 | if (ret) { | ||
1430 | dev_err(&pdev->dev, "dt probe failed: %d\n", ret); | ||
1431 | return ret; | ||
1432 | } | ||
1433 | |||
1434 | pins = devm_kzalloc(&pdev->dev, | ||
1435 | pctl->desc->npins * sizeof(*pins), | ||
1436 | GFP_KERNEL); | ||
1437 | if (!pins) | ||
1438 | return -ENOMEM; | ||
1439 | |||
1440 | for (i = 0; i < pctl->desc->npins; i++) | ||
1441 | pins[i] = pctl->desc->pins[i].pin; | ||
1442 | |||
1443 | sunxi_pctrl_desc.name = dev_name(&pdev->dev); | ||
1444 | sunxi_pctrl_desc.owner = THIS_MODULE; | ||
1445 | sunxi_pctrl_desc.pins = pins; | ||
1446 | sunxi_pctrl_desc.npins = pctl->desc->npins; | ||
1447 | pctl->dev = &pdev->dev; | ||
1448 | pctl->pctl_dev = pinctrl_register(&sunxi_pctrl_desc, | ||
1449 | &pdev->dev, pctl); | ||
1450 | if (!pctl->pctl_dev) { | ||
1451 | dev_err(&pdev->dev, "couldn't register pinctrl driver\n"); | ||
1452 | return -EINVAL; | ||
1453 | } | ||
1454 | |||
1455 | pctl->chip = devm_kzalloc(&pdev->dev, sizeof(*pctl->chip), GFP_KERNEL); | ||
1456 | if (!pctl->chip) { | ||
1457 | ret = -ENOMEM; | ||
1458 | goto pinctrl_error; | ||
1459 | } | ||
1460 | |||
1461 | last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number; | ||
1462 | pctl->chip = &sunxi_pinctrl_gpio_chip; | ||
1463 | pctl->chip->ngpio = round_up(last_pin, PINS_PER_BANK); | ||
1464 | pctl->chip->label = dev_name(&pdev->dev); | ||
1465 | pctl->chip->dev = &pdev->dev; | ||
1466 | pctl->chip->base = 0; | ||
1467 | |||
1468 | ret = gpiochip_add(pctl->chip); | ||
1469 | if (ret) | ||
1470 | goto pinctrl_error; | ||
1471 | |||
1472 | for (i = 0; i < pctl->desc->npins; i++) { | ||
1473 | const struct sunxi_desc_pin *pin = pctl->desc->pins + i; | ||
1474 | |||
1475 | ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev), | ||
1476 | pin->pin.number, | ||
1477 | pin->pin.number, 1); | ||
1478 | if (ret) | ||
1479 | goto gpiochip_error; | ||
1480 | } | ||
1481 | |||
1482 | dev_info(&pdev->dev, "initialized sunXi PIO driver\n"); | ||
1483 | |||
1484 | return 0; | ||
1485 | |||
1486 | gpiochip_error: | ||
1487 | ret = gpiochip_remove(pctl->chip); | ||
1488 | pinctrl_error: | ||
1489 | pinctrl_unregister(pctl->pctl_dev); | ||
1490 | return ret; | ||
1491 | } | ||
1492 | |||
1493 | static struct platform_driver sunxi_pinctrl_driver = { | ||
1494 | .probe = sunxi_pinctrl_probe, | ||
1495 | .driver = { | ||
1496 | .name = "sunxi-pinctrl", | ||
1497 | .owner = THIS_MODULE, | ||
1498 | .of_match_table = sunxi_pinctrl_match, | ||
1499 | }, | ||
1500 | }; | ||
1501 | module_platform_driver(sunxi_pinctrl_driver); | ||
1502 | |||
1503 | MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); | ||
1504 | MODULE_DESCRIPTION("Allwinner A1X pinctrl driver"); | ||
1505 | MODULE_LICENSE("GPL"); | ||