GNU Linux-libre 5.15.54-gnu
[releases.git] / drivers / pinctrl / pinctrl-ingenic.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Ingenic SoCs pinctrl driver
4  *
5  * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
6  * Copyright (c) 2017, 2019 Paul Boddie <paul@boddie.org.uk>
7  * Copyright (c) 2019, 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
8  */
9
10 #include <linux/compiler.h>
11 #include <linux/gpio/driver.h>
12 #include <linux/interrupt.h>
13 #include <linux/io.h>
14 #include <linux/kernel.h>
15 #include <linux/of_device.h>
16 #include <linux/of_irq.h>
17 #include <linux/of_platform.h>
18 #include <linux/pinctrl/pinctrl.h>
19 #include <linux/pinctrl/pinmux.h>
20 #include <linux/pinctrl/pinconf.h>
21 #include <linux/pinctrl/pinconf-generic.h>
22 #include <linux/platform_device.h>
23 #include <linux/regmap.h>
24 #include <linux/slab.h>
25
26 #include "core.h"
27 #include "pinconf.h"
28 #include "pinmux.h"
29
30 #define GPIO_PIN                                        0x00
31 #define GPIO_MSK                                        0x20
32
33 #define JZ4730_GPIO_DATA                        0x00
34 #define JZ4730_GPIO_GPDIR                       0x04
35 #define JZ4730_GPIO_GPPUR                       0x0c
36 #define JZ4730_GPIO_GPALR                       0x10
37 #define JZ4730_GPIO_GPAUR                       0x14
38 #define JZ4730_GPIO_GPIDLR                      0x18
39 #define JZ4730_GPIO_GPIDUR                      0x1c
40 #define JZ4730_GPIO_GPIER                       0x20
41 #define JZ4730_GPIO_GPIMR                       0x24
42 #define JZ4730_GPIO_GPFR                        0x28
43
44 #define JZ4740_GPIO_DATA                        0x10
45 #define JZ4740_GPIO_PULL_DIS            0x30
46 #define JZ4740_GPIO_FUNC                        0x40
47 #define JZ4740_GPIO_SELECT                      0x50
48 #define JZ4740_GPIO_DIR                         0x60
49 #define JZ4740_GPIO_TRIG                        0x70
50 #define JZ4740_GPIO_FLAG                        0x80
51
52 #define JZ4770_GPIO_INT                         0x10
53 #define JZ4770_GPIO_PAT1                        0x30
54 #define JZ4770_GPIO_PAT0                        0x40
55 #define JZ4770_GPIO_FLAG                        0x50
56 #define JZ4770_GPIO_PEN                         0x70
57
58 #define X1830_GPIO_PEL                          0x110
59 #define X1830_GPIO_PEH                          0x120
60 #define X1830_GPIO_SR                           0x150
61 #define X1830_GPIO_SMT                          0x160
62
63 #define X2000_GPIO_EDG                          0x70
64 #define X2000_GPIO_PEPU                         0x80
65 #define X2000_GPIO_PEPD                         0x90
66 #define X2000_GPIO_SR                           0xd0
67 #define X2000_GPIO_SMT                          0xe0
68
69 #define REG_SET(x)                                      ((x) + 0x4)
70 #define REG_CLEAR(x)                            ((x) + 0x8)
71
72 #define REG_PZ_BASE(x)                          ((x) * 7)
73 #define REG_PZ_GID2LD(x)                        ((x) * 7 + 0xf0)
74
75 #define GPIO_PULL_DIS                           0
76 #define GPIO_PULL_UP                            1
77 #define GPIO_PULL_DOWN                          2
78
79 #define PINS_PER_GPIO_CHIP                      32
80 #define JZ4730_PINS_PER_PAIRED_REG      16
81
82 #define INGENIC_PIN_GROUP_FUNCS(name, id, funcs)                \
83         {                                               \
84                 name,                                   \
85                 id##_pins,                              \
86                 ARRAY_SIZE(id##_pins),                  \
87                 funcs,                                  \
88         }
89
90 #define INGENIC_PIN_GROUP(name, id, func)               \
91         INGENIC_PIN_GROUP_FUNCS(name, id, (void *)(func))
92
93 enum jz_version {
94         ID_JZ4730,
95         ID_JZ4740,
96         ID_JZ4725B,
97         ID_JZ4750,
98         ID_JZ4755,
99         ID_JZ4760,
100         ID_JZ4770,
101         ID_JZ4775,
102         ID_JZ4780,
103         ID_X1000,
104         ID_X1500,
105         ID_X1830,
106         ID_X2000,
107         ID_X2100,
108 };
109
110 struct ingenic_chip_info {
111         unsigned int num_chips;
112         unsigned int reg_offset;
113         enum jz_version version;
114
115         const struct group_desc *groups;
116         unsigned int num_groups;
117
118         const struct function_desc *functions;
119         unsigned int num_functions;
120
121         const u32 *pull_ups, *pull_downs;
122
123         const struct regmap_access_table *access_table;
124 };
125
126 struct ingenic_pinctrl {
127         struct device *dev;
128         struct regmap *map;
129         struct pinctrl_dev *pctl;
130         struct pinctrl_pin_desc *pdesc;
131
132         const struct ingenic_chip_info *info;
133 };
134
135 struct ingenic_gpio_chip {
136         struct ingenic_pinctrl *jzpc;
137         struct gpio_chip gc;
138         struct irq_chip irq_chip;
139         unsigned int irq, reg_base;
140 };
141
142 static const u32 jz4730_pull_ups[4] = {
143         0x3fa3320f, 0xf200ffff, 0xffffffff, 0xffffffff,
144 };
145
146 static const u32 jz4730_pull_downs[4] = {
147         0x00000df0, 0x0dff0000, 0x00000000, 0x00000000,
148 };
149
150 static int jz4730_mmc_1bit_pins[] = { 0x27, 0x26, 0x22, };
151 static int jz4730_mmc_4bit_pins[] = { 0x23, 0x24, 0x25, };
152 static int jz4730_uart0_data_pins[] = { 0x7e, 0x7f, };
153 static int jz4730_uart1_data_pins[] = { 0x18, 0x19, };
154 static int jz4730_uart2_data_pins[] = { 0x6f, 0x7d, };
155 static int jz4730_uart3_data_pins[] = { 0x10, 0x15, };
156 static int jz4730_uart3_hwflow_pins[] = { 0x11, 0x17, };
157 static int jz4730_lcd_8bit_pins[] = {
158         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
159         0x3a, 0x39, 0x38,
160 };
161 static int jz4730_lcd_16bit_pins[] = {
162         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
163 };
164 static int jz4730_lcd_special_pins[] = { 0x3d, 0x3c, 0x3e, 0x3f, };
165 static int jz4730_lcd_generic_pins[] = { 0x3b, };
166 static int jz4730_nand_cs1_pins[] = { 0x53, };
167 static int jz4730_nand_cs2_pins[] = { 0x54, };
168 static int jz4730_nand_cs3_pins[] = { 0x55, };
169 static int jz4730_nand_cs4_pins[] = { 0x56, };
170 static int jz4730_nand_cs5_pins[] = { 0x57, };
171 static int jz4730_pwm_pwm0_pins[] = { 0x5e, };
172 static int jz4730_pwm_pwm1_pins[] = { 0x5f, };
173
174 static u8 jz4730_lcd_8bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, };
175
176 static const struct group_desc jz4730_groups[] = {
177         INGENIC_PIN_GROUP("mmc-1bit", jz4730_mmc_1bit, 1),
178         INGENIC_PIN_GROUP("mmc-4bit", jz4730_mmc_4bit, 1),
179         INGENIC_PIN_GROUP("uart0-data", jz4730_uart0_data, 1),
180         INGENIC_PIN_GROUP("uart1-data", jz4730_uart1_data, 1),
181         INGENIC_PIN_GROUP("uart2-data", jz4730_uart2_data, 1),
182         INGENIC_PIN_GROUP("uart3-data", jz4730_uart3_data, 1),
183         INGENIC_PIN_GROUP("uart3-hwflow", jz4730_uart3_hwflow, 1),
184         INGENIC_PIN_GROUP_FUNCS("lcd-8bit", jz4730_lcd_8bit, jz4730_lcd_8bit_funcs),
185         INGENIC_PIN_GROUP("lcd-16bit", jz4730_lcd_16bit, 1),
186         INGENIC_PIN_GROUP("lcd-special", jz4730_lcd_special, 1),
187         INGENIC_PIN_GROUP("lcd-generic", jz4730_lcd_generic, 1),
188         INGENIC_PIN_GROUP("nand-cs1", jz4730_nand_cs1, 1),
189         INGENIC_PIN_GROUP("nand-cs2", jz4730_nand_cs2, 1),
190         INGENIC_PIN_GROUP("nand-cs3", jz4730_nand_cs3, 1),
191         INGENIC_PIN_GROUP("nand-cs4", jz4730_nand_cs4, 1),
192         INGENIC_PIN_GROUP("nand-cs5", jz4730_nand_cs5, 1),
193         INGENIC_PIN_GROUP("pwm0", jz4730_pwm_pwm0, 1),
194         INGENIC_PIN_GROUP("pwm1", jz4730_pwm_pwm1, 1),
195 };
196
197 static const char *jz4730_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
198 static const char *jz4730_uart0_groups[] = { "uart0-data", };
199 static const char *jz4730_uart1_groups[] = { "uart1-data", };
200 static const char *jz4730_uart2_groups[] = { "uart2-data", };
201 static const char *jz4730_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
202 static const char *jz4730_lcd_groups[] = {
203         "lcd-8bit", "lcd-16bit", "lcd-special", "lcd-generic",
204 };
205 static const char *jz4730_nand_groups[] = {
206         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-cs5",
207 };
208 static const char *jz4730_pwm0_groups[] = { "pwm0", };
209 static const char *jz4730_pwm1_groups[] = { "pwm1", };
210
211 static const struct function_desc jz4730_functions[] = {
212         { "mmc", jz4730_mmc_groups, ARRAY_SIZE(jz4730_mmc_groups), },
213         { "uart0", jz4730_uart0_groups, ARRAY_SIZE(jz4730_uart0_groups), },
214         { "uart1", jz4730_uart1_groups, ARRAY_SIZE(jz4730_uart1_groups), },
215         { "uart2", jz4730_uart2_groups, ARRAY_SIZE(jz4730_uart2_groups), },
216         { "uart3", jz4730_uart3_groups, ARRAY_SIZE(jz4730_uart3_groups), },
217         { "lcd", jz4730_lcd_groups, ARRAY_SIZE(jz4730_lcd_groups), },
218         { "nand", jz4730_nand_groups, ARRAY_SIZE(jz4730_nand_groups), },
219         { "pwm0", jz4730_pwm0_groups, ARRAY_SIZE(jz4730_pwm0_groups), },
220         { "pwm1", jz4730_pwm1_groups, ARRAY_SIZE(jz4730_pwm1_groups), },
221 };
222
223 static const struct ingenic_chip_info jz4730_chip_info = {
224         .num_chips = 4,
225         .reg_offset = 0x30,
226         .version = ID_JZ4730,
227         .groups = jz4730_groups,
228         .num_groups = ARRAY_SIZE(jz4730_groups),
229         .functions = jz4730_functions,
230         .num_functions = ARRAY_SIZE(jz4730_functions),
231         .pull_ups = jz4730_pull_ups,
232         .pull_downs = jz4730_pull_downs,
233 };
234
235 static const u32 jz4740_pull_ups[4] = {
236         0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
237 };
238
239 static const u32 jz4740_pull_downs[4] = {
240         0x00000000, 0x00000000, 0x00000000, 0x00000000,
241 };
242
243 static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, };
244 static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
245 static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, };
246 static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
247 static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, };
248 static int jz4740_lcd_8bit_pins[] = {
249         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
250         0x52, 0x53, 0x54,
251 };
252 static int jz4740_lcd_16bit_pins[] = {
253         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
254 };
255 static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, };
256 static int jz4740_lcd_special_pins[] = { 0x31, 0x32, 0x56, 0x57, };
257 static int jz4740_lcd_generic_pins[] = { 0x55, };
258 static int jz4740_nand_cs1_pins[] = { 0x39, };
259 static int jz4740_nand_cs2_pins[] = { 0x3a, };
260 static int jz4740_nand_cs3_pins[] = { 0x3b, };
261 static int jz4740_nand_cs4_pins[] = { 0x3c, };
262 static int jz4740_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
263 static int jz4740_pwm_pwm0_pins[] = { 0x77, };
264 static int jz4740_pwm_pwm1_pins[] = { 0x78, };
265 static int jz4740_pwm_pwm2_pins[] = { 0x79, };
266 static int jz4740_pwm_pwm3_pins[] = { 0x7a, };
267 static int jz4740_pwm_pwm4_pins[] = { 0x7b, };
268 static int jz4740_pwm_pwm5_pins[] = { 0x7c, };
269 static int jz4740_pwm_pwm6_pins[] = { 0x7e, };
270 static int jz4740_pwm_pwm7_pins[] = { 0x7f, };
271
272 static const struct group_desc jz4740_groups[] = {
273         INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit, 0),
274         INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit, 0),
275         INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data, 1),
276         INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow, 1),
277         INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data, 2),
278         INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit, 0),
279         INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit, 0),
280         INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit, 0),
281         INGENIC_PIN_GROUP("lcd-special", jz4740_lcd_special, 0),
282         INGENIC_PIN_GROUP("lcd-generic", jz4740_lcd_generic, 0),
283         INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1, 0),
284         INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2, 0),
285         INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3, 0),
286         INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4, 0),
287         INGENIC_PIN_GROUP("nand-fre-fwe", jz4740_nand_fre_fwe, 0),
288         INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0, 0),
289         INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1, 0),
290         INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2, 0),
291         INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3, 0),
292         INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4, 0),
293         INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5, 0),
294         INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6, 0),
295         INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7, 0),
296 };
297
298 static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
299 static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
300 static const char *jz4740_uart1_groups[] = { "uart1-data", };
301 static const char *jz4740_lcd_groups[] = {
302         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-special", "lcd-generic",
303 };
304 static const char *jz4740_nand_groups[] = {
305         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
306 };
307 static const char *jz4740_pwm0_groups[] = { "pwm0", };
308 static const char *jz4740_pwm1_groups[] = { "pwm1", };
309 static const char *jz4740_pwm2_groups[] = { "pwm2", };
310 static const char *jz4740_pwm3_groups[] = { "pwm3", };
311 static const char *jz4740_pwm4_groups[] = { "pwm4", };
312 static const char *jz4740_pwm5_groups[] = { "pwm5", };
313 static const char *jz4740_pwm6_groups[] = { "pwm6", };
314 static const char *jz4740_pwm7_groups[] = { "pwm7", };
315
316 static const struct function_desc jz4740_functions[] = {
317         { "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), },
318         { "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), },
319         { "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), },
320         { "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), },
321         { "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), },
322         { "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), },
323         { "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), },
324         { "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), },
325         { "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), },
326         { "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), },
327         { "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), },
328         { "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), },
329         { "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), },
330 };
331
332 static const struct ingenic_chip_info jz4740_chip_info = {
333         .num_chips = 4,
334         .reg_offset = 0x100,
335         .version = ID_JZ4740,
336         .groups = jz4740_groups,
337         .num_groups = ARRAY_SIZE(jz4740_groups),
338         .functions = jz4740_functions,
339         .num_functions = ARRAY_SIZE(jz4740_functions),
340         .pull_ups = jz4740_pull_ups,
341         .pull_downs = jz4740_pull_downs,
342 };
343
344 static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, };
345 static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, };
346 static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, };
347 static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, };
348 static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, };
349 static int jz4725b_lcd_8bit_pins[] = {
350         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
351         0x72, 0x73, 0x74,
352 };
353 static int jz4725b_lcd_16bit_pins[] = {
354         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
355 };
356 static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, };
357 static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, };
358 static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
359 static int jz4725b_lcd_generic_pins[] = { 0x75, };
360 static int jz4725b_nand_cs1_pins[] = { 0x55, };
361 static int jz4725b_nand_cs2_pins[] = { 0x56, };
362 static int jz4725b_nand_cs3_pins[] = { 0x57, };
363 static int jz4725b_nand_cs4_pins[] = { 0x58, };
364 static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 };
365 static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d };
366 static int jz4725b_pwm_pwm0_pins[] = { 0x4a, };
367 static int jz4725b_pwm_pwm1_pins[] = { 0x4b, };
368 static int jz4725b_pwm_pwm2_pins[] = { 0x4c, };
369 static int jz4725b_pwm_pwm3_pins[] = { 0x4d, };
370 static int jz4725b_pwm_pwm4_pins[] = { 0x4e, };
371 static int jz4725b_pwm_pwm5_pins[] = { 0x4f, };
372
373 static u8 jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, };
374
375 static const struct group_desc jz4725b_groups[] = {
376         INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit, 1),
377         INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4725b_mmc0_4bit,
378                                 jz4725b_mmc0_4bit_funcs),
379         INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit, 0),
380         INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit, 0),
381         INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data, 1),
382         INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit, 0),
383         INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit, 0),
384         INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit, 0),
385         INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit, 1),
386         INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special, 0),
387         INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic, 0),
388         INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1, 0),
389         INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2, 0),
390         INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3, 0),
391         INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4, 0),
392         INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale, 0),
393         INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe, 0),
394         INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0, 0),
395         INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1, 0),
396         INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2, 0),
397         INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3, 0),
398         INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4, 0),
399         INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5, 0),
400 };
401
402 static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
403 static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
404 static const char *jz4725b_uart_groups[] = { "uart-data", };
405 static const char *jz4725b_lcd_groups[] = {
406         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
407         "lcd-special", "lcd-generic",
408 };
409 static const char *jz4725b_nand_groups[] = {
410         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
411         "nand-cle-ale", "nand-fre-fwe",
412 };
413 static const char *jz4725b_pwm0_groups[] = { "pwm0", };
414 static const char *jz4725b_pwm1_groups[] = { "pwm1", };
415 static const char *jz4725b_pwm2_groups[] = { "pwm2", };
416 static const char *jz4725b_pwm3_groups[] = { "pwm3", };
417 static const char *jz4725b_pwm4_groups[] = { "pwm4", };
418 static const char *jz4725b_pwm5_groups[] = { "pwm5", };
419
420 static const struct function_desc jz4725b_functions[] = {
421         { "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), },
422         { "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), },
423         { "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), },
424         { "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), },
425         { "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), },
426         { "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), },
427         { "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), },
428         { "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), },
429         { "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), },
430         { "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), },
431         { "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), },
432 };
433
434 static const struct ingenic_chip_info jz4725b_chip_info = {
435         .num_chips = 4,
436         .reg_offset = 0x100,
437         .version = ID_JZ4725B,
438         .groups = jz4725b_groups,
439         .num_groups = ARRAY_SIZE(jz4725b_groups),
440         .functions = jz4725b_functions,
441         .num_functions = ARRAY_SIZE(jz4725b_functions),
442         .pull_ups = jz4740_pull_ups,
443         .pull_downs = jz4740_pull_downs,
444 };
445
446 static const u32 jz4750_pull_ups[6] = {
447         0xffffffff, 0xffffffff, 0x3fffffff, 0x7fffffff, 0x1fff3fff, 0x00ffffff,
448 };
449
450 static const u32 jz4750_pull_downs[6] = {
451         0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
452 };
453
454 static int jz4750_uart0_data_pins[] = { 0xa4, 0xa5, };
455 static int jz4750_uart0_hwflow_pins[] = { 0xa6, 0xa7, };
456 static int jz4750_uart1_data_pins[] = { 0x90, 0x91, };
457 static int jz4750_uart1_hwflow_pins[] = { 0x92, 0x93, };
458 static int jz4750_uart2_data_pins[] = { 0x9b, 0x9a, };
459 static int jz4750_uart3_data_pins[] = { 0xb0, 0xb1, };
460 static int jz4750_uart3_hwflow_pins[] = { 0xb2, 0xb3, };
461 static int jz4750_mmc0_1bit_pins[] = { 0xa8, 0xa9, 0xa0, };
462 static int jz4750_mmc0_4bit_pins[] = { 0xa1, 0xa2, 0xa3, };
463 static int jz4750_mmc0_8bit_pins[] = { 0xa4, 0xa5, 0xa6, 0xa7, };
464 static int jz4750_mmc1_1bit_pins[] = { 0xae, 0xaf, 0xaa, };
465 static int jz4750_mmc1_4bit_pins[] = { 0xab, 0xac, 0xad, };
466 static int jz4750_i2c_pins[] = { 0x8c, 0x8d, };
467 static int jz4750_cim_pins[] = {
468         0x89, 0x8b, 0x8a, 0x88,
469         0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
470 };
471 static int jz4750_lcd_8bit_pins[] = {
472         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
473         0x72, 0x73, 0x74,
474 };
475 static int jz4750_lcd_16bit_pins[] = {
476         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
477 };
478 static int jz4750_lcd_18bit_pins[] = { 0x70, 0x71, };
479 static int jz4750_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, 0xb2, 0xb3, };
480 static int jz4750_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
481 static int jz4750_lcd_generic_pins[] = { 0x75, };
482 static int jz4750_nand_cs1_pins[] = { 0x55, };
483 static int jz4750_nand_cs2_pins[] = { 0x56, };
484 static int jz4750_nand_cs3_pins[] = { 0x57, };
485 static int jz4750_nand_cs4_pins[] = { 0x58, };
486 static int jz4750_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
487 static int jz4750_pwm_pwm0_pins[] = { 0x94, };
488 static int jz4750_pwm_pwm1_pins[] = { 0x95, };
489 static int jz4750_pwm_pwm2_pins[] = { 0x96, };
490 static int jz4750_pwm_pwm3_pins[] = { 0x97, };
491 static int jz4750_pwm_pwm4_pins[] = { 0x98, };
492 static int jz4750_pwm_pwm5_pins[] = { 0x99, };
493
494 static const struct group_desc jz4750_groups[] = {
495         INGENIC_PIN_GROUP("uart0-data", jz4750_uart0_data, 1),
496         INGENIC_PIN_GROUP("uart0-hwflow", jz4750_uart0_hwflow, 1),
497         INGENIC_PIN_GROUP("uart1-data", jz4750_uart1_data, 0),
498         INGENIC_PIN_GROUP("uart1-hwflow", jz4750_uart1_hwflow, 0),
499         INGENIC_PIN_GROUP("uart2-data", jz4750_uart2_data, 1),
500         INGENIC_PIN_GROUP("uart3-data", jz4750_uart3_data, 0),
501         INGENIC_PIN_GROUP("uart3-hwflow", jz4750_uart3_hwflow, 0),
502         INGENIC_PIN_GROUP("mmc0-1bit", jz4750_mmc0_1bit, 0),
503         INGENIC_PIN_GROUP("mmc0-4bit", jz4750_mmc0_4bit, 0),
504         INGENIC_PIN_GROUP("mmc0-8bit", jz4750_mmc0_8bit, 0),
505         INGENIC_PIN_GROUP("mmc1-1bit", jz4750_mmc1_1bit, 0),
506         INGENIC_PIN_GROUP("mmc1-4bit", jz4750_mmc1_4bit, 0),
507         INGENIC_PIN_GROUP("i2c-data", jz4750_i2c, 0),
508         INGENIC_PIN_GROUP("cim-data", jz4750_cim, 0),
509         INGENIC_PIN_GROUP("lcd-8bit", jz4750_lcd_8bit, 0),
510         INGENIC_PIN_GROUP("lcd-16bit", jz4750_lcd_16bit, 0),
511         INGENIC_PIN_GROUP("lcd-18bit", jz4750_lcd_18bit, 0),
512         INGENIC_PIN_GROUP("lcd-24bit", jz4750_lcd_24bit, 1),
513         INGENIC_PIN_GROUP("lcd-special", jz4750_lcd_special, 0),
514         INGENIC_PIN_GROUP("lcd-generic", jz4750_lcd_generic, 0),
515         INGENIC_PIN_GROUP("nand-cs1", jz4750_nand_cs1, 0),
516         INGENIC_PIN_GROUP("nand-cs2", jz4750_nand_cs2, 0),
517         INGENIC_PIN_GROUP("nand-cs3", jz4750_nand_cs3, 0),
518         INGENIC_PIN_GROUP("nand-cs4", jz4750_nand_cs4, 0),
519         INGENIC_PIN_GROUP("nand-fre-fwe", jz4750_nand_fre_fwe, 0),
520         INGENIC_PIN_GROUP("pwm0", jz4750_pwm_pwm0, 0),
521         INGENIC_PIN_GROUP("pwm1", jz4750_pwm_pwm1, 0),
522         INGENIC_PIN_GROUP("pwm2", jz4750_pwm_pwm2, 0),
523         INGENIC_PIN_GROUP("pwm3", jz4750_pwm_pwm3, 0),
524         INGENIC_PIN_GROUP("pwm4", jz4750_pwm_pwm4, 0),
525         INGENIC_PIN_GROUP("pwm5", jz4750_pwm_pwm5, 0),
526 };
527
528 static const char *jz4750_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
529 static const char *jz4750_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
530 static const char *jz4750_uart2_groups[] = { "uart2-data", };
531 static const char *jz4750_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
532 static const char *jz4750_mmc0_groups[] = {
533         "mmc0-1bit", "mmc0-4bit", "mmc0-8bit",
534 };
535 static const char *jz4750_mmc1_groups[] = { "mmc0-1bit", "mmc0-4bit", };
536 static const char *jz4750_i2c_groups[] = { "i2c-data", };
537 static const char *jz4750_cim_groups[] = { "cim-data", };
538 static const char *jz4750_lcd_groups[] = {
539         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
540         "lcd-special", "lcd-generic",
541 };
542 static const char *jz4750_nand_groups[] = {
543         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
544 };
545 static const char *jz4750_pwm0_groups[] = { "pwm0", };
546 static const char *jz4750_pwm1_groups[] = { "pwm1", };
547 static const char *jz4750_pwm2_groups[] = { "pwm2", };
548 static const char *jz4750_pwm3_groups[] = { "pwm3", };
549 static const char *jz4750_pwm4_groups[] = { "pwm4", };
550 static const char *jz4750_pwm5_groups[] = { "pwm5", };
551
552 static const struct function_desc jz4750_functions[] = {
553         { "uart0", jz4750_uart0_groups, ARRAY_SIZE(jz4750_uart0_groups), },
554         { "uart1", jz4750_uart1_groups, ARRAY_SIZE(jz4750_uart1_groups), },
555         { "uart2", jz4750_uart2_groups, ARRAY_SIZE(jz4750_uart2_groups), },
556         { "uart3", jz4750_uart3_groups, ARRAY_SIZE(jz4750_uart3_groups), },
557         { "mmc0", jz4750_mmc0_groups, ARRAY_SIZE(jz4750_mmc0_groups), },
558         { "mmc1", jz4750_mmc1_groups, ARRAY_SIZE(jz4750_mmc1_groups), },
559         { "i2c", jz4750_i2c_groups, ARRAY_SIZE(jz4750_i2c_groups), },
560         { "cim", jz4750_cim_groups, ARRAY_SIZE(jz4750_cim_groups), },
561         { "lcd", jz4750_lcd_groups, ARRAY_SIZE(jz4750_lcd_groups), },
562         { "nand", jz4750_nand_groups, ARRAY_SIZE(jz4750_nand_groups), },
563         { "pwm0", jz4750_pwm0_groups, ARRAY_SIZE(jz4750_pwm0_groups), },
564         { "pwm1", jz4750_pwm1_groups, ARRAY_SIZE(jz4750_pwm1_groups), },
565         { "pwm2", jz4750_pwm2_groups, ARRAY_SIZE(jz4750_pwm2_groups), },
566         { "pwm3", jz4750_pwm3_groups, ARRAY_SIZE(jz4750_pwm3_groups), },
567         { "pwm4", jz4750_pwm4_groups, ARRAY_SIZE(jz4750_pwm4_groups), },
568         { "pwm5", jz4750_pwm5_groups, ARRAY_SIZE(jz4750_pwm5_groups), },
569 };
570
571 static const struct ingenic_chip_info jz4750_chip_info = {
572         .num_chips = 6,
573         .reg_offset = 0x100,
574         .version = ID_JZ4750,
575         .groups = jz4750_groups,
576         .num_groups = ARRAY_SIZE(jz4750_groups),
577         .functions = jz4750_functions,
578         .num_functions = ARRAY_SIZE(jz4750_functions),
579         .pull_ups = jz4750_pull_ups,
580         .pull_downs = jz4750_pull_downs,
581 };
582
583 static const u32 jz4755_pull_ups[6] = {
584         0xffffffff, 0xffffffff, 0x0fffffff, 0xffffffff, 0x33dc3fff, 0x0000fc00,
585 };
586
587 static const u32 jz4755_pull_downs[6] = {
588         0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
589 };
590
591 static int jz4755_uart0_data_pins[] = { 0x7c, 0x7d, };
592 static int jz4755_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
593 static int jz4755_uart1_data_pins[] = { 0x97, 0x99, };
594 static int jz4755_uart2_data_pins[] = { 0x9f, };
595 static int jz4755_ssi_dt_b_pins[] = { 0x3b, };
596 static int jz4755_ssi_dt_f_pins[] = { 0xa1, };
597 static int jz4755_ssi_dr_b_pins[] = { 0x3c, };
598 static int jz4755_ssi_dr_f_pins[] = { 0xa2, };
599 static int jz4755_ssi_clk_b_pins[] = { 0x3a, };
600 static int jz4755_ssi_clk_f_pins[] = { 0xa0, };
601 static int jz4755_ssi_gpc_b_pins[] = { 0x3e, };
602 static int jz4755_ssi_gpc_f_pins[] = { 0xa4, };
603 static int jz4755_ssi_ce0_b_pins[] = { 0x3d, };
604 static int jz4755_ssi_ce0_f_pins[] = { 0xa3, };
605 static int jz4755_ssi_ce1_b_pins[] = { 0x3f, };
606 static int jz4755_ssi_ce1_f_pins[] = { 0xa5, };
607 static int jz4755_mmc0_1bit_pins[] = { 0x2f, 0x50, 0x5c, };
608 static int jz4755_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x51, };
609 static int jz4755_mmc1_1bit_pins[] = { 0x3a, 0x3d, 0x3c, };
610 static int jz4755_mmc1_4bit_pins[] = { 0x3b, 0x3e, 0x3f, };
611 static int jz4755_i2c_pins[] = { 0x8c, 0x8d, };
612 static int jz4755_cim_pins[] = {
613         0x89, 0x8b, 0x8a, 0x88,
614         0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
615 };
616 static int jz4755_lcd_8bit_pins[] = {
617         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
618         0x72, 0x73, 0x74,
619 };
620 static int jz4755_lcd_16bit_pins[] = {
621         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
622 };
623 static int jz4755_lcd_18bit_pins[] = { 0x70, 0x71, };
624 static int jz4755_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, };
625 static int jz4755_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
626 static int jz4755_lcd_generic_pins[] = { 0x75, };
627 static int jz4755_nand_cs1_pins[] = { 0x55, };
628 static int jz4755_nand_cs2_pins[] = { 0x56, };
629 static int jz4755_nand_cs3_pins[] = { 0x57, };
630 static int jz4755_nand_cs4_pins[] = { 0x58, };
631 static int jz4755_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
632 static int jz4755_pwm_pwm0_pins[] = { 0x94, };
633 static int jz4755_pwm_pwm1_pins[] = { 0xab, };
634 static int jz4755_pwm_pwm2_pins[] = { 0x96, };
635 static int jz4755_pwm_pwm3_pins[] = { 0x97, };
636 static int jz4755_pwm_pwm4_pins[] = { 0x98, };
637 static int jz4755_pwm_pwm5_pins[] = { 0x99, };
638
639 static u8 jz4755_mmc0_1bit_funcs[] = { 2, 2, 1, };
640 static u8 jz4755_mmc0_4bit_funcs[] = { 1, 0, 1, };
641 static u8 jz4755_lcd_24bit_funcs[] = { 1, 1, 1, 1, 0, 0, };
642
643 static const struct group_desc jz4755_groups[] = {
644         INGENIC_PIN_GROUP("uart0-data", jz4755_uart0_data, 0),
645         INGENIC_PIN_GROUP("uart0-hwflow", jz4755_uart0_hwflow, 0),
646         INGENIC_PIN_GROUP("uart1-data", jz4755_uart1_data, 0),
647         INGENIC_PIN_GROUP("uart2-data", jz4755_uart2_data, 1),
648         INGENIC_PIN_GROUP("ssi-dt-b", jz4755_ssi_dt_b, 0),
649         INGENIC_PIN_GROUP("ssi-dt-f", jz4755_ssi_dt_f, 0),
650         INGENIC_PIN_GROUP("ssi-dr-b", jz4755_ssi_dr_b, 0),
651         INGENIC_PIN_GROUP("ssi-dr-f", jz4755_ssi_dr_f, 0),
652         INGENIC_PIN_GROUP("ssi-clk-b", jz4755_ssi_clk_b, 0),
653         INGENIC_PIN_GROUP("ssi-clk-f", jz4755_ssi_clk_f, 0),
654         INGENIC_PIN_GROUP("ssi-gpc-b", jz4755_ssi_gpc_b, 0),
655         INGENIC_PIN_GROUP("ssi-gpc-f", jz4755_ssi_gpc_f, 0),
656         INGENIC_PIN_GROUP("ssi-ce0-b", jz4755_ssi_ce0_b, 0),
657         INGENIC_PIN_GROUP("ssi-ce0-f", jz4755_ssi_ce0_f, 0),
658         INGENIC_PIN_GROUP("ssi-ce1-b", jz4755_ssi_ce1_b, 0),
659         INGENIC_PIN_GROUP("ssi-ce1-f", jz4755_ssi_ce1_f, 0),
660         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit", jz4755_mmc0_1bit,
661                                 jz4755_mmc0_1bit_funcs),
662         INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4755_mmc0_4bit,
663                                 jz4755_mmc0_4bit_funcs),
664         INGENIC_PIN_GROUP("mmc1-1bit", jz4755_mmc1_1bit, 1),
665         INGENIC_PIN_GROUP("mmc1-4bit", jz4755_mmc1_4bit, 1),
666         INGENIC_PIN_GROUP("i2c-data", jz4755_i2c, 0),
667         INGENIC_PIN_GROUP("cim-data", jz4755_cim, 0),
668         INGENIC_PIN_GROUP("lcd-8bit", jz4755_lcd_8bit, 0),
669         INGENIC_PIN_GROUP("lcd-16bit", jz4755_lcd_16bit, 0),
670         INGENIC_PIN_GROUP("lcd-18bit", jz4755_lcd_18bit, 0),
671         INGENIC_PIN_GROUP_FUNCS("lcd-24bit", jz4755_lcd_24bit,
672                                 jz4755_lcd_24bit_funcs),
673         INGENIC_PIN_GROUP("lcd-special", jz4755_lcd_special, 0),
674         INGENIC_PIN_GROUP("lcd-generic", jz4755_lcd_generic, 0),
675         INGENIC_PIN_GROUP("nand-cs1", jz4755_nand_cs1, 0),
676         INGENIC_PIN_GROUP("nand-cs2", jz4755_nand_cs2, 0),
677         INGENIC_PIN_GROUP("nand-cs3", jz4755_nand_cs3, 0),
678         INGENIC_PIN_GROUP("nand-cs4", jz4755_nand_cs4, 0),
679         INGENIC_PIN_GROUP("nand-fre-fwe", jz4755_nand_fre_fwe, 0),
680         INGENIC_PIN_GROUP("pwm0", jz4755_pwm_pwm0, 0),
681         INGENIC_PIN_GROUP("pwm1", jz4755_pwm_pwm1, 1),
682         INGENIC_PIN_GROUP("pwm2", jz4755_pwm_pwm2, 0),
683         INGENIC_PIN_GROUP("pwm3", jz4755_pwm_pwm3, 0),
684         INGENIC_PIN_GROUP("pwm4", jz4755_pwm_pwm4, 0),
685         INGENIC_PIN_GROUP("pwm5", jz4755_pwm_pwm5, 0),
686 };
687
688 static const char *jz4755_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
689 static const char *jz4755_uart1_groups[] = { "uart1-data", };
690 static const char *jz4755_uart2_groups[] = { "uart2-data", };
691 static const char *jz4755_ssi_groups[] = {
692         "ssi-dt-b", "ssi-dt-f",
693         "ssi-dr-b", "ssi-dr-f",
694         "ssi-clk-b", "ssi-clk-f",
695         "ssi-gpc-b", "ssi-gpc-f",
696         "ssi-ce0-b", "ssi-ce0-f",
697         "ssi-ce1-b", "ssi-ce1-f",
698 };
699 static const char *jz4755_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
700 static const char *jz4755_mmc1_groups[] = { "mmc0-1bit", "mmc0-4bit", };
701 static const char *jz4755_i2c_groups[] = { "i2c-data", };
702 static const char *jz4755_cim_groups[] = { "cim-data", };
703 static const char *jz4755_lcd_groups[] = {
704         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
705         "lcd-special", "lcd-generic",
706 };
707 static const char *jz4755_nand_groups[] = {
708         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
709 };
710 static const char *jz4755_pwm0_groups[] = { "pwm0", };
711 static const char *jz4755_pwm1_groups[] = { "pwm1", };
712 static const char *jz4755_pwm2_groups[] = { "pwm2", };
713 static const char *jz4755_pwm3_groups[] = { "pwm3", };
714 static const char *jz4755_pwm4_groups[] = { "pwm4", };
715 static const char *jz4755_pwm5_groups[] = { "pwm5", };
716
717 static const struct function_desc jz4755_functions[] = {
718         { "uart0", jz4755_uart0_groups, ARRAY_SIZE(jz4755_uart0_groups), },
719         { "uart1", jz4755_uart1_groups, ARRAY_SIZE(jz4755_uart1_groups), },
720         { "uart2", jz4755_uart2_groups, ARRAY_SIZE(jz4755_uart2_groups), },
721         { "ssi", jz4755_ssi_groups, ARRAY_SIZE(jz4755_ssi_groups), },
722         { "mmc0", jz4755_mmc0_groups, ARRAY_SIZE(jz4755_mmc0_groups), },
723         { "mmc1", jz4755_mmc1_groups, ARRAY_SIZE(jz4755_mmc1_groups), },
724         { "i2c", jz4755_i2c_groups, ARRAY_SIZE(jz4755_i2c_groups), },
725         { "cim", jz4755_cim_groups, ARRAY_SIZE(jz4755_cim_groups), },
726         { "lcd", jz4755_lcd_groups, ARRAY_SIZE(jz4755_lcd_groups), },
727         { "nand", jz4755_nand_groups, ARRAY_SIZE(jz4755_nand_groups), },
728         { "pwm0", jz4755_pwm0_groups, ARRAY_SIZE(jz4755_pwm0_groups), },
729         { "pwm1", jz4755_pwm1_groups, ARRAY_SIZE(jz4755_pwm1_groups), },
730         { "pwm2", jz4755_pwm2_groups, ARRAY_SIZE(jz4755_pwm2_groups), },
731         { "pwm3", jz4755_pwm3_groups, ARRAY_SIZE(jz4755_pwm3_groups), },
732         { "pwm4", jz4755_pwm4_groups, ARRAY_SIZE(jz4755_pwm4_groups), },
733         { "pwm5", jz4755_pwm5_groups, ARRAY_SIZE(jz4755_pwm5_groups), },
734 };
735
736 static const struct ingenic_chip_info jz4755_chip_info = {
737         .num_chips = 6,
738         .reg_offset = 0x100,
739         .version = ID_JZ4755,
740         .groups = jz4755_groups,
741         .num_groups = ARRAY_SIZE(jz4755_groups),
742         .functions = jz4755_functions,
743         .num_functions = ARRAY_SIZE(jz4755_functions),
744         .pull_ups = jz4755_pull_ups,
745         .pull_downs = jz4755_pull_downs,
746 };
747
748 static const u32 jz4760_pull_ups[6] = {
749         0xffffffff, 0xfffcf3ff, 0xffffffff, 0xffffcfff, 0xfffffb7c, 0x0000000f,
750 };
751
752 static const u32 jz4760_pull_downs[6] = {
753         0x00000000, 0x00030c00, 0x00000000, 0x00003000, 0x00000483, 0x00000ff0,
754 };
755
756 static int jz4760_uart0_data_pins[] = { 0xa0, 0xa3, };
757 static int jz4760_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
758 static int jz4760_uart1_data_pins[] = { 0x7a, 0x7c, };
759 static int jz4760_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
760 static int jz4760_uart2_data_pins[] = { 0x5c, 0x5e, };
761 static int jz4760_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
762 static int jz4760_uart3_data_pins[] = { 0x6c, 0x85, };
763 static int jz4760_uart3_hwflow_pins[] = { 0x88, 0x89, };
764 static int jz4760_ssi0_dt_a_pins[] = { 0x15, };
765 static int jz4760_ssi0_dt_b_pins[] = { 0x35, };
766 static int jz4760_ssi0_dt_d_pins[] = { 0x75, };
767 static int jz4760_ssi0_dt_e_pins[] = { 0x91, };
768 static int jz4760_ssi0_dr_a_pins[] = { 0x14, };
769 static int jz4760_ssi0_dr_b_pins[] = { 0x34, };
770 static int jz4760_ssi0_dr_d_pins[] = { 0x74, };
771 static int jz4760_ssi0_dr_e_pins[] = { 0x8e, };
772 static int jz4760_ssi0_clk_a_pins[] = { 0x12, };
773 static int jz4760_ssi0_clk_b_pins[] = { 0x3c, };
774 static int jz4760_ssi0_clk_d_pins[] = { 0x78, };
775 static int jz4760_ssi0_clk_e_pins[] = { 0x8f, };
776 static int jz4760_ssi0_gpc_b_pins[] = { 0x3e, };
777 static int jz4760_ssi0_gpc_d_pins[] = { 0x76, };
778 static int jz4760_ssi0_gpc_e_pins[] = { 0x93, };
779 static int jz4760_ssi0_ce0_a_pins[] = { 0x13, };
780 static int jz4760_ssi0_ce0_b_pins[] = { 0x3d, };
781 static int jz4760_ssi0_ce0_d_pins[] = { 0x79, };
782 static int jz4760_ssi0_ce0_e_pins[] = { 0x90, };
783 static int jz4760_ssi0_ce1_b_pins[] = { 0x3f, };
784 static int jz4760_ssi0_ce1_d_pins[] = { 0x77, };
785 static int jz4760_ssi0_ce1_e_pins[] = { 0x92, };
786 static int jz4760_ssi1_dt_b_9_pins[] = { 0x29, };
787 static int jz4760_ssi1_dt_b_21_pins[] = { 0x35, };
788 static int jz4760_ssi1_dt_d_12_pins[] = { 0x6c, };
789 static int jz4760_ssi1_dt_d_21_pins[] = { 0x75, };
790 static int jz4760_ssi1_dt_e_pins[] = { 0x91, };
791 static int jz4760_ssi1_dt_f_pins[] = { 0xa3, };
792 static int jz4760_ssi1_dr_b_6_pins[] = { 0x26, };
793 static int jz4760_ssi1_dr_b_20_pins[] = { 0x34, };
794 static int jz4760_ssi1_dr_d_13_pins[] = { 0x6d, };
795 static int jz4760_ssi1_dr_d_20_pins[] = { 0x74, };
796 static int jz4760_ssi1_dr_e_pins[] = { 0x8e, };
797 static int jz4760_ssi1_dr_f_pins[] = { 0xa0, };
798 static int jz4760_ssi1_clk_b_7_pins[] = { 0x27, };
799 static int jz4760_ssi1_clk_b_28_pins[] = { 0x3c, };
800 static int jz4760_ssi1_clk_d_pins[] = { 0x78, };
801 static int jz4760_ssi1_clk_e_7_pins[] = { 0x87, };
802 static int jz4760_ssi1_clk_e_15_pins[] = { 0x8f, };
803 static int jz4760_ssi1_clk_f_pins[] = { 0xa2, };
804 static int jz4760_ssi1_gpc_b_pins[] = { 0x3e, };
805 static int jz4760_ssi1_gpc_d_pins[] = { 0x76, };
806 static int jz4760_ssi1_gpc_e_pins[] = { 0x93, };
807 static int jz4760_ssi1_ce0_b_8_pins[] = { 0x28, };
808 static int jz4760_ssi1_ce0_b_29_pins[] = { 0x3d, };
809 static int jz4760_ssi1_ce0_d_pins[] = { 0x79, };
810 static int jz4760_ssi1_ce0_e_6_pins[] = { 0x86, };
811 static int jz4760_ssi1_ce0_e_16_pins[] = { 0x90, };
812 static int jz4760_ssi1_ce0_f_pins[] = { 0xa1, };
813 static int jz4760_ssi1_ce1_b_pins[] = { 0x3f, };
814 static int jz4760_ssi1_ce1_d_pins[] = { 0x77, };
815 static int jz4760_ssi1_ce1_e_pins[] = { 0x92, };
816 static int jz4760_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
817 static int jz4760_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
818 static int jz4760_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
819 static int jz4760_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
820 static int jz4760_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
821 static int jz4760_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
822 static int jz4760_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
823 static int jz4760_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
824 static int jz4760_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
825 static int jz4760_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
826 static int jz4760_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
827 static int jz4760_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
828 static int jz4760_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
829 static int jz4760_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
830 static int jz4760_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
831 static int jz4760_nemc_8bit_data_pins[] = {
832         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
833 };
834 static int jz4760_nemc_16bit_data_pins[] = {
835         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
836 };
837 static int jz4760_nemc_cle_ale_pins[] = { 0x20, 0x21, };
838 static int jz4760_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
839 static int jz4760_nemc_rd_we_pins[] = { 0x10, 0x11, };
840 static int jz4760_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
841 static int jz4760_nemc_wait_pins[] = { 0x1b, };
842 static int jz4760_nemc_cs1_pins[] = { 0x15, };
843 static int jz4760_nemc_cs2_pins[] = { 0x16, };
844 static int jz4760_nemc_cs3_pins[] = { 0x17, };
845 static int jz4760_nemc_cs4_pins[] = { 0x18, };
846 static int jz4760_nemc_cs5_pins[] = { 0x19, };
847 static int jz4760_nemc_cs6_pins[] = { 0x1a, };
848 static int jz4760_i2c0_pins[] = { 0x7e, 0x7f, };
849 static int jz4760_i2c1_pins[] = { 0x9e, 0x9f, };
850 static int jz4760_cim_pins[] = {
851         0x26, 0x27, 0x28, 0x29,
852         0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
853 };
854 static int jz4760_lcd_8bit_pins[] = {
855         0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4c,
856         0x4d, 0x52, 0x53,
857 };
858 static int jz4760_lcd_16bit_pins[] = {
859         0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59,
860 };
861 static int jz4760_lcd_18bit_pins[] = {
862         0x5a, 0x5b,
863 };
864 static int jz4760_lcd_24bit_pins[] = {
865         0x40, 0x41, 0x4a, 0x4b, 0x54, 0x55,
866 };
867 static int jz4760_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, };
868 static int jz4760_lcd_generic_pins[] = { 0x49, };
869 static int jz4760_pwm_pwm0_pins[] = { 0x80, };
870 static int jz4760_pwm_pwm1_pins[] = { 0x81, };
871 static int jz4760_pwm_pwm2_pins[] = { 0x82, };
872 static int jz4760_pwm_pwm3_pins[] = { 0x83, };
873 static int jz4760_pwm_pwm4_pins[] = { 0x84, };
874 static int jz4760_pwm_pwm5_pins[] = { 0x85, };
875 static int jz4760_pwm_pwm6_pins[] = { 0x6a, };
876 static int jz4760_pwm_pwm7_pins[] = { 0x6b, };
877 static int jz4760_otg_pins[] = { 0x8a, };
878
879 static u8 jz4760_uart3_data_funcs[] = { 0, 1, };
880 static u8 jz4760_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
881
882 static const struct group_desc jz4760_groups[] = {
883         INGENIC_PIN_GROUP("uart0-data", jz4760_uart0_data, 0),
884         INGENIC_PIN_GROUP("uart0-hwflow", jz4760_uart0_hwflow, 0),
885         INGENIC_PIN_GROUP("uart1-data", jz4760_uart1_data, 0),
886         INGENIC_PIN_GROUP("uart1-hwflow", jz4760_uart1_hwflow, 0),
887         INGENIC_PIN_GROUP("uart2-data", jz4760_uart2_data, 0),
888         INGENIC_PIN_GROUP("uart2-hwflow", jz4760_uart2_hwflow, 0),
889         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4760_uart3_data,
890                                 jz4760_uart3_data_funcs),
891         INGENIC_PIN_GROUP("uart3-hwflow", jz4760_uart3_hwflow, 0),
892         INGENIC_PIN_GROUP("ssi0-dt-a", jz4760_ssi0_dt_a, 2),
893         INGENIC_PIN_GROUP("ssi0-dt-b", jz4760_ssi0_dt_b, 1),
894         INGENIC_PIN_GROUP("ssi0-dt-d", jz4760_ssi0_dt_d, 1),
895         INGENIC_PIN_GROUP("ssi0-dt-e", jz4760_ssi0_dt_e, 0),
896         INGENIC_PIN_GROUP("ssi0-dr-a", jz4760_ssi0_dr_a, 1),
897         INGENIC_PIN_GROUP("ssi0-dr-b", jz4760_ssi0_dr_b, 1),
898         INGENIC_PIN_GROUP("ssi0-dr-d", jz4760_ssi0_dr_d, 1),
899         INGENIC_PIN_GROUP("ssi0-dr-e", jz4760_ssi0_dr_e, 0),
900         INGENIC_PIN_GROUP("ssi0-clk-a", jz4760_ssi0_clk_a, 2),
901         INGENIC_PIN_GROUP("ssi0-clk-b", jz4760_ssi0_clk_b, 1),
902         INGENIC_PIN_GROUP("ssi0-clk-d", jz4760_ssi0_clk_d, 1),
903         INGENIC_PIN_GROUP("ssi0-clk-e", jz4760_ssi0_clk_e, 0),
904         INGENIC_PIN_GROUP("ssi0-gpc-b", jz4760_ssi0_gpc_b, 1),
905         INGENIC_PIN_GROUP("ssi0-gpc-d", jz4760_ssi0_gpc_d, 1),
906         INGENIC_PIN_GROUP("ssi0-gpc-e", jz4760_ssi0_gpc_e, 0),
907         INGENIC_PIN_GROUP("ssi0-ce0-a", jz4760_ssi0_ce0_a, 2),
908         INGENIC_PIN_GROUP("ssi0-ce0-b", jz4760_ssi0_ce0_b, 1),
909         INGENIC_PIN_GROUP("ssi0-ce0-d", jz4760_ssi0_ce0_d, 1),
910         INGENIC_PIN_GROUP("ssi0-ce0-e", jz4760_ssi0_ce0_e, 0),
911         INGENIC_PIN_GROUP("ssi0-ce1-b", jz4760_ssi0_ce1_b, 1),
912         INGENIC_PIN_GROUP("ssi0-ce1-d", jz4760_ssi0_ce1_d, 1),
913         INGENIC_PIN_GROUP("ssi0-ce1-e", jz4760_ssi0_ce1_e, 0),
914         INGENIC_PIN_GROUP("ssi1-dt-b-9", jz4760_ssi1_dt_b_9, 2),
915         INGENIC_PIN_GROUP("ssi1-dt-b-21", jz4760_ssi1_dt_b_21, 2),
916         INGENIC_PIN_GROUP("ssi1-dt-d-12", jz4760_ssi1_dt_d_12, 2),
917         INGENIC_PIN_GROUP("ssi1-dt-d-21", jz4760_ssi1_dt_d_21, 2),
918         INGENIC_PIN_GROUP("ssi1-dt-e", jz4760_ssi1_dt_e, 1),
919         INGENIC_PIN_GROUP("ssi1-dt-f", jz4760_ssi1_dt_f, 2),
920         INGENIC_PIN_GROUP("ssi1-dr-b-6", jz4760_ssi1_dr_b_6, 2),
921         INGENIC_PIN_GROUP("ssi1-dr-b-20", jz4760_ssi1_dr_b_20, 2),
922         INGENIC_PIN_GROUP("ssi1-dr-d-13", jz4760_ssi1_dr_d_13, 2),
923         INGENIC_PIN_GROUP("ssi1-dr-d-20", jz4760_ssi1_dr_d_20, 2),
924         INGENIC_PIN_GROUP("ssi1-dr-e", jz4760_ssi1_dr_e, 1),
925         INGENIC_PIN_GROUP("ssi1-dr-f", jz4760_ssi1_dr_f, 2),
926         INGENIC_PIN_GROUP("ssi1-clk-b-7", jz4760_ssi1_clk_b_7, 2),
927         INGENIC_PIN_GROUP("ssi1-clk-b-28", jz4760_ssi1_clk_b_28, 2),
928         INGENIC_PIN_GROUP("ssi1-clk-d", jz4760_ssi1_clk_d, 2),
929         INGENIC_PIN_GROUP("ssi1-clk-e-7", jz4760_ssi1_clk_e_7, 2),
930         INGENIC_PIN_GROUP("ssi1-clk-e-15", jz4760_ssi1_clk_e_15, 1),
931         INGENIC_PIN_GROUP("ssi1-clk-f", jz4760_ssi1_clk_f, 2),
932         INGENIC_PIN_GROUP("ssi1-gpc-b", jz4760_ssi1_gpc_b, 2),
933         INGENIC_PIN_GROUP("ssi1-gpc-d", jz4760_ssi1_gpc_d, 2),
934         INGENIC_PIN_GROUP("ssi1-gpc-e", jz4760_ssi1_gpc_e, 1),
935         INGENIC_PIN_GROUP("ssi1-ce0-b-8", jz4760_ssi1_ce0_b_8, 2),
936         INGENIC_PIN_GROUP("ssi1-ce0-b-29", jz4760_ssi1_ce0_b_29, 2),
937         INGENIC_PIN_GROUP("ssi1-ce0-d", jz4760_ssi1_ce0_d, 2),
938         INGENIC_PIN_GROUP("ssi1-ce0-e-6", jz4760_ssi1_ce0_e_6, 2),
939         INGENIC_PIN_GROUP("ssi1-ce0-e-16", jz4760_ssi1_ce0_e_16, 1),
940         INGENIC_PIN_GROUP("ssi1-ce0-f", jz4760_ssi1_ce0_f, 2),
941         INGENIC_PIN_GROUP("ssi1-ce1-b", jz4760_ssi1_ce1_b, 2),
942         INGENIC_PIN_GROUP("ssi1-ce1-d", jz4760_ssi1_ce1_d, 2),
943         INGENIC_PIN_GROUP("ssi1-ce1-e", jz4760_ssi1_ce1_e, 1),
944         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4760_mmc0_1bit_a,
945                                 jz4760_mmc0_1bit_a_funcs),
946         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4760_mmc0_4bit_a, 1),
947         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4760_mmc0_1bit_e, 0),
948         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4760_mmc0_4bit_e, 0),
949         INGENIC_PIN_GROUP("mmc0-8bit-e", jz4760_mmc0_8bit_e, 0),
950         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4760_mmc1_1bit_d, 0),
951         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4760_mmc1_4bit_d, 0),
952         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4760_mmc1_1bit_e, 1),
953         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4760_mmc1_4bit_e, 1),
954         INGENIC_PIN_GROUP("mmc1-8bit-e", jz4760_mmc1_8bit_e, 1),
955         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4760_mmc2_1bit_b, 0),
956         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4760_mmc2_4bit_b, 0),
957         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4760_mmc2_1bit_e, 2),
958         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4760_mmc2_4bit_e, 2),
959         INGENIC_PIN_GROUP("mmc2-8bit-e", jz4760_mmc2_8bit_e, 2),
960         INGENIC_PIN_GROUP("nemc-8bit-data", jz4760_nemc_8bit_data, 0),
961         INGENIC_PIN_GROUP("nemc-16bit-data", jz4760_nemc_16bit_data, 0),
962         INGENIC_PIN_GROUP("nemc-cle-ale", jz4760_nemc_cle_ale, 0),
963         INGENIC_PIN_GROUP("nemc-addr", jz4760_nemc_addr, 0),
964         INGENIC_PIN_GROUP("nemc-rd-we", jz4760_nemc_rd_we, 0),
965         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4760_nemc_frd_fwe, 0),
966         INGENIC_PIN_GROUP("nemc-wait", jz4760_nemc_wait, 0),
967         INGENIC_PIN_GROUP("nemc-cs1", jz4760_nemc_cs1, 0),
968         INGENIC_PIN_GROUP("nemc-cs2", jz4760_nemc_cs2, 0),
969         INGENIC_PIN_GROUP("nemc-cs3", jz4760_nemc_cs3, 0),
970         INGENIC_PIN_GROUP("nemc-cs4", jz4760_nemc_cs4, 0),
971         INGENIC_PIN_GROUP("nemc-cs5", jz4760_nemc_cs5, 0),
972         INGENIC_PIN_GROUP("nemc-cs6", jz4760_nemc_cs6, 0),
973         INGENIC_PIN_GROUP("i2c0-data", jz4760_i2c0, 0),
974         INGENIC_PIN_GROUP("i2c1-data", jz4760_i2c1, 0),
975         INGENIC_PIN_GROUP("cim-data", jz4760_cim, 0),
976         INGENIC_PIN_GROUP("lcd-8bit", jz4760_lcd_8bit, 0),
977         INGENIC_PIN_GROUP("lcd-16bit", jz4760_lcd_16bit, 0),
978         INGENIC_PIN_GROUP("lcd-18bit", jz4760_lcd_18bit, 0),
979         INGENIC_PIN_GROUP("lcd-24bit", jz4760_lcd_24bit, 0),
980         INGENIC_PIN_GROUP("lcd-special", jz4760_lcd_special, 1),
981         INGENIC_PIN_GROUP("lcd-generic", jz4760_lcd_generic, 0),
982         INGENIC_PIN_GROUP("pwm0", jz4760_pwm_pwm0, 0),
983         INGENIC_PIN_GROUP("pwm1", jz4760_pwm_pwm1, 0),
984         INGENIC_PIN_GROUP("pwm2", jz4760_pwm_pwm2, 0),
985         INGENIC_PIN_GROUP("pwm3", jz4760_pwm_pwm3, 0),
986         INGENIC_PIN_GROUP("pwm4", jz4760_pwm_pwm4, 0),
987         INGENIC_PIN_GROUP("pwm5", jz4760_pwm_pwm5, 0),
988         INGENIC_PIN_GROUP("pwm6", jz4760_pwm_pwm6, 0),
989         INGENIC_PIN_GROUP("pwm7", jz4760_pwm_pwm7, 0),
990         INGENIC_PIN_GROUP("otg-vbus", jz4760_otg, 0),
991 };
992
993 static const char *jz4760_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
994 static const char *jz4760_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
995 static const char *jz4760_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
996 static const char *jz4760_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
997 static const char *jz4760_ssi0_groups[] = {
998         "ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
999         "ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1000         "ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e",
1001         "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1002         "ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1003         "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1004 };
1005 static const char *jz4760_ssi1_groups[] = {
1006         "ssi1-dt-b-9", "ssi1-dt-b-21", "ssi1-dt-d-12", "ssi1-dt-d-21", "ssi1-dt-e", "ssi1-dt-f",
1007         "ssi1-dr-b-6", "ssi1-dr-b-20", "ssi1-dr-d-13", "ssi1-dr-d-20", "ssi1-dr-e", "ssi1-dr-f",
1008         "ssi1-clk-b-7", "ssi1-clk-b-28", "ssi1-clk-d", "ssi1-clk-e-7", "ssi1-clk-e-15", "ssi1-clk-f",
1009         "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1010         "ssi1-ce0-b-8", "ssi1-ce0-b-29", "ssi1-ce0-d", "ssi1-ce0-e-6", "ssi1-ce0-e-16", "ssi1-ce0-f",
1011         "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1012 };
1013 static const char *jz4760_mmc0_groups[] = {
1014         "mmc0-1bit-a", "mmc0-4bit-a",
1015         "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
1016 };
1017 static const char *jz4760_mmc1_groups[] = {
1018         "mmc1-1bit-d", "mmc1-4bit-d",
1019         "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
1020 };
1021 static const char *jz4760_mmc2_groups[] = {
1022         "mmc2-1bit-b", "mmc2-4bit-b",
1023         "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
1024 };
1025 static const char *jz4760_nemc_groups[] = {
1026         "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
1027         "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1028 };
1029 static const char *jz4760_cs1_groups[] = { "nemc-cs1", };
1030 static const char *jz4760_cs2_groups[] = { "nemc-cs2", };
1031 static const char *jz4760_cs3_groups[] = { "nemc-cs3", };
1032 static const char *jz4760_cs4_groups[] = { "nemc-cs4", };
1033 static const char *jz4760_cs5_groups[] = { "nemc-cs5", };
1034 static const char *jz4760_cs6_groups[] = { "nemc-cs6", };
1035 static const char *jz4760_i2c0_groups[] = { "i2c0-data", };
1036 static const char *jz4760_i2c1_groups[] = { "i2c1-data", };
1037 static const char *jz4760_cim_groups[] = { "cim-data", };
1038 static const char *jz4760_lcd_groups[] = {
1039         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
1040         "lcd-special", "lcd-generic",
1041 };
1042 static const char *jz4760_pwm0_groups[] = { "pwm0", };
1043 static const char *jz4760_pwm1_groups[] = { "pwm1", };
1044 static const char *jz4760_pwm2_groups[] = { "pwm2", };
1045 static const char *jz4760_pwm3_groups[] = { "pwm3", };
1046 static const char *jz4760_pwm4_groups[] = { "pwm4", };
1047 static const char *jz4760_pwm5_groups[] = { "pwm5", };
1048 static const char *jz4760_pwm6_groups[] = { "pwm6", };
1049 static const char *jz4760_pwm7_groups[] = { "pwm7", };
1050 static const char *jz4760_otg_groups[] = { "otg-vbus", };
1051
1052 static const struct function_desc jz4760_functions[] = {
1053         { "uart0", jz4760_uart0_groups, ARRAY_SIZE(jz4760_uart0_groups), },
1054         { "uart1", jz4760_uart1_groups, ARRAY_SIZE(jz4760_uart1_groups), },
1055         { "uart2", jz4760_uart2_groups, ARRAY_SIZE(jz4760_uart2_groups), },
1056         { "uart3", jz4760_uart3_groups, ARRAY_SIZE(jz4760_uart3_groups), },
1057         { "ssi0", jz4760_ssi0_groups, ARRAY_SIZE(jz4760_ssi0_groups), },
1058         { "ssi1", jz4760_ssi1_groups, ARRAY_SIZE(jz4760_ssi1_groups), },
1059         { "mmc0", jz4760_mmc0_groups, ARRAY_SIZE(jz4760_mmc0_groups), },
1060         { "mmc1", jz4760_mmc1_groups, ARRAY_SIZE(jz4760_mmc1_groups), },
1061         { "mmc2", jz4760_mmc2_groups, ARRAY_SIZE(jz4760_mmc2_groups), },
1062         { "nemc", jz4760_nemc_groups, ARRAY_SIZE(jz4760_nemc_groups), },
1063         { "nemc-cs1", jz4760_cs1_groups, ARRAY_SIZE(jz4760_cs1_groups), },
1064         { "nemc-cs2", jz4760_cs2_groups, ARRAY_SIZE(jz4760_cs2_groups), },
1065         { "nemc-cs3", jz4760_cs3_groups, ARRAY_SIZE(jz4760_cs3_groups), },
1066         { "nemc-cs4", jz4760_cs4_groups, ARRAY_SIZE(jz4760_cs4_groups), },
1067         { "nemc-cs5", jz4760_cs5_groups, ARRAY_SIZE(jz4760_cs5_groups), },
1068         { "nemc-cs6", jz4760_cs6_groups, ARRAY_SIZE(jz4760_cs6_groups), },
1069         { "i2c0", jz4760_i2c0_groups, ARRAY_SIZE(jz4760_i2c0_groups), },
1070         { "i2c1", jz4760_i2c1_groups, ARRAY_SIZE(jz4760_i2c1_groups), },
1071         { "cim", jz4760_cim_groups, ARRAY_SIZE(jz4760_cim_groups), },
1072         { "lcd", jz4760_lcd_groups, ARRAY_SIZE(jz4760_lcd_groups), },
1073         { "pwm0", jz4760_pwm0_groups, ARRAY_SIZE(jz4760_pwm0_groups), },
1074         { "pwm1", jz4760_pwm1_groups, ARRAY_SIZE(jz4760_pwm1_groups), },
1075         { "pwm2", jz4760_pwm2_groups, ARRAY_SIZE(jz4760_pwm2_groups), },
1076         { "pwm3", jz4760_pwm3_groups, ARRAY_SIZE(jz4760_pwm3_groups), },
1077         { "pwm4", jz4760_pwm4_groups, ARRAY_SIZE(jz4760_pwm4_groups), },
1078         { "pwm5", jz4760_pwm5_groups, ARRAY_SIZE(jz4760_pwm5_groups), },
1079         { "pwm6", jz4760_pwm6_groups, ARRAY_SIZE(jz4760_pwm6_groups), },
1080         { "pwm7", jz4760_pwm7_groups, ARRAY_SIZE(jz4760_pwm7_groups), },
1081         { "otg", jz4760_otg_groups, ARRAY_SIZE(jz4760_otg_groups), },
1082 };
1083
1084 static const struct ingenic_chip_info jz4760_chip_info = {
1085         .num_chips = 6,
1086         .reg_offset = 0x100,
1087         .version = ID_JZ4760,
1088         .groups = jz4760_groups,
1089         .num_groups = ARRAY_SIZE(jz4760_groups),
1090         .functions = jz4760_functions,
1091         .num_functions = ARRAY_SIZE(jz4760_functions),
1092         .pull_ups = jz4760_pull_ups,
1093         .pull_downs = jz4760_pull_downs,
1094 };
1095
1096 static const u32 jz4770_pull_ups[6] = {
1097         0x3fffffff, 0xfff0f3fc, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0x0024f00f,
1098 };
1099
1100 static const u32 jz4770_pull_downs[6] = {
1101         0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x005b0ff0,
1102 };
1103
1104 static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
1105 static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
1106 static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
1107 static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
1108 static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, };
1109 static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
1110 static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
1111 static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
1112 static int jz4770_ssi0_dt_a_pins[] = { 0x15, };
1113 static int jz4770_ssi0_dt_b_pins[] = { 0x35, };
1114 static int jz4770_ssi0_dt_d_pins[] = { 0x75, };
1115 static int jz4770_ssi0_dt_e_pins[] = { 0x91, };
1116 static int jz4770_ssi0_dr_a_pins[] = { 0x14, };
1117 static int jz4770_ssi0_dr_b_pins[] = { 0x34, };
1118 static int jz4770_ssi0_dr_d_pins[] = { 0x74, };
1119 static int jz4770_ssi0_dr_e_pins[] = { 0x8e, };
1120 static int jz4770_ssi0_clk_a_pins[] = { 0x12, };
1121 static int jz4770_ssi0_clk_b_pins[] = { 0x3c, };
1122 static int jz4770_ssi0_clk_d_pins[] = { 0x78, };
1123 static int jz4770_ssi0_clk_e_pins[] = { 0x8f, };
1124 static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, };
1125 static int jz4770_ssi0_gpc_d_pins[] = { 0x76, };
1126 static int jz4770_ssi0_gpc_e_pins[] = { 0x93, };
1127 static int jz4770_ssi0_ce0_a_pins[] = { 0x13, };
1128 static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, };
1129 static int jz4770_ssi0_ce0_d_pins[] = { 0x79, };
1130 static int jz4770_ssi0_ce0_e_pins[] = { 0x90, };
1131 static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, };
1132 static int jz4770_ssi0_ce1_d_pins[] = { 0x77, };
1133 static int jz4770_ssi0_ce1_e_pins[] = { 0x92, };
1134 static int jz4770_ssi1_dt_b_pins[] = { 0x35, };
1135 static int jz4770_ssi1_dt_d_pins[] = { 0x75, };
1136 static int jz4770_ssi1_dt_e_pins[] = { 0x91, };
1137 static int jz4770_ssi1_dr_b_pins[] = { 0x34, };
1138 static int jz4770_ssi1_dr_d_pins[] = { 0x74, };
1139 static int jz4770_ssi1_dr_e_pins[] = { 0x8e, };
1140 static int jz4770_ssi1_clk_b_pins[] = { 0x3c, };
1141 static int jz4770_ssi1_clk_d_pins[] = { 0x78, };
1142 static int jz4770_ssi1_clk_e_pins[] = { 0x8f, };
1143 static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, };
1144 static int jz4770_ssi1_gpc_d_pins[] = { 0x76, };
1145 static int jz4770_ssi1_gpc_e_pins[] = { 0x93, };
1146 static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, };
1147 static int jz4770_ssi1_ce0_d_pins[] = { 0x79, };
1148 static int jz4770_ssi1_ce0_e_pins[] = { 0x90, };
1149 static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, };
1150 static int jz4770_ssi1_ce1_d_pins[] = { 0x77, };
1151 static int jz4770_ssi1_ce1_e_pins[] = { 0x92, };
1152 static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
1153 static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
1154 static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1155 static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1156 static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
1157 static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
1158 static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
1159 static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1160 static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1161 static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
1162 static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
1163 static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
1164 static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1165 static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1166 static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
1167 static int jz4770_nemc_8bit_data_pins[] = {
1168         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1169 };
1170 static int jz4770_nemc_16bit_data_pins[] = {
1171         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1172 };
1173 static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
1174 static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
1175 static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
1176 static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
1177 static int jz4770_nemc_wait_pins[] = { 0x1b, };
1178 static int jz4770_nemc_cs1_pins[] = { 0x15, };
1179 static int jz4770_nemc_cs2_pins[] = { 0x16, };
1180 static int jz4770_nemc_cs3_pins[] = { 0x17, };
1181 static int jz4770_nemc_cs4_pins[] = { 0x18, };
1182 static int jz4770_nemc_cs5_pins[] = { 0x19, };
1183 static int jz4770_nemc_cs6_pins[] = { 0x1a, };
1184 static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, };
1185 static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, };
1186 static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
1187 static int jz4770_cim_8bit_pins[] = {
1188         0x26, 0x27, 0x28, 0x29,
1189         0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
1190 };
1191 static int jz4770_cim_12bit_pins[] = {
1192         0x32, 0x33, 0xb0, 0xb1,
1193 };
1194 static int jz4770_lcd_8bit_pins[] = {
1195         0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d,
1196         0x48, 0x52, 0x53,
1197 };
1198 static int jz4770_lcd_16bit_pins[] = {
1199         0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59,
1200 };
1201 static int jz4770_lcd_18bit_pins[] = {
1202         0x5a, 0x5b,
1203 };
1204 static int jz4770_lcd_24bit_pins[] = {
1205         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
1206         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
1207         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
1208         0x58, 0x59, 0x5a, 0x5b,
1209 };
1210 static int jz4770_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, };
1211 static int jz4770_lcd_generic_pins[] = { 0x49, };
1212 static int jz4770_pwm_pwm0_pins[] = { 0x80, };
1213 static int jz4770_pwm_pwm1_pins[] = { 0x81, };
1214 static int jz4770_pwm_pwm2_pins[] = { 0x82, };
1215 static int jz4770_pwm_pwm3_pins[] = { 0x83, };
1216 static int jz4770_pwm_pwm4_pins[] = { 0x84, };
1217 static int jz4770_pwm_pwm5_pins[] = { 0x85, };
1218 static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
1219 static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
1220 static int jz4770_mac_rmii_pins[] = {
1221         0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
1222 };
1223 static int jz4770_mac_mii_pins[] = {
1224         0x7b, 0x7a, 0x7d, 0x7c, 0xa7, 0x24, 0xaf,
1225 };
1226
1227 static const struct group_desc jz4770_groups[] = {
1228         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0),
1229         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0),
1230         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0),
1231         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0),
1232         INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data, 0),
1233         INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow, 0),
1234         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data,
1235                                 jz4760_uart3_data_funcs),
1236         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0),
1237         INGENIC_PIN_GROUP("ssi0-dt-a", jz4770_ssi0_dt_a, 2),
1238         INGENIC_PIN_GROUP("ssi0-dt-b", jz4770_ssi0_dt_b, 1),
1239         INGENIC_PIN_GROUP("ssi0-dt-d", jz4770_ssi0_dt_d, 1),
1240         INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0),
1241         INGENIC_PIN_GROUP("ssi0-dr-a", jz4770_ssi0_dr_a, 1),
1242         INGENIC_PIN_GROUP("ssi0-dr-b", jz4770_ssi0_dr_b, 1),
1243         INGENIC_PIN_GROUP("ssi0-dr-d", jz4770_ssi0_dr_d, 1),
1244         INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0),
1245         INGENIC_PIN_GROUP("ssi0-clk-a", jz4770_ssi0_clk_a, 2),
1246         INGENIC_PIN_GROUP("ssi0-clk-b", jz4770_ssi0_clk_b, 1),
1247         INGENIC_PIN_GROUP("ssi0-clk-d", jz4770_ssi0_clk_d, 1),
1248         INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0),
1249         INGENIC_PIN_GROUP("ssi0-gpc-b", jz4770_ssi0_gpc_b, 1),
1250         INGENIC_PIN_GROUP("ssi0-gpc-d", jz4770_ssi0_gpc_d, 1),
1251         INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0),
1252         INGENIC_PIN_GROUP("ssi0-ce0-a", jz4770_ssi0_ce0_a, 2),
1253         INGENIC_PIN_GROUP("ssi0-ce0-b", jz4770_ssi0_ce0_b, 1),
1254         INGENIC_PIN_GROUP("ssi0-ce0-d", jz4770_ssi0_ce0_d, 1),
1255         INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0),
1256         INGENIC_PIN_GROUP("ssi0-ce1-b", jz4770_ssi0_ce1_b, 1),
1257         INGENIC_PIN_GROUP("ssi0-ce1-d", jz4770_ssi0_ce1_d, 1),
1258         INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0),
1259         INGENIC_PIN_GROUP("ssi1-dt-b", jz4770_ssi1_dt_b, 2),
1260         INGENIC_PIN_GROUP("ssi1-dt-d", jz4770_ssi1_dt_d, 2),
1261         INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1),
1262         INGENIC_PIN_GROUP("ssi1-dr-b", jz4770_ssi1_dr_b, 2),
1263         INGENIC_PIN_GROUP("ssi1-dr-d", jz4770_ssi1_dr_d, 2),
1264         INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1),
1265         INGENIC_PIN_GROUP("ssi1-clk-b", jz4770_ssi1_clk_b, 2),
1266         INGENIC_PIN_GROUP("ssi1-clk-d", jz4770_ssi1_clk_d, 2),
1267         INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1),
1268         INGENIC_PIN_GROUP("ssi1-gpc-b", jz4770_ssi1_gpc_b, 2),
1269         INGENIC_PIN_GROUP("ssi1-gpc-d", jz4770_ssi1_gpc_d, 2),
1270         INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1),
1271         INGENIC_PIN_GROUP("ssi1-ce0-b", jz4770_ssi1_ce0_b, 2),
1272         INGENIC_PIN_GROUP("ssi1-ce0-d", jz4770_ssi1_ce0_d, 2),
1273         INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1),
1274         INGENIC_PIN_GROUP("ssi1-ce1-b", jz4770_ssi1_ce1_b, 2),
1275         INGENIC_PIN_GROUP("ssi1-ce1-d", jz4770_ssi1_ce1_d, 2),
1276         INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1),
1277         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a,
1278                                 jz4760_mmc0_1bit_a_funcs),
1279         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1),
1280         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0),
1281         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0),
1282         INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e, 0),
1283         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0),
1284         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0),
1285         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1),
1286         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1),
1287         INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e, 1),
1288         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0),
1289         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0),
1290         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2),
1291         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2),
1292         INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e, 2),
1293         INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data, 0),
1294         INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data, 0),
1295         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0),
1296         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0),
1297         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0),
1298         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0),
1299         INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0),
1300         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0),
1301         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0),
1302         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0),
1303         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0),
1304         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0),
1305         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0),
1306         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0),
1307         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0),
1308         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2),
1309         INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit, 0),
1310         INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0),
1311         INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0),
1312         INGENIC_PIN_GROUP("lcd-16bit", jz4770_lcd_16bit, 0),
1313         INGENIC_PIN_GROUP("lcd-18bit", jz4770_lcd_18bit, 0),
1314         INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0),
1315         INGENIC_PIN_GROUP("lcd-special", jz4770_lcd_special, 1),
1316         INGENIC_PIN_GROUP("lcd-generic", jz4770_lcd_generic, 0),
1317         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0),
1318         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0),
1319         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0),
1320         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0),
1321         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0),
1322         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0),
1323         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0),
1324         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0),
1325         INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii, 0),
1326         INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii, 0),
1327         INGENIC_PIN_GROUP("otg-vbus", jz4760_otg, 0),
1328 };
1329
1330 static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
1331 static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
1332 static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
1333 static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
1334 static const char *jz4770_ssi0_groups[] = {
1335         "ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
1336         "ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1337         "ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e",
1338         "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1339         "ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1340         "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1341 };
1342 static const char *jz4770_ssi1_groups[] = {
1343         "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
1344         "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
1345         "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
1346         "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1347         "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
1348         "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1349 };
1350 static const char *jz4770_mmc0_groups[] = {
1351         "mmc0-1bit-a", "mmc0-4bit-a",
1352         "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
1353 };
1354 static const char *jz4770_mmc1_groups[] = {
1355         "mmc1-1bit-d", "mmc1-4bit-d",
1356         "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
1357 };
1358 static const char *jz4770_mmc2_groups[] = {
1359         "mmc2-1bit-b", "mmc2-4bit-b",
1360         "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
1361 };
1362 static const char *jz4770_nemc_groups[] = {
1363         "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
1364         "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1365 };
1366 static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
1367 static const char *jz4770_cs2_groups[] = { "nemc-cs2", };
1368 static const char *jz4770_cs3_groups[] = { "nemc-cs3", };
1369 static const char *jz4770_cs4_groups[] = { "nemc-cs4", };
1370 static const char *jz4770_cs5_groups[] = { "nemc-cs5", };
1371 static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
1372 static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
1373 static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
1374 static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
1375 static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
1376 static const char *jz4770_lcd_groups[] = {
1377         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
1378         "lcd-special", "lcd-generic",
1379 };
1380 static const char *jz4770_pwm0_groups[] = { "pwm0", };
1381 static const char *jz4770_pwm1_groups[] = { "pwm1", };
1382 static const char *jz4770_pwm2_groups[] = { "pwm2", };
1383 static const char *jz4770_pwm3_groups[] = { "pwm3", };
1384 static const char *jz4770_pwm4_groups[] = { "pwm4", };
1385 static const char *jz4770_pwm5_groups[] = { "pwm5", };
1386 static const char *jz4770_pwm6_groups[] = { "pwm6", };
1387 static const char *jz4770_pwm7_groups[] = { "pwm7", };
1388 static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", };
1389
1390 static const struct function_desc jz4770_functions[] = {
1391         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
1392         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
1393         { "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
1394         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
1395         { "ssi0", jz4770_ssi0_groups, ARRAY_SIZE(jz4770_ssi0_groups), },
1396         { "ssi1", jz4770_ssi1_groups, ARRAY_SIZE(jz4770_ssi1_groups), },
1397         { "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
1398         { "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
1399         { "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), },
1400         { "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
1401         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
1402         { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
1403         { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
1404         { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
1405         { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
1406         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
1407         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
1408         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
1409         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
1410         { "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
1411         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
1412         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
1413         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
1414         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
1415         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
1416         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
1417         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
1418         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
1419         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
1420         { "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), },
1421         { "otg", jz4760_otg_groups, ARRAY_SIZE(jz4760_otg_groups), },
1422 };
1423
1424 static const struct ingenic_chip_info jz4770_chip_info = {
1425         .num_chips = 6,
1426         .reg_offset = 0x100,
1427         .version = ID_JZ4770,
1428         .groups = jz4770_groups,
1429         .num_groups = ARRAY_SIZE(jz4770_groups),
1430         .functions = jz4770_functions,
1431         .num_functions = ARRAY_SIZE(jz4770_functions),
1432         .pull_ups = jz4770_pull_ups,
1433         .pull_downs = jz4770_pull_downs,
1434 };
1435
1436 static const u32 jz4775_pull_ups[7] = {
1437         0x28ff00ff, 0xf030f3fc, 0x0fffffff, 0xfffe4000, 0xf0f0000c, 0x0000f00f, 0x0000f3c0,
1438 };
1439
1440 static const u32 jz4775_pull_downs[7] = {
1441         0x00000000, 0x00030c03, 0x00000000, 0x00008000, 0x00000403, 0x00000ff0, 0x00030c00,
1442 };
1443
1444 static int jz4775_uart0_data_pins[] = { 0xa0, 0xa3, };
1445 static int jz4775_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
1446 static int jz4775_uart1_data_pins[] = { 0x7a, 0x7c, };
1447 static int jz4775_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
1448 static int jz4775_uart2_data_c_pins[] = { 0x54, 0x4a, };
1449 static int jz4775_uart2_data_f_pins[] = { 0xa5, 0xa4, };
1450 static int jz4775_uart3_data_pins[] = { 0x1e, 0x1f, };
1451 static int jz4775_ssi_dt_a_pins[] = { 0x13, };
1452 static int jz4775_ssi_dt_d_pins[] = { 0x75, };
1453 static int jz4775_ssi_dr_a_pins[] = { 0x14, };
1454 static int jz4775_ssi_dr_d_pins[] = { 0x74, };
1455 static int jz4775_ssi_clk_a_pins[] = { 0x12, };
1456 static int jz4775_ssi_clk_d_pins[] = { 0x78, };
1457 static int jz4775_ssi_gpc_pins[] = { 0x76, };
1458 static int jz4775_ssi_ce0_a_pins[] = { 0x17, };
1459 static int jz4775_ssi_ce0_d_pins[] = { 0x79, };
1460 static int jz4775_ssi_ce1_pins[] = { 0x77, };
1461 static int jz4775_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
1462 static int jz4775_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
1463 static int jz4775_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, };
1464 static int jz4775_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1465 static int jz4775_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1466 static int jz4775_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
1467 static int jz4775_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
1468 static int jz4775_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1469 static int jz4775_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1470 static int jz4775_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
1471 static int jz4775_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
1472 static int jz4775_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1473 static int jz4775_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1474 static int jz4775_nemc_8bit_data_pins[] = {
1475         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1476 };
1477 static int jz4775_nemc_16bit_data_pins[] = {
1478         0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1,
1479 };
1480 static int jz4775_nemc_cle_ale_pins[] = { 0x20, 0x21, };
1481 static int jz4775_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
1482 static int jz4775_nemc_rd_we_pins[] = { 0x10, 0x11, };
1483 static int jz4775_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
1484 static int jz4775_nemc_wait_pins[] = { 0x1b, };
1485 static int jz4775_nemc_cs1_pins[] = { 0x15, };
1486 static int jz4775_nemc_cs2_pins[] = { 0x16, };
1487 static int jz4775_nemc_cs3_pins[] = { 0x17, };
1488 static int jz4775_i2c0_pins[] = { 0x7e, 0x7f, };
1489 static int jz4775_i2c1_pins[] = { 0x9e, 0x9f, };
1490 static int jz4775_i2c2_pins[] = { 0x80, 0x83, };
1491 static int jz4775_i2s_data_tx_pins[] = { 0xa3, };
1492 static int jz4775_i2s_data_rx_pins[] = { 0xa2, };
1493 static int jz4775_i2s_clk_txrx_pins[] = { 0xa0, 0xa1, };
1494 static int jz4775_i2s_sysclk_pins[] = { 0x83, };
1495 static int jz4775_dmic_pins[] = { 0xaa, 0xab, };
1496 static int jz4775_cim_pins[] = {
1497         0x26, 0x27, 0x28, 0x29,
1498         0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
1499 };
1500 static int jz4775_lcd_8bit_pins[] = {
1501         0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d,
1502         0x48, 0x52, 0x53,
1503 };
1504 static int jz4775_lcd_16bit_pins[] = {
1505         0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59,
1506 };
1507 static int jz4775_lcd_18bit_pins[] = {
1508         0x5a, 0x5b,
1509 };
1510 static int jz4775_lcd_24bit_pins[] = {
1511         0x40, 0x41, 0x4a, 0x4b, 0x54, 0x55,
1512 };
1513 static int jz4775_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, };
1514 static int jz4775_lcd_generic_pins[] = { 0x49, };
1515 static int jz4775_pwm_pwm0_pins[] = { 0x80, };
1516 static int jz4775_pwm_pwm1_pins[] = { 0x81, };
1517 static int jz4775_pwm_pwm2_pins[] = { 0x82, };
1518 static int jz4775_pwm_pwm3_pins[] = { 0x83, };
1519 static int jz4775_mac_rmii_pins[] = {
1520         0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
1521 };
1522 static int jz4775_mac_mii_pins[] = {
1523         0x7b, 0x7a, 0x7d, 0x7c, 0xa7, 0x24, 0xaf,
1524 };
1525 static int jz4775_mac_rgmii_pins[] = {
1526         0xa9, 0x7b, 0x7a, 0xab, 0xaa, 0xac, 0x7d, 0x7c, 0xa5, 0xa4,
1527         0xad, 0xae, 0xa7, 0xa6,
1528 };
1529 static int jz4775_mac_gmii_pins[] = {
1530         0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a,
1531         0xa8, 0x28, 0x24, 0xaf,
1532 };
1533 static int jz4775_otg_pins[] = { 0x8a, };
1534
1535 static u8 jz4775_uart3_data_funcs[] = { 0, 1, };
1536 static u8 jz4775_mac_mii_funcs[] = { 1, 1, 1, 1, 0, 1, 0, };
1537 static u8 jz4775_mac_rgmii_funcs[] = {
1538         0, 1, 1, 0, 0, 0, 1, 1, 0, 0,
1539         0, 0, 0, 0,
1540 };
1541 static u8 jz4775_mac_gmii_funcs[] = {
1542         1, 1, 1, 1, 1, 1, 1, 1,
1543         0, 1, 1, 0,
1544 };
1545
1546 static const struct group_desc jz4775_groups[] = {
1547         INGENIC_PIN_GROUP("uart0-data", jz4775_uart0_data, 0),
1548         INGENIC_PIN_GROUP("uart0-hwflow", jz4775_uart0_hwflow, 0),
1549         INGENIC_PIN_GROUP("uart1-data", jz4775_uart1_data, 0),
1550         INGENIC_PIN_GROUP("uart1-hwflow", jz4775_uart1_hwflow, 0),
1551         INGENIC_PIN_GROUP("uart2-data-c", jz4775_uart2_data_c, 2),
1552         INGENIC_PIN_GROUP("uart2-data-f", jz4775_uart2_data_f, 1),
1553         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4775_uart3_data,
1554                                 jz4775_uart3_data_funcs),
1555         INGENIC_PIN_GROUP("ssi-dt-a", jz4775_ssi_dt_a, 2),
1556         INGENIC_PIN_GROUP("ssi-dt-d", jz4775_ssi_dt_d, 1),
1557         INGENIC_PIN_GROUP("ssi-dr-a", jz4775_ssi_dr_a, 2),
1558         INGENIC_PIN_GROUP("ssi-dr-d", jz4775_ssi_dr_d, 1),
1559         INGENIC_PIN_GROUP("ssi-clk-a", jz4775_ssi_clk_a, 2),
1560         INGENIC_PIN_GROUP("ssi-clk-d", jz4775_ssi_clk_d, 1),
1561         INGENIC_PIN_GROUP("ssi-gpc", jz4775_ssi_gpc, 1),
1562         INGENIC_PIN_GROUP("ssi-ce0-a", jz4775_ssi_ce0_a, 2),
1563         INGENIC_PIN_GROUP("ssi-ce0-d", jz4775_ssi_ce0_d, 1),
1564         INGENIC_PIN_GROUP("ssi-ce1", jz4775_ssi_ce1, 1),
1565         INGENIC_PIN_GROUP("mmc0-1bit-a", jz4775_mmc0_1bit_a, 1),
1566         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4775_mmc0_4bit_a, 1),
1567         INGENIC_PIN_GROUP("mmc0-8bit-a", jz4775_mmc0_8bit_a, 1),
1568         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4775_mmc0_1bit_e, 0),
1569         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4775_mmc0_4bit_e, 0),
1570         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4775_mmc1_1bit_d, 0),
1571         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4775_mmc1_4bit_d, 0),
1572         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4775_mmc1_1bit_e, 1),
1573         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4775_mmc1_4bit_e, 1),
1574         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4775_mmc2_1bit_b, 0),
1575         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4775_mmc2_4bit_b, 0),
1576         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4775_mmc2_1bit_e, 2),
1577         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4775_mmc2_4bit_e, 2),
1578         INGENIC_PIN_GROUP("nemc-8bit-data", jz4775_nemc_8bit_data, 0),
1579         INGENIC_PIN_GROUP("nemc-16bit-data", jz4775_nemc_16bit_data, 1),
1580         INGENIC_PIN_GROUP("nemc-cle-ale", jz4775_nemc_cle_ale, 0),
1581         INGENIC_PIN_GROUP("nemc-addr", jz4775_nemc_addr, 0),
1582         INGENIC_PIN_GROUP("nemc-rd-we", jz4775_nemc_rd_we, 0),
1583         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4775_nemc_frd_fwe, 0),
1584         INGENIC_PIN_GROUP("nemc-wait", jz4775_nemc_wait, 0),
1585         INGENIC_PIN_GROUP("nemc-cs1", jz4775_nemc_cs1, 0),
1586         INGENIC_PIN_GROUP("nemc-cs2", jz4775_nemc_cs2, 0),
1587         INGENIC_PIN_GROUP("nemc-cs3", jz4775_nemc_cs3, 0),
1588         INGENIC_PIN_GROUP("i2c0-data", jz4775_i2c0, 0),
1589         INGENIC_PIN_GROUP("i2c1-data", jz4775_i2c1, 0),
1590         INGENIC_PIN_GROUP("i2c2-data", jz4775_i2c2, 1),
1591         INGENIC_PIN_GROUP("i2s-data-tx", jz4775_i2s_data_tx, 1),
1592         INGENIC_PIN_GROUP("i2s-data-rx", jz4775_i2s_data_rx, 1),
1593         INGENIC_PIN_GROUP("i2s-clk-txrx", jz4775_i2s_clk_txrx, 1),
1594         INGENIC_PIN_GROUP("i2s-sysclk", jz4775_i2s_sysclk, 2),
1595         INGENIC_PIN_GROUP("dmic", jz4775_dmic, 1),
1596         INGENIC_PIN_GROUP("cim-data", jz4775_cim, 0),
1597         INGENIC_PIN_GROUP("lcd-8bit", jz4775_lcd_8bit, 0),
1598         INGENIC_PIN_GROUP("lcd-16bit", jz4775_lcd_16bit, 0),
1599         INGENIC_PIN_GROUP("lcd-18bit", jz4775_lcd_18bit, 0),
1600         INGENIC_PIN_GROUP("lcd-24bit", jz4775_lcd_24bit, 0),
1601         INGENIC_PIN_GROUP("lcd-generic", jz4775_lcd_generic, 0),
1602         INGENIC_PIN_GROUP("lcd-special", jz4775_lcd_special, 1),
1603         INGENIC_PIN_GROUP("pwm0", jz4775_pwm_pwm0, 0),
1604         INGENIC_PIN_GROUP("pwm1", jz4775_pwm_pwm1, 0),
1605         INGENIC_PIN_GROUP("pwm2", jz4775_pwm_pwm2, 0),
1606         INGENIC_PIN_GROUP("pwm3", jz4775_pwm_pwm3, 0),
1607         INGENIC_PIN_GROUP("mac-rmii", jz4775_mac_rmii, 0),
1608         INGENIC_PIN_GROUP_FUNCS("mac-mii", jz4775_mac_mii,
1609                                 jz4775_mac_mii_funcs),
1610         INGENIC_PIN_GROUP_FUNCS("mac-rgmii", jz4775_mac_rgmii,
1611                                 jz4775_mac_rgmii_funcs),
1612         INGENIC_PIN_GROUP_FUNCS("mac-gmii", jz4775_mac_gmii,
1613                                 jz4775_mac_gmii_funcs),
1614         INGENIC_PIN_GROUP("otg-vbus", jz4775_otg, 0),
1615 };
1616
1617 static const char *jz4775_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
1618 static const char *jz4775_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
1619 static const char *jz4775_uart2_groups[] = { "uart2-data-c", "uart2-data-f", };
1620 static const char *jz4775_uart3_groups[] = { "uart3-data", };
1621 static const char *jz4775_ssi_groups[] = {
1622         "ssi-dt-a", "ssi-dt-d",
1623         "ssi-dr-a", "ssi-dr-d",
1624         "ssi-clk-a", "ssi-clk-d",
1625         "ssi-gpc",
1626         "ssi-ce0-a", "ssi-ce0-d",
1627         "ssi-ce1",
1628 };
1629 static const char *jz4775_mmc0_groups[] = {
1630         "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
1631         "mmc0-1bit-e", "mmc0-4bit-e",
1632 };
1633 static const char *jz4775_mmc1_groups[] = {
1634         "mmc1-1bit-d", "mmc1-4bit-d",
1635         "mmc1-1bit-e", "mmc1-4bit-e",
1636 };
1637 static const char *jz4775_mmc2_groups[] = {
1638         "mmc2-1bit-b", "mmc2-4bit-b",
1639         "mmc2-1bit-e", "mmc2-4bit-e",
1640 };
1641 static const char *jz4775_nemc_groups[] = {
1642         "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
1643         "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1644 };
1645 static const char *jz4775_cs1_groups[] = { "nemc-cs1", };
1646 static const char *jz4775_cs2_groups[] = { "nemc-cs2", };
1647 static const char *jz4775_cs3_groups[] = { "nemc-cs3", };
1648 static const char *jz4775_i2c0_groups[] = { "i2c0-data", };
1649 static const char *jz4775_i2c1_groups[] = { "i2c1-data", };
1650 static const char *jz4775_i2c2_groups[] = { "i2c2-data", };
1651 static const char *jz4775_i2s_groups[] = {
1652         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
1653 };
1654 static const char *jz4775_dmic_groups[] = { "dmic", };
1655 static const char *jz4775_cim_groups[] = { "cim-data", };
1656 static const char *jz4775_lcd_groups[] = {
1657         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
1658         "lcd-special", "lcd-generic",
1659 };
1660 static const char *jz4775_pwm0_groups[] = { "pwm0", };
1661 static const char *jz4775_pwm1_groups[] = { "pwm1", };
1662 static const char *jz4775_pwm2_groups[] = { "pwm2", };
1663 static const char *jz4775_pwm3_groups[] = { "pwm3", };
1664 static const char *jz4775_mac_groups[] = {
1665         "mac-rmii", "mac-mii", "mac-rgmii", "mac-gmii",
1666 };
1667 static const char *jz4775_otg_groups[] = { "otg-vbus", };
1668
1669 static const struct function_desc jz4775_functions[] = {
1670         { "uart0", jz4775_uart0_groups, ARRAY_SIZE(jz4775_uart0_groups), },
1671         { "uart1", jz4775_uart1_groups, ARRAY_SIZE(jz4775_uart1_groups), },
1672         { "uart2", jz4775_uart2_groups, ARRAY_SIZE(jz4775_uart2_groups), },
1673         { "uart3", jz4775_uart3_groups, ARRAY_SIZE(jz4775_uart3_groups), },
1674         { "ssi", jz4775_ssi_groups, ARRAY_SIZE(jz4775_ssi_groups), },
1675         { "mmc0", jz4775_mmc0_groups, ARRAY_SIZE(jz4775_mmc0_groups), },
1676         { "mmc1", jz4775_mmc1_groups, ARRAY_SIZE(jz4775_mmc1_groups), },
1677         { "mmc2", jz4775_mmc2_groups, ARRAY_SIZE(jz4775_mmc2_groups), },
1678         { "nemc", jz4775_nemc_groups, ARRAY_SIZE(jz4775_nemc_groups), },
1679         { "nemc-cs1", jz4775_cs1_groups, ARRAY_SIZE(jz4775_cs1_groups), },
1680         { "nemc-cs2", jz4775_cs2_groups, ARRAY_SIZE(jz4775_cs2_groups), },
1681         { "nemc-cs3", jz4775_cs3_groups, ARRAY_SIZE(jz4775_cs3_groups), },
1682         { "i2c0", jz4775_i2c0_groups, ARRAY_SIZE(jz4775_i2c0_groups), },
1683         { "i2c1", jz4775_i2c1_groups, ARRAY_SIZE(jz4775_i2c1_groups), },
1684         { "i2c2", jz4775_i2c2_groups, ARRAY_SIZE(jz4775_i2c2_groups), },
1685         { "i2s", jz4775_i2s_groups, ARRAY_SIZE(jz4775_i2s_groups), },
1686         { "dmic", jz4775_dmic_groups, ARRAY_SIZE(jz4775_dmic_groups), },
1687         { "cim", jz4775_cim_groups, ARRAY_SIZE(jz4775_cim_groups), },
1688         { "lcd", jz4775_lcd_groups, ARRAY_SIZE(jz4775_lcd_groups), },
1689         { "pwm0", jz4775_pwm0_groups, ARRAY_SIZE(jz4775_pwm0_groups), },
1690         { "pwm1", jz4775_pwm1_groups, ARRAY_SIZE(jz4775_pwm1_groups), },
1691         { "pwm2", jz4775_pwm2_groups, ARRAY_SIZE(jz4775_pwm2_groups), },
1692         { "pwm3", jz4775_pwm3_groups, ARRAY_SIZE(jz4775_pwm3_groups), },
1693         { "mac", jz4775_mac_groups, ARRAY_SIZE(jz4775_mac_groups), },
1694         { "otg", jz4775_otg_groups, ARRAY_SIZE(jz4775_otg_groups), },
1695 };
1696
1697 static const struct ingenic_chip_info jz4775_chip_info = {
1698         .num_chips = 7,
1699         .reg_offset = 0x100,
1700         .version = ID_JZ4775,
1701         .groups = jz4775_groups,
1702         .num_groups = ARRAY_SIZE(jz4775_groups),
1703         .functions = jz4775_functions,
1704         .num_functions = ARRAY_SIZE(jz4775_functions),
1705         .pull_ups = jz4775_pull_ups,
1706         .pull_downs = jz4775_pull_downs,
1707 };
1708
1709 static const u32 jz4780_pull_ups[6] = {
1710         0x3fffffff, 0xfff0f3fc, 0x0fffffff, 0xffff4fff, 0xfffffb7c, 0x7fa7f00f,
1711 };
1712
1713 static const u32 jz4780_pull_downs[6] = {
1714         0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
1715 };
1716
1717 static int jz4780_uart2_data_pins[] = { 0x66, 0x67, };
1718 static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, };
1719 static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, };
1720 static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, };
1721 static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, };
1722 static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, };
1723 static int jz4780_ssi0_dt_b_pins[] = { 0x3d, };
1724 static int jz4780_ssi0_dt_d_pins[] = { 0x79, };
1725 static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, };
1726 static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, };
1727 static int jz4780_ssi0_dr_b_pins[] = { 0x34, };
1728 static int jz4780_ssi0_dr_d_pins[] = { 0x74, };
1729 static int jz4780_ssi0_clk_a_pins[] = { 0x12, };
1730 static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, };
1731 static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, };
1732 static int jz4780_ssi0_clk_d_pins[] = { 0x78, };
1733 static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, };
1734 static int jz4780_ssi0_gpc_d_pins[] = { 0x76, };
1735 static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, };
1736 static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, };
1737 static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, };
1738 static int jz4780_ssi0_ce0_d_pins[] = { 0x77, };
1739 static int jz4780_ssi0_ce1_b_pins[] = { 0x35, };
1740 static int jz4780_ssi0_ce1_d_pins[] = { 0x75, };
1741 static int jz4780_ssi1_dt_b_pins[] = { 0x3d, };
1742 static int jz4780_ssi1_dt_d_pins[] = { 0x79, };
1743 static int jz4780_ssi1_dr_b_pins[] = { 0x34, };
1744 static int jz4780_ssi1_dr_d_pins[] = { 0x74, };
1745 static int jz4780_ssi1_clk_b_pins[] = { 0x3c, };
1746 static int jz4780_ssi1_clk_d_pins[] = { 0x78, };
1747 static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, };
1748 static int jz4780_ssi1_gpc_d_pins[] = { 0x76, };
1749 static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, };
1750 static int jz4780_ssi1_ce0_d_pins[] = { 0x77, };
1751 static int jz4780_ssi1_ce1_b_pins[] = { 0x35, };
1752 static int jz4780_ssi1_ce1_d_pins[] = { 0x75, };
1753 static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
1754 static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, };
1755 static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, };
1756 static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, };
1757 static int jz4780_i2s_data_tx_pins[] = { 0x87, };
1758 static int jz4780_i2s_data_rx_pins[] = { 0x86, };
1759 static int jz4780_i2s_clk_txrx_pins[] = { 0x6c, 0x6d, };
1760 static int jz4780_i2s_clk_rx_pins[] = { 0x88, 0x89, };
1761 static int jz4780_i2s_sysclk_pins[] = { 0x85, };
1762 static int jz4780_dmic_pins[] = { 0x32, 0x33, };
1763 static int jz4780_hdmi_ddc_pins[] = { 0xb9, 0xb8, };
1764
1765 static u8 jz4780_i2s_clk_txrx_funcs[] = { 1, 0, };
1766
1767 static const struct group_desc jz4780_groups[] = {
1768         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0),
1769         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0),
1770         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0),
1771         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0),
1772         INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data, 1),
1773         INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow, 1),
1774         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data,
1775                                 jz4760_uart3_data_funcs),
1776         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0),
1777         INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data, 2),
1778         INGENIC_PIN_GROUP("ssi0-dt-a-19", jz4780_ssi0_dt_a_19, 2),
1779         INGENIC_PIN_GROUP("ssi0-dt-a-21", jz4780_ssi0_dt_a_21, 2),
1780         INGENIC_PIN_GROUP("ssi0-dt-a-28", jz4780_ssi0_dt_a_28, 2),
1781         INGENIC_PIN_GROUP("ssi0-dt-b", jz4780_ssi0_dt_b, 1),
1782         INGENIC_PIN_GROUP("ssi0-dt-d", jz4780_ssi0_dt_d, 1),
1783         INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0),
1784         INGENIC_PIN_GROUP("ssi0-dr-a-20", jz4780_ssi0_dr_a_20, 2),
1785         INGENIC_PIN_GROUP("ssi0-dr-a-27", jz4780_ssi0_dr_a_27, 2),
1786         INGENIC_PIN_GROUP("ssi0-dr-b", jz4780_ssi0_dr_b, 1),
1787         INGENIC_PIN_GROUP("ssi0-dr-d", jz4780_ssi0_dr_d, 1),
1788         INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0),
1789         INGENIC_PIN_GROUP("ssi0-clk-a", jz4780_ssi0_clk_a, 2),
1790         INGENIC_PIN_GROUP("ssi0-clk-b-5", jz4780_ssi0_clk_b_5, 1),
1791         INGENIC_PIN_GROUP("ssi0-clk-b-28", jz4780_ssi0_clk_b_28, 1),
1792         INGENIC_PIN_GROUP("ssi0-clk-d", jz4780_ssi0_clk_d, 1),
1793         INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0),
1794         INGENIC_PIN_GROUP("ssi0-gpc-b", jz4780_ssi0_gpc_b, 1),
1795         INGENIC_PIN_GROUP("ssi0-gpc-d", jz4780_ssi0_gpc_d, 1),
1796         INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0),
1797         INGENIC_PIN_GROUP("ssi0-ce0-a-23", jz4780_ssi0_ce0_a_23, 2),
1798         INGENIC_PIN_GROUP("ssi0-ce0-a-25", jz4780_ssi0_ce0_a_25, 2),
1799         INGENIC_PIN_GROUP("ssi0-ce0-b", jz4780_ssi0_ce0_b, 1),
1800         INGENIC_PIN_GROUP("ssi0-ce0-d", jz4780_ssi0_ce0_d, 1),
1801         INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0),
1802         INGENIC_PIN_GROUP("ssi0-ce1-b", jz4780_ssi0_ce1_b, 1),
1803         INGENIC_PIN_GROUP("ssi0-ce1-d", jz4780_ssi0_ce1_d, 1),
1804         INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0),
1805         INGENIC_PIN_GROUP("ssi1-dt-b", jz4780_ssi1_dt_b, 2),
1806         INGENIC_PIN_GROUP("ssi1-dt-d", jz4780_ssi1_dt_d, 2),
1807         INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1),
1808         INGENIC_PIN_GROUP("ssi1-dr-b", jz4780_ssi1_dr_b, 2),
1809         INGENIC_PIN_GROUP("ssi1-dr-d", jz4780_ssi1_dr_d, 2),
1810         INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1),
1811         INGENIC_PIN_GROUP("ssi1-clk-b", jz4780_ssi1_clk_b, 2),
1812         INGENIC_PIN_GROUP("ssi1-clk-d", jz4780_ssi1_clk_d, 2),
1813         INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1),
1814         INGENIC_PIN_GROUP("ssi1-gpc-b", jz4780_ssi1_gpc_b, 2),
1815         INGENIC_PIN_GROUP("ssi1-gpc-d", jz4780_ssi1_gpc_d, 2),
1816         INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1),
1817         INGENIC_PIN_GROUP("ssi1-ce0-b", jz4780_ssi1_ce0_b, 2),
1818         INGENIC_PIN_GROUP("ssi1-ce0-d", jz4780_ssi1_ce0_d, 2),
1819         INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1),
1820         INGENIC_PIN_GROUP("ssi1-ce1-b", jz4780_ssi1_ce1_b, 2),
1821         INGENIC_PIN_GROUP("ssi1-ce1-d", jz4780_ssi1_ce1_d, 2),
1822         INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1),
1823         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a,
1824                                 jz4760_mmc0_1bit_a_funcs),
1825         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1),
1826         INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a, 1),
1827         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0),
1828         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0),
1829         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0),
1830         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0),
1831         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1),
1832         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1),
1833         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0),
1834         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0),
1835         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2),
1836         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2),
1837         INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data, 0),
1838         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0),
1839         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0),
1840         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0),
1841         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0),
1842         INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0),
1843         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0),
1844         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0),
1845         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0),
1846         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0),
1847         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0),
1848         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0),
1849         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0),
1850         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0),
1851         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2),
1852         INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3, 1),
1853         INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e, 1),
1854         INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f, 1),
1855         INGENIC_PIN_GROUP("i2s-data-tx", jz4780_i2s_data_tx, 0),
1856         INGENIC_PIN_GROUP("i2s-data-rx", jz4780_i2s_data_rx, 0),
1857         INGENIC_PIN_GROUP_FUNCS("i2s-clk-txrx", jz4780_i2s_clk_txrx,
1858                                 jz4780_i2s_clk_txrx_funcs),
1859         INGENIC_PIN_GROUP("i2s-clk-rx", jz4780_i2s_clk_rx, 1),
1860         INGENIC_PIN_GROUP("i2s-sysclk", jz4780_i2s_sysclk, 2),
1861         INGENIC_PIN_GROUP("dmic", jz4780_dmic, 1),
1862         INGENIC_PIN_GROUP("hdmi-ddc", jz4780_hdmi_ddc, 0),
1863         INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit, 0),
1864         INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0),
1865         INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0),
1866         INGENIC_PIN_GROUP("lcd-16bit", jz4770_lcd_16bit, 0),
1867         INGENIC_PIN_GROUP("lcd-18bit", jz4770_lcd_18bit, 0),
1868         INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0),
1869         INGENIC_PIN_GROUP("lcd-special", jz4770_lcd_special, 1),
1870         INGENIC_PIN_GROUP("lcd-generic", jz4770_lcd_generic, 0),
1871         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0),
1872         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0),
1873         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0),
1874         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0),
1875         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0),
1876         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0),
1877         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0),
1878         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0),
1879 };
1880
1881 static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
1882 static const char *jz4780_uart4_groups[] = { "uart4-data", };
1883 static const char *jz4780_ssi0_groups[] = {
1884         "ssi0-dt-a-19", "ssi0-dt-a-21", "ssi0-dt-a-28", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
1885         "ssi0-dr-a-20", "ssi0-dr-a-27", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1886         "ssi0-clk-a", "ssi0-clk-b-5", "ssi0-clk-b-28", "ssi0-clk-d", "ssi0-clk-e",
1887         "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1888         "ssi0-ce0-a-23", "ssi0-ce0-a-25", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1889         "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1890 };
1891 static const char *jz4780_ssi1_groups[] = {
1892         "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
1893         "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
1894         "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
1895         "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1896         "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
1897         "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1898 };
1899 static const char *jz4780_mmc0_groups[] = {
1900         "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
1901         "mmc0-1bit-e", "mmc0-4bit-e",
1902 };
1903 static const char *jz4780_mmc1_groups[] = {
1904         "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
1905 };
1906 static const char *jz4780_mmc2_groups[] = {
1907         "mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e",
1908 };
1909 static const char *jz4780_nemc_groups[] = {
1910         "nemc-data", "nemc-cle-ale", "nemc-addr",
1911         "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1912 };
1913 static const char *jz4780_i2c3_groups[] = { "i2c3-data", };
1914 static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
1915 static const char *jz4780_i2s_groups[] = {
1916         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
1917 };
1918 static const char *jz4780_dmic_groups[] = { "dmic", };
1919 static const char *jz4780_cim_groups[] = { "cim-data", };
1920 static const char *jz4780_hdmi_ddc_groups[] = { "hdmi-ddc", };
1921
1922 static const struct function_desc jz4780_functions[] = {
1923         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
1924         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
1925         { "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), },
1926         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
1927         { "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), },
1928         { "ssi0", jz4780_ssi0_groups, ARRAY_SIZE(jz4780_ssi0_groups), },
1929         { "ssi1", jz4780_ssi1_groups, ARRAY_SIZE(jz4780_ssi1_groups), },
1930         { "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), },
1931         { "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), },
1932         { "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), },
1933         { "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), },
1934         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
1935         { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
1936         { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
1937         { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
1938         { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
1939         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
1940         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
1941         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
1942         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
1943         { "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), },
1944         { "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), },
1945         { "i2s", jz4780_i2s_groups, ARRAY_SIZE(jz4780_i2s_groups), },
1946         { "dmic", jz4780_dmic_groups, ARRAY_SIZE(jz4780_dmic_groups), },
1947         { "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), },
1948         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
1949         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
1950         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
1951         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
1952         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
1953         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
1954         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
1955         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
1956         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
1957         { "hdmi-ddc", jz4780_hdmi_ddc_groups,
1958                       ARRAY_SIZE(jz4780_hdmi_ddc_groups), },
1959 };
1960
1961 static const struct ingenic_chip_info jz4780_chip_info = {
1962         .num_chips = 6,
1963         .reg_offset = 0x100,
1964         .version = ID_JZ4780,
1965         .groups = jz4780_groups,
1966         .num_groups = ARRAY_SIZE(jz4780_groups),
1967         .functions = jz4780_functions,
1968         .num_functions = ARRAY_SIZE(jz4780_functions),
1969         .pull_ups = jz4780_pull_ups,
1970         .pull_downs = jz4780_pull_downs,
1971 };
1972
1973 static const u32 x1000_pull_ups[4] = {
1974         0xffffffff, 0xfdffffff, 0x0dffffff, 0x0000003f,
1975 };
1976
1977 static const u32 x1000_pull_downs[4] = {
1978         0x00000000, 0x02000000, 0x02000000, 0x00000000,
1979 };
1980
1981 static int x1000_uart0_data_pins[] = { 0x4a, 0x4b, };
1982 static int x1000_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
1983 static int x1000_uart1_data_a_pins[] = { 0x04, 0x05, };
1984 static int x1000_uart1_data_d_pins[] = { 0x62, 0x63, };
1985 static int x1000_uart1_hwflow_pins[] = { 0x64, 0x65, };
1986 static int x1000_uart2_data_a_pins[] = { 0x02, 0x03, };
1987 static int x1000_uart2_data_d_pins[] = { 0x65, 0x64, };
1988 static int x1000_sfc_data_pins[] = { 0x1d, 0x1c, 0x1e, 0x1f, };
1989 static int x1000_sfc_clk_pins[] = { 0x1a, };
1990 static int x1000_sfc_ce_pins[] = { 0x1b, };
1991 static int x1000_ssi_dt_a_22_pins[] = { 0x16, };
1992 static int x1000_ssi_dt_a_29_pins[] = { 0x1d, };
1993 static int x1000_ssi_dt_d_pins[] = { 0x62, };
1994 static int x1000_ssi_dr_a_23_pins[] = { 0x17, };
1995 static int x1000_ssi_dr_a_28_pins[] = { 0x1c, };
1996 static int x1000_ssi_dr_d_pins[] = { 0x63, };
1997 static int x1000_ssi_clk_a_24_pins[] = { 0x18, };
1998 static int x1000_ssi_clk_a_26_pins[] = { 0x1a, };
1999 static int x1000_ssi_clk_d_pins[] = { 0x60, };
2000 static int x1000_ssi_gpc_a_20_pins[] = { 0x14, };
2001 static int x1000_ssi_gpc_a_31_pins[] = { 0x1f, };
2002 static int x1000_ssi_ce0_a_25_pins[] = { 0x19, };
2003 static int x1000_ssi_ce0_a_27_pins[] = { 0x1b, };
2004 static int x1000_ssi_ce0_d_pins[] = { 0x61, };
2005 static int x1000_ssi_ce1_a_21_pins[] = { 0x15, };
2006 static int x1000_ssi_ce1_a_30_pins[] = { 0x1e, };
2007 static int x1000_mmc0_1bit_pins[] = { 0x18, 0x19, 0x17, };
2008 static int x1000_mmc0_4bit_pins[] = { 0x16, 0x15, 0x14, };
2009 static int x1000_mmc0_8bit_pins[] = { 0x13, 0x12, 0x11, 0x10, };
2010 static int x1000_mmc1_1bit_pins[] = { 0x40, 0x41, 0x42, };
2011 static int x1000_mmc1_4bit_pins[] = { 0x43, 0x44, 0x45, };
2012 static int x1000_emc_8bit_data_pins[] = {
2013         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2014 };
2015 static int x1000_emc_16bit_data_pins[] = {
2016         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2017 };
2018 static int x1000_emc_addr_pins[] = {
2019         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2020         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
2021 };
2022 static int x1000_emc_rd_we_pins[] = { 0x30, 0x31, };
2023 static int x1000_emc_wait_pins[] = { 0x34, };
2024 static int x1000_emc_cs1_pins[] = { 0x32, };
2025 static int x1000_emc_cs2_pins[] = { 0x33, };
2026 static int x1000_i2c0_pins[] = { 0x38, 0x37, };
2027 static int x1000_i2c1_a_pins[] = { 0x01, 0x00, };
2028 static int x1000_i2c1_c_pins[] = { 0x5b, 0x5a, };
2029 static int x1000_i2c2_pins[] = { 0x61, 0x60, };
2030 static int x1000_i2s_data_tx_pins[] = { 0x24, };
2031 static int x1000_i2s_data_rx_pins[] = { 0x23, };
2032 static int x1000_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
2033 static int x1000_i2s_sysclk_pins[] = { 0x20, };
2034 static int x1000_dmic_if0_pins[] = { 0x35, 0x36, };
2035 static int x1000_dmic_if1_pins[] = { 0x25, };
2036 static int x1000_cim_pins[] = {
2037         0x08, 0x09, 0x0a, 0x0b,
2038         0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
2039 };
2040 static int x1000_lcd_8bit_pins[] = {
2041         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2042         0x30, 0x31, 0x32, 0x33, 0x34,
2043 };
2044 static int x1000_lcd_16bit_pins[] = {
2045         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2046 };
2047 static int x1000_pwm_pwm0_pins[] = { 0x59, };
2048 static int x1000_pwm_pwm1_pins[] = { 0x5a, };
2049 static int x1000_pwm_pwm2_pins[] = { 0x5b, };
2050 static int x1000_pwm_pwm3_pins[] = { 0x26, };
2051 static int x1000_pwm_pwm4_pins[] = { 0x58, };
2052 static int x1000_mac_pins[] = {
2053         0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x26,
2054 };
2055
2056 static const struct group_desc x1000_groups[] = {
2057         INGENIC_PIN_GROUP("uart0-data", x1000_uart0_data, 0),
2058         INGENIC_PIN_GROUP("uart0-hwflow", x1000_uart0_hwflow, 0),
2059         INGENIC_PIN_GROUP("uart1-data-a", x1000_uart1_data_a, 2),
2060         INGENIC_PIN_GROUP("uart1-data-d", x1000_uart1_data_d, 1),
2061         INGENIC_PIN_GROUP("uart1-hwflow", x1000_uart1_hwflow, 1),
2062         INGENIC_PIN_GROUP("uart2-data-a", x1000_uart2_data_a, 2),
2063         INGENIC_PIN_GROUP("uart2-data-d", x1000_uart2_data_d, 0),
2064         INGENIC_PIN_GROUP("sfc-data", x1000_sfc_data, 1),
2065         INGENIC_PIN_GROUP("sfc-clk", x1000_sfc_clk, 1),
2066         INGENIC_PIN_GROUP("sfc-ce", x1000_sfc_ce, 1),
2067         INGENIC_PIN_GROUP("ssi-dt-a-22", x1000_ssi_dt_a_22, 2),
2068         INGENIC_PIN_GROUP("ssi-dt-a-29", x1000_ssi_dt_a_29, 2),
2069         INGENIC_PIN_GROUP("ssi-dt-d", x1000_ssi_dt_d, 0),
2070         INGENIC_PIN_GROUP("ssi-dr-a-23", x1000_ssi_dr_a_23, 2),
2071         INGENIC_PIN_GROUP("ssi-dr-a-28", x1000_ssi_dr_a_28, 2),
2072         INGENIC_PIN_GROUP("ssi-dr-d", x1000_ssi_dr_d, 0),
2073         INGENIC_PIN_GROUP("ssi-clk-a-24", x1000_ssi_clk_a_24, 2),
2074         INGENIC_PIN_GROUP("ssi-clk-a-26", x1000_ssi_clk_a_26, 2),
2075         INGENIC_PIN_GROUP("ssi-clk-d", x1000_ssi_clk_d, 0),
2076         INGENIC_PIN_GROUP("ssi-gpc-a-20", x1000_ssi_gpc_a_20, 2),
2077         INGENIC_PIN_GROUP("ssi-gpc-a-31", x1000_ssi_gpc_a_31, 2),
2078         INGENIC_PIN_GROUP("ssi-ce0-a-25", x1000_ssi_ce0_a_25, 2),
2079         INGENIC_PIN_GROUP("ssi-ce0-a-27", x1000_ssi_ce0_a_27, 2),
2080         INGENIC_PIN_GROUP("ssi-ce0-d", x1000_ssi_ce0_d, 0),
2081         INGENIC_PIN_GROUP("ssi-ce1-a-21", x1000_ssi_ce1_a_21, 2),
2082         INGENIC_PIN_GROUP("ssi-ce1-a-30", x1000_ssi_ce1_a_30, 2),
2083         INGENIC_PIN_GROUP("mmc0-1bit", x1000_mmc0_1bit, 1),
2084         INGENIC_PIN_GROUP("mmc0-4bit", x1000_mmc0_4bit, 1),
2085         INGENIC_PIN_GROUP("mmc0-8bit", x1000_mmc0_8bit, 1),
2086         INGENIC_PIN_GROUP("mmc1-1bit", x1000_mmc1_1bit, 0),
2087         INGENIC_PIN_GROUP("mmc1-4bit", x1000_mmc1_4bit, 0),
2088         INGENIC_PIN_GROUP("emc-8bit-data", x1000_emc_8bit_data, 0),
2089         INGENIC_PIN_GROUP("emc-16bit-data", x1000_emc_16bit_data, 0),
2090         INGENIC_PIN_GROUP("emc-addr", x1000_emc_addr, 0),
2091         INGENIC_PIN_GROUP("emc-rd-we", x1000_emc_rd_we, 0),
2092         INGENIC_PIN_GROUP("emc-wait", x1000_emc_wait, 0),
2093         INGENIC_PIN_GROUP("emc-cs1", x1000_emc_cs1, 0),
2094         INGENIC_PIN_GROUP("emc-cs2", x1000_emc_cs2, 0),
2095         INGENIC_PIN_GROUP("i2c0-data", x1000_i2c0, 0),
2096         INGENIC_PIN_GROUP("i2c1-data-a", x1000_i2c1_a, 2),
2097         INGENIC_PIN_GROUP("i2c1-data-c", x1000_i2c1_c, 0),
2098         INGENIC_PIN_GROUP("i2c2-data", x1000_i2c2, 1),
2099         INGENIC_PIN_GROUP("i2s-data-tx", x1000_i2s_data_tx, 1),
2100         INGENIC_PIN_GROUP("i2s-data-rx", x1000_i2s_data_rx, 1),
2101         INGENIC_PIN_GROUP("i2s-clk-txrx", x1000_i2s_clk_txrx, 1),
2102         INGENIC_PIN_GROUP("i2s-sysclk", x1000_i2s_sysclk, 1),
2103         INGENIC_PIN_GROUP("dmic-if0", x1000_dmic_if0, 0),
2104         INGENIC_PIN_GROUP("dmic-if1", x1000_dmic_if1, 1),
2105         INGENIC_PIN_GROUP("cim-data", x1000_cim, 2),
2106         INGENIC_PIN_GROUP("lcd-8bit", x1000_lcd_8bit, 1),
2107         INGENIC_PIN_GROUP("lcd-16bit", x1000_lcd_16bit, 1),
2108         INGENIC_PIN_GROUP("pwm0", x1000_pwm_pwm0, 0),
2109         INGENIC_PIN_GROUP("pwm1", x1000_pwm_pwm1, 1),
2110         INGENIC_PIN_GROUP("pwm2", x1000_pwm_pwm2, 1),
2111         INGENIC_PIN_GROUP("pwm3", x1000_pwm_pwm3, 2),
2112         INGENIC_PIN_GROUP("pwm4", x1000_pwm_pwm4, 0),
2113         INGENIC_PIN_GROUP("mac", x1000_mac, 1),
2114 };
2115
2116 static const char *x1000_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2117 static const char *x1000_uart1_groups[] = {
2118         "uart1-data-a", "uart1-data-d", "uart1-hwflow",
2119 };
2120 static const char *x1000_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
2121 static const char *x1000_sfc_groups[] = { "sfc-data", "sfc-clk", "sfc-ce", };
2122 static const char *x1000_ssi_groups[] = {
2123         "ssi-dt-a-22", "ssi-dt-a-29", "ssi-dt-d",
2124         "ssi-dr-a-23", "ssi-dr-a-28", "ssi-dr-d",
2125         "ssi-clk-a-24", "ssi-clk-a-26", "ssi-clk-d",
2126         "ssi-gpc-a-20", "ssi-gpc-a-31",
2127         "ssi-ce0-a-25", "ssi-ce0-a-27", "ssi-ce0-d",
2128         "ssi-ce1-a-21", "ssi-ce1-a-30",
2129 };
2130 static const char *x1000_mmc0_groups[] = {
2131         "mmc0-1bit", "mmc0-4bit", "mmc0-8bit",
2132 };
2133 static const char *x1000_mmc1_groups[] = {
2134         "mmc1-1bit", "mmc1-4bit",
2135 };
2136 static const char *x1000_emc_groups[] = {
2137         "emc-8bit-data", "emc-16bit-data",
2138         "emc-addr", "emc-rd-we", "emc-wait",
2139 };
2140 static const char *x1000_cs1_groups[] = { "emc-cs1", };
2141 static const char *x1000_cs2_groups[] = { "emc-cs2", };
2142 static const char *x1000_i2c0_groups[] = { "i2c0-data", };
2143 static const char *x1000_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
2144 static const char *x1000_i2c2_groups[] = { "i2c2-data", };
2145 static const char *x1000_i2s_groups[] = {
2146         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
2147 };
2148 static const char *x1000_dmic_groups[] = { "dmic-if0", "dmic-if1", };
2149 static const char *x1000_cim_groups[] = { "cim-data", };
2150 static const char *x1000_lcd_groups[] = { "lcd-8bit", "lcd-16bit", };
2151 static const char *x1000_pwm0_groups[] = { "pwm0", };
2152 static const char *x1000_pwm1_groups[] = { "pwm1", };
2153 static const char *x1000_pwm2_groups[] = { "pwm2", };
2154 static const char *x1000_pwm3_groups[] = { "pwm3", };
2155 static const char *x1000_pwm4_groups[] = { "pwm4", };
2156 static const char *x1000_mac_groups[] = { "mac", };
2157
2158 static const struct function_desc x1000_functions[] = {
2159         { "uart0", x1000_uart0_groups, ARRAY_SIZE(x1000_uart0_groups), },
2160         { "uart1", x1000_uart1_groups, ARRAY_SIZE(x1000_uart1_groups), },
2161         { "uart2", x1000_uart2_groups, ARRAY_SIZE(x1000_uart2_groups), },
2162         { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
2163         { "ssi", x1000_ssi_groups, ARRAY_SIZE(x1000_ssi_groups), },
2164         { "mmc0", x1000_mmc0_groups, ARRAY_SIZE(x1000_mmc0_groups), },
2165         { "mmc1", x1000_mmc1_groups, ARRAY_SIZE(x1000_mmc1_groups), },
2166         { "emc", x1000_emc_groups, ARRAY_SIZE(x1000_emc_groups), },
2167         { "emc-cs1", x1000_cs1_groups, ARRAY_SIZE(x1000_cs1_groups), },
2168         { "emc-cs2", x1000_cs2_groups, ARRAY_SIZE(x1000_cs2_groups), },
2169         { "i2c0", x1000_i2c0_groups, ARRAY_SIZE(x1000_i2c0_groups), },
2170         { "i2c1", x1000_i2c1_groups, ARRAY_SIZE(x1000_i2c1_groups), },
2171         { "i2c2", x1000_i2c2_groups, ARRAY_SIZE(x1000_i2c2_groups), },
2172         { "i2s", x1000_i2s_groups, ARRAY_SIZE(x1000_i2s_groups), },
2173         { "dmic", x1000_dmic_groups, ARRAY_SIZE(x1000_dmic_groups), },
2174         { "cim", x1000_cim_groups, ARRAY_SIZE(x1000_cim_groups), },
2175         { "lcd", x1000_lcd_groups, ARRAY_SIZE(x1000_lcd_groups), },
2176         { "pwm0", x1000_pwm0_groups, ARRAY_SIZE(x1000_pwm0_groups), },
2177         { "pwm1", x1000_pwm1_groups, ARRAY_SIZE(x1000_pwm1_groups), },
2178         { "pwm2", x1000_pwm2_groups, ARRAY_SIZE(x1000_pwm2_groups), },
2179         { "pwm3", x1000_pwm3_groups, ARRAY_SIZE(x1000_pwm3_groups), },
2180         { "pwm4", x1000_pwm4_groups, ARRAY_SIZE(x1000_pwm4_groups), },
2181         { "mac", x1000_mac_groups, ARRAY_SIZE(x1000_mac_groups), },
2182 };
2183
2184 static const struct regmap_range x1000_access_ranges[] = {
2185         regmap_reg_range(0x000, 0x400 - 4),
2186         regmap_reg_range(0x700, 0x800 - 4),
2187 };
2188
2189 /* shared with X1500 */
2190 static const struct regmap_access_table x1000_access_table = {
2191         .yes_ranges = x1000_access_ranges,
2192         .n_yes_ranges = ARRAY_SIZE(x1000_access_ranges),
2193 };
2194
2195 static const struct ingenic_chip_info x1000_chip_info = {
2196         .num_chips = 4,
2197         .reg_offset = 0x100,
2198         .version = ID_X1000,
2199         .groups = x1000_groups,
2200         .num_groups = ARRAY_SIZE(x1000_groups),
2201         .functions = x1000_functions,
2202         .num_functions = ARRAY_SIZE(x1000_functions),
2203         .pull_ups = x1000_pull_ups,
2204         .pull_downs = x1000_pull_downs,
2205         .access_table = &x1000_access_table,
2206 };
2207
2208 static int x1500_uart0_data_pins[] = { 0x4a, 0x4b, };
2209 static int x1500_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
2210 static int x1500_uart1_data_a_pins[] = { 0x04, 0x05, };
2211 static int x1500_uart1_data_d_pins[] = { 0x62, 0x63, };
2212 static int x1500_uart1_hwflow_pins[] = { 0x64, 0x65, };
2213 static int x1500_uart2_data_a_pins[] = { 0x02, 0x03, };
2214 static int x1500_uart2_data_d_pins[] = { 0x65, 0x64, };
2215 static int x1500_mmc_1bit_pins[] = { 0x18, 0x19, 0x17, };
2216 static int x1500_mmc_4bit_pins[] = { 0x16, 0x15, 0x14, };
2217 static int x1500_i2c0_pins[] = { 0x38, 0x37, };
2218 static int x1500_i2c1_a_pins[] = { 0x01, 0x00, };
2219 static int x1500_i2c1_c_pins[] = { 0x5b, 0x5a, };
2220 static int x1500_i2c2_pins[] = { 0x61, 0x60, };
2221 static int x1500_i2s_data_tx_pins[] = { 0x24, };
2222 static int x1500_i2s_data_rx_pins[] = { 0x23, };
2223 static int x1500_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
2224 static int x1500_i2s_sysclk_pins[] = { 0x20, };
2225 static int x1500_dmic_if0_pins[] = { 0x35, 0x36, };
2226 static int x1500_dmic_if1_pins[] = { 0x25, };
2227 static int x1500_cim_pins[] = {
2228         0x08, 0x09, 0x0a, 0x0b,
2229         0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
2230 };
2231 static int x1500_pwm_pwm0_pins[] = { 0x59, };
2232 static int x1500_pwm_pwm1_pins[] = { 0x5a, };
2233 static int x1500_pwm_pwm2_pins[] = { 0x5b, };
2234 static int x1500_pwm_pwm3_pins[] = { 0x26, };
2235 static int x1500_pwm_pwm4_pins[] = { 0x58, };
2236
2237 static const struct group_desc x1500_groups[] = {
2238         INGENIC_PIN_GROUP("uart0-data", x1500_uart0_data, 0),
2239         INGENIC_PIN_GROUP("uart0-hwflow", x1500_uart0_hwflow, 0),
2240         INGENIC_PIN_GROUP("uart1-data-a", x1500_uart1_data_a, 2),
2241         INGENIC_PIN_GROUP("uart1-data-d", x1500_uart1_data_d, 1),
2242         INGENIC_PIN_GROUP("uart1-hwflow", x1500_uart1_hwflow, 1),
2243         INGENIC_PIN_GROUP("uart2-data-a", x1500_uart2_data_a, 2),
2244         INGENIC_PIN_GROUP("uart2-data-d", x1500_uart2_data_d, 0),
2245         INGENIC_PIN_GROUP("sfc-data", x1000_sfc_data, 1),
2246         INGENIC_PIN_GROUP("sfc-clk", x1000_sfc_clk, 1),
2247         INGENIC_PIN_GROUP("sfc-ce", x1000_sfc_ce, 1),
2248         INGENIC_PIN_GROUP("mmc-1bit", x1500_mmc_1bit, 1),
2249         INGENIC_PIN_GROUP("mmc-4bit", x1500_mmc_4bit, 1),
2250         INGENIC_PIN_GROUP("i2c0-data", x1500_i2c0, 0),
2251         INGENIC_PIN_GROUP("i2c1-data-a", x1500_i2c1_a, 2),
2252         INGENIC_PIN_GROUP("i2c1-data-c", x1500_i2c1_c, 0),
2253         INGENIC_PIN_GROUP("i2c2-data", x1500_i2c2, 1),
2254         INGENIC_PIN_GROUP("i2s-data-tx", x1500_i2s_data_tx, 1),
2255         INGENIC_PIN_GROUP("i2s-data-rx", x1500_i2s_data_rx, 1),
2256         INGENIC_PIN_GROUP("i2s-clk-txrx", x1500_i2s_clk_txrx, 1),
2257         INGENIC_PIN_GROUP("i2s-sysclk", x1500_i2s_sysclk, 1),
2258         INGENIC_PIN_GROUP("dmic-if0", x1500_dmic_if0, 0),
2259         INGENIC_PIN_GROUP("dmic-if1", x1500_dmic_if1, 1),
2260         INGENIC_PIN_GROUP("cim-data", x1500_cim, 2),
2261         INGENIC_PIN_GROUP("pwm0", x1500_pwm_pwm0, 0),
2262         INGENIC_PIN_GROUP("pwm1", x1500_pwm_pwm1, 1),
2263         INGENIC_PIN_GROUP("pwm2", x1500_pwm_pwm2, 1),
2264         INGENIC_PIN_GROUP("pwm3", x1500_pwm_pwm3, 2),
2265         INGENIC_PIN_GROUP("pwm4", x1500_pwm_pwm4, 0),
2266 };
2267
2268 static const char *x1500_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2269 static const char *x1500_uart1_groups[] = {
2270         "uart1-data-a", "uart1-data-d", "uart1-hwflow",
2271 };
2272 static const char *x1500_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
2273 static const char *x1500_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
2274 static const char *x1500_i2c0_groups[] = { "i2c0-data", };
2275 static const char *x1500_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
2276 static const char *x1500_i2c2_groups[] = { "i2c2-data", };
2277 static const char *x1500_i2s_groups[] = {
2278         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
2279 };
2280 static const char *x1500_dmic_groups[] = { "dmic-if0", "dmic-if1", };
2281 static const char *x1500_cim_groups[] = { "cim-data", };
2282 static const char *x1500_pwm0_groups[] = { "pwm0", };
2283 static const char *x1500_pwm1_groups[] = { "pwm1", };
2284 static const char *x1500_pwm2_groups[] = { "pwm2", };
2285 static const char *x1500_pwm3_groups[] = { "pwm3", };
2286 static const char *x1500_pwm4_groups[] = { "pwm4", };
2287
2288 static const struct function_desc x1500_functions[] = {
2289         { "uart0", x1500_uart0_groups, ARRAY_SIZE(x1500_uart0_groups), },
2290         { "uart1", x1500_uart1_groups, ARRAY_SIZE(x1500_uart1_groups), },
2291         { "uart2", x1500_uart2_groups, ARRAY_SIZE(x1500_uart2_groups), },
2292         { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
2293         { "mmc", x1500_mmc_groups, ARRAY_SIZE(x1500_mmc_groups), },
2294         { "i2c0", x1500_i2c0_groups, ARRAY_SIZE(x1500_i2c0_groups), },
2295         { "i2c1", x1500_i2c1_groups, ARRAY_SIZE(x1500_i2c1_groups), },
2296         { "i2c2", x1500_i2c2_groups, ARRAY_SIZE(x1500_i2c2_groups), },
2297         { "i2s", x1500_i2s_groups, ARRAY_SIZE(x1500_i2s_groups), },
2298         { "dmic", x1500_dmic_groups, ARRAY_SIZE(x1500_dmic_groups), },
2299         { "cim", x1500_cim_groups, ARRAY_SIZE(x1500_cim_groups), },
2300         { "pwm0", x1500_pwm0_groups, ARRAY_SIZE(x1500_pwm0_groups), },
2301         { "pwm1", x1500_pwm1_groups, ARRAY_SIZE(x1500_pwm1_groups), },
2302         { "pwm2", x1500_pwm2_groups, ARRAY_SIZE(x1500_pwm2_groups), },
2303         { "pwm3", x1500_pwm3_groups, ARRAY_SIZE(x1500_pwm3_groups), },
2304         { "pwm4", x1500_pwm4_groups, ARRAY_SIZE(x1500_pwm4_groups), },
2305 };
2306
2307 static const struct ingenic_chip_info x1500_chip_info = {
2308         .num_chips = 4,
2309         .reg_offset = 0x100,
2310         .version = ID_X1500,
2311         .groups = x1500_groups,
2312         .num_groups = ARRAY_SIZE(x1500_groups),
2313         .functions = x1500_functions,
2314         .num_functions = ARRAY_SIZE(x1500_functions),
2315         .pull_ups = x1000_pull_ups,
2316         .pull_downs = x1000_pull_downs,
2317         .access_table = &x1000_access_table,
2318 };
2319
2320 static const u32 x1830_pull_ups[4] = {
2321         0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
2322 };
2323
2324 static const u32 x1830_pull_downs[4] = {
2325         0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
2326 };
2327
2328 static int x1830_uart0_data_pins[] = { 0x33, 0x36, };
2329 static int x1830_uart0_hwflow_pins[] = { 0x34, 0x35, };
2330 static int x1830_uart1_data_pins[] = { 0x38, 0x37, };
2331 static int x1830_sfc_data_pins[] = { 0x17, 0x18, 0x1a, 0x19, };
2332 static int x1830_sfc_clk_pins[] = { 0x1b, };
2333 static int x1830_sfc_ce_pins[] = { 0x1c, };
2334 static int x1830_ssi0_dt_pins[] = { 0x4c, };
2335 static int x1830_ssi0_dr_pins[] = { 0x4b, };
2336 static int x1830_ssi0_clk_pins[] = { 0x4f, };
2337 static int x1830_ssi0_gpc_pins[] = { 0x4d, };
2338 static int x1830_ssi0_ce0_pins[] = { 0x50, };
2339 static int x1830_ssi0_ce1_pins[] = { 0x4e, };
2340 static int x1830_ssi1_dt_c_pins[] = { 0x53, };
2341 static int x1830_ssi1_dt_d_pins[] = { 0x62, };
2342 static int x1830_ssi1_dr_c_pins[] = { 0x54, };
2343 static int x1830_ssi1_dr_d_pins[] = { 0x63, };
2344 static int x1830_ssi1_clk_c_pins[] = { 0x57, };
2345 static int x1830_ssi1_clk_d_pins[] = { 0x66, };
2346 static int x1830_ssi1_gpc_c_pins[] = { 0x55, };
2347 static int x1830_ssi1_gpc_d_pins[] = { 0x64, };
2348 static int x1830_ssi1_ce0_c_pins[] = { 0x58, };
2349 static int x1830_ssi1_ce0_d_pins[] = { 0x67, };
2350 static int x1830_ssi1_ce1_c_pins[] = { 0x56, };
2351 static int x1830_ssi1_ce1_d_pins[] = { 0x65, };
2352 static int x1830_mmc0_1bit_pins[] = { 0x24, 0x25, 0x20, };
2353 static int x1830_mmc0_4bit_pins[] = { 0x21, 0x22, 0x23, };
2354 static int x1830_mmc1_1bit_pins[] = { 0x42, 0x43, 0x44, };
2355 static int x1830_mmc1_4bit_pins[] = { 0x45, 0x46, 0x47, };
2356 static int x1830_i2c0_pins[] = { 0x0c, 0x0d, };
2357 static int x1830_i2c1_pins[] = { 0x39, 0x3a, };
2358 static int x1830_i2c2_pins[] = { 0x5b, 0x5c, };
2359 static int x1830_i2s_data_tx_pins[] = { 0x53, };
2360 static int x1830_i2s_data_rx_pins[] = { 0x54, };
2361 static int x1830_i2s_clk_txrx_pins[] = { 0x58, 0x52, };
2362 static int x1830_i2s_clk_rx_pins[] = { 0x56, 0x55, };
2363 static int x1830_i2s_sysclk_pins[] = { 0x57, };
2364 static int x1830_dmic_if0_pins[] = { 0x48, 0x59, };
2365 static int x1830_dmic_if1_pins[] = { 0x5a, };
2366 static int x1830_lcd_tft_8bit_pins[] = {
2367         0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
2368         0x68, 0x73, 0x72, 0x69,
2369 };
2370 static int x1830_lcd_tft_24bit_pins[] = {
2371         0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71,
2372         0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b,
2373 };
2374 static int x1830_lcd_slcd_8bit_pins[] = {
2375         0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d,
2376         0x69, 0x72, 0x73, 0x7b, 0x7a,
2377 };
2378 static int x1830_lcd_slcd_16bit_pins[] = {
2379         0x6e, 0x6f, 0x70, 0x71, 0x76, 0x77, 0x78, 0x79,
2380 };
2381 static int x1830_pwm_pwm0_b_pins[] = { 0x31, };
2382 static int x1830_pwm_pwm0_c_pins[] = { 0x4b, };
2383 static int x1830_pwm_pwm1_b_pins[] = { 0x32, };
2384 static int x1830_pwm_pwm1_c_pins[] = { 0x4c, };
2385 static int x1830_pwm_pwm2_c_8_pins[] = { 0x48, };
2386 static int x1830_pwm_pwm2_c_13_pins[] = { 0x4d, };
2387 static int x1830_pwm_pwm3_c_9_pins[] = { 0x49, };
2388 static int x1830_pwm_pwm3_c_14_pins[] = { 0x4e, };
2389 static int x1830_pwm_pwm4_c_15_pins[] = { 0x4f, };
2390 static int x1830_pwm_pwm4_c_25_pins[] = { 0x59, };
2391 static int x1830_pwm_pwm5_c_16_pins[] = { 0x50, };
2392 static int x1830_pwm_pwm5_c_26_pins[] = { 0x5a, };
2393 static int x1830_pwm_pwm6_c_17_pins[] = { 0x51, };
2394 static int x1830_pwm_pwm6_c_27_pins[] = { 0x5b, };
2395 static int x1830_pwm_pwm7_c_18_pins[] = { 0x52, };
2396 static int x1830_pwm_pwm7_c_28_pins[] = { 0x5c, };
2397 static int x1830_mac_pins[] = {
2398         0x29, 0x30, 0x2f, 0x28, 0x2e, 0x2d, 0x2a, 0x2b, 0x26, 0x27,
2399 };
2400
2401 static const struct group_desc x1830_groups[] = {
2402         INGENIC_PIN_GROUP("uart0-data", x1830_uart0_data, 0),
2403         INGENIC_PIN_GROUP("uart0-hwflow", x1830_uart0_hwflow, 0),
2404         INGENIC_PIN_GROUP("uart1-data", x1830_uart1_data, 0),
2405         INGENIC_PIN_GROUP("sfc-data", x1830_sfc_data, 1),
2406         INGENIC_PIN_GROUP("sfc-clk", x1830_sfc_clk, 1),
2407         INGENIC_PIN_GROUP("sfc-ce", x1830_sfc_ce, 1),
2408         INGENIC_PIN_GROUP("ssi0-dt", x1830_ssi0_dt, 0),
2409         INGENIC_PIN_GROUP("ssi0-dr", x1830_ssi0_dr, 0),
2410         INGENIC_PIN_GROUP("ssi0-clk", x1830_ssi0_clk, 0),
2411         INGENIC_PIN_GROUP("ssi0-gpc", x1830_ssi0_gpc, 0),
2412         INGENIC_PIN_GROUP("ssi0-ce0", x1830_ssi0_ce0, 0),
2413         INGENIC_PIN_GROUP("ssi0-ce1", x1830_ssi0_ce1, 0),
2414         INGENIC_PIN_GROUP("ssi1-dt-c", x1830_ssi1_dt_c, 1),
2415         INGENIC_PIN_GROUP("ssi1-dr-c", x1830_ssi1_dr_c, 1),
2416         INGENIC_PIN_GROUP("ssi1-clk-c", x1830_ssi1_clk_c, 1),
2417         INGENIC_PIN_GROUP("ssi1-gpc-c", x1830_ssi1_gpc_c, 1),
2418         INGENIC_PIN_GROUP("ssi1-ce0-c", x1830_ssi1_ce0_c, 1),
2419         INGENIC_PIN_GROUP("ssi1-ce1-c", x1830_ssi1_ce1_c, 1),
2420         INGENIC_PIN_GROUP("ssi1-dt-d", x1830_ssi1_dt_d, 2),
2421         INGENIC_PIN_GROUP("ssi1-dr-d", x1830_ssi1_dr_d, 2),
2422         INGENIC_PIN_GROUP("ssi1-clk-d", x1830_ssi1_clk_d, 2),
2423         INGENIC_PIN_GROUP("ssi1-gpc-d", x1830_ssi1_gpc_d, 2),
2424         INGENIC_PIN_GROUP("ssi1-ce0-d", x1830_ssi1_ce0_d, 2),
2425         INGENIC_PIN_GROUP("ssi1-ce1-d", x1830_ssi1_ce1_d, 2),
2426         INGENIC_PIN_GROUP("mmc0-1bit", x1830_mmc0_1bit, 0),
2427         INGENIC_PIN_GROUP("mmc0-4bit", x1830_mmc0_4bit, 0),
2428         INGENIC_PIN_GROUP("mmc1-1bit", x1830_mmc1_1bit, 0),
2429         INGENIC_PIN_GROUP("mmc1-4bit", x1830_mmc1_4bit, 0),
2430         INGENIC_PIN_GROUP("i2c0-data", x1830_i2c0, 1),
2431         INGENIC_PIN_GROUP("i2c1-data", x1830_i2c1, 0),
2432         INGENIC_PIN_GROUP("i2c2-data", x1830_i2c2, 1),
2433         INGENIC_PIN_GROUP("i2s-data-tx", x1830_i2s_data_tx, 0),
2434         INGENIC_PIN_GROUP("i2s-data-rx", x1830_i2s_data_rx, 0),
2435         INGENIC_PIN_GROUP("i2s-clk-txrx", x1830_i2s_clk_txrx, 0),
2436         INGENIC_PIN_GROUP("i2s-clk-rx", x1830_i2s_clk_rx, 0),
2437         INGENIC_PIN_GROUP("i2s-sysclk", x1830_i2s_sysclk, 0),
2438         INGENIC_PIN_GROUP("dmic-if0", x1830_dmic_if0, 2),
2439         INGENIC_PIN_GROUP("dmic-if1", x1830_dmic_if1, 2),
2440         INGENIC_PIN_GROUP("lcd-tft-8bit", x1830_lcd_tft_8bit, 0),
2441         INGENIC_PIN_GROUP("lcd-tft-24bit", x1830_lcd_tft_24bit, 0),
2442         INGENIC_PIN_GROUP("lcd-slcd-8bit", x1830_lcd_slcd_8bit, 1),
2443         INGENIC_PIN_GROUP("lcd-slcd-16bit", x1830_lcd_slcd_16bit, 1),
2444         INGENIC_PIN_GROUP("pwm0-b", x1830_pwm_pwm0_b, 0),
2445         INGENIC_PIN_GROUP("pwm0-c", x1830_pwm_pwm0_c, 1),
2446         INGENIC_PIN_GROUP("pwm1-b", x1830_pwm_pwm1_b, 0),
2447         INGENIC_PIN_GROUP("pwm1-c", x1830_pwm_pwm1_c, 1),
2448         INGENIC_PIN_GROUP("pwm2-c-8", x1830_pwm_pwm2_c_8, 0),
2449         INGENIC_PIN_GROUP("pwm2-c-13", x1830_pwm_pwm2_c_13, 1),
2450         INGENIC_PIN_GROUP("pwm3-c-9", x1830_pwm_pwm3_c_9, 0),
2451         INGENIC_PIN_GROUP("pwm3-c-14", x1830_pwm_pwm3_c_14, 1),
2452         INGENIC_PIN_GROUP("pwm4-c-15", x1830_pwm_pwm4_c_15, 1),
2453         INGENIC_PIN_GROUP("pwm4-c-25", x1830_pwm_pwm4_c_25, 0),
2454         INGENIC_PIN_GROUP("pwm5-c-16", x1830_pwm_pwm5_c_16, 1),
2455         INGENIC_PIN_GROUP("pwm5-c-26", x1830_pwm_pwm5_c_26, 0),
2456         INGENIC_PIN_GROUP("pwm6-c-17", x1830_pwm_pwm6_c_17, 1),
2457         INGENIC_PIN_GROUP("pwm6-c-27", x1830_pwm_pwm6_c_27, 0),
2458         INGENIC_PIN_GROUP("pwm7-c-18", x1830_pwm_pwm7_c_18, 1),
2459         INGENIC_PIN_GROUP("pwm7-c-28", x1830_pwm_pwm7_c_28, 0),
2460         INGENIC_PIN_GROUP("mac", x1830_mac, 0),
2461 };
2462
2463 static const char *x1830_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2464 static const char *x1830_uart1_groups[] = { "uart1-data", };
2465 static const char *x1830_sfc_groups[] = { "sfc-data", "sfc-clk", "sfc-ce", };
2466 static const char *x1830_ssi0_groups[] = {
2467         "ssi0-dt", "ssi0-dr", "ssi0-clk", "ssi0-gpc", "ssi0-ce0", "ssi0-ce1",
2468 };
2469 static const char *x1830_ssi1_groups[] = {
2470         "ssi1-dt-c", "ssi1-dt-d",
2471         "ssi1-dr-c", "ssi1-dr-d",
2472         "ssi1-clk-c", "ssi1-clk-d",
2473         "ssi1-gpc-c", "ssi1-gpc-d",
2474         "ssi1-ce0-c", "ssi1-ce0-d",
2475         "ssi1-ce1-c", "ssi1-ce1-d",
2476 };
2477 static const char *x1830_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
2478 static const char *x1830_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
2479 static const char *x1830_i2c0_groups[] = { "i2c0-data", };
2480 static const char *x1830_i2c1_groups[] = { "i2c1-data", };
2481 static const char *x1830_i2c2_groups[] = { "i2c2-data", };
2482 static const char *x1830_i2s_groups[] = {
2483         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
2484 };
2485 static const char *x1830_dmic_groups[] = { "dmic-if0", "dmic-if1", };
2486 static const char *x1830_lcd_groups[] = {
2487         "lcd-tft-8bit", "lcd-tft-24bit", "lcd-slcd-8bit", "lcd-slcd-16bit",
2488 };
2489 static const char *x1830_pwm0_groups[] = { "pwm0-b", "pwm0-c", };
2490 static const char *x1830_pwm1_groups[] = { "pwm1-b", "pwm1-c", };
2491 static const char *x1830_pwm2_groups[] = { "pwm2-c-8", "pwm2-c-13", };
2492 static const char *x1830_pwm3_groups[] = { "pwm3-c-9", "pwm3-c-14", };
2493 static const char *x1830_pwm4_groups[] = { "pwm4-c-15", "pwm4-c-25", };
2494 static const char *x1830_pwm5_groups[] = { "pwm5-c-16", "pwm5-c-26", };
2495 static const char *x1830_pwm6_groups[] = { "pwm6-c-17", "pwm6-c-27", };
2496 static const char *x1830_pwm7_groups[] = { "pwm7-c-18", "pwm7-c-28", };
2497 static const char *x1830_mac_groups[] = { "mac", };
2498
2499 static const struct function_desc x1830_functions[] = {
2500         { "uart0", x1830_uart0_groups, ARRAY_SIZE(x1830_uart0_groups), },
2501         { "uart1", x1830_uart1_groups, ARRAY_SIZE(x1830_uart1_groups), },
2502         { "sfc", x1830_sfc_groups, ARRAY_SIZE(x1830_sfc_groups), },
2503         { "ssi0", x1830_ssi0_groups, ARRAY_SIZE(x1830_ssi0_groups), },
2504         { "ssi1", x1830_ssi1_groups, ARRAY_SIZE(x1830_ssi1_groups), },
2505         { "mmc0", x1830_mmc0_groups, ARRAY_SIZE(x1830_mmc0_groups), },
2506         { "mmc1", x1830_mmc1_groups, ARRAY_SIZE(x1830_mmc1_groups), },
2507         { "i2c0", x1830_i2c0_groups, ARRAY_SIZE(x1830_i2c0_groups), },
2508         { "i2c1", x1830_i2c1_groups, ARRAY_SIZE(x1830_i2c1_groups), },
2509         { "i2c2", x1830_i2c2_groups, ARRAY_SIZE(x1830_i2c2_groups), },
2510         { "i2s", x1830_i2s_groups, ARRAY_SIZE(x1830_i2s_groups), },
2511         { "dmic", x1830_dmic_groups, ARRAY_SIZE(x1830_dmic_groups), },
2512         { "lcd", x1830_lcd_groups, ARRAY_SIZE(x1830_lcd_groups), },
2513         { "pwm0", x1830_pwm0_groups, ARRAY_SIZE(x1830_pwm0_groups), },
2514         { "pwm1", x1830_pwm1_groups, ARRAY_SIZE(x1830_pwm1_groups), },
2515         { "pwm2", x1830_pwm2_groups, ARRAY_SIZE(x1830_pwm2_groups), },
2516         { "pwm3", x1830_pwm3_groups, ARRAY_SIZE(x1830_pwm3_groups), },
2517         { "pwm4", x1830_pwm4_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2518         { "pwm5", x1830_pwm5_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2519         { "pwm6", x1830_pwm6_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2520         { "pwm7", x1830_pwm7_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2521         { "mac", x1830_mac_groups, ARRAY_SIZE(x1830_mac_groups), },
2522 };
2523
2524 static const struct regmap_range x1830_access_ranges[] = {
2525         regmap_reg_range(0x0000, 0x4000 - 4),
2526         regmap_reg_range(0x7000, 0x8000 - 4),
2527 };
2528
2529 static const struct regmap_access_table x1830_access_table = {
2530         .yes_ranges = x1830_access_ranges,
2531         .n_yes_ranges = ARRAY_SIZE(x1830_access_ranges),
2532 };
2533
2534 static const struct ingenic_chip_info x1830_chip_info = {
2535         .num_chips = 4,
2536         .reg_offset = 0x1000,
2537         .version = ID_X1830,
2538         .groups = x1830_groups,
2539         .num_groups = ARRAY_SIZE(x1830_groups),
2540         .functions = x1830_functions,
2541         .num_functions = ARRAY_SIZE(x1830_functions),
2542         .pull_ups = x1830_pull_ups,
2543         .pull_downs = x1830_pull_downs,
2544         .access_table = &x1830_access_table,
2545 };
2546
2547 static const u32 x2000_pull_ups[5] = {
2548         0x0003ffff, 0xffffffff, 0x1ff0ffff, 0xc7fe3f3f, 0x8fff003f,
2549 };
2550
2551 static const u32 x2000_pull_downs[5] = {
2552         0x0003ffff, 0xffffffff, 0x1ff0ffff, 0x00000000, 0x8fff003f,
2553 };
2554
2555 static int x2000_uart0_data_pins[] = { 0x77, 0x78, };
2556 static int x2000_uart0_hwflow_pins[] = { 0x79, 0x7a, };
2557 static int x2000_uart1_data_pins[] = { 0x57, 0x58, };
2558 static int x2000_uart1_hwflow_pins[] = { 0x55, 0x56, };
2559 static int x2000_uart2_data_pins[] = { 0x7e, 0x7f, };
2560 static int x2000_uart3_data_c_pins[] = { 0x59, 0x5a, };
2561 static int x2000_uart3_data_d_pins[] = { 0x62, 0x63, };
2562 static int x2000_uart3_hwflow_c_pins[] = { 0x5b, 0x5c, };
2563 static int x2000_uart3_hwflow_d_pins[] = { 0x60, 0x61, };
2564 static int x2000_uart4_data_a_pins[] = { 0x02, 0x03, };
2565 static int x2000_uart4_data_c_pins[] = { 0x4b, 0x4c, };
2566 static int x2000_uart4_hwflow_a_pins[] = { 0x00, 0x01, };
2567 static int x2000_uart4_hwflow_c_pins[] = { 0x49, 0x4a, };
2568 static int x2000_uart5_data_a_pins[] = { 0x04, 0x05, };
2569 static int x2000_uart5_data_c_pins[] = { 0x45, 0x46, };
2570 static int x2000_uart6_data_a_pins[] = { 0x06, 0x07, };
2571 static int x2000_uart6_data_c_pins[] = { 0x47, 0x48, };
2572 static int x2000_uart7_data_a_pins[] = { 0x08, 0x09, };
2573 static int x2000_uart7_data_c_pins[] = { 0x41, 0x42, };
2574 static int x2000_uart8_data_pins[] = { 0x3c, 0x3d, };
2575 static int x2000_uart9_data_pins[] = { 0x3e, 0x3f, };
2576 static int x2000_sfc_data_if0_d_pins[] = { 0x73, 0x74, 0x75, 0x76, };
2577 static int x2000_sfc_data_if0_e_pins[] = { 0x92, 0x93, 0x94, 0x95, };
2578 static int x2000_sfc_data_if1_pins[] = { 0x77, 0x78, 0x79, 0x7a, };
2579 static int x2000_sfc_clk_d_pins[] = { 0x71, };
2580 static int x2000_sfc_clk_e_pins[] = { 0x90, };
2581 static int x2000_sfc_ce_d_pins[] = { 0x72, };
2582 static int x2000_sfc_ce_e_pins[] = { 0x91, };
2583 static int x2000_ssi0_dt_b_pins[] = { 0x3e, };
2584 static int x2000_ssi0_dt_d_pins[] = { 0x69, };
2585 static int x2000_ssi0_dr_b_pins[] = { 0x3d, };
2586 static int x2000_ssi0_dr_d_pins[] = { 0x6a, };
2587 static int x2000_ssi0_clk_b_pins[] = { 0x3f, };
2588 static int x2000_ssi0_clk_d_pins[] = { 0x68, };
2589 static int x2000_ssi0_ce_b_pins[] = { 0x3c, };
2590 static int x2000_ssi0_ce_d_pins[] = { 0x6d, };
2591 static int x2000_ssi1_dt_c_pins[] = { 0x4b, };
2592 static int x2000_ssi1_dt_d_pins[] = { 0x72, };
2593 static int x2000_ssi1_dt_e_pins[] = { 0x91, };
2594 static int x2000_ssi1_dr_c_pins[] = { 0x4a, };
2595 static int x2000_ssi1_dr_d_pins[] = { 0x73, };
2596 static int x2000_ssi1_dr_e_pins[] = { 0x92, };
2597 static int x2000_ssi1_clk_c_pins[] = { 0x4c, };
2598 static int x2000_ssi1_clk_d_pins[] = { 0x71, };
2599 static int x2000_ssi1_clk_e_pins[] = { 0x90, };
2600 static int x2000_ssi1_ce_c_pins[] = { 0x49, };
2601 static int x2000_ssi1_ce_d_pins[] = { 0x76, };
2602 static int x2000_ssi1_ce_e_pins[] = { 0x95, };
2603 static int x2000_mmc0_1bit_pins[] = { 0x71, 0x72, 0x73, };
2604 static int x2000_mmc0_4bit_pins[] = { 0x74, 0x75, 0x75, };
2605 static int x2000_mmc0_8bit_pins[] = { 0x77, 0x78, 0x79, 0x7a, };
2606 static int x2000_mmc1_1bit_pins[] = { 0x68, 0x69, 0x6a, };
2607 static int x2000_mmc1_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
2608 static int x2000_mmc2_1bit_pins[] = { 0x80, 0x81, 0x82, };
2609 static int x2000_mmc2_4bit_pins[] = { 0x83, 0x84, 0x85, };
2610 static int x2000_emc_8bit_data_pins[] = {
2611         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
2612 };
2613 static int x2000_emc_16bit_data_pins[] = {
2614         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
2615 };
2616 static int x2000_emc_addr_pins[] = {
2617         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2618         0x28, 0x29, 0x2a, 0x2b, 0x2c,
2619 };
2620 static int x2000_emc_rd_we_pins[] = { 0x2d, 0x2e, };
2621 static int x2000_emc_wait_pins[] = { 0x2f, };
2622 static int x2000_emc_cs1_pins[] = { 0x57, };
2623 static int x2000_emc_cs2_pins[] = { 0x58, };
2624 static int x2000_i2c0_pins[] = { 0x4e, 0x4d, };
2625 static int x2000_i2c1_c_pins[] = { 0x58, 0x57, };
2626 static int x2000_i2c1_d_pins[] = { 0x6c, 0x6b, };
2627 static int x2000_i2c2_b_pins[] = { 0x37, 0x36, };
2628 static int x2000_i2c2_d_pins[] = { 0x75, 0x74, };
2629 static int x2000_i2c2_e_pins[] = { 0x94, 0x93, };
2630 static int x2000_i2c3_a_pins[] = { 0x11, 0x10, };
2631 static int x2000_i2c3_d_pins[] = { 0x7f, 0x7e, };
2632 static int x2000_i2c4_c_pins[] = { 0x5a, 0x59, };
2633 static int x2000_i2c4_d_pins[] = { 0x61, 0x60, };
2634 static int x2000_i2c5_c_pins[] = { 0x5c, 0x5b, };
2635 static int x2000_i2c5_d_pins[] = { 0x65, 0x64, };
2636 static int x2000_i2s1_data_tx_pins[] = { 0x47, };
2637 static int x2000_i2s1_data_rx_pins[] = { 0x44, };
2638 static int x2000_i2s1_clk_tx_pins[] = { 0x45, 0x46, };
2639 static int x2000_i2s1_clk_rx_pins[] = { 0x42, 0x43, };
2640 static int x2000_i2s1_sysclk_tx_pins[] = { 0x48, };
2641 static int x2000_i2s1_sysclk_rx_pins[] = { 0x41, };
2642 static int x2000_i2s2_data_rx0_pins[] = { 0x0a, };
2643 static int x2000_i2s2_data_rx1_pins[] = { 0x0b, };
2644 static int x2000_i2s2_data_rx2_pins[] = { 0x0c, };
2645 static int x2000_i2s2_data_rx3_pins[] = { 0x0d, };
2646 static int x2000_i2s2_clk_rx_pins[] = { 0x11, 0x09, };
2647 static int x2000_i2s2_sysclk_rx_pins[] = { 0x07, };
2648 static int x2000_i2s3_data_tx0_pins[] = { 0x03, };
2649 static int x2000_i2s3_data_tx1_pins[] = { 0x04, };
2650 static int x2000_i2s3_data_tx2_pins[] = { 0x05, };
2651 static int x2000_i2s3_data_tx3_pins[] = { 0x06, };
2652 static int x2000_i2s3_clk_tx_pins[] = { 0x10, 0x02, };
2653 static int x2000_i2s3_sysclk_tx_pins[] = { 0x00, };
2654 static int x2000_dmic_if0_pins[] = { 0x54, 0x55, };
2655 static int x2000_dmic_if1_pins[] = { 0x56, };
2656 static int x2000_dmic_if2_pins[] = { 0x57, };
2657 static int x2000_dmic_if3_pins[] = { 0x58, };
2658 static int x2000_cim_8bit_pins[] = {
2659         0x0e, 0x0c, 0x0d, 0x4f,
2660         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2661 };
2662 static int x2000_cim_12bit_pins[] = { 0x08, 0x09, 0x0a, 0x0b, };
2663 static int x2000_lcd_tft_8bit_pins[] = {
2664         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2665         0x38, 0x3a, 0x39, 0x3b,
2666 };
2667 static int x2000_lcd_tft_16bit_pins[] = {
2668         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
2669 };
2670 static int x2000_lcd_tft_18bit_pins[] = {
2671         0x30, 0x31,
2672 };
2673 static int x2000_lcd_tft_24bit_pins[] = {
2674         0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
2675 };
2676 static int x2000_lcd_slcd_8bit_pins[] = {
2677         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2678         0x3a, 0x38, 0x3b, 0x30, 0x39,
2679 };
2680 static int x2000_pwm_pwm0_c_pins[] = { 0x40, };
2681 static int x2000_pwm_pwm0_d_pins[] = { 0x7e, };
2682 static int x2000_pwm_pwm1_c_pins[] = { 0x41, };
2683 static int x2000_pwm_pwm1_d_pins[] = { 0x7f, };
2684 static int x2000_pwm_pwm2_c_pins[] = { 0x42, };
2685 static int x2000_pwm_pwm2_e_pins[] = { 0x80, };
2686 static int x2000_pwm_pwm3_c_pins[] = { 0x43, };
2687 static int x2000_pwm_pwm3_e_pins[] = { 0x81, };
2688 static int x2000_pwm_pwm4_c_pins[] = { 0x44, };
2689 static int x2000_pwm_pwm4_e_pins[] = { 0x82, };
2690 static int x2000_pwm_pwm5_c_pins[] = { 0x45, };
2691 static int x2000_pwm_pwm5_e_pins[] = { 0x83, };
2692 static int x2000_pwm_pwm6_c_pins[] = { 0x46, };
2693 static int x2000_pwm_pwm6_e_pins[] = { 0x84, };
2694 static int x2000_pwm_pwm7_c_pins[] = { 0x47, };
2695 static int x2000_pwm_pwm7_e_pins[] = { 0x85, };
2696 static int x2000_pwm_pwm8_pins[] = { 0x48, };
2697 static int x2000_pwm_pwm9_pins[] = { 0x49, };
2698 static int x2000_pwm_pwm10_pins[] = { 0x4a, };
2699 static int x2000_pwm_pwm11_pins[] = { 0x4b, };
2700 static int x2000_pwm_pwm12_pins[] = { 0x4c, };
2701 static int x2000_pwm_pwm13_pins[] = { 0x4d, };
2702 static int x2000_pwm_pwm14_pins[] = { 0x4e, };
2703 static int x2000_pwm_pwm15_pins[] = { 0x4f, };
2704 static int x2000_mac0_rmii_pins[] = {
2705         0x4b, 0x47, 0x46, 0x4a, 0x43, 0x42, 0x4c, 0x4d, 0x4e, 0x41,
2706 };
2707 static int x2000_mac0_rgmii_pins[] = {
2708         0x4b, 0x49, 0x48, 0x47, 0x46, 0x4a, 0x45, 0x44, 0x43, 0x42,
2709         0x4c, 0x4d, 0x4f, 0x4e, 0x41,
2710 };
2711 static int x2000_mac1_rmii_pins[] = {
2712         0x32, 0x2d, 0x2c, 0x31, 0x29, 0x28, 0x33, 0x34, 0x35, 0x37,
2713 };
2714 static int x2000_mac1_rgmii_pins[] = {
2715         0x32, 0x2f, 0x2e, 0x2d, 0x2c, 0x31, 0x2b, 0x2a, 0x29, 0x28,
2716         0x33, 0x34, 0x36, 0x35, 0x37,
2717 };
2718 static int x2000_otg_pins[] = { 0x96, };
2719
2720 static u8 x2000_cim_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, };
2721
2722 static const struct group_desc x2000_groups[] = {
2723         INGENIC_PIN_GROUP("uart0-data", x2000_uart0_data, 2),
2724         INGENIC_PIN_GROUP("uart0-hwflow", x2000_uart0_hwflow, 2),
2725         INGENIC_PIN_GROUP("uart1-data", x2000_uart1_data, 1),
2726         INGENIC_PIN_GROUP("uart1-hwflow", x2000_uart1_hwflow, 1),
2727         INGENIC_PIN_GROUP("uart2-data", x2000_uart2_data, 0),
2728         INGENIC_PIN_GROUP("uart3-data-c", x2000_uart3_data_c, 0),
2729         INGENIC_PIN_GROUP("uart3-data-d", x2000_uart3_data_d, 1),
2730         INGENIC_PIN_GROUP("uart3-hwflow-c", x2000_uart3_hwflow_c, 0),
2731         INGENIC_PIN_GROUP("uart3-hwflow-d", x2000_uart3_hwflow_d, 1),
2732         INGENIC_PIN_GROUP("uart4-data-a", x2000_uart4_data_a, 1),
2733         INGENIC_PIN_GROUP("uart4-data-c", x2000_uart4_data_c, 3),
2734         INGENIC_PIN_GROUP("uart4-hwflow-a", x2000_uart4_hwflow_a, 1),
2735         INGENIC_PIN_GROUP("uart4-hwflow-c", x2000_uart4_hwflow_c, 3),
2736         INGENIC_PIN_GROUP("uart5-data-a", x2000_uart5_data_a, 1),
2737         INGENIC_PIN_GROUP("uart5-data-c", x2000_uart5_data_c, 3),
2738         INGENIC_PIN_GROUP("uart6-data-a", x2000_uart6_data_a, 1),
2739         INGENIC_PIN_GROUP("uart6-data-c", x2000_uart6_data_c, 3),
2740         INGENIC_PIN_GROUP("uart7-data-a", x2000_uart7_data_a, 1),
2741         INGENIC_PIN_GROUP("uart7-data-c", x2000_uart7_data_c, 3),
2742         INGENIC_PIN_GROUP("uart8-data", x2000_uart8_data, 3),
2743         INGENIC_PIN_GROUP("uart9-data", x2000_uart9_data, 3),
2744         INGENIC_PIN_GROUP("sfc-data-if0-d", x2000_sfc_data_if0_d, 1),
2745         INGENIC_PIN_GROUP("sfc-data-if0-e", x2000_sfc_data_if0_e, 0),
2746         INGENIC_PIN_GROUP("sfc-data-if1", x2000_sfc_data_if1, 1),
2747         INGENIC_PIN_GROUP("sfc-clk-d", x2000_sfc_clk_d, 1),
2748         INGENIC_PIN_GROUP("sfc-clk-e", x2000_sfc_clk_e, 0),
2749         INGENIC_PIN_GROUP("sfc-ce-d", x2000_sfc_ce_d, 1),
2750         INGENIC_PIN_GROUP("sfc-ce-e", x2000_sfc_ce_e, 0),
2751         INGENIC_PIN_GROUP("ssi0-dt-b", x2000_ssi0_dt_b, 1),
2752         INGENIC_PIN_GROUP("ssi0-dt-d", x2000_ssi0_dt_d, 1),
2753         INGENIC_PIN_GROUP("ssi0-dr-b", x2000_ssi0_dr_b, 1),
2754         INGENIC_PIN_GROUP("ssi0-dr-d", x2000_ssi0_dr_d, 1),
2755         INGENIC_PIN_GROUP("ssi0-clk-b", x2000_ssi0_clk_b, 1),
2756         INGENIC_PIN_GROUP("ssi0-clk-d", x2000_ssi0_clk_d, 1),
2757         INGENIC_PIN_GROUP("ssi0-ce-b", x2000_ssi0_ce_b, 1),
2758         INGENIC_PIN_GROUP("ssi0-ce-d", x2000_ssi0_ce_d, 1),
2759         INGENIC_PIN_GROUP("ssi1-dt-c", x2000_ssi1_dt_c, 2),
2760         INGENIC_PIN_GROUP("ssi1-dt-d", x2000_ssi1_dt_d, 2),
2761         INGENIC_PIN_GROUP("ssi1-dt-e", x2000_ssi1_dt_e, 1),
2762         INGENIC_PIN_GROUP("ssi1-dr-c", x2000_ssi1_dr_c, 2),
2763         INGENIC_PIN_GROUP("ssi1-dr-d", x2000_ssi1_dr_d, 2),
2764         INGENIC_PIN_GROUP("ssi1-dr-e", x2000_ssi1_dr_e, 1),
2765         INGENIC_PIN_GROUP("ssi1-clk-c", x2000_ssi1_clk_c, 2),
2766         INGENIC_PIN_GROUP("ssi1-clk-d", x2000_ssi1_clk_d, 2),
2767         INGENIC_PIN_GROUP("ssi1-clk-e", x2000_ssi1_clk_e, 1),
2768         INGENIC_PIN_GROUP("ssi1-ce-c", x2000_ssi1_ce_c, 2),
2769         INGENIC_PIN_GROUP("ssi1-ce-d", x2000_ssi1_ce_d, 2),
2770         INGENIC_PIN_GROUP("ssi1-ce-e", x2000_ssi1_ce_e, 1),
2771         INGENIC_PIN_GROUP("mmc0-1bit", x2000_mmc0_1bit, 0),
2772         INGENIC_PIN_GROUP("mmc0-4bit", x2000_mmc0_4bit, 0),
2773         INGENIC_PIN_GROUP("mmc0-8bit", x2000_mmc0_8bit, 0),
2774         INGENIC_PIN_GROUP("mmc1-1bit", x2000_mmc1_1bit, 0),
2775         INGENIC_PIN_GROUP("mmc1-4bit", x2000_mmc1_4bit, 0),
2776         INGENIC_PIN_GROUP("mmc2-1bit", x2000_mmc2_1bit, 0),
2777         INGENIC_PIN_GROUP("mmc2-4bit", x2000_mmc2_4bit, 0),
2778         INGENIC_PIN_GROUP("emc-8bit-data", x2000_emc_8bit_data, 0),
2779         INGENIC_PIN_GROUP("emc-16bit-data", x2000_emc_16bit_data, 0),
2780         INGENIC_PIN_GROUP("emc-addr", x2000_emc_addr, 0),
2781         INGENIC_PIN_GROUP("emc-rd-we", x2000_emc_rd_we, 0),
2782         INGENIC_PIN_GROUP("emc-wait", x2000_emc_wait, 0),
2783         INGENIC_PIN_GROUP("emc-cs1", x2000_emc_cs1, 3),
2784         INGENIC_PIN_GROUP("emc-cs2", x2000_emc_cs2, 3),
2785         INGENIC_PIN_GROUP("i2c0-data", x2000_i2c0, 3),
2786         INGENIC_PIN_GROUP("i2c1-data-c", x2000_i2c1_c, 2),
2787         INGENIC_PIN_GROUP("i2c1-data-d", x2000_i2c1_d, 1),
2788         INGENIC_PIN_GROUP("i2c2-data-b", x2000_i2c2_b, 2),
2789         INGENIC_PIN_GROUP("i2c2-data-d", x2000_i2c2_d, 2),
2790         INGENIC_PIN_GROUP("i2c2-data-e", x2000_i2c2_e, 1),
2791         INGENIC_PIN_GROUP("i2c3-data-a", x2000_i2c3_a, 0),
2792         INGENIC_PIN_GROUP("i2c3-data-d", x2000_i2c3_d, 1),
2793         INGENIC_PIN_GROUP("i2c4-data-c", x2000_i2c4_c, 1),
2794         INGENIC_PIN_GROUP("i2c4-data-d", x2000_i2c4_d, 2),
2795         INGENIC_PIN_GROUP("i2c5-data-c", x2000_i2c5_c, 1),
2796         INGENIC_PIN_GROUP("i2c5-data-d", x2000_i2c5_d, 1),
2797         INGENIC_PIN_GROUP("i2s1-data-tx", x2000_i2s1_data_tx, 2),
2798         INGENIC_PIN_GROUP("i2s1-data-rx", x2000_i2s1_data_rx, 2),
2799         INGENIC_PIN_GROUP("i2s1-clk-tx", x2000_i2s1_clk_tx, 2),
2800         INGENIC_PIN_GROUP("i2s1-clk-rx", x2000_i2s1_clk_rx, 2),
2801         INGENIC_PIN_GROUP("i2s1-sysclk-tx", x2000_i2s1_sysclk_tx, 2),
2802         INGENIC_PIN_GROUP("i2s1-sysclk-rx", x2000_i2s1_sysclk_rx, 2),
2803         INGENIC_PIN_GROUP("i2s2-data-rx0", x2000_i2s2_data_rx0, 2),
2804         INGENIC_PIN_GROUP("i2s2-data-rx1", x2000_i2s2_data_rx1, 2),
2805         INGENIC_PIN_GROUP("i2s2-data-rx2", x2000_i2s2_data_rx2, 2),
2806         INGENIC_PIN_GROUP("i2s2-data-rx3", x2000_i2s2_data_rx3, 2),
2807         INGENIC_PIN_GROUP("i2s2-clk-rx", x2000_i2s2_clk_rx, 2),
2808         INGENIC_PIN_GROUP("i2s2-sysclk-rx", x2000_i2s2_sysclk_rx, 2),
2809         INGENIC_PIN_GROUP("i2s3-data-tx0", x2000_i2s3_data_tx0, 2),
2810         INGENIC_PIN_GROUP("i2s3-data-tx1", x2000_i2s3_data_tx1, 2),
2811         INGENIC_PIN_GROUP("i2s3-data-tx2", x2000_i2s3_data_tx2, 2),
2812         INGENIC_PIN_GROUP("i2s3-data-tx3", x2000_i2s3_data_tx3, 2),
2813         INGENIC_PIN_GROUP("i2s3-clk-tx", x2000_i2s3_clk_tx, 2),
2814         INGENIC_PIN_GROUP("i2s3-sysclk-tx", x2000_i2s3_sysclk_tx, 2),
2815         INGENIC_PIN_GROUP("dmic-if0", x2000_dmic_if0, 0),
2816         INGENIC_PIN_GROUP("dmic-if1", x2000_dmic_if1, 0),
2817         INGENIC_PIN_GROUP("dmic-if2", x2000_dmic_if2, 0),
2818         INGENIC_PIN_GROUP("dmic-if3", x2000_dmic_if3, 0),
2819         INGENIC_PIN_GROUP_FUNCS("cim-data-8bit", x2000_cim_8bit,
2820                                 x2000_cim_8bit_funcs),
2821         INGENIC_PIN_GROUP("cim-data-12bit", x2000_cim_12bit, 0),
2822         INGENIC_PIN_GROUP("lcd-tft-8bit", x2000_lcd_tft_8bit, 1),
2823         INGENIC_PIN_GROUP("lcd-tft-16bit", x2000_lcd_tft_16bit, 1),
2824         INGENIC_PIN_GROUP("lcd-tft-18bit", x2000_lcd_tft_18bit, 1),
2825         INGENIC_PIN_GROUP("lcd-tft-24bit", x2000_lcd_tft_24bit, 1),
2826         INGENIC_PIN_GROUP("lcd-slcd-8bit", x2000_lcd_slcd_8bit, 2),
2827         INGENIC_PIN_GROUP("lcd-slcd-16bit", x2000_lcd_tft_16bit, 2),
2828         INGENIC_PIN_GROUP("pwm0-c", x2000_pwm_pwm0_c, 0),
2829         INGENIC_PIN_GROUP("pwm0-d", x2000_pwm_pwm0_d, 2),
2830         INGENIC_PIN_GROUP("pwm1-c", x2000_pwm_pwm1_c, 0),
2831         INGENIC_PIN_GROUP("pwm1-d", x2000_pwm_pwm1_d, 2),
2832         INGENIC_PIN_GROUP("pwm2-c", x2000_pwm_pwm2_c, 0),
2833         INGENIC_PIN_GROUP("pwm2-e", x2000_pwm_pwm2_e, 1),
2834         INGENIC_PIN_GROUP("pwm3-c", x2000_pwm_pwm3_c, 0),
2835         INGENIC_PIN_GROUP("pwm3-e", x2000_pwm_pwm3_e, 1),
2836         INGENIC_PIN_GROUP("pwm4-c", x2000_pwm_pwm4_c, 0),
2837         INGENIC_PIN_GROUP("pwm4-e", x2000_pwm_pwm4_e, 1),
2838         INGENIC_PIN_GROUP("pwm5-c", x2000_pwm_pwm5_c, 0),
2839         INGENIC_PIN_GROUP("pwm5-e", x2000_pwm_pwm5_e, 1),
2840         INGENIC_PIN_GROUP("pwm6-c", x2000_pwm_pwm6_c, 0),
2841         INGENIC_PIN_GROUP("pwm6-e", x2000_pwm_pwm6_e, 1),
2842         INGENIC_PIN_GROUP("pwm7-c", x2000_pwm_pwm7_c, 0),
2843         INGENIC_PIN_GROUP("pwm7-e", x2000_pwm_pwm7_e, 1),
2844         INGENIC_PIN_GROUP("pwm8", x2000_pwm_pwm8, 0),
2845         INGENIC_PIN_GROUP("pwm9", x2000_pwm_pwm9, 0),
2846         INGENIC_PIN_GROUP("pwm10", x2000_pwm_pwm10, 0),
2847         INGENIC_PIN_GROUP("pwm11", x2000_pwm_pwm11, 0),
2848         INGENIC_PIN_GROUP("pwm12", x2000_pwm_pwm12, 0),
2849         INGENIC_PIN_GROUP("pwm13", x2000_pwm_pwm13, 0),
2850         INGENIC_PIN_GROUP("pwm14", x2000_pwm_pwm14, 0),
2851         INGENIC_PIN_GROUP("pwm15", x2000_pwm_pwm15, 0),
2852         INGENIC_PIN_GROUP("mac0-rmii", x2000_mac0_rmii, 1),
2853         INGENIC_PIN_GROUP("mac0-rgmii", x2000_mac0_rgmii, 1),
2854         INGENIC_PIN_GROUP("mac1-rmii", x2000_mac1_rmii, 3),
2855         INGENIC_PIN_GROUP("mac1-rgmii", x2000_mac1_rgmii, 3),
2856         INGENIC_PIN_GROUP("otg-vbus", x2000_otg, 0),
2857 };
2858
2859 static const char *x2000_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2860 static const char *x2000_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
2861 static const char *x2000_uart2_groups[] = { "uart2-data", };
2862 static const char *x2000_uart3_groups[] = {
2863         "uart3-data-c", "uart3-data-d", "uart3-hwflow-c", "uart3-hwflow-d",
2864 };
2865 static const char *x2000_uart4_groups[] = {
2866         "uart4-data-a", "uart4-data-c", "uart4-hwflow-a", "uart4-hwflow-c",
2867 };
2868 static const char *x2000_uart5_groups[] = { "uart5-data-a", "uart5-data-c", };
2869 static const char *x2000_uart6_groups[] = { "uart6-data-a", "uart6-data-c", };
2870 static const char *x2000_uart7_groups[] = { "uart7-data-a", "uart7-data-c", };
2871 static const char *x2000_uart8_groups[] = { "uart8-data", };
2872 static const char *x2000_uart9_groups[] = { "uart9-data", };
2873 static const char *x2000_sfc_groups[] = {
2874         "sfc-data-if0-d", "sfc-data-if0-e", "sfc-data-if1",
2875         "sfc-clk-d", "sfc-clk-e", "sfc-ce-d", "sfc-ce-e",
2876 };
2877 static const char *x2000_ssi0_groups[] = {
2878         "ssi0-dt-b", "ssi0-dt-d",
2879         "ssi0-dr-b", "ssi0-dr-d",
2880         "ssi0-clk-b", "ssi0-clk-d",
2881         "ssi0-ce-b", "ssi0-ce-d",
2882 };
2883 static const char *x2000_ssi1_groups[] = {
2884         "ssi1-dt-c", "ssi1-dt-d", "ssi1-dt-e",
2885         "ssi1-dr-c", "ssi1-dr-d", "ssi1-dr-e",
2886         "ssi1-clk-c", "ssi1-clk-d", "ssi1-clk-e",
2887         "ssi1-ce-c", "ssi1-ce-d", "ssi1-ce-e",
2888 };
2889 static const char *x2000_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", "mmc0-8bit", };
2890 static const char *x2000_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
2891 static const char *x2000_mmc2_groups[] = { "mmc2-1bit", "mmc2-4bit", };
2892 static const char *x2000_emc_groups[] = {
2893         "emc-8bit-data", "emc-16bit-data",
2894         "emc-addr", "emc-rd-we", "emc-wait",
2895 };
2896 static const char *x2000_cs1_groups[] = { "emc-cs1", };
2897 static const char *x2000_cs2_groups[] = { "emc-cs2", };
2898 static const char *x2000_i2c0_groups[] = { "i2c0-data", };
2899 static const char *x2000_i2c1_groups[] = { "i2c1-data-c", "i2c1-data-d", };
2900 static const char *x2000_i2c2_groups[] = { "i2c2-data-b", "i2c2-data-d", };
2901 static const char *x2000_i2c3_groups[] = { "i2c3-data-a", "i2c3-data-d", };
2902 static const char *x2000_i2c4_groups[] = { "i2c4-data-c", "i2c4-data-d", };
2903 static const char *x2000_i2c5_groups[] = { "i2c5-data-c", "i2c5-data-d", };
2904 static const char *x2000_i2s1_groups[] = {
2905         "i2s1-data-tx", "i2s1-data-rx",
2906         "i2s1-clk-tx", "i2s1-clk-rx",
2907         "i2s1-sysclk-tx", "i2s1-sysclk-rx",
2908 };
2909 static const char *x2000_i2s2_groups[] = {
2910         "i2s2-data-rx0", "i2s2-data-rx1", "i2s2-data-rx2", "i2s2-data-rx3",
2911         "i2s2-clk-rx", "i2s2-sysclk-rx",
2912 };
2913 static const char *x2000_i2s3_groups[] = {
2914         "i2s3-data-tx0", "i2s3-data-tx1", "i2s3-data-tx2", "i2s3-data-tx3",
2915         "i2s3-clk-tx", "i2s3-sysclk-tx",
2916 };
2917 static const char *x2000_dmic_groups[] = {
2918         "dmic-if0", "dmic-if1", "dmic-if2", "dmic-if3",
2919 };
2920 static const char *x2000_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
2921 static const char *x2000_lcd_groups[] = {
2922         "lcd-tft-8bit", "lcd-tft-16bit", "lcd-tft-18bit", "lcd-tft-24bit",
2923         "lcd-slcd-8bit", "lcd-slcd-16bit",
2924 };
2925 static const char *x2000_pwm0_groups[] = { "pwm0-c", "pwm0-d", };
2926 static const char *x2000_pwm1_groups[] = { "pwm1-c", "pwm1-d", };
2927 static const char *x2000_pwm2_groups[] = { "pwm2-c", "pwm2-e", };
2928 static const char *x2000_pwm3_groups[] = { "pwm3-c", "pwm3-r", };
2929 static const char *x2000_pwm4_groups[] = { "pwm4-c", "pwm4-e", };
2930 static const char *x2000_pwm5_groups[] = { "pwm5-c", "pwm5-e", };
2931 static const char *x2000_pwm6_groups[] = { "pwm6-c", "pwm6-e", };
2932 static const char *x2000_pwm7_groups[] = { "pwm7-c", "pwm7-e", };
2933 static const char *x2000_pwm8_groups[] = { "pwm8", };
2934 static const char *x2000_pwm9_groups[] = { "pwm9", };
2935 static const char *x2000_pwm10_groups[] = { "pwm10", };
2936 static const char *x2000_pwm11_groups[] = { "pwm11", };
2937 static const char *x2000_pwm12_groups[] = { "pwm12", };
2938 static const char *x2000_pwm13_groups[] = { "pwm13", };
2939 static const char *x2000_pwm14_groups[] = { "pwm14", };
2940 static const char *x2000_pwm15_groups[] = { "pwm15", };
2941 static const char *x2000_mac0_groups[] = { "mac0-rmii", "mac0-rgmii", };
2942 static const char *x2000_mac1_groups[] = { "mac1-rmii", "mac1-rgmii", };
2943 static const char *x2000_otg_groups[] = { "otg-vbus", };
2944
2945 static const struct function_desc x2000_functions[] = {
2946         { "uart0", x2000_uart0_groups, ARRAY_SIZE(x2000_uart0_groups), },
2947         { "uart1", x2000_uart1_groups, ARRAY_SIZE(x2000_uart1_groups), },
2948         { "uart2", x2000_uart2_groups, ARRAY_SIZE(x2000_uart2_groups), },
2949         { "uart3", x2000_uart3_groups, ARRAY_SIZE(x2000_uart3_groups), },
2950         { "uart4", x2000_uart4_groups, ARRAY_SIZE(x2000_uart4_groups), },
2951         { "uart5", x2000_uart5_groups, ARRAY_SIZE(x2000_uart5_groups), },
2952         { "uart6", x2000_uart6_groups, ARRAY_SIZE(x2000_uart6_groups), },
2953         { "uart7", x2000_uart7_groups, ARRAY_SIZE(x2000_uart7_groups), },
2954         { "uart8", x2000_uart8_groups, ARRAY_SIZE(x2000_uart8_groups), },
2955         { "uart9", x2000_uart9_groups, ARRAY_SIZE(x2000_uart9_groups), },
2956         { "sfc", x2000_sfc_groups, ARRAY_SIZE(x2000_sfc_groups), },
2957         { "ssi0", x2000_ssi0_groups, ARRAY_SIZE(x2000_ssi0_groups), },
2958         { "ssi1", x2000_ssi1_groups, ARRAY_SIZE(x2000_ssi1_groups), },
2959         { "mmc0", x2000_mmc0_groups, ARRAY_SIZE(x2000_mmc0_groups), },
2960         { "mmc1", x2000_mmc1_groups, ARRAY_SIZE(x2000_mmc1_groups), },
2961         { "mmc2", x2000_mmc2_groups, ARRAY_SIZE(x2000_mmc2_groups), },
2962         { "emc", x2000_emc_groups, ARRAY_SIZE(x2000_emc_groups), },
2963         { "emc-cs1", x2000_cs1_groups, ARRAY_SIZE(x2000_cs1_groups), },
2964         { "emc-cs2", x2000_cs2_groups, ARRAY_SIZE(x2000_cs2_groups), },
2965         { "i2c0", x2000_i2c0_groups, ARRAY_SIZE(x2000_i2c0_groups), },
2966         { "i2c1", x2000_i2c1_groups, ARRAY_SIZE(x2000_i2c1_groups), },
2967         { "i2c2", x2000_i2c2_groups, ARRAY_SIZE(x2000_i2c2_groups), },
2968         { "i2c3", x2000_i2c3_groups, ARRAY_SIZE(x2000_i2c3_groups), },
2969         { "i2c4", x2000_i2c4_groups, ARRAY_SIZE(x2000_i2c4_groups), },
2970         { "i2c5", x2000_i2c5_groups, ARRAY_SIZE(x2000_i2c5_groups), },
2971         { "i2s1", x2000_i2s1_groups, ARRAY_SIZE(x2000_i2s1_groups), },
2972         { "i2s2", x2000_i2s2_groups, ARRAY_SIZE(x2000_i2s2_groups), },
2973         { "i2s3", x2000_i2s3_groups, ARRAY_SIZE(x2000_i2s3_groups), },
2974         { "dmic", x2000_dmic_groups, ARRAY_SIZE(x2000_dmic_groups), },
2975         { "cim", x2000_cim_groups, ARRAY_SIZE(x2000_cim_groups), },
2976         { "lcd", x2000_lcd_groups, ARRAY_SIZE(x2000_lcd_groups), },
2977         { "pwm0", x2000_pwm0_groups, ARRAY_SIZE(x2000_pwm0_groups), },
2978         { "pwm1", x2000_pwm1_groups, ARRAY_SIZE(x2000_pwm1_groups), },
2979         { "pwm2", x2000_pwm2_groups, ARRAY_SIZE(x2000_pwm2_groups), },
2980         { "pwm3", x2000_pwm3_groups, ARRAY_SIZE(x2000_pwm3_groups), },
2981         { "pwm4", x2000_pwm4_groups, ARRAY_SIZE(x2000_pwm4_groups), },
2982         { "pwm5", x2000_pwm5_groups, ARRAY_SIZE(x2000_pwm5_groups), },
2983         { "pwm6", x2000_pwm6_groups, ARRAY_SIZE(x2000_pwm6_groups), },
2984         { "pwm7", x2000_pwm7_groups, ARRAY_SIZE(x2000_pwm7_groups), },
2985         { "pwm8", x2000_pwm8_groups, ARRAY_SIZE(x2000_pwm8_groups), },
2986         { "pwm9", x2000_pwm9_groups, ARRAY_SIZE(x2000_pwm9_groups), },
2987         { "pwm10", x2000_pwm10_groups, ARRAY_SIZE(x2000_pwm10_groups), },
2988         { "pwm11", x2000_pwm11_groups, ARRAY_SIZE(x2000_pwm11_groups), },
2989         { "pwm12", x2000_pwm12_groups, ARRAY_SIZE(x2000_pwm12_groups), },
2990         { "pwm13", x2000_pwm13_groups, ARRAY_SIZE(x2000_pwm13_groups), },
2991         { "pwm14", x2000_pwm14_groups, ARRAY_SIZE(x2000_pwm14_groups), },
2992         { "pwm15", x2000_pwm15_groups, ARRAY_SIZE(x2000_pwm15_groups), },
2993         { "mac0", x2000_mac0_groups, ARRAY_SIZE(x2000_mac0_groups), },
2994         { "mac1", x2000_mac1_groups, ARRAY_SIZE(x2000_mac1_groups), },
2995         { "otg", x2000_otg_groups, ARRAY_SIZE(x2000_otg_groups), },
2996 };
2997
2998 static const struct regmap_range x2000_access_ranges[] = {
2999         regmap_reg_range(0x000, 0x500 - 4),
3000         regmap_reg_range(0x700, 0x800 - 4),
3001 };
3002
3003 /* shared with X2100 */
3004 static const struct regmap_access_table x2000_access_table = {
3005         .yes_ranges = x2000_access_ranges,
3006         .n_yes_ranges = ARRAY_SIZE(x2000_access_ranges),
3007 };
3008
3009 static const struct ingenic_chip_info x2000_chip_info = {
3010         .num_chips = 5,
3011         .reg_offset = 0x100,
3012         .version = ID_X2000,
3013         .groups = x2000_groups,
3014         .num_groups = ARRAY_SIZE(x2000_groups),
3015         .functions = x2000_functions,
3016         .num_functions = ARRAY_SIZE(x2000_functions),
3017         .pull_ups = x2000_pull_ups,
3018         .pull_downs = x2000_pull_downs,
3019         .access_table = &x2000_access_table,
3020 };
3021
3022 static const u32 x2100_pull_ups[5] = {
3023         0x0003ffff, 0xffffffff, 0x1ff0ffff, 0xc7fe3f3f, 0x0fbf003f,
3024 };
3025
3026 static const u32 x2100_pull_downs[5] = {
3027         0x0003ffff, 0xffffffff, 0x1ff0ffff, 0x00000000, 0x0fbf003f,
3028 };
3029
3030 static int x2100_mac_pins[] = {
3031         0x4b, 0x47, 0x46, 0x4a, 0x43, 0x42, 0x4c, 0x4d, 0x4f, 0x41,
3032 };
3033
3034 static const struct group_desc x2100_groups[] = {
3035         INGENIC_PIN_GROUP("uart0-data", x2000_uart0_data, 2),
3036         INGENIC_PIN_GROUP("uart0-hwflow", x2000_uart0_hwflow, 2),
3037         INGENIC_PIN_GROUP("uart1-data", x2000_uart1_data, 1),
3038         INGENIC_PIN_GROUP("uart1-hwflow", x2000_uart1_hwflow, 1),
3039         INGENIC_PIN_GROUP("uart2-data", x2000_uart2_data, 0),
3040         INGENIC_PIN_GROUP("uart3-data-c", x2000_uart3_data_c, 0),
3041         INGENIC_PIN_GROUP("uart3-data-d", x2000_uart3_data_d, 1),
3042         INGENIC_PIN_GROUP("uart3-hwflow-c", x2000_uart3_hwflow_c, 0),
3043         INGENIC_PIN_GROUP("uart3-hwflow-d", x2000_uart3_hwflow_d, 1),
3044         INGENIC_PIN_GROUP("uart4-data-a", x2000_uart4_data_a, 1),
3045         INGENIC_PIN_GROUP("uart4-data-c", x2000_uart4_data_c, 3),
3046         INGENIC_PIN_GROUP("uart4-hwflow-a", x2000_uart4_hwflow_a, 1),
3047         INGENIC_PIN_GROUP("uart4-hwflow-c", x2000_uart4_hwflow_c, 3),
3048         INGENIC_PIN_GROUP("uart5-data-a", x2000_uart5_data_a, 1),
3049         INGENIC_PIN_GROUP("uart5-data-c", x2000_uart5_data_c, 3),
3050         INGENIC_PIN_GROUP("uart6-data-a", x2000_uart6_data_a, 1),
3051         INGENIC_PIN_GROUP("uart6-data-c", x2000_uart6_data_c, 3),
3052         INGENIC_PIN_GROUP("uart7-data-a", x2000_uart7_data_a, 1),
3053         INGENIC_PIN_GROUP("uart7-data-c", x2000_uart7_data_c, 3),
3054         INGENIC_PIN_GROUP("uart8-data", x2000_uart8_data, 3),
3055         INGENIC_PIN_GROUP("uart9-data", x2000_uart9_data, 3),
3056         INGENIC_PIN_GROUP("sfc-data-if0-d", x2000_sfc_data_if0_d, 1),
3057         INGENIC_PIN_GROUP("sfc-data-if0-e", x2000_sfc_data_if0_e, 0),
3058         INGENIC_PIN_GROUP("sfc-data-if1", x2000_sfc_data_if1, 1),
3059         INGENIC_PIN_GROUP("sfc-clk-d", x2000_sfc_clk_d, 1),
3060         INGENIC_PIN_GROUP("sfc-clk-e", x2000_sfc_clk_e, 0),
3061         INGENIC_PIN_GROUP("sfc-ce-d", x2000_sfc_ce_d, 1),
3062         INGENIC_PIN_GROUP("sfc-ce-e", x2000_sfc_ce_e, 0),
3063         INGENIC_PIN_GROUP("ssi0-dt-b", x2000_ssi0_dt_b, 1),
3064         INGENIC_PIN_GROUP("ssi0-dt-d", x2000_ssi0_dt_d, 1),
3065         INGENIC_PIN_GROUP("ssi0-dr-b", x2000_ssi0_dr_b, 1),
3066         INGENIC_PIN_GROUP("ssi0-dr-d", x2000_ssi0_dr_d, 1),
3067         INGENIC_PIN_GROUP("ssi0-clk-b", x2000_ssi0_clk_b, 1),
3068         INGENIC_PIN_GROUP("ssi0-clk-d", x2000_ssi0_clk_d, 1),
3069         INGENIC_PIN_GROUP("ssi0-ce-b", x2000_ssi0_ce_b, 1),
3070         INGENIC_PIN_GROUP("ssi0-ce-d", x2000_ssi0_ce_d, 1),
3071         INGENIC_PIN_GROUP("ssi1-dt-c", x2000_ssi1_dt_c, 2),
3072         INGENIC_PIN_GROUP("ssi1-dt-d", x2000_ssi1_dt_d, 2),
3073         INGENIC_PIN_GROUP("ssi1-dt-e", x2000_ssi1_dt_e, 1),
3074         INGENIC_PIN_GROUP("ssi1-dr-c", x2000_ssi1_dr_c, 2),
3075         INGENIC_PIN_GROUP("ssi1-dr-d", x2000_ssi1_dr_d, 2),
3076         INGENIC_PIN_GROUP("ssi1-dr-e", x2000_ssi1_dr_e, 1),
3077         INGENIC_PIN_GROUP("ssi1-clk-c", x2000_ssi1_clk_c, 2),
3078         INGENIC_PIN_GROUP("ssi1-clk-d", x2000_ssi1_clk_d, 2),
3079         INGENIC_PIN_GROUP("ssi1-clk-e", x2000_ssi1_clk_e, 1),
3080         INGENIC_PIN_GROUP("ssi1-ce-c", x2000_ssi1_ce_c, 2),
3081         INGENIC_PIN_GROUP("ssi1-ce-d", x2000_ssi1_ce_d, 2),
3082         INGENIC_PIN_GROUP("ssi1-ce-e", x2000_ssi1_ce_e, 1),
3083         INGENIC_PIN_GROUP("mmc0-1bit", x2000_mmc0_1bit, 0),
3084         INGENIC_PIN_GROUP("mmc0-4bit", x2000_mmc0_4bit, 0),
3085         INGENIC_PIN_GROUP("mmc0-8bit", x2000_mmc0_8bit, 0),
3086         INGENIC_PIN_GROUP("mmc1-1bit", x2000_mmc1_1bit, 0),
3087         INGENIC_PIN_GROUP("mmc1-4bit", x2000_mmc1_4bit, 0),
3088         INGENIC_PIN_GROUP("mmc2-1bit", x2000_mmc2_1bit, 0),
3089         INGENIC_PIN_GROUP("mmc2-4bit", x2000_mmc2_4bit, 0),
3090         INGENIC_PIN_GROUP("emc-8bit-data", x2000_emc_8bit_data, 0),
3091         INGENIC_PIN_GROUP("emc-16bit-data", x2000_emc_16bit_data, 0),
3092         INGENIC_PIN_GROUP("emc-addr", x2000_emc_addr, 0),
3093         INGENIC_PIN_GROUP("emc-rd-we", x2000_emc_rd_we, 0),
3094         INGENIC_PIN_GROUP("emc-wait", x2000_emc_wait, 0),
3095         INGENIC_PIN_GROUP("emc-cs1", x2000_emc_cs1, 3),
3096         INGENIC_PIN_GROUP("emc-cs2", x2000_emc_cs2, 3),
3097         INGENIC_PIN_GROUP("i2c0-data", x2000_i2c0, 3),
3098         INGENIC_PIN_GROUP("i2c1-data-c", x2000_i2c1_c, 2),
3099         INGENIC_PIN_GROUP("i2c1-data-d", x2000_i2c1_d, 1),
3100         INGENIC_PIN_GROUP("i2c2-data-b", x2000_i2c2_b, 2),
3101         INGENIC_PIN_GROUP("i2c2-data-d", x2000_i2c2_d, 2),
3102         INGENIC_PIN_GROUP("i2c2-data-e", x2000_i2c2_e, 1),
3103         INGENIC_PIN_GROUP("i2c3-data-a", x2000_i2c3_a, 0),
3104         INGENIC_PIN_GROUP("i2c3-data-d", x2000_i2c3_d, 1),
3105         INGENIC_PIN_GROUP("i2c4-data-c", x2000_i2c4_c, 1),
3106         INGENIC_PIN_GROUP("i2c4-data-d", x2000_i2c4_d, 2),
3107         INGENIC_PIN_GROUP("i2c5-data-c", x2000_i2c5_c, 1),
3108         INGENIC_PIN_GROUP("i2c5-data-d", x2000_i2c5_d, 1),
3109         INGENIC_PIN_GROUP("i2s1-data-tx", x2000_i2s1_data_tx, 2),
3110         INGENIC_PIN_GROUP("i2s1-data-rx", x2000_i2s1_data_rx, 2),
3111         INGENIC_PIN_GROUP("i2s1-clk-tx", x2000_i2s1_clk_tx, 2),
3112         INGENIC_PIN_GROUP("i2s1-clk-rx", x2000_i2s1_clk_rx, 2),
3113         INGENIC_PIN_GROUP("i2s1-sysclk-tx", x2000_i2s1_sysclk_tx, 2),
3114         INGENIC_PIN_GROUP("i2s1-sysclk-rx", x2000_i2s1_sysclk_rx, 2),
3115         INGENIC_PIN_GROUP("i2s2-data-rx0", x2000_i2s2_data_rx0, 2),
3116         INGENIC_PIN_GROUP("i2s2-data-rx1", x2000_i2s2_data_rx1, 2),
3117         INGENIC_PIN_GROUP("i2s2-data-rx2", x2000_i2s2_data_rx2, 2),
3118         INGENIC_PIN_GROUP("i2s2-data-rx3", x2000_i2s2_data_rx3, 2),
3119         INGENIC_PIN_GROUP("i2s2-clk-rx", x2000_i2s2_clk_rx, 2),
3120         INGENIC_PIN_GROUP("i2s2-sysclk-rx", x2000_i2s2_sysclk_rx, 2),
3121         INGENIC_PIN_GROUP("i2s3-data-tx0", x2000_i2s3_data_tx0, 2),
3122         INGENIC_PIN_GROUP("i2s3-data-tx1", x2000_i2s3_data_tx1, 2),
3123         INGENIC_PIN_GROUP("i2s3-data-tx2", x2000_i2s3_data_tx2, 2),
3124         INGENIC_PIN_GROUP("i2s3-data-tx3", x2000_i2s3_data_tx3, 2),
3125         INGENIC_PIN_GROUP("i2s3-clk-tx", x2000_i2s3_clk_tx, 2),
3126         INGENIC_PIN_GROUP("i2s3-sysclk-tx", x2000_i2s3_sysclk_tx, 2),
3127         INGENIC_PIN_GROUP("dmic-if0", x2000_dmic_if0, 0),
3128         INGENIC_PIN_GROUP("dmic-if1", x2000_dmic_if1, 0),
3129         INGENIC_PIN_GROUP("dmic-if2", x2000_dmic_if2, 0),
3130         INGENIC_PIN_GROUP("dmic-if3", x2000_dmic_if3, 0),
3131         INGENIC_PIN_GROUP_FUNCS("cim-data-8bit", x2000_cim_8bit,
3132                                 x2000_cim_8bit_funcs),
3133         INGENIC_PIN_GROUP("cim-data-12bit", x2000_cim_12bit, 0),
3134         INGENIC_PIN_GROUP("lcd-tft-8bit", x2000_lcd_tft_8bit, 1),
3135         INGENIC_PIN_GROUP("lcd-tft-16bit", x2000_lcd_tft_16bit, 1),
3136         INGENIC_PIN_GROUP("lcd-tft-18bit", x2000_lcd_tft_18bit, 1),
3137         INGENIC_PIN_GROUP("lcd-tft-24bit", x2000_lcd_tft_24bit, 1),
3138         INGENIC_PIN_GROUP("lcd-slcd-8bit", x2000_lcd_slcd_8bit, 2),
3139         INGENIC_PIN_GROUP("lcd-slcd-16bit", x2000_lcd_tft_16bit, 2),
3140         INGENIC_PIN_GROUP("pwm0-c", x2000_pwm_pwm0_c, 0),
3141         INGENIC_PIN_GROUP("pwm0-d", x2000_pwm_pwm0_d, 2),
3142         INGENIC_PIN_GROUP("pwm1-c", x2000_pwm_pwm1_c, 0),
3143         INGENIC_PIN_GROUP("pwm1-d", x2000_pwm_pwm1_d, 2),
3144         INGENIC_PIN_GROUP("pwm2-c", x2000_pwm_pwm2_c, 0),
3145         INGENIC_PIN_GROUP("pwm2-e", x2000_pwm_pwm2_e, 1),
3146         INGENIC_PIN_GROUP("pwm3-c", x2000_pwm_pwm3_c, 0),
3147         INGENIC_PIN_GROUP("pwm3-e", x2000_pwm_pwm3_e, 1),
3148         INGENIC_PIN_GROUP("pwm4-c", x2000_pwm_pwm4_c, 0),
3149         INGENIC_PIN_GROUP("pwm4-e", x2000_pwm_pwm4_e, 1),
3150         INGENIC_PIN_GROUP("pwm5-c", x2000_pwm_pwm5_c, 0),
3151         INGENIC_PIN_GROUP("pwm5-e", x2000_pwm_pwm5_e, 1),
3152         INGENIC_PIN_GROUP("pwm6-c", x2000_pwm_pwm6_c, 0),
3153         INGENIC_PIN_GROUP("pwm6-e", x2000_pwm_pwm6_e, 1),
3154         INGENIC_PIN_GROUP("pwm7-c", x2000_pwm_pwm7_c, 0),
3155         INGENIC_PIN_GROUP("pwm7-e", x2000_pwm_pwm7_e, 1),
3156         INGENIC_PIN_GROUP("pwm8", x2000_pwm_pwm8, 0),
3157         INGENIC_PIN_GROUP("pwm9", x2000_pwm_pwm9, 0),
3158         INGENIC_PIN_GROUP("pwm10", x2000_pwm_pwm10, 0),
3159         INGENIC_PIN_GROUP("pwm11", x2000_pwm_pwm11, 0),
3160         INGENIC_PIN_GROUP("pwm12", x2000_pwm_pwm12, 0),
3161         INGENIC_PIN_GROUP("pwm13", x2000_pwm_pwm13, 0),
3162         INGENIC_PIN_GROUP("pwm14", x2000_pwm_pwm14, 0),
3163         INGENIC_PIN_GROUP("pwm15", x2000_pwm_pwm15, 0),
3164         INGENIC_PIN_GROUP("mac", x2100_mac, 1),
3165 };
3166
3167 static const char *x2100_mac_groups[] = { "mac", };
3168
3169 static const struct function_desc x2100_functions[] = {
3170         { "uart0", x2000_uart0_groups, ARRAY_SIZE(x2000_uart0_groups), },
3171         { "uart1", x2000_uart1_groups, ARRAY_SIZE(x2000_uart1_groups), },
3172         { "uart2", x2000_uart2_groups, ARRAY_SIZE(x2000_uart2_groups), },
3173         { "uart3", x2000_uart3_groups, ARRAY_SIZE(x2000_uart3_groups), },
3174         { "uart4", x2000_uart4_groups, ARRAY_SIZE(x2000_uart4_groups), },
3175         { "uart5", x2000_uart5_groups, ARRAY_SIZE(x2000_uart5_groups), },
3176         { "uart6", x2000_uart6_groups, ARRAY_SIZE(x2000_uart6_groups), },
3177         { "uart7", x2000_uart7_groups, ARRAY_SIZE(x2000_uart7_groups), },
3178         { "uart8", x2000_uart8_groups, ARRAY_SIZE(x2000_uart8_groups), },
3179         { "uart9", x2000_uart9_groups, ARRAY_SIZE(x2000_uart9_groups), },
3180         { "sfc", x2000_sfc_groups, ARRAY_SIZE(x2000_sfc_groups), },
3181         { "ssi0", x2000_ssi0_groups, ARRAY_SIZE(x2000_ssi0_groups), },
3182         { "ssi1", x2000_ssi1_groups, ARRAY_SIZE(x2000_ssi1_groups), },
3183         { "mmc0", x2000_mmc0_groups, ARRAY_SIZE(x2000_mmc0_groups), },
3184         { "mmc1", x2000_mmc1_groups, ARRAY_SIZE(x2000_mmc1_groups), },
3185         { "mmc2", x2000_mmc2_groups, ARRAY_SIZE(x2000_mmc2_groups), },
3186         { "emc", x2000_emc_groups, ARRAY_SIZE(x2000_emc_groups), },
3187         { "emc-cs1", x2000_cs1_groups, ARRAY_SIZE(x2000_cs1_groups), },
3188         { "emc-cs2", x2000_cs2_groups, ARRAY_SIZE(x2000_cs2_groups), },
3189         { "i2c0", x2000_i2c0_groups, ARRAY_SIZE(x2000_i2c0_groups), },
3190         { "i2c1", x2000_i2c1_groups, ARRAY_SIZE(x2000_i2c1_groups), },
3191         { "i2c2", x2000_i2c2_groups, ARRAY_SIZE(x2000_i2c2_groups), },
3192         { "i2c3", x2000_i2c3_groups, ARRAY_SIZE(x2000_i2c3_groups), },
3193         { "i2c4", x2000_i2c4_groups, ARRAY_SIZE(x2000_i2c4_groups), },
3194         { "i2c5", x2000_i2c5_groups, ARRAY_SIZE(x2000_i2c5_groups), },
3195         { "i2s1", x2000_i2s1_groups, ARRAY_SIZE(x2000_i2s1_groups), },
3196         { "i2s2", x2000_i2s2_groups, ARRAY_SIZE(x2000_i2s2_groups), },
3197         { "i2s3", x2000_i2s3_groups, ARRAY_SIZE(x2000_i2s3_groups), },
3198         { "dmic", x2000_dmic_groups, ARRAY_SIZE(x2000_dmic_groups), },
3199         { "cim", x2000_cim_groups, ARRAY_SIZE(x2000_cim_groups), },
3200         { "lcd", x2000_lcd_groups, ARRAY_SIZE(x2000_lcd_groups), },
3201         { "pwm0", x2000_pwm0_groups, ARRAY_SIZE(x2000_pwm0_groups), },
3202         { "pwm1", x2000_pwm1_groups, ARRAY_SIZE(x2000_pwm1_groups), },
3203         { "pwm2", x2000_pwm2_groups, ARRAY_SIZE(x2000_pwm2_groups), },
3204         { "pwm3", x2000_pwm3_groups, ARRAY_SIZE(x2000_pwm3_groups), },
3205         { "pwm4", x2000_pwm4_groups, ARRAY_SIZE(x2000_pwm4_groups), },
3206         { "pwm5", x2000_pwm5_groups, ARRAY_SIZE(x2000_pwm5_groups), },
3207         { "pwm6", x2000_pwm6_groups, ARRAY_SIZE(x2000_pwm6_groups), },
3208         { "pwm7", x2000_pwm7_groups, ARRAY_SIZE(x2000_pwm7_groups), },
3209         { "pwm8", x2000_pwm8_groups, ARRAY_SIZE(x2000_pwm8_groups), },
3210         { "pwm9", x2000_pwm9_groups, ARRAY_SIZE(x2000_pwm9_groups), },
3211         { "pwm10", x2000_pwm10_groups, ARRAY_SIZE(x2000_pwm10_groups), },
3212         { "pwm11", x2000_pwm11_groups, ARRAY_SIZE(x2000_pwm11_groups), },
3213         { "pwm12", x2000_pwm12_groups, ARRAY_SIZE(x2000_pwm12_groups), },
3214         { "pwm13", x2000_pwm13_groups, ARRAY_SIZE(x2000_pwm13_groups), },
3215         { "pwm14", x2000_pwm14_groups, ARRAY_SIZE(x2000_pwm14_groups), },
3216         { "pwm15", x2000_pwm15_groups, ARRAY_SIZE(x2000_pwm15_groups), },
3217         { "mac", x2100_mac_groups, ARRAY_SIZE(x2100_mac_groups), },
3218 };
3219
3220 static const struct ingenic_chip_info x2100_chip_info = {
3221         .num_chips = 5,
3222         .reg_offset = 0x100,
3223         .version = ID_X2100,
3224         .groups = x2100_groups,
3225         .num_groups = ARRAY_SIZE(x2100_groups),
3226         .functions = x2100_functions,
3227         .num_functions = ARRAY_SIZE(x2100_functions),
3228         .pull_ups = x2100_pull_ups,
3229         .pull_downs = x2100_pull_downs,
3230         .access_table = &x2000_access_table,
3231 };
3232
3233 static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg)
3234 {
3235         unsigned int val;
3236
3237         regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val);
3238
3239         return (u32) val;
3240 }
3241
3242 static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc,
3243                 u8 reg, u8 offset, bool set)
3244 {
3245         if (jzgc->jzpc->info->version == ID_JZ4730) {
3246                 regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg,
3247                                 BIT(offset), set ? BIT(offset) : 0);
3248                 return;
3249         }
3250
3251         if (set)
3252                 reg = REG_SET(reg);
3253         else
3254                 reg = REG_CLEAR(reg);
3255
3256         regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset));
3257 }
3258
3259 static void ingenic_gpio_shadow_set_bit(struct ingenic_gpio_chip *jzgc,
3260                 u8 reg, u8 offset, bool set)
3261 {
3262         if (set)
3263                 reg = REG_SET(reg);
3264         else
3265                 reg = REG_CLEAR(reg);
3266
3267         regmap_write(jzgc->jzpc->map, REG_PZ_BASE(
3268                         jzgc->jzpc->info->reg_offset) + reg, BIT(offset));
3269 }
3270
3271 static void ingenic_gpio_shadow_set_bit_load(struct ingenic_gpio_chip *jzgc)
3272 {
3273         regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD(
3274                         jzgc->jzpc->info->reg_offset),
3275                         jzgc->gc.base / PINS_PER_GPIO_CHIP);
3276 }
3277
3278 static void jz4730_gpio_set_bits(struct ingenic_gpio_chip *jzgc,
3279                 u8 reg_upper, u8 reg_lower, u8 offset, u8 value)
3280 {
3281         /*
3282          * JZ4730 function and IRQ registers support two-bits-per-pin
3283          * definitions, split into two groups of 16.
3284          */
3285         u8 reg = offset < JZ4730_PINS_PER_PAIRED_REG ? reg_lower : reg_upper;
3286         unsigned int idx = offset % JZ4730_PINS_PER_PAIRED_REG;
3287         unsigned int mask = GENMASK(1, 0) << idx * 2;
3288
3289         regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg, mask, value << (idx * 2));
3290 }
3291
3292 static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,
3293                                           u8 offset)
3294 {
3295         unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN);
3296
3297         return !!(val & BIT(offset));
3298 }
3299
3300 static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc,
3301                                    u8 offset, int value)
3302 {
3303         if (jzgc->jzpc->info->version >= ID_JZ4770)
3304                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_PAT0, offset, !!value);
3305         else if (jzgc->jzpc->info->version >= ID_JZ4740)
3306                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value);
3307         else
3308                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_DATA, offset, !!value);
3309 }
3310
3311 static void irq_set_type(struct ingenic_gpio_chip *jzgc,
3312                 u8 offset, unsigned int type)
3313 {
3314         u8 reg1, reg2;
3315         bool val1, val2, val3;
3316
3317         switch (type) {
3318         case IRQ_TYPE_EDGE_BOTH:
3319                 val1 = val2 = false;
3320                 val3 = true;
3321                 break;
3322         case IRQ_TYPE_EDGE_RISING:
3323                 val1 = val2 = true;
3324                 val3 = false;
3325                 break;
3326         case IRQ_TYPE_EDGE_FALLING:
3327                 val1 = val3 = false;
3328                 val2 = true;
3329                 break;
3330         case IRQ_TYPE_LEVEL_HIGH:
3331                 val1 = true;
3332                 val2 = val3 = false;
3333                 break;
3334         case IRQ_TYPE_LEVEL_LOW:
3335         default:
3336                 val1 = val2 = val3 = false;
3337                 break;
3338         }
3339
3340         if (jzgc->jzpc->info->version >= ID_JZ4770) {
3341                 reg1 = JZ4770_GPIO_PAT1;
3342                 reg2 = JZ4770_GPIO_PAT0;
3343         } else if (jzgc->jzpc->info->version >= ID_JZ4740) {
3344                 reg1 = JZ4740_GPIO_TRIG;
3345                 reg2 = JZ4740_GPIO_DIR;
3346         } else {
3347                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPDIR, offset, false);
3348                 jz4730_gpio_set_bits(jzgc, JZ4730_GPIO_GPIDUR,
3349                                 JZ4730_GPIO_GPIDLR, offset, (val2 << 1) | val1);
3350                 return;
3351         }
3352
3353         if (jzgc->jzpc->info->version >= ID_X2000) {
3354                 ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1);
3355                 ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2);
3356                 ingenic_gpio_shadow_set_bit_load(jzgc);
3357                 ingenic_gpio_set_bit(jzgc, X2000_GPIO_EDG, offset, val3);
3358         } else if (jzgc->jzpc->info->version >= ID_X1000) {
3359                 ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1);
3360                 ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2);
3361                 ingenic_gpio_shadow_set_bit_load(jzgc);
3362         } else {
3363                 ingenic_gpio_set_bit(jzgc, reg2, offset, val1);
3364                 ingenic_gpio_set_bit(jzgc, reg1, offset, val2);
3365         }
3366 }
3367
3368 static void ingenic_gpio_irq_mask(struct irq_data *irqd)
3369 {
3370         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3371         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3372         int irq = irqd->hwirq;
3373
3374         if (jzgc->jzpc->info->version >= ID_JZ4740)
3375                 ingenic_gpio_set_bit(jzgc, GPIO_MSK, irq, true);
3376         else
3377                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIMR, irq, true);
3378 }
3379
3380 static void ingenic_gpio_irq_unmask(struct irq_data *irqd)
3381 {
3382         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3383         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3384         int irq = irqd->hwirq;
3385
3386         if (jzgc->jzpc->info->version >= ID_JZ4740)
3387                 ingenic_gpio_set_bit(jzgc, GPIO_MSK, irq, false);
3388         else
3389                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIMR, irq, false);
3390 }
3391
3392 static void ingenic_gpio_irq_enable(struct irq_data *irqd)
3393 {
3394         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3395         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3396         int irq = irqd->hwirq;
3397
3398         if (jzgc->jzpc->info->version >= ID_JZ4770)
3399                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, true);
3400         else if (jzgc->jzpc->info->version >= ID_JZ4740)
3401                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true);
3402         else
3403                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIER, irq, true);
3404
3405         ingenic_gpio_irq_unmask(irqd);
3406 }
3407
3408 static void ingenic_gpio_irq_disable(struct irq_data *irqd)
3409 {
3410         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3411         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3412         int irq = irqd->hwirq;
3413
3414         ingenic_gpio_irq_mask(irqd);
3415
3416         if (jzgc->jzpc->info->version >= ID_JZ4770)
3417                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, false);
3418         else if (jzgc->jzpc->info->version >= ID_JZ4740)
3419                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false);
3420         else
3421                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIER, irq, false);
3422 }
3423
3424 static void ingenic_gpio_irq_ack(struct irq_data *irqd)
3425 {
3426         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3427         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3428         int irq = irqd->hwirq;
3429         bool high;
3430
3431         if ((irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) &&
3432                 (jzgc->jzpc->info->version < ID_X2000)) {
3433                 /*
3434                  * Switch to an interrupt for the opposite edge to the one that
3435                  * triggered the interrupt being ACKed.
3436                  */
3437                 high = ingenic_gpio_get_value(jzgc, irq);
3438                 if (high)
3439                         irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_LOW);
3440                 else
3441                         irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_HIGH);
3442         }
3443
3444         if (jzgc->jzpc->info->version >= ID_JZ4770)
3445                 ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_FLAG, irq, false);
3446         else if (jzgc->jzpc->info->version >= ID_JZ4740)
3447                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true);
3448         else
3449                 ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPFR, irq, false);
3450 }
3451
3452 static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
3453 {
3454         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3455         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3456
3457         switch (type) {
3458         case IRQ_TYPE_EDGE_BOTH:
3459         case IRQ_TYPE_EDGE_RISING:
3460         case IRQ_TYPE_EDGE_FALLING:
3461                 irq_set_handler_locked(irqd, handle_edge_irq);
3462                 break;
3463         case IRQ_TYPE_LEVEL_HIGH:
3464         case IRQ_TYPE_LEVEL_LOW:
3465                 irq_set_handler_locked(irqd, handle_level_irq);
3466                 break;
3467         default:
3468                 irq_set_handler_locked(irqd, handle_bad_irq);
3469         }
3470
3471         if ((type == IRQ_TYPE_EDGE_BOTH) && (jzgc->jzpc->info->version < ID_X2000)) {
3472                 /*
3473                  * The hardware does not support interrupts on both edges. The
3474                  * best we can do is to set up a single-edge interrupt and then
3475                  * switch to the opposing edge when ACKing the interrupt.
3476                  */
3477                 bool high = ingenic_gpio_get_value(jzgc, irqd->hwirq);
3478
3479                 type = high ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH;
3480         }
3481
3482         irq_set_type(jzgc, irqd->hwirq, type);
3483         return 0;
3484 }
3485
3486 static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on)
3487 {
3488         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3489         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3490
3491         return irq_set_irq_wake(jzgc->irq, on);
3492 }
3493
3494 static void ingenic_gpio_irq_handler(struct irq_desc *desc)
3495 {
3496         struct gpio_chip *gc = irq_desc_get_handler_data(desc);
3497         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3498         struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data);
3499         unsigned long flag, i;
3500
3501         chained_irq_enter(irq_chip, desc);
3502
3503         if (jzgc->jzpc->info->version >= ID_JZ4770)
3504                 flag = ingenic_gpio_read_reg(jzgc, JZ4770_GPIO_FLAG);
3505         else if (jzgc->jzpc->info->version >= ID_JZ4740)
3506                 flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG);
3507         else
3508                 flag = ingenic_gpio_read_reg(jzgc, JZ4730_GPIO_GPFR);
3509
3510         for_each_set_bit(i, &flag, 32)
3511                 generic_handle_domain_irq(gc->irq.domain, i);
3512         chained_irq_exit(irq_chip, desc);
3513 }
3514
3515 static void ingenic_gpio_set(struct gpio_chip *gc,
3516                 unsigned int offset, int value)
3517 {
3518         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3519
3520         ingenic_gpio_set_value(jzgc, offset, value);
3521 }
3522
3523 static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset)
3524 {
3525         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3526
3527         return (int) ingenic_gpio_get_value(jzgc, offset);
3528 }
3529
3530 static int ingenic_gpio_direction_input(struct gpio_chip *gc,
3531                 unsigned int offset)
3532 {
3533         return pinctrl_gpio_direction_input(gc->base + offset);
3534 }
3535
3536 static int ingenic_gpio_direction_output(struct gpio_chip *gc,
3537                 unsigned int offset, int value)
3538 {
3539         ingenic_gpio_set(gc, offset, value);
3540         return pinctrl_gpio_direction_output(gc->base + offset);
3541 }
3542
3543 static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
3544                 unsigned int pin, unsigned int reg, bool set)
3545 {
3546         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3547         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3548
3549         if (set) {
3550                 if (jzpc->info->version >= ID_JZ4740)
3551                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3552                                         REG_SET(reg), BIT(idx));
3553                 else
3554                         regmap_set_bits(jzpc->map, offt * jzpc->info->reg_offset +
3555                                         reg, BIT(idx));
3556         } else {
3557                 if (jzpc->info->version >= ID_JZ4740)
3558                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3559                                         REG_CLEAR(reg), BIT(idx));
3560                 else
3561                         regmap_clear_bits(jzpc->map, offt * jzpc->info->reg_offset +
3562                                         reg, BIT(idx));
3563         }
3564 }
3565
3566 static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc,
3567                 unsigned int pin, u8 reg, bool set)
3568 {
3569         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3570
3571         regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) +
3572                         (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
3573 }
3574
3575 static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc,
3576                 unsigned int pin)
3577 {
3578         regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset),
3579                         pin / PINS_PER_GPIO_CHIP);
3580 }
3581
3582 static inline void jz4730_config_pin_function(struct ingenic_pinctrl *jzpc,
3583                 unsigned int pin, u8 reg_upper, u8 reg_lower, u8 value)
3584 {
3585         /*
3586          * JZ4730 function and IRQ registers support two-bits-per-pin
3587          * definitions, split into two groups of 16.
3588          */
3589         unsigned int idx = pin % JZ4730_PINS_PER_PAIRED_REG;
3590         unsigned int mask = GENMASK(1, 0) << idx * 2;
3591         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3592         u8 reg = (pin % PINS_PER_GPIO_CHIP) < JZ4730_PINS_PER_PAIRED_REG ? reg_lower : reg_upper;
3593
3594         regmap_update_bits(jzpc->map, offt * jzpc->info->reg_offset + reg,
3595                         mask, value << (idx * 2));
3596 }
3597
3598 static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
3599                 unsigned int pin, unsigned int reg)
3600 {
3601         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3602         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3603         unsigned int val;
3604
3605         regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val);
3606
3607         return val & BIT(idx);
3608 }
3609
3610 static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
3611 {
3612         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3613         struct ingenic_pinctrl *jzpc = jzgc->jzpc;
3614         unsigned int pin = gc->base + offset;
3615
3616         if (jzpc->info->version >= ID_JZ4770) {
3617                 if (ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_INT) ||
3618                     ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PAT1))
3619                         return GPIO_LINE_DIRECTION_IN;
3620                 return GPIO_LINE_DIRECTION_OUT;
3621         } else if (jzpc->info->version == ID_JZ4730) {
3622                 if (!ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPDIR))
3623                         return GPIO_LINE_DIRECTION_IN;
3624                 return GPIO_LINE_DIRECTION_OUT;
3625         }
3626
3627         if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
3628                 return GPIO_LINE_DIRECTION_IN;
3629
3630         if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR))
3631                 return GPIO_LINE_DIRECTION_OUT;
3632
3633         return GPIO_LINE_DIRECTION_IN;
3634 }
3635
3636 static const struct pinctrl_ops ingenic_pctlops = {
3637         .get_groups_count = pinctrl_generic_get_group_count,
3638         .get_group_name = pinctrl_generic_get_group_name,
3639         .get_group_pins = pinctrl_generic_get_group_pins,
3640         .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
3641         .dt_free_map = pinconf_generic_dt_free_map,
3642 };
3643
3644 static int ingenic_gpio_irq_request(struct irq_data *data)
3645 {
3646         struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
3647         int ret;
3648
3649         ret = ingenic_gpio_direction_input(gpio_chip, data->hwirq);
3650         if (ret)
3651                 return ret;
3652
3653         return gpiochip_reqres_irq(gpio_chip, data->hwirq);
3654 }
3655
3656 static void ingenic_gpio_irq_release(struct irq_data *data)
3657 {
3658         struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
3659
3660         return gpiochip_relres_irq(gpio_chip, data->hwirq);
3661 }
3662
3663 static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
3664                 int pin, int func)
3665 {
3666         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3667         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3668
3669         dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n",
3670                         'A' + offt, idx, func);
3671
3672         if (jzpc->info->version >= ID_X1000) {
3673                 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3674                 ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false);
3675                 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
3676                 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
3677                 ingenic_shadow_config_pin_load(jzpc, pin);
3678         } else if (jzpc->info->version >= ID_JZ4770) {
3679                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3680                 ingenic_config_pin(jzpc, pin, GPIO_MSK, false);
3681                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
3682                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
3683         } else if (jzpc->info->version >= ID_JZ4740) {
3684                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
3685                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
3686                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func & 0x1);
3687         } else {
3688                 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false);
3689                 jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, func);
3690         }
3691
3692         return 0;
3693 }
3694
3695 static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
3696                 unsigned int selector, unsigned int group)
3697 {
3698         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3699         struct function_desc *func;
3700         struct group_desc *grp;
3701         unsigned int i;
3702         uintptr_t mode;
3703         u8 *pin_modes;
3704
3705         func = pinmux_generic_get_function(pctldev, selector);
3706         if (!func)
3707                 return -EINVAL;
3708
3709         grp = pinctrl_generic_get_group(pctldev, group);
3710         if (!grp)
3711                 return -EINVAL;
3712
3713         dev_dbg(pctldev->dev, "enable function %s group %s\n",
3714                 func->name, grp->name);
3715
3716         mode = (uintptr_t)grp->data;
3717         if (mode <= 3) {
3718                 for (i = 0; i < grp->num_pins; i++)
3719                         ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], mode);
3720         } else {
3721                 pin_modes = grp->data;
3722
3723                 for (i = 0; i < grp->num_pins; i++)
3724                         ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
3725         }
3726
3727         return 0;
3728 }
3729
3730 static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
3731                 struct pinctrl_gpio_range *range,
3732                 unsigned int pin, bool input)
3733 {
3734         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3735         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3736         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3737
3738         dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n",
3739                         'A' + offt, idx, input ? "in" : "out");
3740
3741         if (jzpc->info->version >= ID_X1000) {
3742                 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3743                 ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true);
3744                 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
3745                 ingenic_shadow_config_pin_load(jzpc, pin);
3746         } else if (jzpc->info->version >= ID_JZ4770) {
3747                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3748                 ingenic_config_pin(jzpc, pin, GPIO_MSK, true);
3749                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
3750         } else if (jzpc->info->version >= ID_JZ4740) {
3751                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
3752                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input);
3753                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
3754         } else {
3755                 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false);
3756                 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPDIR, !input);
3757                 jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, 0);
3758         }
3759
3760         return 0;
3761 }
3762
3763 static const struct pinmux_ops ingenic_pmxops = {
3764         .get_functions_count = pinmux_generic_get_function_count,
3765         .get_function_name = pinmux_generic_get_function_name,
3766         .get_function_groups = pinmux_generic_get_function_groups,
3767         .set_mux = ingenic_pinmux_set_mux,
3768         .gpio_set_direction = ingenic_pinmux_gpio_set_direction,
3769 };
3770
3771 static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
3772                 unsigned int pin, unsigned long *config)
3773 {
3774         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3775         enum pin_config_param param = pinconf_to_config_param(*config);
3776         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3777         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3778         unsigned int arg = 1;
3779         unsigned int bias, reg;
3780         bool pull, pullup, pulldown;
3781
3782         if (jzpc->info->version >= ID_X2000) {
3783                 pullup = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) &&
3784                                 !ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) &&
3785                                 (jzpc->info->pull_ups[offt] & BIT(idx));
3786                 pulldown = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) &&
3787                                 !ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) &&
3788                                 (jzpc->info->pull_downs[offt] & BIT(idx));
3789
3790         } else if (jzpc->info->version >= ID_X1830) {
3791                 unsigned int half = PINS_PER_GPIO_CHIP / 2;
3792                 unsigned int idxh = (pin % half) * 2;
3793
3794                 if (idx < half)
3795                         regmap_read(jzpc->map, offt * jzpc->info->reg_offset +
3796                                         X1830_GPIO_PEL, &bias);
3797                 else
3798                         regmap_read(jzpc->map, offt * jzpc->info->reg_offset +
3799                                         X1830_GPIO_PEH, &bias);
3800
3801                 bias = (bias >> idxh) & (GPIO_PULL_UP | GPIO_PULL_DOWN);
3802
3803                 pullup = (bias == GPIO_PULL_UP) && (jzpc->info->pull_ups[offt] & BIT(idx));
3804                 pulldown = (bias == GPIO_PULL_DOWN) && (jzpc->info->pull_downs[offt] & BIT(idx));
3805
3806         } else {
3807                 if (jzpc->info->version >= ID_JZ4770)
3808                         pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN);
3809                 else if (jzpc->info->version >= ID_JZ4740)
3810                         pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
3811                 else
3812                         pull = ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPPUR);
3813
3814                 pullup = pull && (jzpc->info->pull_ups[offt] & BIT(idx));
3815                 pulldown = pull && (jzpc->info->pull_downs[offt] & BIT(idx));
3816         }
3817
3818         switch (param) {
3819         case PIN_CONFIG_BIAS_DISABLE:
3820                 if (pullup || pulldown)
3821                         return -EINVAL;
3822
3823                 break;
3824
3825         case PIN_CONFIG_BIAS_PULL_UP:
3826                 if (!pullup)
3827                         return -EINVAL;
3828
3829                 break;
3830
3831         case PIN_CONFIG_BIAS_PULL_DOWN:
3832                 if (!pulldown)
3833                         return -EINVAL;
3834
3835                 break;
3836
3837         case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
3838                 if (jzpc->info->version >= ID_X2000)
3839                         reg = X2000_GPIO_SMT;
3840                 else if (jzpc->info->version >= ID_X1830)
3841                         reg = X1830_GPIO_SMT;
3842                 else
3843                         return -EINVAL;
3844
3845                 arg = !!ingenic_get_pin_config(jzpc, pin, reg);
3846                 break;
3847
3848         case PIN_CONFIG_SLEW_RATE:
3849                 if (jzpc->info->version >= ID_X2000)
3850                         reg = X2000_GPIO_SR;
3851                 else if (jzpc->info->version >= ID_X1830)
3852                         reg = X1830_GPIO_SR;
3853                 else
3854                         return -EINVAL;
3855
3856                 arg = !!ingenic_get_pin_config(jzpc, pin, reg);
3857                 break;
3858
3859         default:
3860                 return -ENOTSUPP;
3861         }
3862
3863         *config = pinconf_to_config_packed(param, arg);
3864         return 0;
3865 }
3866
3867 static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
3868                 unsigned int pin, unsigned int bias)
3869 {
3870         if (jzpc->info->version >= ID_X2000) {
3871                 switch (bias) {
3872                 case GPIO_PULL_UP:
3873                         ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false);
3874                         ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, true);
3875                         break;
3876
3877                 case GPIO_PULL_DOWN:
3878                         ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false);
3879                         ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, true);
3880                         break;
3881
3882                 case GPIO_PULL_DIS:
3883                 default:
3884                         ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false);
3885                         ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false);
3886                 }
3887
3888         } else if (jzpc->info->version >= ID_X1830) {
3889                 unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3890                 unsigned int half = PINS_PER_GPIO_CHIP / 2;
3891                 unsigned int idxh = (pin % half) * 2;
3892                 unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3893
3894                 if (idx < half) {
3895                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3896                                         REG_CLEAR(X1830_GPIO_PEL), 3 << idxh);
3897                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3898                                         REG_SET(X1830_GPIO_PEL), bias << idxh);
3899                 } else {
3900                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3901                                         REG_CLEAR(X1830_GPIO_PEH), 3 << idxh);
3902                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3903                                         REG_SET(X1830_GPIO_PEH), bias << idxh);
3904                 }
3905
3906         } else if (jzpc->info->version >= ID_JZ4770) {
3907                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !bias);
3908         } else if (jzpc->info->version >= ID_JZ4740) {
3909                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias);
3910         } else {
3911                 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPPUR, bias);
3912         }
3913 }
3914
3915 static void ingenic_set_schmitt_trigger(struct ingenic_pinctrl *jzpc,
3916                 unsigned int pin, bool enable)
3917 {
3918         if (jzpc->info->version >= ID_X2000)
3919                 ingenic_config_pin(jzpc, pin, X2000_GPIO_SMT, enable);
3920         else
3921                 ingenic_config_pin(jzpc, pin, X1830_GPIO_SMT, enable);
3922 }
3923
3924 static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc,
3925                                      unsigned int pin, bool high)
3926 {
3927         if (jzpc->info->version >= ID_JZ4770)
3928                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, high);
3929         else if (jzpc->info->version >= ID_JZ4740)
3930                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high);
3931         else
3932                 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_DATA, high);
3933 }
3934
3935 static void ingenic_set_slew_rate(struct ingenic_pinctrl *jzpc,
3936                 unsigned int pin, unsigned int slew)
3937 {
3938         if (jzpc->info->version >= ID_X2000)
3939                 ingenic_config_pin(jzpc, pin, X2000_GPIO_SR, slew);
3940         else
3941                 ingenic_config_pin(jzpc, pin, X1830_GPIO_SR, slew);
3942 }
3943
3944 static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
3945                 unsigned long *configs, unsigned int num_configs)
3946 {
3947         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3948         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3949         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3950         unsigned int cfg, arg;
3951         int ret;
3952
3953         for (cfg = 0; cfg < num_configs; cfg++) {
3954                 switch (pinconf_to_config_param(configs[cfg])) {
3955                 case PIN_CONFIG_BIAS_DISABLE:
3956                 case PIN_CONFIG_BIAS_PULL_UP:
3957                 case PIN_CONFIG_BIAS_PULL_DOWN:
3958                 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
3959                 case PIN_CONFIG_OUTPUT:
3960                 case PIN_CONFIG_SLEW_RATE:
3961                         continue;
3962                 default:
3963                         return -ENOTSUPP;
3964                 }
3965         }
3966
3967         for (cfg = 0; cfg < num_configs; cfg++) {
3968                 arg = pinconf_to_config_argument(configs[cfg]);
3969
3970                 switch (pinconf_to_config_param(configs[cfg])) {
3971                 case PIN_CONFIG_BIAS_DISABLE:
3972                         dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n",
3973                                         'A' + offt, idx);
3974                         ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS);
3975                         break;
3976
3977                 case PIN_CONFIG_BIAS_PULL_UP:
3978                         if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
3979                                 return -EINVAL;
3980                         dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n",
3981                                         'A' + offt, idx);
3982                         ingenic_set_bias(jzpc, pin, GPIO_PULL_UP);
3983                         break;
3984
3985                 case PIN_CONFIG_BIAS_PULL_DOWN:
3986                         if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
3987                                 return -EINVAL;
3988                         dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n",
3989                                         'A' + offt, idx);
3990                         ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN);
3991                         break;
3992
3993                 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
3994                         if (jzpc->info->version < ID_X1830)
3995                                 return -EINVAL;
3996
3997                         ingenic_set_schmitt_trigger(jzpc, pin, arg);
3998                         break;
3999
4000                 case PIN_CONFIG_OUTPUT:
4001                         ret = pinctrl_gpio_direction_output(pin);
4002                         if (ret)
4003                                 return ret;
4004
4005                         ingenic_set_output_level(jzpc, pin, arg);
4006                         break;
4007
4008                 case PIN_CONFIG_SLEW_RATE:
4009                         if (jzpc->info->version < ID_X1830)
4010                                 return -EINVAL;
4011
4012                         ingenic_set_slew_rate(jzpc, pin, arg);
4013                         break;
4014
4015                 default:
4016                         /* unreachable */
4017                         break;
4018                 }
4019         }
4020
4021         return 0;
4022 }
4023
4024 static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
4025                 unsigned int group, unsigned long *config)
4026 {
4027         const unsigned int *pins;
4028         unsigned int i, npins, old = 0;
4029         int ret;
4030
4031         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
4032         if (ret)
4033                 return ret;
4034
4035         for (i = 0; i < npins; i++) {
4036                 if (ingenic_pinconf_get(pctldev, pins[i], config))
4037                         return -ENOTSUPP;
4038
4039                 /* configs do not match between two pins */
4040                 if (i && (old != *config))
4041                         return -ENOTSUPP;
4042
4043                 old = *config;
4044         }
4045
4046         return 0;
4047 }
4048
4049 static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
4050                 unsigned int group, unsigned long *configs,
4051                 unsigned int num_configs)
4052 {
4053         const unsigned int *pins;
4054         unsigned int i, npins;
4055         int ret;
4056
4057         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
4058         if (ret)
4059                 return ret;
4060
4061         for (i = 0; i < npins; i++) {
4062                 ret = ingenic_pinconf_set(pctldev,
4063                                 pins[i], configs, num_configs);
4064                 if (ret)
4065                         return ret;
4066         }
4067
4068         return 0;
4069 }
4070
4071 static const struct pinconf_ops ingenic_confops = {
4072         .is_generic = true,
4073         .pin_config_get = ingenic_pinconf_get,
4074         .pin_config_set = ingenic_pinconf_set,
4075         .pin_config_group_get = ingenic_pinconf_group_get,
4076         .pin_config_group_set = ingenic_pinconf_group_set,
4077 };
4078
4079 static const struct regmap_config ingenic_pinctrl_regmap_config = {
4080         .reg_bits = 32,
4081         .val_bits = 32,
4082         .reg_stride = 4,
4083 };
4084
4085 static const struct of_device_id ingenic_gpio_of_matches[] __initconst = {
4086         { .compatible = "ingenic,jz4730-gpio" },
4087         { .compatible = "ingenic,jz4740-gpio" },
4088         { .compatible = "ingenic,jz4725b-gpio" },
4089         { .compatible = "ingenic,jz4750-gpio" },
4090         { .compatible = "ingenic,jz4755-gpio" },
4091         { .compatible = "ingenic,jz4760-gpio" },
4092         { .compatible = "ingenic,jz4770-gpio" },
4093         { .compatible = "ingenic,jz4775-gpio" },
4094         { .compatible = "ingenic,jz4780-gpio" },
4095         { .compatible = "ingenic,x1000-gpio" },
4096         { .compatible = "ingenic,x1830-gpio" },
4097         { .compatible = "ingenic,x2000-gpio" },
4098         { .compatible = "ingenic,x2100-gpio" },
4099         {},
4100 };
4101
4102 static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc,
4103                                      struct device_node *node)
4104 {
4105         struct ingenic_gpio_chip *jzgc;
4106         struct device *dev = jzpc->dev;
4107         struct gpio_irq_chip *girq;
4108         unsigned int bank;
4109         int err;
4110
4111         err = of_property_read_u32(node, "reg", &bank);
4112         if (err) {
4113                 dev_err(dev, "Cannot read \"reg\" property: %i\n", err);
4114                 return err;
4115         }
4116
4117         jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL);
4118         if (!jzgc)
4119                 return -ENOMEM;
4120
4121         jzgc->jzpc = jzpc;
4122         jzgc->reg_base = bank * jzpc->info->reg_offset;
4123
4124         jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank);
4125         if (!jzgc->gc.label)
4126                 return -ENOMEM;
4127
4128         /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
4129          * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
4130          * <linux/gpio/consumer.h> INSTEAD.
4131          */
4132         jzgc->gc.base = bank * 32;
4133
4134         jzgc->gc.ngpio = 32;
4135         jzgc->gc.parent = dev;
4136         jzgc->gc.of_node = node;
4137         jzgc->gc.owner = THIS_MODULE;
4138
4139         jzgc->gc.set = ingenic_gpio_set;
4140         jzgc->gc.get = ingenic_gpio_get;
4141         jzgc->gc.direction_input = ingenic_gpio_direction_input;
4142         jzgc->gc.direction_output = ingenic_gpio_direction_output;
4143         jzgc->gc.get_direction = ingenic_gpio_get_direction;
4144         jzgc->gc.request = gpiochip_generic_request;
4145         jzgc->gc.free = gpiochip_generic_free;
4146
4147         jzgc->irq = irq_of_parse_and_map(node, 0);
4148         if (!jzgc->irq)
4149                 return -EINVAL;
4150
4151         jzgc->irq_chip.name = jzgc->gc.label;
4152         jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable;
4153         jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable;
4154         jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask;
4155         jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask;
4156         jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack;
4157         jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type;
4158         jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake;
4159         jzgc->irq_chip.irq_request_resources = ingenic_gpio_irq_request;
4160         jzgc->irq_chip.irq_release_resources = ingenic_gpio_irq_release;
4161         jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND;
4162
4163         girq = &jzgc->gc.irq;
4164         girq->chip = &jzgc->irq_chip;
4165         girq->parent_handler = ingenic_gpio_irq_handler;
4166         girq->num_parents = 1;
4167         girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
4168                                      GFP_KERNEL);
4169         if (!girq->parents)
4170                 return -ENOMEM;
4171
4172         girq->parents[0] = jzgc->irq;
4173         girq->default_type = IRQ_TYPE_NONE;
4174         girq->handler = handle_level_irq;
4175
4176         err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc);
4177         if (err)
4178                 return err;
4179
4180         return 0;
4181 }
4182
4183 static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
4184 {
4185         struct device *dev = &pdev->dev;
4186         struct ingenic_pinctrl *jzpc;
4187         struct pinctrl_desc *pctl_desc;
4188         void __iomem *base;
4189         const struct ingenic_chip_info *chip_info;
4190         struct device_node *node;
4191         struct regmap_config regmap_config;
4192         unsigned int i;
4193         int err;
4194
4195         chip_info = of_device_get_match_data(dev);
4196         if (!chip_info) {
4197                 dev_err(dev, "Unsupported SoC\n");
4198                 return -EINVAL;
4199         }
4200
4201         jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
4202         if (!jzpc)
4203                 return -ENOMEM;
4204
4205         base = devm_platform_ioremap_resource(pdev, 0);
4206         if (IS_ERR(base))
4207                 return PTR_ERR(base);
4208
4209         regmap_config = ingenic_pinctrl_regmap_config;
4210         if (chip_info->access_table) {
4211                 regmap_config.rd_table = chip_info->access_table;
4212                 regmap_config.wr_table = chip_info->access_table;
4213         } else {
4214                 regmap_config.max_register = chip_info->num_chips * chip_info->reg_offset - 4;
4215         }
4216
4217         jzpc->map = devm_regmap_init_mmio(dev, base, &regmap_config);
4218         if (IS_ERR(jzpc->map)) {
4219                 dev_err(dev, "Failed to create regmap\n");
4220                 return PTR_ERR(jzpc->map);
4221         }
4222
4223         jzpc->dev = dev;
4224         jzpc->info = chip_info;
4225
4226         pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
4227         if (!pctl_desc)
4228                 return -ENOMEM;
4229
4230         /* fill in pinctrl_desc structure */
4231         pctl_desc->name = dev_name(dev);
4232         pctl_desc->owner = THIS_MODULE;
4233         pctl_desc->pctlops = &ingenic_pctlops;
4234         pctl_desc->pmxops = &ingenic_pmxops;
4235         pctl_desc->confops = &ingenic_confops;
4236         pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
4237         pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev,
4238                         pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL);
4239         if (!jzpc->pdesc)
4240                 return -ENOMEM;
4241
4242         for (i = 0; i < pctl_desc->npins; i++) {
4243                 jzpc->pdesc[i].number = i;
4244                 jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
4245                                                 'A' + (i / PINS_PER_GPIO_CHIP),
4246                                                 i % PINS_PER_GPIO_CHIP);
4247         }
4248
4249         jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
4250         if (IS_ERR(jzpc->pctl)) {
4251                 dev_err(dev, "Failed to register pinctrl\n");
4252                 return PTR_ERR(jzpc->pctl);
4253         }
4254
4255         for (i = 0; i < chip_info->num_groups; i++) {
4256                 const struct group_desc *group = &chip_info->groups[i];
4257
4258                 err = pinctrl_generic_add_group(jzpc->pctl, group->name,
4259                                 group->pins, group->num_pins, group->data);
4260                 if (err < 0) {
4261                         dev_err(dev, "Failed to register group %s\n",
4262                                         group->name);
4263                         return err;
4264                 }
4265         }
4266
4267         for (i = 0; i < chip_info->num_functions; i++) {
4268                 const struct function_desc *func = &chip_info->functions[i];
4269
4270                 err = pinmux_generic_add_function(jzpc->pctl, func->name,
4271                                 func->group_names, func->num_group_names,
4272                                 func->data);
4273                 if (err < 0) {
4274                         dev_err(dev, "Failed to register function %s\n",
4275                                         func->name);
4276                         return err;
4277                 }
4278         }
4279
4280         dev_set_drvdata(dev, jzpc->map);
4281
4282         for_each_child_of_node(dev->of_node, node) {
4283                 if (of_match_node(ingenic_gpio_of_matches, node)) {
4284                         err = ingenic_gpio_probe(jzpc, node);
4285                         if (err) {
4286                                 of_node_put(node);
4287                                 return err;
4288                         }
4289                 }
4290         }
4291
4292         return 0;
4293 }
4294
4295 #define IF_ENABLED(cfg, ptr)    PTR_IF(IS_ENABLED(cfg), (ptr))
4296
4297 static const struct of_device_id ingenic_pinctrl_of_matches[] = {
4298         {
4299                 .compatible = "ingenic,jz4730-pinctrl",
4300                 .data = IF_ENABLED(CONFIG_MACH_JZ4730, &jz4730_chip_info)
4301         },
4302         {
4303                 .compatible = "ingenic,jz4740-pinctrl",
4304                 .data = IF_ENABLED(CONFIG_MACH_JZ4740, &jz4740_chip_info)
4305         },
4306         {
4307                 .compatible = "ingenic,jz4725b-pinctrl",
4308                 .data = IF_ENABLED(CONFIG_MACH_JZ4725B, &jz4725b_chip_info)
4309         },
4310         {
4311                 .compatible = "ingenic,jz4750-pinctrl",
4312                 .data = IF_ENABLED(CONFIG_MACH_JZ4750, &jz4750_chip_info)
4313         },
4314         {
4315                 .compatible = "ingenic,jz4755-pinctrl",
4316                 .data = IF_ENABLED(CONFIG_MACH_JZ4755, &jz4755_chip_info)
4317         },
4318         {
4319                 .compatible = "ingenic,jz4760-pinctrl",
4320                 .data = IF_ENABLED(CONFIG_MACH_JZ4760, &jz4760_chip_info)
4321         },
4322         {
4323                 .compatible = "ingenic,jz4760b-pinctrl",
4324                 .data = IF_ENABLED(CONFIG_MACH_JZ4760, &jz4760_chip_info)
4325         },
4326         {
4327                 .compatible = "ingenic,jz4770-pinctrl",
4328                 .data = IF_ENABLED(CONFIG_MACH_JZ4770, &jz4770_chip_info)
4329         },
4330         {
4331                 .compatible = "ingenic,jz4775-pinctrl",
4332                 .data = IF_ENABLED(CONFIG_MACH_JZ4775, &jz4775_chip_info)
4333         },
4334         {
4335                 .compatible = "ingenic,jz4780-pinctrl",
4336                 .data = IF_ENABLED(CONFIG_MACH_JZ4780, &jz4780_chip_info)
4337         },
4338         {
4339                 .compatible = "ingenic,x1000-pinctrl",
4340                 .data = IF_ENABLED(CONFIG_MACH_X1000, &x1000_chip_info)
4341         },
4342         {
4343                 .compatible = "ingenic,x1000e-pinctrl",
4344                 .data = IF_ENABLED(CONFIG_MACH_X1000, &x1000_chip_info)
4345         },
4346         {
4347                 .compatible = "ingenic,x1500-pinctrl",
4348                 .data = IF_ENABLED(CONFIG_MACH_X1500, &x1500_chip_info)
4349         },
4350         {
4351                 .compatible = "ingenic,x1830-pinctrl",
4352                 .data = IF_ENABLED(CONFIG_MACH_X1830, &x1830_chip_info)
4353         },
4354         {
4355                 .compatible = "ingenic,x2000-pinctrl",
4356                 .data = IF_ENABLED(CONFIG_MACH_X2000, &x2000_chip_info)
4357         },
4358         {
4359                 .compatible = "ingenic,x2000e-pinctrl",
4360                 .data = IF_ENABLED(CONFIG_MACH_X2000, &x2000_chip_info)
4361         },
4362         {
4363                 .compatible = "ingenic,x2100-pinctrl",
4364                 .data = IF_ENABLED(CONFIG_MACH_X2100, &x2100_chip_info)
4365         },
4366         { /* sentinel */ },
4367 };
4368
4369 static struct platform_driver ingenic_pinctrl_driver = {
4370         .driver = {
4371                 .name = "pinctrl-ingenic",
4372                 .of_match_table = ingenic_pinctrl_of_matches,
4373         },
4374 };
4375
4376 static int __init ingenic_pinctrl_drv_register(void)
4377 {
4378         return platform_driver_probe(&ingenic_pinctrl_driver,
4379                                      ingenic_pinctrl_probe);
4380 }
4381 subsys_initcall(ingenic_pinctrl_drv_register);