Merge tag 'linux-watchdog-5.1-rc1' of git://www.linux-watchdog.org/linux-watchdog
[linux-2.6-block.git] / drivers / pinctrl / pinctrl-ingenic.c
1 /*
2  * Ingenic SoCs pinctrl driver
3  *
4  * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
5  *
6  * License terms: GNU General Public License (GPL) version 2
7  */
8
9 #include <linux/compiler.h>
10 #include <linux/gpio/driver.h>
11 #include <linux/interrupt.h>
12 #include <linux/io.h>
13 #include <linux/of_device.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_platform.h>
16 #include <linux/pinctrl/pinctrl.h>
17 #include <linux/pinctrl/pinmux.h>
18 #include <linux/pinctrl/pinconf.h>
19 #include <linux/pinctrl/pinconf-generic.h>
20 #include <linux/platform_device.h>
21 #include <linux/regmap.h>
22 #include <linux/slab.h>
23
24 #include "core.h"
25 #include "pinconf.h"
26 #include "pinmux.h"
27
28 #define GPIO_PIN        0x00
29 #define GPIO_MSK        0x20
30
31 #define JZ4740_GPIO_DATA        0x10
32 #define JZ4740_GPIO_PULL_DIS    0x30
33 #define JZ4740_GPIO_FUNC        0x40
34 #define JZ4740_GPIO_SELECT      0x50
35 #define JZ4740_GPIO_DIR         0x60
36 #define JZ4740_GPIO_TRIG        0x70
37 #define JZ4740_GPIO_FLAG        0x80
38
39 #define JZ4770_GPIO_INT         0x10
40 #define JZ4770_GPIO_PAT1        0x30
41 #define JZ4770_GPIO_PAT0        0x40
42 #define JZ4770_GPIO_FLAG        0x50
43 #define JZ4770_GPIO_PEN         0x70
44
45 #define REG_SET(x) ((x) + 0x4)
46 #define REG_CLEAR(x) ((x) + 0x8)
47
48 #define PINS_PER_GPIO_CHIP 32
49
50 enum jz_version {
51         ID_JZ4740,
52         ID_JZ4725B,
53         ID_JZ4770,
54         ID_JZ4780,
55 };
56
57 struct ingenic_chip_info {
58         unsigned int num_chips;
59
60         const struct group_desc *groups;
61         unsigned int num_groups;
62
63         const struct function_desc *functions;
64         unsigned int num_functions;
65
66         const u32 *pull_ups, *pull_downs;
67 };
68
69 struct ingenic_pinctrl {
70         struct device *dev;
71         struct regmap *map;
72         struct pinctrl_dev *pctl;
73         struct pinctrl_pin_desc *pdesc;
74         enum jz_version version;
75
76         const struct ingenic_chip_info *info;
77 };
78
79 struct ingenic_gpio_chip {
80         struct ingenic_pinctrl *jzpc;
81         struct gpio_chip gc;
82         struct irq_chip irq_chip;
83         unsigned int irq, reg_base;
84 };
85
86 static const u32 jz4740_pull_ups[4] = {
87         0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
88 };
89
90 static const u32 jz4740_pull_downs[4] = {
91         0x00000000, 0x00000000, 0x00000000, 0x00000000,
92 };
93
94 static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, };
95 static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
96 static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, };
97 static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
98 static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, };
99 static int jz4740_lcd_8bit_pins[] = {
100         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x52, 0x53, 0x54,
101 };
102 static int jz4740_lcd_16bit_pins[] = {
103         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55,
104 };
105 static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, };
106 static int jz4740_lcd_18bit_tft_pins[] = { 0x56, 0x57, 0x31, 0x32, };
107 static int jz4740_nand_cs1_pins[] = { 0x39, };
108 static int jz4740_nand_cs2_pins[] = { 0x3a, };
109 static int jz4740_nand_cs3_pins[] = { 0x3b, };
110 static int jz4740_nand_cs4_pins[] = { 0x3c, };
111 static int jz4740_pwm_pwm0_pins[] = { 0x77, };
112 static int jz4740_pwm_pwm1_pins[] = { 0x78, };
113 static int jz4740_pwm_pwm2_pins[] = { 0x79, };
114 static int jz4740_pwm_pwm3_pins[] = { 0x7a, };
115 static int jz4740_pwm_pwm4_pins[] = { 0x7b, };
116 static int jz4740_pwm_pwm5_pins[] = { 0x7c, };
117 static int jz4740_pwm_pwm6_pins[] = { 0x7e, };
118 static int jz4740_pwm_pwm7_pins[] = { 0x7f, };
119
120 static int jz4740_mmc_1bit_funcs[] = { 0, 0, 0, };
121 static int jz4740_mmc_4bit_funcs[] = { 0, 0, 0, };
122 static int jz4740_uart0_data_funcs[] = { 1, 1, };
123 static int jz4740_uart0_hwflow_funcs[] = { 1, 1, };
124 static int jz4740_uart1_data_funcs[] = { 2, 2, };
125 static int jz4740_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
126 static int jz4740_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, };
127 static int jz4740_lcd_18bit_funcs[] = { 0, 0, };
128 static int jz4740_lcd_18bit_tft_funcs[] = { 0, 0, 0, 0, };
129 static int jz4740_nand_cs1_funcs[] = { 0, };
130 static int jz4740_nand_cs2_funcs[] = { 0, };
131 static int jz4740_nand_cs3_funcs[] = { 0, };
132 static int jz4740_nand_cs4_funcs[] = { 0, };
133 static int jz4740_pwm_pwm0_funcs[] = { 0, };
134 static int jz4740_pwm_pwm1_funcs[] = { 0, };
135 static int jz4740_pwm_pwm2_funcs[] = { 0, };
136 static int jz4740_pwm_pwm3_funcs[] = { 0, };
137 static int jz4740_pwm_pwm4_funcs[] = { 0, };
138 static int jz4740_pwm_pwm5_funcs[] = { 0, };
139 static int jz4740_pwm_pwm6_funcs[] = { 0, };
140 static int jz4740_pwm_pwm7_funcs[] = { 0, };
141
142 #define INGENIC_PIN_GROUP(name, id)                     \
143         {                                               \
144                 name,                                   \
145                 id##_pins,                              \
146                 ARRAY_SIZE(id##_pins),                  \
147                 id##_funcs,                             \
148         }
149
150 static const struct group_desc jz4740_groups[] = {
151         INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit),
152         INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit),
153         INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data),
154         INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow),
155         INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data),
156         INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit),
157         INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit),
158         INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit),
159         INGENIC_PIN_GROUP("lcd-18bit-tft", jz4740_lcd_18bit_tft),
160         { "lcd-no-pins", },
161         INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1),
162         INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2),
163         INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3),
164         INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4),
165         INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0),
166         INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1),
167         INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2),
168         INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3),
169         INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4),
170         INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5),
171         INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6),
172         INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7),
173 };
174
175 static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
176 static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
177 static const char *jz4740_uart1_groups[] = { "uart1-data", };
178 static const char *jz4740_lcd_groups[] = {
179         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-18bit-tft", "lcd-no-pins",
180 };
181 static const char *jz4740_nand_groups[] = {
182         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
183 };
184 static const char *jz4740_pwm0_groups[] = { "pwm0", };
185 static const char *jz4740_pwm1_groups[] = { "pwm1", };
186 static const char *jz4740_pwm2_groups[] = { "pwm2", };
187 static const char *jz4740_pwm3_groups[] = { "pwm3", };
188 static const char *jz4740_pwm4_groups[] = { "pwm4", };
189 static const char *jz4740_pwm5_groups[] = { "pwm5", };
190 static const char *jz4740_pwm6_groups[] = { "pwm6", };
191 static const char *jz4740_pwm7_groups[] = { "pwm7", };
192
193 static const struct function_desc jz4740_functions[] = {
194         { "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), },
195         { "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), },
196         { "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), },
197         { "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), },
198         { "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), },
199         { "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), },
200         { "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), },
201         { "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), },
202         { "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), },
203         { "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), },
204         { "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), },
205         { "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), },
206         { "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), },
207 };
208
209 static const struct ingenic_chip_info jz4740_chip_info = {
210         .num_chips = 4,
211         .groups = jz4740_groups,
212         .num_groups = ARRAY_SIZE(jz4740_groups),
213         .functions = jz4740_functions,
214         .num_functions = ARRAY_SIZE(jz4740_functions),
215         .pull_ups = jz4740_pull_ups,
216         .pull_downs = jz4740_pull_downs,
217 };
218
219 static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, };
220 static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, };
221 static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, };
222 static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, };
223 static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, };
224 static int jz4725b_nand_cs1_pins[] = { 0x55, };
225 static int jz4725b_nand_cs2_pins[] = { 0x56, };
226 static int jz4725b_nand_cs3_pins[] = { 0x57, };
227 static int jz4725b_nand_cs4_pins[] = { 0x58, };
228 static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 };
229 static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d };
230 static int jz4725b_pwm_pwm0_pins[] = { 0x4a, };
231 static int jz4725b_pwm_pwm1_pins[] = { 0x4b, };
232 static int jz4725b_pwm_pwm2_pins[] = { 0x4c, };
233 static int jz4725b_pwm_pwm3_pins[] = { 0x4d, };
234 static int jz4725b_pwm_pwm4_pins[] = { 0x4e, };
235 static int jz4725b_pwm_pwm5_pins[] = { 0x4f, };
236 static int jz4725b_lcd_8bit_pins[] = {
237         0x72, 0x73, 0x74,
238         0x60, 0x61, 0x62, 0x63,
239         0x64, 0x65, 0x66, 0x67,
240 };
241 static int jz4725b_lcd_16bit_pins[] = {
242         0x68, 0x69, 0x6a, 0x6b,
243         0x6c, 0x6d, 0x6e, 0x6f,
244 };
245 static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, };
246 static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, };
247 static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
248 static int jz4725b_lcd_generic_pins[] = { 0x75, };
249
250 static int jz4725b_mmc0_1bit_funcs[] = { 1, 1, 1, };
251 static int jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, };
252 static int jz4725b_mmc1_1bit_funcs[] = { 0, 0, 0, };
253 static int jz4725b_mmc1_4bit_funcs[] = { 0, 0, 0, };
254 static int jz4725b_uart_data_funcs[] = { 1, 1, };
255 static int jz4725b_nand_cs1_funcs[] = { 0, };
256 static int jz4725b_nand_cs2_funcs[] = { 0, };
257 static int jz4725b_nand_cs3_funcs[] = { 0, };
258 static int jz4725b_nand_cs4_funcs[] = { 0, };
259 static int jz4725b_nand_cle_ale_funcs[] = { 0, 0, };
260 static int jz4725b_nand_fre_fwe_funcs[] = { 0, 0, };
261 static int jz4725b_pwm_pwm0_funcs[] = { 0, };
262 static int jz4725b_pwm_pwm1_funcs[] = { 0, };
263 static int jz4725b_pwm_pwm2_funcs[] = { 0, };
264 static int jz4725b_pwm_pwm3_funcs[] = { 0, };
265 static int jz4725b_pwm_pwm4_funcs[] = { 0, };
266 static int jz4725b_pwm_pwm5_funcs[] = { 0, };
267 static int jz4725b_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
268 static int jz4725b_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
269 static int jz4725b_lcd_18bit_funcs[] = { 0, 0, };
270 static int jz4725b_lcd_24bit_funcs[] = { 1, 1, 1, 1, };
271 static int jz4725b_lcd_special_funcs[] = { 0, 0, 0, 0, };
272 static int jz4725b_lcd_generic_funcs[] = { 0, };
273
274 static const struct group_desc jz4725b_groups[] = {
275         INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit),
276         INGENIC_PIN_GROUP("mmc0-4bit", jz4725b_mmc0_4bit),
277         INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit),
278         INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit),
279         INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data),
280         INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1),
281         INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2),
282         INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3),
283         INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4),
284         INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale),
285         INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe),
286         INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0),
287         INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1),
288         INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2),
289         INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3),
290         INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4),
291         INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5),
292         INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit),
293         INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit),
294         INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit),
295         INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit),
296         INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special),
297         INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic),
298 };
299
300 static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
301 static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
302 static const char *jz4725b_uart_groups[] = { "uart-data", };
303 static const char *jz4725b_nand_groups[] = {
304         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
305         "nand-cle-ale", "nand-fre-fwe",
306 };
307 static const char *jz4725b_pwm0_groups[] = { "pwm0", };
308 static const char *jz4725b_pwm1_groups[] = { "pwm1", };
309 static const char *jz4725b_pwm2_groups[] = { "pwm2", };
310 static const char *jz4725b_pwm3_groups[] = { "pwm3", };
311 static const char *jz4725b_pwm4_groups[] = { "pwm4", };
312 static const char *jz4725b_pwm5_groups[] = { "pwm5", };
313 static const char *jz4725b_lcd_groups[] = {
314         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
315         "lcd-special", "lcd-generic",
316 };
317
318 static const struct function_desc jz4725b_functions[] = {
319         { "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), },
320         { "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), },
321         { "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), },
322         { "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), },
323         { "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), },
324         { "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), },
325         { "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), },
326         { "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), },
327         { "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), },
328         { "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), },
329         { "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), },
330 };
331
332 static const struct ingenic_chip_info jz4725b_chip_info = {
333         .num_chips = 4,
334         .groups = jz4725b_groups,
335         .num_groups = ARRAY_SIZE(jz4725b_groups),
336         .functions = jz4725b_functions,
337         .num_functions = ARRAY_SIZE(jz4725b_functions),
338         .pull_ups = jz4740_pull_ups,
339         .pull_downs = jz4740_pull_downs,
340 };
341
342 static const u32 jz4770_pull_ups[6] = {
343         0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f,
344 };
345
346 static const u32 jz4770_pull_downs[6] = {
347         0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
348 };
349
350 static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
351 static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
352 static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
353 static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
354 static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, };
355 static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
356 static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
357 static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
358 static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
359 static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
360 static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
361 static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
362 static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
363 static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
364 static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
365 static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
366 static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
367 static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
368 static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
369 static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
370 static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
371 static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
372 static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
373 static int jz4770_nemc_8bit_data_pins[] = {
374         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
375 };
376 static int jz4770_nemc_16bit_data_pins[] = {
377         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
378 };
379 static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
380 static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
381 static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
382 static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
383 static int jz4770_nemc_wait_pins[] = { 0x1b, };
384 static int jz4770_nemc_cs1_pins[] = { 0x15, };
385 static int jz4770_nemc_cs2_pins[] = { 0x16, };
386 static int jz4770_nemc_cs3_pins[] = { 0x17, };
387 static int jz4770_nemc_cs4_pins[] = { 0x18, };
388 static int jz4770_nemc_cs5_pins[] = { 0x19, };
389 static int jz4770_nemc_cs6_pins[] = { 0x1a, };
390 static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, };
391 static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, };
392 static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
393 static int jz4770_cim_8bit_pins[] = {
394         0x26, 0x27, 0x28, 0x29,
395         0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
396 };
397 static int jz4770_cim_12bit_pins[] = {
398         0x32, 0x33, 0xb0, 0xb1,
399 };
400 static int jz4770_lcd_24bit_pins[] = {
401         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
402         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
403         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
404         0x58, 0x59, 0x5a, 0x5b,
405 };
406 static int jz4770_pwm_pwm0_pins[] = { 0x80, };
407 static int jz4770_pwm_pwm1_pins[] = { 0x81, };
408 static int jz4770_pwm_pwm2_pins[] = { 0x82, };
409 static int jz4770_pwm_pwm3_pins[] = { 0x83, };
410 static int jz4770_pwm_pwm4_pins[] = { 0x84, };
411 static int jz4770_pwm_pwm5_pins[] = { 0x85, };
412 static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
413 static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
414 static int jz4770_mac_rmii_pins[] = {
415         0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
416 };
417 static int jz4770_mac_mii_pins[] = { 0xa7, 0xaf, };
418
419 static int jz4770_uart0_data_funcs[] = { 0, 0, };
420 static int jz4770_uart0_hwflow_funcs[] = { 0, 0, };
421 static int jz4770_uart1_data_funcs[] = { 0, 0, };
422 static int jz4770_uart1_hwflow_funcs[] = { 0, 0, };
423 static int jz4770_uart2_data_funcs[] = { 0, 0, };
424 static int jz4770_uart2_hwflow_funcs[] = { 0, 0, };
425 static int jz4770_uart3_data_funcs[] = { 0, 1, };
426 static int jz4770_uart3_hwflow_funcs[] = { 0, 0, };
427 static int jz4770_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
428 static int jz4770_mmc0_4bit_a_funcs[] = { 1, 1, 1, };
429 static int jz4770_mmc0_1bit_e_funcs[] = { 0, 0, 0, };
430 static int jz4770_mmc0_4bit_e_funcs[] = { 0, 0, 0, };
431 static int jz4770_mmc0_8bit_e_funcs[] = { 0, 0, 0, 0, };
432 static int jz4770_mmc1_1bit_d_funcs[] = { 0, 0, 0, };
433 static int jz4770_mmc1_4bit_d_funcs[] = { 0, 0, 0, };
434 static int jz4770_mmc1_1bit_e_funcs[] = { 1, 1, 1, };
435 static int jz4770_mmc1_4bit_e_funcs[] = { 1, 1, 1, };
436 static int jz4770_mmc1_8bit_e_funcs[] = { 1, 1, 1, 1, };
437 static int jz4770_mmc2_1bit_b_funcs[] = { 0, 0, 0, };
438 static int jz4770_mmc2_4bit_b_funcs[] = { 0, 0, 0, };
439 static int jz4770_mmc2_1bit_e_funcs[] = { 2, 2, 2, };
440 static int jz4770_mmc2_4bit_e_funcs[] = { 2, 2, 2, };
441 static int jz4770_mmc2_8bit_e_funcs[] = { 2, 2, 2, 2, };
442 static int jz4770_nemc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
443 static int jz4770_nemc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
444 static int jz4770_nemc_cle_ale_funcs[] = { 0, 0, };
445 static int jz4770_nemc_addr_funcs[] = { 0, 0, 0, 0, };
446 static int jz4770_nemc_rd_we_funcs[] = { 0, 0, };
447 static int jz4770_nemc_frd_fwe_funcs[] = { 0, 0, };
448 static int jz4770_nemc_wait_funcs[] = { 0, };
449 static int jz4770_nemc_cs1_funcs[] = { 0, };
450 static int jz4770_nemc_cs2_funcs[] = { 0, };
451 static int jz4770_nemc_cs3_funcs[] = { 0, };
452 static int jz4770_nemc_cs4_funcs[] = { 0, };
453 static int jz4770_nemc_cs5_funcs[] = { 0, };
454 static int jz4770_nemc_cs6_funcs[] = { 0, };
455 static int jz4770_i2c0_funcs[] = { 0, 0, };
456 static int jz4770_i2c1_funcs[] = { 0, 0, };
457 static int jz4770_i2c2_funcs[] = { 2, 2, };
458 static int jz4770_cim_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
459 static int jz4770_cim_12bit_funcs[] = { 0, 0, 0, 0, };
460 static int jz4770_lcd_24bit_funcs[] = {
461         0, 0, 0, 0, 0, 0, 0, 0,
462         0, 0, 0, 0, 0, 0, 0, 0,
463         0, 0, 0, 0, 0, 0, 0, 0,
464         0, 0, 0, 0,
465 };
466 static int jz4770_pwm_pwm0_funcs[] = { 0, };
467 static int jz4770_pwm_pwm1_funcs[] = { 0, };
468 static int jz4770_pwm_pwm2_funcs[] = { 0, };
469 static int jz4770_pwm_pwm3_funcs[] = { 0, };
470 static int jz4770_pwm_pwm4_funcs[] = { 0, };
471 static int jz4770_pwm_pwm5_funcs[] = { 0, };
472 static int jz4770_pwm_pwm6_funcs[] = { 0, };
473 static int jz4770_pwm_pwm7_funcs[] = { 0, };
474 static int jz4770_mac_rmii_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
475 static int jz4770_mac_mii_funcs[] = { 0, 0, };
476
477 static const struct group_desc jz4770_groups[] = {
478         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data),
479         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow),
480         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data),
481         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow),
482         INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data),
483         INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow),
484         INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data),
485         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow),
486         INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a),
487         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a),
488         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e),
489         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e),
490         INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e),
491         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d),
492         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d),
493         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e),
494         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e),
495         INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e),
496         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b),
497         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b),
498         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e),
499         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e),
500         INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e),
501         INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data),
502         INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data),
503         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale),
504         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr),
505         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we),
506         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe),
507         INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait),
508         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1),
509         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2),
510         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3),
511         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4),
512         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5),
513         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6),
514         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0),
515         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1),
516         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2),
517         INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit),
518         INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit),
519         INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit),
520         { "lcd-no-pins", },
521         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0),
522         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1),
523         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2),
524         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3),
525         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4),
526         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5),
527         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6),
528         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7),
529         INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii),
530         INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii),
531 };
532
533 static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
534 static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
535 static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
536 static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
537 static const char *jz4770_mmc0_groups[] = {
538         "mmc0-1bit-a", "mmc0-4bit-a",
539         "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
540 };
541 static const char *jz4770_mmc1_groups[] = {
542         "mmc1-1bit-d", "mmc1-4bit-d",
543         "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
544 };
545 static const char *jz4770_mmc2_groups[] = {
546         "mmc2-1bit-b", "mmc2-4bit-b",
547         "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
548 };
549 static const char *jz4770_nemc_groups[] = {
550         "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
551         "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
552 };
553 static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
554 static const char *jz4770_cs2_groups[] = { "nemc-cs2", };
555 static const char *jz4770_cs3_groups[] = { "nemc-cs3", };
556 static const char *jz4770_cs4_groups[] = { "nemc-cs4", };
557 static const char *jz4770_cs5_groups[] = { "nemc-cs5", };
558 static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
559 static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
560 static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
561 static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
562 static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
563 static const char *jz4770_lcd_groups[] = { "lcd-24bit", "lcd-no-pins", };
564 static const char *jz4770_pwm0_groups[] = { "pwm0", };
565 static const char *jz4770_pwm1_groups[] = { "pwm1", };
566 static const char *jz4770_pwm2_groups[] = { "pwm2", };
567 static const char *jz4770_pwm3_groups[] = { "pwm3", };
568 static const char *jz4770_pwm4_groups[] = { "pwm4", };
569 static const char *jz4770_pwm5_groups[] = { "pwm5", };
570 static const char *jz4770_pwm6_groups[] = { "pwm6", };
571 static const char *jz4770_pwm7_groups[] = { "pwm7", };
572 static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", };
573
574 static const struct function_desc jz4770_functions[] = {
575         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
576         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
577         { "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
578         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
579         { "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
580         { "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
581         { "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), },
582         { "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
583         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
584         { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
585         { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
586         { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
587         { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
588         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
589         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
590         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
591         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
592         { "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
593         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
594         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
595         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
596         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
597         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
598         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
599         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
600         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
601         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
602         { "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), },
603 };
604
605 static const struct ingenic_chip_info jz4770_chip_info = {
606         .num_chips = 6,
607         .groups = jz4770_groups,
608         .num_groups = ARRAY_SIZE(jz4770_groups),
609         .functions = jz4770_functions,
610         .num_functions = ARRAY_SIZE(jz4770_functions),
611         .pull_ups = jz4770_pull_ups,
612         .pull_downs = jz4770_pull_downs,
613 };
614
615 static int jz4780_uart2_data_pins[] = { 0x66, 0x67, };
616 static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, };
617 static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, };
618 static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
619 static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, };
620 static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, };
621 static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, };
622
623 static int jz4780_uart2_data_funcs[] = { 1, 1, };
624 static int jz4780_uart2_hwflow_funcs[] = { 1, 1, };
625 static int jz4780_uart4_data_funcs[] = { 2, 2, };
626 static int jz4780_mmc0_8bit_a_funcs[] = { 1, 1, 1, 1, 1, };
627 static int jz4780_i2c3_funcs[] = { 1, 1, };
628 static int jz4780_i2c4_e_funcs[] = { 1, 1, };
629 static int jz4780_i2c4_f_funcs[] = { 1, 1, };
630
631 static const struct group_desc jz4780_groups[] = {
632         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data),
633         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow),
634         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data),
635         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow),
636         INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data),
637         INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow),
638         INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data),
639         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow),
640         INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data),
641         INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a),
642         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a),
643         INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a),
644         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e),
645         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e),
646         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d),
647         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d),
648         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e),
649         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e),
650         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b),
651         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b),
652         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e),
653         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e),
654         INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data),
655         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale),
656         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr),
657         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we),
658         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe),
659         INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait),
660         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1),
661         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2),
662         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3),
663         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4),
664         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5),
665         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6),
666         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0),
667         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1),
668         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2),
669         INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3),
670         INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e),
671         INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f),
672         INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit),
673         INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit),
674         { "lcd-no-pins", },
675         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0),
676         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1),
677         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2),
678         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3),
679         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4),
680         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5),
681         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6),
682         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7),
683 };
684
685 static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
686 static const char *jz4780_uart4_groups[] = { "uart4-data", };
687 static const char *jz4780_mmc0_groups[] = {
688         "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
689         "mmc0-1bit-e", "mmc0-4bit-e",
690 };
691 static const char *jz4780_mmc1_groups[] = {
692         "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
693 };
694 static const char *jz4780_mmc2_groups[] = {
695         "mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e",
696 };
697 static const char *jz4780_nemc_groups[] = {
698         "nemc-data", "nemc-cle-ale", "nemc-addr",
699         "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
700 };
701 static const char *jz4780_i2c3_groups[] = { "i2c3-data", };
702 static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
703 static const char *jz4780_cim_groups[] = { "cim-data", };
704
705 static const struct function_desc jz4780_functions[] = {
706         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
707         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
708         { "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), },
709         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
710         { "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), },
711         { "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), },
712         { "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), },
713         { "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), },
714         { "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), },
715         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
716         { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
717         { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
718         { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
719         { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
720         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
721         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
722         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
723         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
724         { "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), },
725         { "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), },
726         { "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), },
727         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
728         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
729         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
730         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
731         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
732         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
733         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
734         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
735         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
736 };
737
738 static const struct ingenic_chip_info jz4780_chip_info = {
739         .num_chips = 6,
740         .groups = jz4780_groups,
741         .num_groups = ARRAY_SIZE(jz4780_groups),
742         .functions = jz4780_functions,
743         .num_functions = ARRAY_SIZE(jz4780_functions),
744         .pull_ups = jz4770_pull_ups,
745         .pull_downs = jz4770_pull_downs,
746 };
747
748 static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg)
749 {
750         unsigned int val;
751
752         regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val);
753
754         return (u32) val;
755 }
756
757 static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc,
758                 u8 reg, u8 offset, bool set)
759 {
760         if (set)
761                 reg = REG_SET(reg);
762         else
763                 reg = REG_CLEAR(reg);
764
765         regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset));
766 }
767
768 static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,
769                                           u8 offset)
770 {
771         unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN);
772
773         return !!(val & BIT(offset));
774 }
775
776 static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc,
777                                    u8 offset, int value)
778 {
779         if (jzgc->jzpc->version >= ID_JZ4770)
780                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_PAT0, offset, !!value);
781         else
782                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value);
783 }
784
785 static void irq_set_type(struct ingenic_gpio_chip *jzgc,
786                 u8 offset, unsigned int type)
787 {
788         u8 reg1, reg2;
789
790         if (jzgc->jzpc->version >= ID_JZ4770) {
791                 reg1 = JZ4770_GPIO_PAT1;
792                 reg2 = JZ4770_GPIO_PAT0;
793         } else {
794                 reg1 = JZ4740_GPIO_TRIG;
795                 reg2 = JZ4740_GPIO_DIR;
796         }
797
798         switch (type) {
799         case IRQ_TYPE_EDGE_RISING:
800                 ingenic_gpio_set_bit(jzgc, reg2, offset, true);
801                 ingenic_gpio_set_bit(jzgc, reg1, offset, true);
802                 break;
803         case IRQ_TYPE_EDGE_FALLING:
804                 ingenic_gpio_set_bit(jzgc, reg2, offset, false);
805                 ingenic_gpio_set_bit(jzgc, reg1, offset, true);
806                 break;
807         case IRQ_TYPE_LEVEL_HIGH:
808                 ingenic_gpio_set_bit(jzgc, reg2, offset, true);
809                 ingenic_gpio_set_bit(jzgc, reg1, offset, false);
810                 break;
811         case IRQ_TYPE_LEVEL_LOW:
812         default:
813                 ingenic_gpio_set_bit(jzgc, reg2, offset, false);
814                 ingenic_gpio_set_bit(jzgc, reg1, offset, false);
815                 break;
816         }
817 }
818
819 static void ingenic_gpio_irq_mask(struct irq_data *irqd)
820 {
821         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
822         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
823
824         ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, true);
825 }
826
827 static void ingenic_gpio_irq_unmask(struct irq_data *irqd)
828 {
829         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
830         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
831
832         ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, false);
833 }
834
835 static void ingenic_gpio_irq_enable(struct irq_data *irqd)
836 {
837         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
838         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
839         int irq = irqd->hwirq;
840
841         if (jzgc->jzpc->version >= ID_JZ4770)
842                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, true);
843         else
844                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true);
845
846         ingenic_gpio_irq_unmask(irqd);
847 }
848
849 static void ingenic_gpio_irq_disable(struct irq_data *irqd)
850 {
851         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
852         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
853         int irq = irqd->hwirq;
854
855         ingenic_gpio_irq_mask(irqd);
856
857         if (jzgc->jzpc->version >= ID_JZ4770)
858                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, false);
859         else
860                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false);
861 }
862
863 static void ingenic_gpio_irq_ack(struct irq_data *irqd)
864 {
865         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
866         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
867         int irq = irqd->hwirq;
868         bool high;
869
870         if (irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) {
871                 /*
872                  * Switch to an interrupt for the opposite edge to the one that
873                  * triggered the interrupt being ACKed.
874                  */
875                 high = ingenic_gpio_get_value(jzgc, irq);
876                 if (high)
877                         irq_set_type(jzgc, irq, IRQ_TYPE_EDGE_FALLING);
878                 else
879                         irq_set_type(jzgc, irq, IRQ_TYPE_EDGE_RISING);
880         }
881
882         if (jzgc->jzpc->version >= ID_JZ4770)
883                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_FLAG, irq, false);
884         else
885                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true);
886 }
887
888 static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
889 {
890         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
891         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
892
893         switch (type) {
894         case IRQ_TYPE_EDGE_BOTH:
895         case IRQ_TYPE_EDGE_RISING:
896         case IRQ_TYPE_EDGE_FALLING:
897                 irq_set_handler_locked(irqd, handle_edge_irq);
898                 break;
899         case IRQ_TYPE_LEVEL_HIGH:
900         case IRQ_TYPE_LEVEL_LOW:
901                 irq_set_handler_locked(irqd, handle_level_irq);
902                 break;
903         default:
904                 irq_set_handler_locked(irqd, handle_bad_irq);
905         }
906
907         if (type == IRQ_TYPE_EDGE_BOTH) {
908                 /*
909                  * The hardware does not support interrupts on both edges. The
910                  * best we can do is to set up a single-edge interrupt and then
911                  * switch to the opposing edge when ACKing the interrupt.
912                  */
913                 bool high = ingenic_gpio_get_value(jzgc, irqd->hwirq);
914
915                 type = high ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING;
916         }
917
918         irq_set_type(jzgc, irqd->hwirq, type);
919         return 0;
920 }
921
922 static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on)
923 {
924         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
925         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
926
927         return irq_set_irq_wake(jzgc->irq, on);
928 }
929
930 static void ingenic_gpio_irq_handler(struct irq_desc *desc)
931 {
932         struct gpio_chip *gc = irq_desc_get_handler_data(desc);
933         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
934         struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data);
935         unsigned long flag, i;
936
937         chained_irq_enter(irq_chip, desc);
938
939         if (jzgc->jzpc->version >= ID_JZ4770)
940                 flag = ingenic_gpio_read_reg(jzgc, JZ4770_GPIO_FLAG);
941         else
942                 flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG);
943
944         for_each_set_bit(i, &flag, 32)
945                 generic_handle_irq(irq_linear_revmap(gc->irq.domain, i));
946         chained_irq_exit(irq_chip, desc);
947 }
948
949 static void ingenic_gpio_set(struct gpio_chip *gc,
950                 unsigned int offset, int value)
951 {
952         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
953
954         ingenic_gpio_set_value(jzgc, offset, value);
955 }
956
957 static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset)
958 {
959         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
960
961         return (int) ingenic_gpio_get_value(jzgc, offset);
962 }
963
964 static int ingenic_gpio_direction_input(struct gpio_chip *gc,
965                 unsigned int offset)
966 {
967         return pinctrl_gpio_direction_input(gc->base + offset);
968 }
969
970 static int ingenic_gpio_direction_output(struct gpio_chip *gc,
971                 unsigned int offset, int value)
972 {
973         ingenic_gpio_set(gc, offset, value);
974         return pinctrl_gpio_direction_output(gc->base + offset);
975 }
976
977 static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
978                 unsigned int pin, u8 reg, bool set)
979 {
980         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
981         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
982
983         regmap_write(jzpc->map, offt * 0x100 +
984                         (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
985 }
986
987 static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
988                 unsigned int pin, u8 reg)
989 {
990         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
991         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
992         unsigned int val;
993
994         regmap_read(jzpc->map, offt * 0x100 + reg, &val);
995
996         return val & BIT(idx);
997 }
998
999 static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
1000 {
1001         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1002         struct ingenic_pinctrl *jzpc = jzgc->jzpc;
1003         unsigned int pin = gc->base + offset;
1004
1005         if (jzpc->version >= ID_JZ4770)
1006                 return ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PAT1);
1007
1008         if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
1009                 return true;
1010
1011         return !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR);
1012 }
1013
1014 static const struct pinctrl_ops ingenic_pctlops = {
1015         .get_groups_count = pinctrl_generic_get_group_count,
1016         .get_group_name = pinctrl_generic_get_group_name,
1017         .get_group_pins = pinctrl_generic_get_group_pins,
1018         .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
1019         .dt_free_map = pinconf_generic_dt_free_map,
1020 };
1021
1022 static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
1023                 int pin, int func)
1024 {
1025         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1026         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1027
1028         dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n",
1029                         'A' + offt, idx, func);
1030
1031         if (jzpc->version >= ID_JZ4770) {
1032                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
1033                 ingenic_config_pin(jzpc, pin, GPIO_MSK, false);
1034                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
1035                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
1036         } else {
1037                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
1038                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
1039                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func > 0);
1040         }
1041
1042         return 0;
1043 }
1044
1045 static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
1046                 unsigned int selector, unsigned int group)
1047 {
1048         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
1049         struct function_desc *func;
1050         struct group_desc *grp;
1051         unsigned int i;
1052
1053         func = pinmux_generic_get_function(pctldev, selector);
1054         if (!func)
1055                 return -EINVAL;
1056
1057         grp = pinctrl_generic_get_group(pctldev, group);
1058         if (!grp)
1059                 return -EINVAL;
1060
1061         dev_dbg(pctldev->dev, "enable function %s group %s\n",
1062                 func->name, grp->name);
1063
1064         for (i = 0; i < grp->num_pins; i++) {
1065                 int *pin_modes = grp->data;
1066
1067                 ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
1068         }
1069
1070         return 0;
1071 }
1072
1073 static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
1074                 struct pinctrl_gpio_range *range,
1075                 unsigned int pin, bool input)
1076 {
1077         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
1078         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1079         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1080
1081         dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n",
1082                         'A' + offt, idx, input ? "in" : "out");
1083
1084         if (jzpc->version >= ID_JZ4770) {
1085                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
1086                 ingenic_config_pin(jzpc, pin, GPIO_MSK, true);
1087                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
1088         } else {
1089                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
1090                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input);
1091                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
1092         }
1093
1094         return 0;
1095 }
1096
1097 static const struct pinmux_ops ingenic_pmxops = {
1098         .get_functions_count = pinmux_generic_get_function_count,
1099         .get_function_name = pinmux_generic_get_function_name,
1100         .get_function_groups = pinmux_generic_get_function_groups,
1101         .set_mux = ingenic_pinmux_set_mux,
1102         .gpio_set_direction = ingenic_pinmux_gpio_set_direction,
1103 };
1104
1105 static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
1106                 unsigned int pin, unsigned long *config)
1107 {
1108         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
1109         enum pin_config_param param = pinconf_to_config_param(*config);
1110         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1111         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1112         bool pull;
1113
1114         if (jzpc->version >= ID_JZ4770)
1115                 pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN);
1116         else
1117                 pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
1118
1119         switch (param) {
1120         case PIN_CONFIG_BIAS_DISABLE:
1121                 if (pull)
1122                         return -EINVAL;
1123                 break;
1124
1125         case PIN_CONFIG_BIAS_PULL_UP:
1126                 if (!pull || !(jzpc->info->pull_ups[offt] & BIT(idx)))
1127                         return -EINVAL;
1128                 break;
1129
1130         case PIN_CONFIG_BIAS_PULL_DOWN:
1131                 if (!pull || !(jzpc->info->pull_downs[offt] & BIT(idx)))
1132                         return -EINVAL;
1133                 break;
1134
1135         default:
1136                 return -ENOTSUPP;
1137         }
1138
1139         *config = pinconf_to_config_packed(param, 1);
1140         return 0;
1141 }
1142
1143 static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
1144                 unsigned int pin, bool enabled)
1145 {
1146         if (jzpc->version >= ID_JZ4770)
1147                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !enabled);
1148         else
1149                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !enabled);
1150 }
1151
1152 static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1153                 unsigned long *configs, unsigned int num_configs)
1154 {
1155         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
1156         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1157         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1158         unsigned int cfg;
1159
1160         for (cfg = 0; cfg < num_configs; cfg++) {
1161                 switch (pinconf_to_config_param(configs[cfg])) {
1162                 case PIN_CONFIG_BIAS_DISABLE:
1163                 case PIN_CONFIG_BIAS_PULL_UP:
1164                 case PIN_CONFIG_BIAS_PULL_DOWN:
1165                         continue;
1166                 default:
1167                         return -ENOTSUPP;
1168                 }
1169         }
1170
1171         for (cfg = 0; cfg < num_configs; cfg++) {
1172                 switch (pinconf_to_config_param(configs[cfg])) {
1173                 case PIN_CONFIG_BIAS_DISABLE:
1174                         dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n",
1175                                         'A' + offt, idx);
1176                         ingenic_set_bias(jzpc, pin, false);
1177                         break;
1178
1179                 case PIN_CONFIG_BIAS_PULL_UP:
1180                         if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
1181                                 return -EINVAL;
1182                         dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n",
1183                                         'A' + offt, idx);
1184                         ingenic_set_bias(jzpc, pin, true);
1185                         break;
1186
1187                 case PIN_CONFIG_BIAS_PULL_DOWN:
1188                         if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
1189                                 return -EINVAL;
1190                         dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n",
1191                                         'A' + offt, idx);
1192                         ingenic_set_bias(jzpc, pin, true);
1193                         break;
1194
1195                 default:
1196                         unreachable();
1197                 }
1198         }
1199
1200         return 0;
1201 }
1202
1203 static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
1204                 unsigned int group, unsigned long *config)
1205 {
1206         const unsigned int *pins;
1207         unsigned int i, npins, old = 0;
1208         int ret;
1209
1210         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
1211         if (ret)
1212                 return ret;
1213
1214         for (i = 0; i < npins; i++) {
1215                 if (ingenic_pinconf_get(pctldev, pins[i], config))
1216                         return -ENOTSUPP;
1217
1218                 /* configs do not match between two pins */
1219                 if (i && (old != *config))
1220                         return -ENOTSUPP;
1221
1222                 old = *config;
1223         }
1224
1225         return 0;
1226 }
1227
1228 static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
1229                 unsigned int group, unsigned long *configs,
1230                 unsigned int num_configs)
1231 {
1232         const unsigned int *pins;
1233         unsigned int i, npins;
1234         int ret;
1235
1236         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
1237         if (ret)
1238                 return ret;
1239
1240         for (i = 0; i < npins; i++) {
1241                 ret = ingenic_pinconf_set(pctldev,
1242                                 pins[i], configs, num_configs);
1243                 if (ret)
1244                         return ret;
1245         }
1246
1247         return 0;
1248 }
1249
1250 static const struct pinconf_ops ingenic_confops = {
1251         .is_generic = true,
1252         .pin_config_get = ingenic_pinconf_get,
1253         .pin_config_set = ingenic_pinconf_set,
1254         .pin_config_group_get = ingenic_pinconf_group_get,
1255         .pin_config_group_set = ingenic_pinconf_group_set,
1256 };
1257
1258 static const struct regmap_config ingenic_pinctrl_regmap_config = {
1259         .reg_bits = 32,
1260         .val_bits = 32,
1261         .reg_stride = 4,
1262 };
1263
1264 static const struct of_device_id ingenic_pinctrl_of_match[] = {
1265         { .compatible = "ingenic,jz4740-pinctrl", .data = (void *) ID_JZ4740 },
1266         { .compatible = "ingenic,jz4725b-pinctrl", .data = (void *)ID_JZ4725B },
1267         { .compatible = "ingenic,jz4770-pinctrl", .data = (void *) ID_JZ4770 },
1268         { .compatible = "ingenic,jz4780-pinctrl", .data = (void *) ID_JZ4780 },
1269         {},
1270 };
1271
1272 static const struct of_device_id ingenic_gpio_of_match[] __initconst = {
1273         { .compatible = "ingenic,jz4740-gpio", },
1274         { .compatible = "ingenic,jz4770-gpio", },
1275         { .compatible = "ingenic,jz4780-gpio", },
1276         {},
1277 };
1278
1279 static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc,
1280                                      struct device_node *node)
1281 {
1282         struct ingenic_gpio_chip *jzgc;
1283         struct device *dev = jzpc->dev;
1284         unsigned int bank;
1285         int err;
1286
1287         err = of_property_read_u32(node, "reg", &bank);
1288         if (err) {
1289                 dev_err(dev, "Cannot read \"reg\" property: %i\n", err);
1290                 return err;
1291         }
1292
1293         jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL);
1294         if (!jzgc)
1295                 return -ENOMEM;
1296
1297         jzgc->jzpc = jzpc;
1298         jzgc->reg_base = bank * 0x100;
1299
1300         jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank);
1301         if (!jzgc->gc.label)
1302                 return -ENOMEM;
1303
1304         /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
1305          * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
1306          * <linux/gpio/consumer.h> INSTEAD.
1307          */
1308         jzgc->gc.base = bank * 32;
1309
1310         jzgc->gc.ngpio = 32;
1311         jzgc->gc.parent = dev;
1312         jzgc->gc.of_node = node;
1313         jzgc->gc.owner = THIS_MODULE;
1314
1315         jzgc->gc.set = ingenic_gpio_set;
1316         jzgc->gc.get = ingenic_gpio_get;
1317         jzgc->gc.direction_input = ingenic_gpio_direction_input;
1318         jzgc->gc.direction_output = ingenic_gpio_direction_output;
1319         jzgc->gc.get_direction = ingenic_gpio_get_direction;
1320
1321         if (of_property_read_bool(node, "gpio-ranges")) {
1322                 jzgc->gc.request = gpiochip_generic_request;
1323                 jzgc->gc.free = gpiochip_generic_free;
1324         }
1325
1326         err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc);
1327         if (err)
1328                 return err;
1329
1330         jzgc->irq = irq_of_parse_and_map(node, 0);
1331         if (!jzgc->irq)
1332                 return -EINVAL;
1333
1334         jzgc->irq_chip.name = jzgc->gc.label;
1335         jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable;
1336         jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable;
1337         jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask;
1338         jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask;
1339         jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack;
1340         jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type;
1341         jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake;
1342         jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND;
1343
1344         err = gpiochip_irqchip_add(&jzgc->gc, &jzgc->irq_chip, 0,
1345                         handle_level_irq, IRQ_TYPE_NONE);
1346         if (err)
1347                 return err;
1348
1349         gpiochip_set_chained_irqchip(&jzgc->gc, &jzgc->irq_chip,
1350                         jzgc->irq, ingenic_gpio_irq_handler);
1351         return 0;
1352 }
1353
1354 static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
1355 {
1356         struct device *dev = &pdev->dev;
1357         struct ingenic_pinctrl *jzpc;
1358         struct pinctrl_desc *pctl_desc;
1359         void __iomem *base;
1360         const struct platform_device_id *id = platform_get_device_id(pdev);
1361         const struct of_device_id *of_id = of_match_device(
1362                         ingenic_pinctrl_of_match, dev);
1363         const struct ingenic_chip_info *chip_info;
1364         struct device_node *node;
1365         unsigned int i;
1366         int err;
1367
1368         jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
1369         if (!jzpc)
1370                 return -ENOMEM;
1371
1372         base = devm_ioremap_resource(dev,
1373                         platform_get_resource(pdev, IORESOURCE_MEM, 0));
1374         if (IS_ERR(base))
1375                 return PTR_ERR(base);
1376
1377         jzpc->map = devm_regmap_init_mmio(dev, base,
1378                         &ingenic_pinctrl_regmap_config);
1379         if (IS_ERR(jzpc->map)) {
1380                 dev_err(dev, "Failed to create regmap\n");
1381                 return PTR_ERR(jzpc->map);
1382         }
1383
1384         jzpc->dev = dev;
1385
1386         if (of_id)
1387                 jzpc->version = (enum jz_version)of_id->data;
1388         else
1389                 jzpc->version = (enum jz_version)id->driver_data;
1390
1391         if (jzpc->version >= ID_JZ4780)
1392                 chip_info = &jz4780_chip_info;
1393         else if (jzpc->version >= ID_JZ4770)
1394                 chip_info = &jz4770_chip_info;
1395         else if (jzpc->version >= ID_JZ4725B)
1396                 chip_info = &jz4725b_chip_info;
1397         else
1398                 chip_info = &jz4740_chip_info;
1399         jzpc->info = chip_info;
1400
1401         pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
1402         if (!pctl_desc)
1403                 return -ENOMEM;
1404
1405         /* fill in pinctrl_desc structure */
1406         pctl_desc->name = dev_name(dev);
1407         pctl_desc->owner = THIS_MODULE;
1408         pctl_desc->pctlops = &ingenic_pctlops;
1409         pctl_desc->pmxops = &ingenic_pmxops;
1410         pctl_desc->confops = &ingenic_confops;
1411         pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
1412         pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev,
1413                         pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL);
1414         if (!jzpc->pdesc)
1415                 return -ENOMEM;
1416
1417         for (i = 0; i < pctl_desc->npins; i++) {
1418                 jzpc->pdesc[i].number = i;
1419                 jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
1420                                                 'A' + (i / PINS_PER_GPIO_CHIP),
1421                                                 i % PINS_PER_GPIO_CHIP);
1422         }
1423
1424         jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
1425         if (IS_ERR(jzpc->pctl)) {
1426                 dev_err(dev, "Failed to register pinctrl\n");
1427                 return PTR_ERR(jzpc->pctl);
1428         }
1429
1430         for (i = 0; i < chip_info->num_groups; i++) {
1431                 const struct group_desc *group = &chip_info->groups[i];
1432
1433                 err = pinctrl_generic_add_group(jzpc->pctl, group->name,
1434                                 group->pins, group->num_pins, group->data);
1435                 if (err < 0) {
1436                         dev_err(dev, "Failed to register group %s\n",
1437                                         group->name);
1438                         return err;
1439                 }
1440         }
1441
1442         for (i = 0; i < chip_info->num_functions; i++) {
1443                 const struct function_desc *func = &chip_info->functions[i];
1444
1445                 err = pinmux_generic_add_function(jzpc->pctl, func->name,
1446                                 func->group_names, func->num_group_names,
1447                                 func->data);
1448                 if (err < 0) {
1449                         dev_err(dev, "Failed to register function %s\n",
1450                                         func->name);
1451                         return err;
1452                 }
1453         }
1454
1455         dev_set_drvdata(dev, jzpc->map);
1456
1457         for_each_child_of_node(dev->of_node, node) {
1458                 if (of_match_node(ingenic_gpio_of_match, node)) {
1459                         err = ingenic_gpio_probe(jzpc, node);
1460                         if (err)
1461                                 return err;
1462                 }
1463         }
1464
1465         return 0;
1466 }
1467
1468 static const struct platform_device_id ingenic_pinctrl_ids[] = {
1469         { "jz4740-pinctrl", ID_JZ4740 },
1470         { "jz4725b-pinctrl", ID_JZ4725B },
1471         { "jz4770-pinctrl", ID_JZ4770 },
1472         { "jz4780-pinctrl", ID_JZ4780 },
1473         {},
1474 };
1475
1476 static struct platform_driver ingenic_pinctrl_driver = {
1477         .driver = {
1478                 .name = "pinctrl-ingenic",
1479                 .of_match_table = of_match_ptr(ingenic_pinctrl_of_match),
1480         },
1481         .id_table = ingenic_pinctrl_ids,
1482 };
1483
1484 static int __init ingenic_pinctrl_drv_register(void)
1485 {
1486         return platform_driver_probe(&ingenic_pinctrl_driver,
1487                                      ingenic_pinctrl_probe);
1488 }
1489 subsys_initcall(ingenic_pinctrl_drv_register);