Merge tag 'fuse-update-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/mszered...
[linux-2.6-microblaze.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) 2019 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
7  * Copyright (c) 2017, 2019 Paul Boddie <paul@boddie.org.uk>
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/of_device.h>
15 #include <linux/of_irq.h>
16 #include <linux/of_platform.h>
17 #include <linux/pinctrl/pinctrl.h>
18 #include <linux/pinctrl/pinmux.h>
19 #include <linux/pinctrl/pinconf.h>
20 #include <linux/pinctrl/pinconf-generic.h>
21 #include <linux/platform_device.h>
22 #include <linux/regmap.h>
23 #include <linux/slab.h>
24
25 #include "core.h"
26 #include "pinconf.h"
27 #include "pinmux.h"
28
29 #define GPIO_PIN        0x00
30 #define GPIO_MSK        0x20
31
32 #define JZ4740_GPIO_DATA        0x10
33 #define JZ4740_GPIO_PULL_DIS    0x30
34 #define JZ4740_GPIO_FUNC        0x40
35 #define JZ4740_GPIO_SELECT      0x50
36 #define JZ4740_GPIO_DIR         0x60
37 #define JZ4740_GPIO_TRIG        0x70
38 #define JZ4740_GPIO_FLAG        0x80
39
40 #define JZ4760_GPIO_INT         0x10
41 #define JZ4760_GPIO_PAT1        0x30
42 #define JZ4760_GPIO_PAT0        0x40
43 #define JZ4760_GPIO_FLAG        0x50
44 #define JZ4760_GPIO_PEN         0x70
45
46 #define X1830_GPIO_PEL                  0x110
47 #define X1830_GPIO_PEH                  0x120
48
49 #define REG_SET(x) ((x) + 0x4)
50 #define REG_CLEAR(x) ((x) + 0x8)
51
52 #define REG_PZ_BASE(x) ((x) * 7)
53 #define REG_PZ_GID2LD(x) ((x) * 7 + 0xf0)
54
55 #define GPIO_PULL_DIS   0
56 #define GPIO_PULL_UP    1
57 #define GPIO_PULL_DOWN  2
58
59 #define PINS_PER_GPIO_CHIP 32
60
61 enum jz_version {
62         ID_JZ4740,
63         ID_JZ4725B,
64         ID_JZ4760,
65         ID_JZ4770,
66         ID_JZ4780,
67         ID_X1000,
68         ID_X1500,
69         ID_X1830,
70 };
71
72 struct ingenic_chip_info {
73         unsigned int num_chips;
74         unsigned int reg_offset;
75         enum jz_version version;
76
77         const struct group_desc *groups;
78         unsigned int num_groups;
79
80         const struct function_desc *functions;
81         unsigned int num_functions;
82
83         const u32 *pull_ups, *pull_downs;
84 };
85
86 struct ingenic_pinctrl {
87         struct device *dev;
88         struct regmap *map;
89         struct pinctrl_dev *pctl;
90         struct pinctrl_pin_desc *pdesc;
91
92         const struct ingenic_chip_info *info;
93 };
94
95 struct ingenic_gpio_chip {
96         struct ingenic_pinctrl *jzpc;
97         struct gpio_chip gc;
98         struct irq_chip irq_chip;
99         unsigned int irq, reg_base;
100 };
101
102 static const u32 jz4740_pull_ups[4] = {
103         0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
104 };
105
106 static const u32 jz4740_pull_downs[4] = {
107         0x00000000, 0x00000000, 0x00000000, 0x00000000,
108 };
109
110 static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, };
111 static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
112 static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, };
113 static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
114 static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, };
115 static int jz4740_lcd_8bit_pins[] = {
116         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x52, 0x53, 0x54,
117 };
118 static int jz4740_lcd_16bit_pins[] = {
119         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55,
120 };
121 static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, };
122 static int jz4740_lcd_18bit_tft_pins[] = { 0x56, 0x57, 0x31, 0x32, };
123 static int jz4740_nand_cs1_pins[] = { 0x39, };
124 static int jz4740_nand_cs2_pins[] = { 0x3a, };
125 static int jz4740_nand_cs3_pins[] = { 0x3b, };
126 static int jz4740_nand_cs4_pins[] = { 0x3c, };
127 static int jz4740_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
128 static int jz4740_pwm_pwm0_pins[] = { 0x77, };
129 static int jz4740_pwm_pwm1_pins[] = { 0x78, };
130 static int jz4740_pwm_pwm2_pins[] = { 0x79, };
131 static int jz4740_pwm_pwm3_pins[] = { 0x7a, };
132 static int jz4740_pwm_pwm4_pins[] = { 0x7b, };
133 static int jz4740_pwm_pwm5_pins[] = { 0x7c, };
134 static int jz4740_pwm_pwm6_pins[] = { 0x7e, };
135 static int jz4740_pwm_pwm7_pins[] = { 0x7f, };
136
137
138 #define INGENIC_PIN_GROUP_FUNCS(name, id, funcs)                \
139         {                                               \
140                 name,                                   \
141                 id##_pins,                              \
142                 ARRAY_SIZE(id##_pins),                  \
143                 funcs,                                  \
144         }
145
146 #define INGENIC_PIN_GROUP(name, id, func)               \
147         INGENIC_PIN_GROUP_FUNCS(name, id, (void *)(func))
148
149 static const struct group_desc jz4740_groups[] = {
150         INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit, 0),
151         INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit, 0),
152         INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data, 1),
153         INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow, 1),
154         INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data, 2),
155         INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit, 0),
156         INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit, 0),
157         INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit, 0),
158         INGENIC_PIN_GROUP("lcd-18bit-tft", jz4740_lcd_18bit_tft, 0),
159         { "lcd-no-pins", },
160         INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1, 0),
161         INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2, 0),
162         INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3, 0),
163         INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4, 0),
164         INGENIC_PIN_GROUP("nand-fre-fwe", jz4740_nand_fre_fwe, 0),
165         INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0, 0),
166         INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1, 0),
167         INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2, 0),
168         INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3, 0),
169         INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4, 0),
170         INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5, 0),
171         INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6, 0),
172         INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7, 0),
173 };
174
175 static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
176 static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
177 static const char *jz4740_uart1_groups[] = { "uart1-data", };
178 static const char *jz4740_lcd_groups[] = {
179         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-18bit-tft", "lcd-no-pins",
180 };
181 static const char *jz4740_nand_groups[] = {
182         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
183 };
184 static const char *jz4740_pwm0_groups[] = { "pwm0", };
185 static const char *jz4740_pwm1_groups[] = { "pwm1", };
186 static const char *jz4740_pwm2_groups[] = { "pwm2", };
187 static const char *jz4740_pwm3_groups[] = { "pwm3", };
188 static const char *jz4740_pwm4_groups[] = { "pwm4", };
189 static const char *jz4740_pwm5_groups[] = { "pwm5", };
190 static const char *jz4740_pwm6_groups[] = { "pwm6", };
191 static const char *jz4740_pwm7_groups[] = { "pwm7", };
192
193 static const struct function_desc jz4740_functions[] = {
194         { "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), },
195         { "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), },
196         { "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), },
197         { "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), },
198         { "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), },
199         { "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), },
200         { "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), },
201         { "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), },
202         { "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), },
203         { "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), },
204         { "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), },
205         { "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), },
206         { "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), },
207 };
208
209 static const struct ingenic_chip_info jz4740_chip_info = {
210         .num_chips = 4,
211         .reg_offset = 0x100,
212         .version = ID_JZ4740,
213         .groups = jz4740_groups,
214         .num_groups = ARRAY_SIZE(jz4740_groups),
215         .functions = jz4740_functions,
216         .num_functions = ARRAY_SIZE(jz4740_functions),
217         .pull_ups = jz4740_pull_ups,
218         .pull_downs = jz4740_pull_downs,
219 };
220
221 static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, };
222 static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, };
223 static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, };
224 static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, };
225 static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, };
226 static int jz4725b_nand_cs1_pins[] = { 0x55, };
227 static int jz4725b_nand_cs2_pins[] = { 0x56, };
228 static int jz4725b_nand_cs3_pins[] = { 0x57, };
229 static int jz4725b_nand_cs4_pins[] = { 0x58, };
230 static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 };
231 static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d };
232 static int jz4725b_pwm_pwm0_pins[] = { 0x4a, };
233 static int jz4725b_pwm_pwm1_pins[] = { 0x4b, };
234 static int jz4725b_pwm_pwm2_pins[] = { 0x4c, };
235 static int jz4725b_pwm_pwm3_pins[] = { 0x4d, };
236 static int jz4725b_pwm_pwm4_pins[] = { 0x4e, };
237 static int jz4725b_pwm_pwm5_pins[] = { 0x4f, };
238 static int jz4725b_lcd_8bit_pins[] = {
239         0x72, 0x73, 0x74,
240         0x60, 0x61, 0x62, 0x63,
241         0x64, 0x65, 0x66, 0x67,
242 };
243 static int jz4725b_lcd_16bit_pins[] = {
244         0x68, 0x69, 0x6a, 0x6b,
245         0x6c, 0x6d, 0x6e, 0x6f,
246 };
247 static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, };
248 static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, };
249 static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
250 static int jz4725b_lcd_generic_pins[] = { 0x75, };
251
252 static u8 jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, };
253
254 static const struct group_desc jz4725b_groups[] = {
255         INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit, 1),
256         INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4725b_mmc0_4bit,
257                                 jz4725b_mmc0_4bit_funcs),
258         INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit, 0),
259         INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit, 0),
260         INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data, 1),
261         INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1, 0),
262         INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2, 0),
263         INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3, 0),
264         INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4, 0),
265         INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale, 0),
266         INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe, 0),
267         INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0, 0),
268         INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1, 0),
269         INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2, 0),
270         INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3, 0),
271         INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4, 0),
272         INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5, 0),
273         INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit, 0),
274         INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit, 0),
275         INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit, 0),
276         INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit, 1),
277         INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special, 0),
278         INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic, 0),
279 };
280
281 static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
282 static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
283 static const char *jz4725b_uart_groups[] = { "uart-data", };
284 static const char *jz4725b_nand_groups[] = {
285         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
286         "nand-cle-ale", "nand-fre-fwe",
287 };
288 static const char *jz4725b_pwm0_groups[] = { "pwm0", };
289 static const char *jz4725b_pwm1_groups[] = { "pwm1", };
290 static const char *jz4725b_pwm2_groups[] = { "pwm2", };
291 static const char *jz4725b_pwm3_groups[] = { "pwm3", };
292 static const char *jz4725b_pwm4_groups[] = { "pwm4", };
293 static const char *jz4725b_pwm5_groups[] = { "pwm5", };
294 static const char *jz4725b_lcd_groups[] = {
295         "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
296         "lcd-special", "lcd-generic",
297 };
298
299 static const struct function_desc jz4725b_functions[] = {
300         { "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), },
301         { "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), },
302         { "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), },
303         { "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), },
304         { "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), },
305         { "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), },
306         { "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), },
307         { "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), },
308         { "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), },
309         { "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), },
310         { "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), },
311 };
312
313 static const struct ingenic_chip_info jz4725b_chip_info = {
314         .num_chips = 4,
315         .reg_offset = 0x100,
316         .version = ID_JZ4725B,
317         .groups = jz4725b_groups,
318         .num_groups = ARRAY_SIZE(jz4725b_groups),
319         .functions = jz4725b_functions,
320         .num_functions = ARRAY_SIZE(jz4725b_functions),
321         .pull_ups = jz4740_pull_ups,
322         .pull_downs = jz4740_pull_downs,
323 };
324
325 static const u32 jz4760_pull_ups[6] = {
326         0xffffffff, 0xfffcf3ff, 0xffffffff, 0xffffcfff, 0xfffffb7c, 0xfffff00f,
327 };
328
329 static const u32 jz4760_pull_downs[6] = {
330         0x00000000, 0x00030c00, 0x00000000, 0x00003000, 0x00000483, 0x00000ff0,
331 };
332
333 static int jz4760_uart0_data_pins[] = { 0xa0, 0xa3, };
334 static int jz4760_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
335 static int jz4760_uart1_data_pins[] = { 0x7a, 0x7c, };
336 static int jz4760_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
337 static int jz4760_uart2_data_pins[] = { 0x5c, 0x5e, };
338 static int jz4760_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
339 static int jz4760_uart3_data_pins[] = { 0x6c, 0x85, };
340 static int jz4760_uart3_hwflow_pins[] = { 0x88, 0x89, };
341 static int jz4760_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
342 static int jz4760_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
343 static int jz4760_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
344 static int jz4760_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
345 static int jz4760_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
346 static int jz4760_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
347 static int jz4760_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
348 static int jz4760_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
349 static int jz4760_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
350 static int jz4760_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
351 static int jz4760_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
352 static int jz4760_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
353 static int jz4760_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
354 static int jz4760_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
355 static int jz4760_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
356 static int jz4760_nemc_8bit_data_pins[] = {
357         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
358 };
359 static int jz4760_nemc_16bit_data_pins[] = {
360         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
361 };
362 static int jz4760_nemc_cle_ale_pins[] = { 0x20, 0x21, };
363 static int jz4760_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
364 static int jz4760_nemc_rd_we_pins[] = { 0x10, 0x11, };
365 static int jz4760_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
366 static int jz4760_nemc_wait_pins[] = { 0x1b, };
367 static int jz4760_nemc_cs1_pins[] = { 0x15, };
368 static int jz4760_nemc_cs2_pins[] = { 0x16, };
369 static int jz4760_nemc_cs3_pins[] = { 0x17, };
370 static int jz4760_nemc_cs4_pins[] = { 0x18, };
371 static int jz4760_nemc_cs5_pins[] = { 0x19, };
372 static int jz4760_nemc_cs6_pins[] = { 0x1a, };
373 static int jz4760_i2c0_pins[] = { 0x7e, 0x7f, };
374 static int jz4760_i2c1_pins[] = { 0x9e, 0x9f, };
375 static int jz4760_cim_pins[] = {
376         0x26, 0x27, 0x28, 0x29,
377         0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
378 };
379 static int jz4760_lcd_24bit_pins[] = {
380         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
381         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
382         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
383         0x58, 0x59, 0x5a, 0x5b,
384 };
385 static int jz4760_pwm_pwm0_pins[] = { 0x80, };
386 static int jz4760_pwm_pwm1_pins[] = { 0x81, };
387 static int jz4760_pwm_pwm2_pins[] = { 0x82, };
388 static int jz4760_pwm_pwm3_pins[] = { 0x83, };
389 static int jz4760_pwm_pwm4_pins[] = { 0x84, };
390 static int jz4760_pwm_pwm5_pins[] = { 0x85, };
391 static int jz4760_pwm_pwm6_pins[] = { 0x6a, };
392 static int jz4760_pwm_pwm7_pins[] = { 0x6b, };
393
394 static u8 jz4760_uart3_data_funcs[] = { 0, 1, };
395 static u8 jz4760_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
396
397 static const struct group_desc jz4760_groups[] = {
398         INGENIC_PIN_GROUP("uart0-data", jz4760_uart0_data, 0),
399         INGENIC_PIN_GROUP("uart0-hwflow", jz4760_uart0_hwflow, 0),
400         INGENIC_PIN_GROUP("uart1-data", jz4760_uart1_data, 0),
401         INGENIC_PIN_GROUP("uart1-hwflow", jz4760_uart1_hwflow, 0),
402         INGENIC_PIN_GROUP("uart2-data", jz4760_uart2_data, 0),
403         INGENIC_PIN_GROUP("uart2-hwflow", jz4760_uart2_hwflow, 0),
404         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4760_uart3_data,
405                                 jz4760_uart3_data_funcs),
406         INGENIC_PIN_GROUP("uart3-hwflow", jz4760_uart3_hwflow, 0),
407         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4760_mmc0_1bit_a,
408                                 jz4760_mmc0_1bit_a_funcs),
409         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4760_mmc0_4bit_a, 1),
410         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4760_mmc0_1bit_e, 0),
411         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4760_mmc0_4bit_e, 0),
412         INGENIC_PIN_GROUP("mmc0-8bit-e", jz4760_mmc0_8bit_e, 0),
413         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4760_mmc1_1bit_d, 0),
414         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4760_mmc1_4bit_d, 0),
415         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4760_mmc1_1bit_e, 1),
416         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4760_mmc1_4bit_e, 1),
417         INGENIC_PIN_GROUP("mmc1-8bit-e", jz4760_mmc1_8bit_e, 1),
418         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4760_mmc2_1bit_b, 0),
419         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4760_mmc2_4bit_b, 0),
420         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4760_mmc2_1bit_e, 2),
421         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4760_mmc2_4bit_e, 2),
422         INGENIC_PIN_GROUP("mmc2-8bit-e", jz4760_mmc2_8bit_e, 2),
423         INGENIC_PIN_GROUP("nemc-8bit-data", jz4760_nemc_8bit_data, 0),
424         INGENIC_PIN_GROUP("nemc-16bit-data", jz4760_nemc_16bit_data, 0),
425         INGENIC_PIN_GROUP("nemc-cle-ale", jz4760_nemc_cle_ale, 0),
426         INGENIC_PIN_GROUP("nemc-addr", jz4760_nemc_addr, 0),
427         INGENIC_PIN_GROUP("nemc-rd-we", jz4760_nemc_rd_we, 0),
428         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4760_nemc_frd_fwe, 0),
429         INGENIC_PIN_GROUP("nemc-wait", jz4760_nemc_wait, 0),
430         INGENIC_PIN_GROUP("nemc-cs1", jz4760_nemc_cs1, 0),
431         INGENIC_PIN_GROUP("nemc-cs2", jz4760_nemc_cs2, 0),
432         INGENIC_PIN_GROUP("nemc-cs3", jz4760_nemc_cs3, 0),
433         INGENIC_PIN_GROUP("nemc-cs4", jz4760_nemc_cs4, 0),
434         INGENIC_PIN_GROUP("nemc-cs5", jz4760_nemc_cs5, 0),
435         INGENIC_PIN_GROUP("nemc-cs6", jz4760_nemc_cs6, 0),
436         INGENIC_PIN_GROUP("i2c0-data", jz4760_i2c0, 0),
437         INGENIC_PIN_GROUP("i2c1-data", jz4760_i2c1, 0),
438         INGENIC_PIN_GROUP("cim-data", jz4760_cim, 0),
439         INGENIC_PIN_GROUP("lcd-24bit", jz4760_lcd_24bit, 0),
440         { "lcd-no-pins", },
441         INGENIC_PIN_GROUP("pwm0", jz4760_pwm_pwm0, 0),
442         INGENIC_PIN_GROUP("pwm1", jz4760_pwm_pwm1, 0),
443         INGENIC_PIN_GROUP("pwm2", jz4760_pwm_pwm2, 0),
444         INGENIC_PIN_GROUP("pwm3", jz4760_pwm_pwm3, 0),
445         INGENIC_PIN_GROUP("pwm4", jz4760_pwm_pwm4, 0),
446         INGENIC_PIN_GROUP("pwm5", jz4760_pwm_pwm5, 0),
447         INGENIC_PIN_GROUP("pwm6", jz4760_pwm_pwm6, 0),
448         INGENIC_PIN_GROUP("pwm7", jz4760_pwm_pwm7, 0),
449 };
450
451 static const char *jz4760_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
452 static const char *jz4760_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
453 static const char *jz4760_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
454 static const char *jz4760_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
455 static const char *jz4760_mmc0_groups[] = {
456         "mmc0-1bit-a", "mmc0-4bit-a",
457         "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
458 };
459 static const char *jz4760_mmc1_groups[] = {
460         "mmc1-1bit-d", "mmc1-4bit-d",
461         "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
462 };
463 static const char *jz4760_mmc2_groups[] = {
464         "mmc2-1bit-b", "mmc2-4bit-b",
465         "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
466 };
467 static const char *jz4760_nemc_groups[] = {
468         "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
469         "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
470 };
471 static const char *jz4760_cs1_groups[] = { "nemc-cs1", };
472 static const char *jz4760_cs2_groups[] = { "nemc-cs2", };
473 static const char *jz4760_cs3_groups[] = { "nemc-cs3", };
474 static const char *jz4760_cs4_groups[] = { "nemc-cs4", };
475 static const char *jz4760_cs5_groups[] = { "nemc-cs5", };
476 static const char *jz4760_cs6_groups[] = { "nemc-cs6", };
477 static const char *jz4760_i2c0_groups[] = { "i2c0-data", };
478 static const char *jz4760_i2c1_groups[] = { "i2c1-data", };
479 static const char *jz4760_cim_groups[] = { "cim-data", };
480 static const char *jz4760_lcd_groups[] = { "lcd-24bit", "lcd-no-pins", };
481 static const char *jz4760_pwm0_groups[] = { "pwm0", };
482 static const char *jz4760_pwm1_groups[] = { "pwm1", };
483 static const char *jz4760_pwm2_groups[] = { "pwm2", };
484 static const char *jz4760_pwm3_groups[] = { "pwm3", };
485 static const char *jz4760_pwm4_groups[] = { "pwm4", };
486 static const char *jz4760_pwm5_groups[] = { "pwm5", };
487 static const char *jz4760_pwm6_groups[] = { "pwm6", };
488 static const char *jz4760_pwm7_groups[] = { "pwm7", };
489
490 static const struct function_desc jz4760_functions[] = {
491         { "uart0", jz4760_uart0_groups, ARRAY_SIZE(jz4760_uart0_groups), },
492         { "uart1", jz4760_uart1_groups, ARRAY_SIZE(jz4760_uart1_groups), },
493         { "uart2", jz4760_uart2_groups, ARRAY_SIZE(jz4760_uart2_groups), },
494         { "uart3", jz4760_uart3_groups, ARRAY_SIZE(jz4760_uart3_groups), },
495         { "mmc0", jz4760_mmc0_groups, ARRAY_SIZE(jz4760_mmc0_groups), },
496         { "mmc1", jz4760_mmc1_groups, ARRAY_SIZE(jz4760_mmc1_groups), },
497         { "mmc2", jz4760_mmc2_groups, ARRAY_SIZE(jz4760_mmc2_groups), },
498         { "nemc", jz4760_nemc_groups, ARRAY_SIZE(jz4760_nemc_groups), },
499         { "nemc-cs1", jz4760_cs1_groups, ARRAY_SIZE(jz4760_cs1_groups), },
500         { "nemc-cs2", jz4760_cs2_groups, ARRAY_SIZE(jz4760_cs2_groups), },
501         { "nemc-cs3", jz4760_cs3_groups, ARRAY_SIZE(jz4760_cs3_groups), },
502         { "nemc-cs4", jz4760_cs4_groups, ARRAY_SIZE(jz4760_cs4_groups), },
503         { "nemc-cs5", jz4760_cs5_groups, ARRAY_SIZE(jz4760_cs5_groups), },
504         { "nemc-cs6", jz4760_cs6_groups, ARRAY_SIZE(jz4760_cs6_groups), },
505         { "i2c0", jz4760_i2c0_groups, ARRAY_SIZE(jz4760_i2c0_groups), },
506         { "i2c1", jz4760_i2c1_groups, ARRAY_SIZE(jz4760_i2c1_groups), },
507         { "cim", jz4760_cim_groups, ARRAY_SIZE(jz4760_cim_groups), },
508         { "lcd", jz4760_lcd_groups, ARRAY_SIZE(jz4760_lcd_groups), },
509         { "pwm0", jz4760_pwm0_groups, ARRAY_SIZE(jz4760_pwm0_groups), },
510         { "pwm1", jz4760_pwm1_groups, ARRAY_SIZE(jz4760_pwm1_groups), },
511         { "pwm2", jz4760_pwm2_groups, ARRAY_SIZE(jz4760_pwm2_groups), },
512         { "pwm3", jz4760_pwm3_groups, ARRAY_SIZE(jz4760_pwm3_groups), },
513         { "pwm4", jz4760_pwm4_groups, ARRAY_SIZE(jz4760_pwm4_groups), },
514         { "pwm5", jz4760_pwm5_groups, ARRAY_SIZE(jz4760_pwm5_groups), },
515         { "pwm6", jz4760_pwm6_groups, ARRAY_SIZE(jz4760_pwm6_groups), },
516         { "pwm7", jz4760_pwm7_groups, ARRAY_SIZE(jz4760_pwm7_groups), },
517 };
518
519 static const struct ingenic_chip_info jz4760_chip_info = {
520         .num_chips = 6,
521         .reg_offset = 0x100,
522         .version = ID_JZ4760,
523         .groups = jz4760_groups,
524         .num_groups = ARRAY_SIZE(jz4760_groups),
525         .functions = jz4760_functions,
526         .num_functions = ARRAY_SIZE(jz4760_functions),
527         .pull_ups = jz4760_pull_ups,
528         .pull_downs = jz4760_pull_downs,
529 };
530
531 static const u32 jz4770_pull_ups[6] = {
532         0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f,
533 };
534
535 static const u32 jz4770_pull_downs[6] = {
536         0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
537 };
538
539 static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
540 static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
541 static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
542 static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
543 static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, };
544 static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
545 static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
546 static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
547 static int jz4770_ssi0_dt_a_pins[] = { 0x15, };
548 static int jz4770_ssi0_dt_b_pins[] = { 0x35, };
549 static int jz4770_ssi0_dt_d_pins[] = { 0x75, };
550 static int jz4770_ssi0_dt_e_pins[] = { 0x91, };
551 static int jz4770_ssi0_dr_a_pins[] = { 0x14, };
552 static int jz4770_ssi0_dr_b_pins[] = { 0x34, };
553 static int jz4770_ssi0_dr_d_pins[] = { 0x74, };
554 static int jz4770_ssi0_dr_e_pins[] = { 0x8e, };
555 static int jz4770_ssi0_clk_a_pins[] = { 0x12, };
556 static int jz4770_ssi0_clk_b_pins[] = { 0x3c, };
557 static int jz4770_ssi0_clk_d_pins[] = { 0x78, };
558 static int jz4770_ssi0_clk_e_pins[] = { 0x8f, };
559 static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, };
560 static int jz4770_ssi0_gpc_d_pins[] = { 0x76, };
561 static int jz4770_ssi0_gpc_e_pins[] = { 0x93, };
562 static int jz4770_ssi0_ce0_a_pins[] = { 0x13, };
563 static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, };
564 static int jz4770_ssi0_ce0_d_pins[] = { 0x79, };
565 static int jz4770_ssi0_ce0_e_pins[] = { 0x90, };
566 static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, };
567 static int jz4770_ssi0_ce1_d_pins[] = { 0x77, };
568 static int jz4770_ssi0_ce1_e_pins[] = { 0x92, };
569 static int jz4770_ssi1_dt_b_pins[] = { 0x35, };
570 static int jz4770_ssi1_dt_d_pins[] = { 0x75, };
571 static int jz4770_ssi1_dt_e_pins[] = { 0x91, };
572 static int jz4770_ssi1_dr_b_pins[] = { 0x34, };
573 static int jz4770_ssi1_dr_d_pins[] = { 0x74, };
574 static int jz4770_ssi1_dr_e_pins[] = { 0x8e, };
575 static int jz4770_ssi1_clk_b_pins[] = { 0x3c, };
576 static int jz4770_ssi1_clk_d_pins[] = { 0x78, };
577 static int jz4770_ssi1_clk_e_pins[] = { 0x8f, };
578 static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, };
579 static int jz4770_ssi1_gpc_d_pins[] = { 0x76, };
580 static int jz4770_ssi1_gpc_e_pins[] = { 0x93, };
581 static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, };
582 static int jz4770_ssi1_ce0_d_pins[] = { 0x79, };
583 static int jz4770_ssi1_ce0_e_pins[] = { 0x90, };
584 static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, };
585 static int jz4770_ssi1_ce1_d_pins[] = { 0x77, };
586 static int jz4770_ssi1_ce1_e_pins[] = { 0x92, };
587 static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
588 static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
589 static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
590 static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
591 static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
592 static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
593 static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
594 static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
595 static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
596 static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
597 static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
598 static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
599 static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
600 static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
601 static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
602 static int jz4770_nemc_8bit_data_pins[] = {
603         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
604 };
605 static int jz4770_nemc_16bit_data_pins[] = {
606         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
607 };
608 static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
609 static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
610 static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
611 static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
612 static int jz4770_nemc_wait_pins[] = { 0x1b, };
613 static int jz4770_nemc_cs1_pins[] = { 0x15, };
614 static int jz4770_nemc_cs2_pins[] = { 0x16, };
615 static int jz4770_nemc_cs3_pins[] = { 0x17, };
616 static int jz4770_nemc_cs4_pins[] = { 0x18, };
617 static int jz4770_nemc_cs5_pins[] = { 0x19, };
618 static int jz4770_nemc_cs6_pins[] = { 0x1a, };
619 static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, };
620 static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, };
621 static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
622 static int jz4770_cim_8bit_pins[] = {
623         0x26, 0x27, 0x28, 0x29,
624         0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
625 };
626 static int jz4770_cim_12bit_pins[] = {
627         0x32, 0x33, 0xb0, 0xb1,
628 };
629 static int jz4770_lcd_8bit_pins[] = {
630         0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d,
631         0x48, 0x49, 0x52, 0x53,
632 };
633 static int jz4770_lcd_24bit_pins[] = {
634         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
635         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
636         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
637         0x58, 0x59, 0x5a, 0x5b,
638 };
639 static int jz4770_pwm_pwm0_pins[] = { 0x80, };
640 static int jz4770_pwm_pwm1_pins[] = { 0x81, };
641 static int jz4770_pwm_pwm2_pins[] = { 0x82, };
642 static int jz4770_pwm_pwm3_pins[] = { 0x83, };
643 static int jz4770_pwm_pwm4_pins[] = { 0x84, };
644 static int jz4770_pwm_pwm5_pins[] = { 0x85, };
645 static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
646 static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
647 static int jz4770_mac_rmii_pins[] = {
648         0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
649 };
650 static int jz4770_mac_mii_pins[] = { 0xa7, 0xaf, };
651 static int jz4770_otg_pins[] = { 0x8a, };
652
653 static const struct group_desc jz4770_groups[] = {
654         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0),
655         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0),
656         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0),
657         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0),
658         INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data, 0),
659         INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow, 0),
660         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data,
661                                 jz4760_uart3_data_funcs),
662         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0),
663         INGENIC_PIN_GROUP("ssi0-dt-a", jz4770_ssi0_dt_a, 2),
664         INGENIC_PIN_GROUP("ssi0-dt-b", jz4770_ssi0_dt_b, 1),
665         INGENIC_PIN_GROUP("ssi0-dt-d", jz4770_ssi0_dt_d, 1),
666         INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0),
667         INGENIC_PIN_GROUP("ssi0-dr-a", jz4770_ssi0_dr_a, 1),
668         INGENIC_PIN_GROUP("ssi0-dr-b", jz4770_ssi0_dr_b, 1),
669         INGENIC_PIN_GROUP("ssi0-dr-d", jz4770_ssi0_dr_d, 1),
670         INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0),
671         INGENIC_PIN_GROUP("ssi0-clk-a", jz4770_ssi0_clk_a, 2),
672         INGENIC_PIN_GROUP("ssi0-clk-b", jz4770_ssi0_clk_b, 1),
673         INGENIC_PIN_GROUP("ssi0-clk-d", jz4770_ssi0_clk_d, 1),
674         INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0),
675         INGENIC_PIN_GROUP("ssi0-gpc-b", jz4770_ssi0_gpc_b, 1),
676         INGENIC_PIN_GROUP("ssi0-gpc-d", jz4770_ssi0_gpc_d, 1),
677         INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0),
678         INGENIC_PIN_GROUP("ssi0-ce0-a", jz4770_ssi0_ce0_a, 2),
679         INGENIC_PIN_GROUP("ssi0-ce0-b", jz4770_ssi0_ce0_b, 1),
680         INGENIC_PIN_GROUP("ssi0-ce0-d", jz4770_ssi0_ce0_d, 1),
681         INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0),
682         INGENIC_PIN_GROUP("ssi0-ce1-b", jz4770_ssi0_ce1_b, 1),
683         INGENIC_PIN_GROUP("ssi0-ce1-d", jz4770_ssi0_ce1_d, 1),
684         INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0),
685         INGENIC_PIN_GROUP("ssi1-dt-b", jz4770_ssi1_dt_b, 2),
686         INGENIC_PIN_GROUP("ssi1-dt-d", jz4770_ssi1_dt_d, 2),
687         INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1),
688         INGENIC_PIN_GROUP("ssi1-dr-b", jz4770_ssi1_dr_b, 2),
689         INGENIC_PIN_GROUP("ssi1-dr-d", jz4770_ssi1_dr_d, 2),
690         INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1),
691         INGENIC_PIN_GROUP("ssi1-clk-b", jz4770_ssi1_clk_b, 2),
692         INGENIC_PIN_GROUP("ssi1-clk-d", jz4770_ssi1_clk_d, 2),
693         INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1),
694         INGENIC_PIN_GROUP("ssi1-gpc-b", jz4770_ssi1_gpc_b, 2),
695         INGENIC_PIN_GROUP("ssi1-gpc-d", jz4770_ssi1_gpc_d, 2),
696         INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1),
697         INGENIC_PIN_GROUP("ssi1-ce0-b", jz4770_ssi1_ce0_b, 2),
698         INGENIC_PIN_GROUP("ssi1-ce0-d", jz4770_ssi1_ce0_d, 2),
699         INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1),
700         INGENIC_PIN_GROUP("ssi1-ce1-b", jz4770_ssi1_ce1_b, 2),
701         INGENIC_PIN_GROUP("ssi1-ce1-d", jz4770_ssi1_ce1_d, 2),
702         INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1),
703         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a,
704                                 jz4760_mmc0_1bit_a_funcs),
705         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1),
706         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0),
707         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0),
708         INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e, 0),
709         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0),
710         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0),
711         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1),
712         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1),
713         INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e, 1),
714         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0),
715         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0),
716         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2),
717         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2),
718         INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e, 2),
719         INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data, 0),
720         INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data, 0),
721         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0),
722         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0),
723         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0),
724         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0),
725         INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0),
726         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0),
727         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0),
728         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0),
729         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0),
730         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0),
731         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0),
732         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0),
733         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0),
734         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2),
735         INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit, 0),
736         INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0),
737         INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0),
738         INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0),
739         { "lcd-no-pins", },
740         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0),
741         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0),
742         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0),
743         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0),
744         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0),
745         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0),
746         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0),
747         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0),
748         INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii, 0),
749         INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii, 0),
750         INGENIC_PIN_GROUP("otg-vbus", jz4770_otg, 0),
751 };
752
753 static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
754 static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
755 static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
756 static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
757 static const char *jz4770_ssi0_groups[] = {
758         "ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
759         "ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
760         "ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e",
761         "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
762         "ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
763         "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
764 };
765 static const char *jz4770_ssi1_groups[] = {
766         "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
767         "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
768         "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
769         "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
770         "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
771         "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
772 };
773 static const char *jz4770_mmc0_groups[] = {
774         "mmc0-1bit-a", "mmc0-4bit-a",
775         "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
776 };
777 static const char *jz4770_mmc1_groups[] = {
778         "mmc1-1bit-d", "mmc1-4bit-d",
779         "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
780 };
781 static const char *jz4770_mmc2_groups[] = {
782         "mmc2-1bit-b", "mmc2-4bit-b",
783         "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
784 };
785 static const char *jz4770_nemc_groups[] = {
786         "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
787         "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
788 };
789 static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
790 static const char *jz4770_cs2_groups[] = { "nemc-cs2", };
791 static const char *jz4770_cs3_groups[] = { "nemc-cs3", };
792 static const char *jz4770_cs4_groups[] = { "nemc-cs4", };
793 static const char *jz4770_cs5_groups[] = { "nemc-cs5", };
794 static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
795 static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
796 static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
797 static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
798 static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
799 static const char *jz4770_lcd_groups[] = {
800         "lcd-8bit", "lcd-24bit", "lcd-no-pins",
801 };
802 static const char *jz4770_pwm0_groups[] = { "pwm0", };
803 static const char *jz4770_pwm1_groups[] = { "pwm1", };
804 static const char *jz4770_pwm2_groups[] = { "pwm2", };
805 static const char *jz4770_pwm3_groups[] = { "pwm3", };
806 static const char *jz4770_pwm4_groups[] = { "pwm4", };
807 static const char *jz4770_pwm5_groups[] = { "pwm5", };
808 static const char *jz4770_pwm6_groups[] = { "pwm6", };
809 static const char *jz4770_pwm7_groups[] = { "pwm7", };
810 static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", };
811 static const char *jz4770_otg_groups[] = { "otg-vbus", };
812
813 static const struct function_desc jz4770_functions[] = {
814         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
815         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
816         { "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
817         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
818         { "ssi0", jz4770_ssi0_groups, ARRAY_SIZE(jz4770_ssi0_groups), },
819         { "ssi1", jz4770_ssi1_groups, ARRAY_SIZE(jz4770_ssi1_groups), },
820         { "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
821         { "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
822         { "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), },
823         { "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
824         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
825         { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
826         { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
827         { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
828         { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
829         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
830         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
831         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
832         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
833         { "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
834         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
835         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
836         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
837         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
838         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
839         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
840         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
841         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
842         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
843         { "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), },
844         { "otg", jz4770_otg_groups, ARRAY_SIZE(jz4770_otg_groups), },
845 };
846
847 static const struct ingenic_chip_info jz4770_chip_info = {
848         .num_chips = 6,
849         .reg_offset = 0x100,
850         .version = ID_JZ4770,
851         .groups = jz4770_groups,
852         .num_groups = ARRAY_SIZE(jz4770_groups),
853         .functions = jz4770_functions,
854         .num_functions = ARRAY_SIZE(jz4770_functions),
855         .pull_ups = jz4770_pull_ups,
856         .pull_downs = jz4770_pull_downs,
857 };
858
859 static const u32 jz4780_pull_ups[6] = {
860         0x3fffffff, 0xfff0f3fc, 0x0fffffff, 0xffff4fff, 0xfffffb7c, 0x7fa7f00f,
861 };
862
863 static const u32 jz4780_pull_downs[6] = {
864         0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
865 };
866
867 static int jz4780_uart2_data_pins[] = { 0x66, 0x67, };
868 static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, };
869 static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, };
870 static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, };
871 static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, };
872 static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, };
873 static int jz4780_ssi0_dt_b_pins[] = { 0x3d, };
874 static int jz4780_ssi0_dt_d_pins[] = { 0x79, };
875 static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, };
876 static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, };
877 static int jz4780_ssi0_dr_b_pins[] = { 0x34, };
878 static int jz4780_ssi0_dr_d_pins[] = { 0x74, };
879 static int jz4780_ssi0_clk_a_pins[] = { 0x12, };
880 static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, };
881 static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, };
882 static int jz4780_ssi0_clk_d_pins[] = { 0x78, };
883 static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, };
884 static int jz4780_ssi0_gpc_d_pins[] = { 0x76, };
885 static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, };
886 static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, };
887 static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, };
888 static int jz4780_ssi0_ce0_d_pins[] = { 0x77, };
889 static int jz4780_ssi0_ce1_b_pins[] = { 0x35, };
890 static int jz4780_ssi0_ce1_d_pins[] = { 0x75, };
891 static int jz4780_ssi1_dt_b_pins[] = { 0x3d, };
892 static int jz4780_ssi1_dt_d_pins[] = { 0x79, };
893 static int jz4780_ssi1_dr_b_pins[] = { 0x34, };
894 static int jz4780_ssi1_dr_d_pins[] = { 0x74, };
895 static int jz4780_ssi1_clk_b_pins[] = { 0x3c, };
896 static int jz4780_ssi1_clk_d_pins[] = { 0x78, };
897 static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, };
898 static int jz4780_ssi1_gpc_d_pins[] = { 0x76, };
899 static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, };
900 static int jz4780_ssi1_ce0_d_pins[] = { 0x77, };
901 static int jz4780_ssi1_ce1_b_pins[] = { 0x35, };
902 static int jz4780_ssi1_ce1_d_pins[] = { 0x75, };
903 static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
904 static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, };
905 static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, };
906 static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, };
907 static int jz4780_i2s_data_tx_pins[] = { 0x87, };
908 static int jz4780_i2s_data_rx_pins[] = { 0x86, };
909 static int jz4780_i2s_clk_txrx_pins[] = { 0x6c, 0x6d, };
910 static int jz4780_i2s_clk_rx_pins[] = { 0x88, 0x89, };
911 static int jz4780_i2s_sysclk_pins[] = { 0x85, };
912 static int jz4780_hdmi_ddc_pins[] = { 0xb9, 0xb8, };
913
914 static u8 jz4780_i2s_clk_txrx_funcs[] = { 1, 0, };
915
916 static const struct group_desc jz4780_groups[] = {
917         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0),
918         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0),
919         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0),
920         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0),
921         INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data, 1),
922         INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow, 1),
923         INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data,
924                                 jz4760_uart3_data_funcs),
925         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0),
926         INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data, 2),
927         INGENIC_PIN_GROUP("ssi0-dt-a-19", jz4780_ssi0_dt_a_19, 2),
928         INGENIC_PIN_GROUP("ssi0-dt-a-21", jz4780_ssi0_dt_a_21, 2),
929         INGENIC_PIN_GROUP("ssi0-dt-a-28", jz4780_ssi0_dt_a_28, 2),
930         INGENIC_PIN_GROUP("ssi0-dt-b", jz4780_ssi0_dt_b, 1),
931         INGENIC_PIN_GROUP("ssi0-dt-d", jz4780_ssi0_dt_d, 1),
932         INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0),
933         INGENIC_PIN_GROUP("ssi0-dr-a-20", jz4780_ssi0_dr_a_20, 2),
934         INGENIC_PIN_GROUP("ssi0-dr-a-27", jz4780_ssi0_dr_a_27, 2),
935         INGENIC_PIN_GROUP("ssi0-dr-b", jz4780_ssi0_dr_b, 1),
936         INGENIC_PIN_GROUP("ssi0-dr-d", jz4780_ssi0_dr_d, 1),
937         INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0),
938         INGENIC_PIN_GROUP("ssi0-clk-a", jz4780_ssi0_clk_a, 2),
939         INGENIC_PIN_GROUP("ssi0-clk-b-5", jz4780_ssi0_clk_b_5, 1),
940         INGENIC_PIN_GROUP("ssi0-clk-b-28", jz4780_ssi0_clk_b_28, 1),
941         INGENIC_PIN_GROUP("ssi0-clk-d", jz4780_ssi0_clk_d, 1),
942         INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0),
943         INGENIC_PIN_GROUP("ssi0-gpc-b", jz4780_ssi0_gpc_b, 1),
944         INGENIC_PIN_GROUP("ssi0-gpc-d", jz4780_ssi0_gpc_d, 1),
945         INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0),
946         INGENIC_PIN_GROUP("ssi0-ce0-a-23", jz4780_ssi0_ce0_a_23, 2),
947         INGENIC_PIN_GROUP("ssi0-ce0-a-25", jz4780_ssi0_ce0_a_25, 2),
948         INGENIC_PIN_GROUP("ssi0-ce0-b", jz4780_ssi0_ce0_b, 1),
949         INGENIC_PIN_GROUP("ssi0-ce0-d", jz4780_ssi0_ce0_d, 1),
950         INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0),
951         INGENIC_PIN_GROUP("ssi0-ce1-b", jz4780_ssi0_ce1_b, 1),
952         INGENIC_PIN_GROUP("ssi0-ce1-d", jz4780_ssi0_ce1_d, 1),
953         INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0),
954         INGENIC_PIN_GROUP("ssi1-dt-b", jz4780_ssi1_dt_b, 2),
955         INGENIC_PIN_GROUP("ssi1-dt-d", jz4780_ssi1_dt_d, 2),
956         INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1),
957         INGENIC_PIN_GROUP("ssi1-dr-b", jz4780_ssi1_dr_b, 2),
958         INGENIC_PIN_GROUP("ssi1-dr-d", jz4780_ssi1_dr_d, 2),
959         INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1),
960         INGENIC_PIN_GROUP("ssi1-clk-b", jz4780_ssi1_clk_b, 2),
961         INGENIC_PIN_GROUP("ssi1-clk-d", jz4780_ssi1_clk_d, 2),
962         INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1),
963         INGENIC_PIN_GROUP("ssi1-gpc-b", jz4780_ssi1_gpc_b, 2),
964         INGENIC_PIN_GROUP("ssi1-gpc-d", jz4780_ssi1_gpc_d, 2),
965         INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1),
966         INGENIC_PIN_GROUP("ssi1-ce0-b", jz4780_ssi1_ce0_b, 2),
967         INGENIC_PIN_GROUP("ssi1-ce0-d", jz4780_ssi1_ce0_d, 2),
968         INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1),
969         INGENIC_PIN_GROUP("ssi1-ce1-b", jz4780_ssi1_ce1_b, 2),
970         INGENIC_PIN_GROUP("ssi1-ce1-d", jz4780_ssi1_ce1_d, 2),
971         INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1),
972         INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a,
973                                 jz4760_mmc0_1bit_a_funcs),
974         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1),
975         INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a, 1),
976         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0),
977         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0),
978         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0),
979         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0),
980         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1),
981         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1),
982         INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0),
983         INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0),
984         INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2),
985         INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2),
986         INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data, 0),
987         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0),
988         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0),
989         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0),
990         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0),
991         INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0),
992         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0),
993         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0),
994         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0),
995         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0),
996         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0),
997         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0),
998         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0),
999         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0),
1000         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2),
1001         INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3, 1),
1002         INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e, 1),
1003         INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f, 1),
1004         INGENIC_PIN_GROUP("i2s-data-tx", jz4780_i2s_data_tx, 0),
1005         INGENIC_PIN_GROUP("i2s-data-rx", jz4780_i2s_data_rx, 0),
1006         INGENIC_PIN_GROUP_FUNCS("i2s-clk-txrx", jz4780_i2s_clk_txrx,
1007                                 jz4780_i2s_clk_txrx_funcs),
1008         INGENIC_PIN_GROUP("i2s-clk-rx", jz4780_i2s_clk_rx, 1),
1009         INGENIC_PIN_GROUP("i2s-sysclk", jz4780_i2s_sysclk, 2),
1010         INGENIC_PIN_GROUP("hdmi-ddc", jz4780_hdmi_ddc, 0),
1011         INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit, 0),
1012         INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0),
1013         INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0),
1014         { "lcd-no-pins", },
1015         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0),
1016         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0),
1017         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0),
1018         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0),
1019         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0),
1020         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0),
1021         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0),
1022         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0),
1023 };
1024
1025 static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
1026 static const char *jz4780_uart4_groups[] = { "uart4-data", };
1027 static const char *jz4780_ssi0_groups[] = {
1028         "ssi0-dt-a-19", "ssi0-dt-a-21", "ssi0-dt-a-28", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
1029         "ssi0-dr-a-20", "ssi0-dr-a-27", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1030         "ssi0-clk-a", "ssi0-clk-b-5", "ssi0-clk-b-28", "ssi0-clk-d", "ssi0-clk-e",
1031         "ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1032         "ssi0-ce0-a-23", "ssi0-ce0-a-25", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1033         "ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1034 };
1035 static const char *jz4780_ssi1_groups[] = {
1036         "ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
1037         "ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
1038         "ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
1039         "ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1040         "ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
1041         "ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1042 };
1043 static const char *jz4780_mmc0_groups[] = {
1044         "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
1045         "mmc0-1bit-e", "mmc0-4bit-e",
1046 };
1047 static const char *jz4780_mmc1_groups[] = {
1048         "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
1049 };
1050 static const char *jz4780_mmc2_groups[] = {
1051         "mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e",
1052 };
1053 static const char *jz4780_nemc_groups[] = {
1054         "nemc-data", "nemc-cle-ale", "nemc-addr",
1055         "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1056 };
1057 static const char *jz4780_i2c3_groups[] = { "i2c3-data", };
1058 static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
1059 static const char *jz4780_i2s_groups[] = {
1060         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
1061 };
1062 static const char *jz4780_cim_groups[] = { "cim-data", };
1063 static const char *jz4780_hdmi_ddc_groups[] = { "hdmi-ddc", };
1064
1065 static const struct function_desc jz4780_functions[] = {
1066         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
1067         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
1068         { "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), },
1069         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
1070         { "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), },
1071         { "ssi0", jz4780_ssi0_groups, ARRAY_SIZE(jz4780_ssi0_groups), },
1072         { "ssi1", jz4780_ssi1_groups, ARRAY_SIZE(jz4780_ssi1_groups), },
1073         { "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), },
1074         { "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), },
1075         { "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), },
1076         { "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), },
1077         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
1078         { "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
1079         { "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
1080         { "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
1081         { "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
1082         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
1083         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
1084         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
1085         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
1086         { "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), },
1087         { "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), },
1088         { "i2s", jz4780_i2s_groups, ARRAY_SIZE(jz4780_i2s_groups), },
1089         { "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), },
1090         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
1091         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
1092         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
1093         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
1094         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
1095         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
1096         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
1097         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
1098         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
1099         { "hdmi-ddc", jz4780_hdmi_ddc_groups,
1100                       ARRAY_SIZE(jz4780_hdmi_ddc_groups), },
1101 };
1102
1103 static const struct ingenic_chip_info jz4780_chip_info = {
1104         .num_chips = 6,
1105         .reg_offset = 0x100,
1106         .version = ID_JZ4780,
1107         .groups = jz4780_groups,
1108         .num_groups = ARRAY_SIZE(jz4780_groups),
1109         .functions = jz4780_functions,
1110         .num_functions = ARRAY_SIZE(jz4780_functions),
1111         .pull_ups = jz4780_pull_ups,
1112         .pull_downs = jz4780_pull_downs,
1113 };
1114
1115 static const u32 x1000_pull_ups[4] = {
1116         0xffffffff, 0xfdffffff, 0x0dffffff, 0x0000003f,
1117 };
1118
1119 static const u32 x1000_pull_downs[4] = {
1120         0x00000000, 0x02000000, 0x02000000, 0x00000000,
1121 };
1122
1123 static int x1000_uart0_data_pins[] = { 0x4a, 0x4b, };
1124 static int x1000_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
1125 static int x1000_uart1_data_a_pins[] = { 0x04, 0x05, };
1126 static int x1000_uart1_data_d_pins[] = { 0x62, 0x63, };
1127 static int x1000_uart1_hwflow_pins[] = { 0x64, 0x65, };
1128 static int x1000_uart2_data_a_pins[] = { 0x02, 0x03, };
1129 static int x1000_uart2_data_d_pins[] = { 0x65, 0x64, };
1130 static int x1000_sfc_pins[] = { 0x1d, 0x1c, 0x1e, 0x1f, 0x1a, 0x1b, };
1131 static int x1000_ssi_dt_a_22_pins[] = { 0x16, };
1132 static int x1000_ssi_dt_a_29_pins[] = { 0x1d, };
1133 static int x1000_ssi_dt_d_pins[] = { 0x62, };
1134 static int x1000_ssi_dr_a_23_pins[] = { 0x17, };
1135 static int x1000_ssi_dr_a_28_pins[] = { 0x1c, };
1136 static int x1000_ssi_dr_d_pins[] = { 0x63, };
1137 static int x1000_ssi_clk_a_24_pins[] = { 0x18, };
1138 static int x1000_ssi_clk_a_26_pins[] = { 0x1a, };
1139 static int x1000_ssi_clk_d_pins[] = { 0x60, };
1140 static int x1000_ssi_gpc_a_20_pins[] = { 0x14, };
1141 static int x1000_ssi_gpc_a_31_pins[] = { 0x1f, };
1142 static int x1000_ssi_ce0_a_25_pins[] = { 0x19, };
1143 static int x1000_ssi_ce0_a_27_pins[] = { 0x1b, };
1144 static int x1000_ssi_ce0_d_pins[] = { 0x61, };
1145 static int x1000_ssi_ce1_a_21_pins[] = { 0x15, };
1146 static int x1000_ssi_ce1_a_30_pins[] = { 0x1e, };
1147 static int x1000_mmc0_1bit_pins[] = { 0x18, 0x19, 0x17, };
1148 static int x1000_mmc0_4bit_pins[] = { 0x16, 0x15, 0x14, };
1149 static int x1000_mmc0_8bit_pins[] = { 0x13, 0x12, 0x11, 0x10, };
1150 static int x1000_mmc1_1bit_pins[] = { 0x40, 0x41, 0x42, };
1151 static int x1000_mmc1_4bit_pins[] = { 0x43, 0x44, 0x45, };
1152 static int x1000_emc_8bit_data_pins[] = {
1153         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1154 };
1155 static int x1000_emc_16bit_data_pins[] = {
1156         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1157 };
1158 static int x1000_emc_addr_pins[] = {
1159         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1160         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
1161 };
1162 static int x1000_emc_rd_we_pins[] = { 0x30, 0x31, };
1163 static int x1000_emc_wait_pins[] = { 0x34, };
1164 static int x1000_emc_cs1_pins[] = { 0x32, };
1165 static int x1000_emc_cs2_pins[] = { 0x33, };
1166 static int x1000_i2c0_pins[] = { 0x38, 0x37, };
1167 static int x1000_i2c1_a_pins[] = { 0x01, 0x00, };
1168 static int x1000_i2c1_c_pins[] = { 0x5b, 0x5a, };
1169 static int x1000_i2c2_pins[] = { 0x61, 0x60, };
1170 static int x1000_i2s_data_tx_pins[] = { 0x24, };
1171 static int x1000_i2s_data_rx_pins[] = { 0x23, };
1172 static int x1000_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
1173 static int x1000_i2s_sysclk_pins[] = { 0x20, };
1174 static int x1000_cim_pins[] = {
1175         0x08, 0x09, 0x0a, 0x0b,
1176         0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
1177 };
1178 static int x1000_lcd_8bit_pins[] = {
1179         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1180         0x30, 0x31, 0x32, 0x33, 0x34,
1181 };
1182 static int x1000_lcd_16bit_pins[] = {
1183         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1184 };
1185 static int x1000_pwm_pwm0_pins[] = { 0x59, };
1186 static int x1000_pwm_pwm1_pins[] = { 0x5a, };
1187 static int x1000_pwm_pwm2_pins[] = { 0x5b, };
1188 static int x1000_pwm_pwm3_pins[] = { 0x26, };
1189 static int x1000_pwm_pwm4_pins[] = { 0x58, };
1190 static int x1000_mac_pins[] = {
1191         0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x26,
1192 };
1193
1194 static const struct group_desc x1000_groups[] = {
1195         INGENIC_PIN_GROUP("uart0-data", x1000_uart0_data, 0),
1196         INGENIC_PIN_GROUP("uart0-hwflow", x1000_uart0_hwflow, 0),
1197         INGENIC_PIN_GROUP("uart1-data-a", x1000_uart1_data_a, 2),
1198         INGENIC_PIN_GROUP("uart1-data-d", x1000_uart1_data_d, 1),
1199         INGENIC_PIN_GROUP("uart1-hwflow", x1000_uart1_hwflow, 1),
1200         INGENIC_PIN_GROUP("uart2-data-a", x1000_uart2_data_a, 2),
1201         INGENIC_PIN_GROUP("uart2-data-d", x1000_uart2_data_d, 0),
1202         INGENIC_PIN_GROUP("sfc", x1000_sfc, 1),
1203         INGENIC_PIN_GROUP("ssi-dt-a-22", x1000_ssi_dt_a_22, 2),
1204         INGENIC_PIN_GROUP("ssi-dt-a-29", x1000_ssi_dt_a_29, 2),
1205         INGENIC_PIN_GROUP("ssi-dt-d", x1000_ssi_dt_d, 0),
1206         INGENIC_PIN_GROUP("ssi-dr-a-23", x1000_ssi_dr_a_23, 2),
1207         INGENIC_PIN_GROUP("ssi-dr-a-28", x1000_ssi_dr_a_28, 2),
1208         INGENIC_PIN_GROUP("ssi-dr-d", x1000_ssi_dr_d, 0),
1209         INGENIC_PIN_GROUP("ssi-clk-a-24", x1000_ssi_clk_a_24, 2),
1210         INGENIC_PIN_GROUP("ssi-clk-a-26", x1000_ssi_clk_a_26, 2),
1211         INGENIC_PIN_GROUP("ssi-clk-d", x1000_ssi_clk_d, 0),
1212         INGENIC_PIN_GROUP("ssi-gpc-a-20", x1000_ssi_gpc_a_20, 2),
1213         INGENIC_PIN_GROUP("ssi-gpc-a-31", x1000_ssi_gpc_a_31, 2),
1214         INGENIC_PIN_GROUP("ssi-ce0-a-25", x1000_ssi_ce0_a_25, 2),
1215         INGENIC_PIN_GROUP("ssi-ce0-a-27", x1000_ssi_ce0_a_27, 2),
1216         INGENIC_PIN_GROUP("ssi-ce0-d", x1000_ssi_ce0_d, 0),
1217         INGENIC_PIN_GROUP("ssi-ce1-a-21", x1000_ssi_ce1_a_21, 2),
1218         INGENIC_PIN_GROUP("ssi-ce1-a-30", x1000_ssi_ce1_a_30, 2),
1219         INGENIC_PIN_GROUP("mmc0-1bit", x1000_mmc0_1bit, 1),
1220         INGENIC_PIN_GROUP("mmc0-4bit", x1000_mmc0_4bit, 1),
1221         INGENIC_PIN_GROUP("mmc0-8bit", x1000_mmc0_8bit, 1),
1222         INGENIC_PIN_GROUP("mmc1-1bit", x1000_mmc1_1bit, 0),
1223         INGENIC_PIN_GROUP("mmc1-4bit", x1000_mmc1_4bit, 0),
1224         INGENIC_PIN_GROUP("emc-8bit-data", x1000_emc_8bit_data, 0),
1225         INGENIC_PIN_GROUP("emc-16bit-data", x1000_emc_16bit_data, 0),
1226         INGENIC_PIN_GROUP("emc-addr", x1000_emc_addr, 0),
1227         INGENIC_PIN_GROUP("emc-rd-we", x1000_emc_rd_we, 0),
1228         INGENIC_PIN_GROUP("emc-wait", x1000_emc_wait, 0),
1229         INGENIC_PIN_GROUP("emc-cs1", x1000_emc_cs1, 0),
1230         INGENIC_PIN_GROUP("emc-cs2", x1000_emc_cs2, 0),
1231         INGENIC_PIN_GROUP("i2c0-data", x1000_i2c0, 0),
1232         INGENIC_PIN_GROUP("i2c1-data-a", x1000_i2c1_a, 2),
1233         INGENIC_PIN_GROUP("i2c1-data-c", x1000_i2c1_c, 0),
1234         INGENIC_PIN_GROUP("i2c2-data", x1000_i2c2, 1),
1235         INGENIC_PIN_GROUP("i2s-data-tx", x1000_i2s_data_tx, 1),
1236         INGENIC_PIN_GROUP("i2s-data-rx", x1000_i2s_data_rx, 1),
1237         INGENIC_PIN_GROUP("i2s-clk-txrx", x1000_i2s_clk_txrx, 1),
1238         INGENIC_PIN_GROUP("i2s-sysclk", x1000_i2s_sysclk, 1),
1239         INGENIC_PIN_GROUP("cim-data", x1000_cim, 2),
1240         INGENIC_PIN_GROUP("lcd-8bit", x1000_lcd_8bit, 1),
1241         INGENIC_PIN_GROUP("lcd-16bit", x1000_lcd_16bit, 1),
1242         { "lcd-no-pins", },
1243         INGENIC_PIN_GROUP("pwm0", x1000_pwm_pwm0, 0),
1244         INGENIC_PIN_GROUP("pwm1", x1000_pwm_pwm1, 1),
1245         INGENIC_PIN_GROUP("pwm2", x1000_pwm_pwm2, 1),
1246         INGENIC_PIN_GROUP("pwm3", x1000_pwm_pwm3, 2),
1247         INGENIC_PIN_GROUP("pwm4", x1000_pwm_pwm4, 0),
1248         INGENIC_PIN_GROUP("mac", x1000_mac, 1),
1249 };
1250
1251 static const char *x1000_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
1252 static const char *x1000_uart1_groups[] = {
1253         "uart1-data-a", "uart1-data-d", "uart1-hwflow",
1254 };
1255 static const char *x1000_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
1256 static const char *x1000_sfc_groups[] = { "sfc", };
1257 static const char *x1000_ssi_groups[] = {
1258         "ssi-dt-a-22", "ssi-dt-a-29", "ssi-dt-d",
1259         "ssi-dr-a-23", "ssi-dr-a-28", "ssi-dr-d",
1260         "ssi-clk-a-24", "ssi-clk-a-26", "ssi-clk-d",
1261         "ssi-gpc-a-20", "ssi-gpc-a-31",
1262         "ssi-ce0-a-25", "ssi-ce0-a-27", "ssi-ce0-d",
1263         "ssi-ce1-a-21", "ssi-ce1-a-30",
1264 };
1265 static const char *x1000_mmc0_groups[] = {
1266         "mmc0-1bit", "mmc0-4bit", "mmc0-8bit",
1267 };
1268 static const char *x1000_mmc1_groups[] = {
1269         "mmc1-1bit", "mmc1-4bit",
1270 };
1271 static const char *x1000_emc_groups[] = {
1272         "emc-8bit-data", "emc-16bit-data",
1273         "emc-addr", "emc-rd-we", "emc-wait",
1274 };
1275 static const char *x1000_cs1_groups[] = { "emc-cs1", };
1276 static const char *x1000_cs2_groups[] = { "emc-cs2", };
1277 static const char *x1000_i2c0_groups[] = { "i2c0-data", };
1278 static const char *x1000_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
1279 static const char *x1000_i2c2_groups[] = { "i2c2-data", };
1280 static const char *x1000_i2s_groups[] = {
1281         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
1282 };
1283 static const char *x1000_cim_groups[] = { "cim-data", };
1284 static const char *x1000_lcd_groups[] = {
1285         "lcd-8bit", "lcd-16bit", "lcd-no-pins",
1286 };
1287 static const char *x1000_pwm0_groups[] = { "pwm0", };
1288 static const char *x1000_pwm1_groups[] = { "pwm1", };
1289 static const char *x1000_pwm2_groups[] = { "pwm2", };
1290 static const char *x1000_pwm3_groups[] = { "pwm3", };
1291 static const char *x1000_pwm4_groups[] = { "pwm4", };
1292 static const char *x1000_mac_groups[] = { "mac", };
1293
1294 static const struct function_desc x1000_functions[] = {
1295         { "uart0", x1000_uart0_groups, ARRAY_SIZE(x1000_uart0_groups), },
1296         { "uart1", x1000_uart1_groups, ARRAY_SIZE(x1000_uart1_groups), },
1297         { "uart2", x1000_uart2_groups, ARRAY_SIZE(x1000_uart2_groups), },
1298         { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
1299         { "ssi", x1000_ssi_groups, ARRAY_SIZE(x1000_ssi_groups), },
1300         { "mmc0", x1000_mmc0_groups, ARRAY_SIZE(x1000_mmc0_groups), },
1301         { "mmc1", x1000_mmc1_groups, ARRAY_SIZE(x1000_mmc1_groups), },
1302         { "emc", x1000_emc_groups, ARRAY_SIZE(x1000_emc_groups), },
1303         { "emc-cs1", x1000_cs1_groups, ARRAY_SIZE(x1000_cs1_groups), },
1304         { "emc-cs2", x1000_cs2_groups, ARRAY_SIZE(x1000_cs2_groups), },
1305         { "i2c0", x1000_i2c0_groups, ARRAY_SIZE(x1000_i2c0_groups), },
1306         { "i2c1", x1000_i2c1_groups, ARRAY_SIZE(x1000_i2c1_groups), },
1307         { "i2c2", x1000_i2c2_groups, ARRAY_SIZE(x1000_i2c2_groups), },
1308         { "i2s", x1000_i2s_groups, ARRAY_SIZE(x1000_i2s_groups), },
1309         { "cim", x1000_cim_groups, ARRAY_SIZE(x1000_cim_groups), },
1310         { "lcd", x1000_lcd_groups, ARRAY_SIZE(x1000_lcd_groups), },
1311         { "pwm0", x1000_pwm0_groups, ARRAY_SIZE(x1000_pwm0_groups), },
1312         { "pwm1", x1000_pwm1_groups, ARRAY_SIZE(x1000_pwm1_groups), },
1313         { "pwm2", x1000_pwm2_groups, ARRAY_SIZE(x1000_pwm2_groups), },
1314         { "pwm3", x1000_pwm3_groups, ARRAY_SIZE(x1000_pwm3_groups), },
1315         { "pwm4", x1000_pwm4_groups, ARRAY_SIZE(x1000_pwm4_groups), },
1316         { "mac", x1000_mac_groups, ARRAY_SIZE(x1000_mac_groups), },
1317 };
1318
1319 static const struct ingenic_chip_info x1000_chip_info = {
1320         .num_chips = 4,
1321         .reg_offset = 0x100,
1322         .version = ID_X1000,
1323         .groups = x1000_groups,
1324         .num_groups = ARRAY_SIZE(x1000_groups),
1325         .functions = x1000_functions,
1326         .num_functions = ARRAY_SIZE(x1000_functions),
1327         .pull_ups = x1000_pull_ups,
1328         .pull_downs = x1000_pull_downs,
1329 };
1330
1331 static int x1500_uart0_data_pins[] = { 0x4a, 0x4b, };
1332 static int x1500_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
1333 static int x1500_uart1_data_a_pins[] = { 0x04, 0x05, };
1334 static int x1500_uart1_data_d_pins[] = { 0x62, 0x63, };
1335 static int x1500_uart1_hwflow_pins[] = { 0x64, 0x65, };
1336 static int x1500_uart2_data_a_pins[] = { 0x02, 0x03, };
1337 static int x1500_uart2_data_d_pins[] = { 0x65, 0x64, };
1338 static int x1500_mmc_1bit_pins[] = { 0x18, 0x19, 0x17, };
1339 static int x1500_mmc_4bit_pins[] = { 0x16, 0x15, 0x14, };
1340 static int x1500_i2c0_pins[] = { 0x38, 0x37, };
1341 static int x1500_i2c1_a_pins[] = { 0x01, 0x00, };
1342 static int x1500_i2c1_c_pins[] = { 0x5b, 0x5a, };
1343 static int x1500_i2c2_pins[] = { 0x61, 0x60, };
1344 static int x1500_i2s_data_tx_pins[] = { 0x24, };
1345 static int x1500_i2s_data_rx_pins[] = { 0x23, };
1346 static int x1500_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
1347 static int x1500_i2s_sysclk_pins[] = { 0x20, };
1348 static int x1500_cim_pins[] = {
1349         0x08, 0x09, 0x0a, 0x0b,
1350         0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
1351 };
1352 static int x1500_pwm_pwm0_pins[] = { 0x59, };
1353 static int x1500_pwm_pwm1_pins[] = { 0x5a, };
1354 static int x1500_pwm_pwm2_pins[] = { 0x5b, };
1355 static int x1500_pwm_pwm3_pins[] = { 0x26, };
1356 static int x1500_pwm_pwm4_pins[] = { 0x58, };
1357
1358 static const struct group_desc x1500_groups[] = {
1359         INGENIC_PIN_GROUP("uart0-data", x1500_uart0_data, 0),
1360         INGENIC_PIN_GROUP("uart0-hwflow", x1500_uart0_hwflow, 0),
1361         INGENIC_PIN_GROUP("uart1-data-a", x1500_uart1_data_a, 2),
1362         INGENIC_PIN_GROUP("uart1-data-d", x1500_uart1_data_d, 1),
1363         INGENIC_PIN_GROUP("uart1-hwflow", x1500_uart1_hwflow, 1),
1364         INGENIC_PIN_GROUP("uart2-data-a", x1500_uart2_data_a, 2),
1365         INGENIC_PIN_GROUP("uart2-data-d", x1500_uart2_data_d, 0),
1366         INGENIC_PIN_GROUP("sfc", x1000_sfc, 1),
1367         INGENIC_PIN_GROUP("mmc-1bit", x1500_mmc_1bit, 1),
1368         INGENIC_PIN_GROUP("mmc-4bit", x1500_mmc_4bit, 1),
1369         INGENIC_PIN_GROUP("i2c0-data", x1500_i2c0, 0),
1370         INGENIC_PIN_GROUP("i2c1-data-a", x1500_i2c1_a, 2),
1371         INGENIC_PIN_GROUP("i2c1-data-c", x1500_i2c1_c, 0),
1372         INGENIC_PIN_GROUP("i2c2-data", x1500_i2c2, 1),
1373         INGENIC_PIN_GROUP("i2s-data-tx", x1500_i2s_data_tx, 1),
1374         INGENIC_PIN_GROUP("i2s-data-rx", x1500_i2s_data_rx, 1),
1375         INGENIC_PIN_GROUP("i2s-clk-txrx", x1500_i2s_clk_txrx, 1),
1376         INGENIC_PIN_GROUP("i2s-sysclk", x1500_i2s_sysclk, 1),
1377         INGENIC_PIN_GROUP("cim-data", x1500_cim, 2),
1378         { "lcd-no-pins", },
1379         INGENIC_PIN_GROUP("pwm0", x1500_pwm_pwm0, 0),
1380         INGENIC_PIN_GROUP("pwm1", x1500_pwm_pwm1, 1),
1381         INGENIC_PIN_GROUP("pwm2", x1500_pwm_pwm2, 1),
1382         INGENIC_PIN_GROUP("pwm3", x1500_pwm_pwm3, 2),
1383         INGENIC_PIN_GROUP("pwm4", x1500_pwm_pwm4, 0),
1384 };
1385
1386 static const char *x1500_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
1387 static const char *x1500_uart1_groups[] = {
1388         "uart1-data-a", "uart1-data-d", "uart1-hwflow",
1389 };
1390 static const char *x1500_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
1391 static const char *x1500_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
1392 static const char *x1500_i2c0_groups[] = { "i2c0-data", };
1393 static const char *x1500_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
1394 static const char *x1500_i2c2_groups[] = { "i2c2-data", };
1395 static const char *x1500_i2s_groups[] = {
1396         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
1397 };
1398 static const char *x1500_cim_groups[] = { "cim-data", };
1399 static const char *x1500_lcd_groups[] = { "lcd-no-pins", };
1400 static const char *x1500_pwm0_groups[] = { "pwm0", };
1401 static const char *x1500_pwm1_groups[] = { "pwm1", };
1402 static const char *x1500_pwm2_groups[] = { "pwm2", };
1403 static const char *x1500_pwm3_groups[] = { "pwm3", };
1404 static const char *x1500_pwm4_groups[] = { "pwm4", };
1405
1406 static const struct function_desc x1500_functions[] = {
1407         { "uart0", x1500_uart0_groups, ARRAY_SIZE(x1500_uart0_groups), },
1408         { "uart1", x1500_uart1_groups, ARRAY_SIZE(x1500_uart1_groups), },
1409         { "uart2", x1500_uart2_groups, ARRAY_SIZE(x1500_uart2_groups), },
1410         { "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
1411         { "mmc", x1500_mmc_groups, ARRAY_SIZE(x1500_mmc_groups), },
1412         { "i2c0", x1500_i2c0_groups, ARRAY_SIZE(x1500_i2c0_groups), },
1413         { "i2c1", x1500_i2c1_groups, ARRAY_SIZE(x1500_i2c1_groups), },
1414         { "i2c2", x1500_i2c2_groups, ARRAY_SIZE(x1500_i2c2_groups), },
1415         { "i2s", x1500_i2s_groups, ARRAY_SIZE(x1500_i2s_groups), },
1416         { "cim", x1500_cim_groups, ARRAY_SIZE(x1500_cim_groups), },
1417         { "lcd", x1500_lcd_groups, ARRAY_SIZE(x1500_lcd_groups), },
1418         { "pwm0", x1500_pwm0_groups, ARRAY_SIZE(x1500_pwm0_groups), },
1419         { "pwm1", x1500_pwm1_groups, ARRAY_SIZE(x1500_pwm1_groups), },
1420         { "pwm2", x1500_pwm2_groups, ARRAY_SIZE(x1500_pwm2_groups), },
1421         { "pwm3", x1500_pwm3_groups, ARRAY_SIZE(x1500_pwm3_groups), },
1422         { "pwm4", x1500_pwm4_groups, ARRAY_SIZE(x1500_pwm4_groups), },
1423 };
1424
1425 static const struct ingenic_chip_info x1500_chip_info = {
1426         .num_chips = 4,
1427         .reg_offset = 0x100,
1428         .version = ID_X1500,
1429         .groups = x1500_groups,
1430         .num_groups = ARRAY_SIZE(x1500_groups),
1431         .functions = x1500_functions,
1432         .num_functions = ARRAY_SIZE(x1500_functions),
1433         .pull_ups = x1000_pull_ups,
1434         .pull_downs = x1000_pull_downs,
1435 };
1436
1437 static const u32 x1830_pull_ups[4] = {
1438         0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
1439 };
1440
1441 static const u32 x1830_pull_downs[4] = {
1442         0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
1443 };
1444
1445 static int x1830_uart0_data_pins[] = { 0x33, 0x36, };
1446 static int x1830_uart0_hwflow_pins[] = { 0x34, 0x35, };
1447 static int x1830_uart1_data_pins[] = { 0x38, 0x37, };
1448 static int x1830_sfc_pins[] = { 0x17, 0x18, 0x1a, 0x19, 0x1b, 0x1c, };
1449 static int x1830_ssi0_dt_pins[] = { 0x4c, };
1450 static int x1830_ssi0_dr_pins[] = { 0x4b, };
1451 static int x1830_ssi0_clk_pins[] = { 0x4f, };
1452 static int x1830_ssi0_gpc_pins[] = { 0x4d, };
1453 static int x1830_ssi0_ce0_pins[] = { 0x50, };
1454 static int x1830_ssi0_ce1_pins[] = { 0x4e, };
1455 static int x1830_ssi1_dt_c_pins[] = { 0x53, };
1456 static int x1830_ssi1_dr_c_pins[] = { 0x54, };
1457 static int x1830_ssi1_clk_c_pins[] = { 0x57, };
1458 static int x1830_ssi1_gpc_c_pins[] = { 0x55, };
1459 static int x1830_ssi1_ce0_c_pins[] = { 0x58, };
1460 static int x1830_ssi1_ce1_c_pins[] = { 0x56, };
1461 static int x1830_ssi1_dt_d_pins[] = { 0x62, };
1462 static int x1830_ssi1_dr_d_pins[] = { 0x63, };
1463 static int x1830_ssi1_clk_d_pins[] = { 0x66, };
1464 static int x1830_ssi1_gpc_d_pins[] = { 0x64, };
1465 static int x1830_ssi1_ce0_d_pins[] = { 0x67, };
1466 static int x1830_ssi1_ce1_d_pins[] = { 0x65, };
1467 static int x1830_mmc0_1bit_pins[] = { 0x24, 0x25, 0x20, };
1468 static int x1830_mmc0_4bit_pins[] = { 0x21, 0x22, 0x23, };
1469 static int x1830_mmc1_1bit_pins[] = { 0x42, 0x43, 0x44, };
1470 static int x1830_mmc1_4bit_pins[] = { 0x45, 0x46, 0x47, };
1471 static int x1830_i2c0_pins[] = { 0x0c, 0x0d, };
1472 static int x1830_i2c1_pins[] = { 0x39, 0x3a, };
1473 static int x1830_i2c2_pins[] = { 0x5b, 0x5c, };
1474 static int x1830_i2s_data_tx_pins[] = { 0x53, };
1475 static int x1830_i2s_data_rx_pins[] = { 0x54, };
1476 static int x1830_i2s_clk_txrx_pins[] = { 0x58, 0x52, };
1477 static int x1830_i2s_clk_rx_pins[] = { 0x56, 0x55, };
1478 static int x1830_i2s_sysclk_pins[] = { 0x57, };
1479 static int x1830_lcd_rgb_18bit_pins[] = {
1480         0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
1481         0x68, 0x69, 0x6c, 0x6d, 0x6e, 0x6f,
1482         0x70, 0x71, 0x72, 0x73, 0x76, 0x77,
1483         0x78, 0x79, 0x7a, 0x7b,
1484 };
1485 static int x1830_lcd_slcd_8bit_pins[] = {
1486         0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d,
1487         0x69, 0x72, 0x73, 0x7b, 0x7a,
1488 };
1489 static int x1830_lcd_slcd_16bit_pins[] = {
1490         0x6e, 0x6f, 0x70, 0x71, 0x76, 0x77, 0x78, 0x79,
1491 };
1492 static int x1830_pwm_pwm0_b_pins[] = { 0x31, };
1493 static int x1830_pwm_pwm0_c_pins[] = { 0x4b, };
1494 static int x1830_pwm_pwm1_b_pins[] = { 0x32, };
1495 static int x1830_pwm_pwm1_c_pins[] = { 0x4c, };
1496 static int x1830_pwm_pwm2_c_8_pins[] = { 0x48, };
1497 static int x1830_pwm_pwm2_c_13_pins[] = { 0x4d, };
1498 static int x1830_pwm_pwm3_c_9_pins[] = { 0x49, };
1499 static int x1830_pwm_pwm3_c_14_pins[] = { 0x4e, };
1500 static int x1830_pwm_pwm4_c_15_pins[] = { 0x4f, };
1501 static int x1830_pwm_pwm4_c_25_pins[] = { 0x59, };
1502 static int x1830_pwm_pwm5_c_16_pins[] = { 0x50, };
1503 static int x1830_pwm_pwm5_c_26_pins[] = { 0x5a, };
1504 static int x1830_pwm_pwm6_c_17_pins[] = { 0x51, };
1505 static int x1830_pwm_pwm6_c_27_pins[] = { 0x5b, };
1506 static int x1830_pwm_pwm7_c_18_pins[] = { 0x52, };
1507 static int x1830_pwm_pwm7_c_28_pins[] = { 0x5c, };
1508 static int x1830_mac_pins[] = {
1509         0x29, 0x30, 0x2f, 0x28, 0x2e, 0x2d, 0x2a, 0x2b, 0x26, 0x27,
1510 };
1511
1512 static const struct group_desc x1830_groups[] = {
1513         INGENIC_PIN_GROUP("uart0-data", x1830_uart0_data, 0),
1514         INGENIC_PIN_GROUP("uart0-hwflow", x1830_uart0_hwflow, 0),
1515         INGENIC_PIN_GROUP("uart1-data", x1830_uart1_data, 0),
1516         INGENIC_PIN_GROUP("sfc", x1830_sfc, 1),
1517         INGENIC_PIN_GROUP("ssi0-dt", x1830_ssi0_dt, 0),
1518         INGENIC_PIN_GROUP("ssi0-dr", x1830_ssi0_dr, 0),
1519         INGENIC_PIN_GROUP("ssi0-clk", x1830_ssi0_clk, 0),
1520         INGENIC_PIN_GROUP("ssi0-gpc", x1830_ssi0_gpc, 0),
1521         INGENIC_PIN_GROUP("ssi0-ce0", x1830_ssi0_ce0, 0),
1522         INGENIC_PIN_GROUP("ssi0-ce1", x1830_ssi0_ce1, 0),
1523         INGENIC_PIN_GROUP("ssi1-dt-c", x1830_ssi1_dt_c, 1),
1524         INGENIC_PIN_GROUP("ssi1-dr-c", x1830_ssi1_dr_c, 1),
1525         INGENIC_PIN_GROUP("ssi1-clk-c", x1830_ssi1_clk_c, 1),
1526         INGENIC_PIN_GROUP("ssi1-gpc-c", x1830_ssi1_gpc_c, 1),
1527         INGENIC_PIN_GROUP("ssi1-ce0-c", x1830_ssi1_ce0_c, 1),
1528         INGENIC_PIN_GROUP("ssi1-ce1-c", x1830_ssi1_ce1_c, 1),
1529         INGENIC_PIN_GROUP("ssi1-dt-d", x1830_ssi1_dt_d, 2),
1530         INGENIC_PIN_GROUP("ssi1-dr-d", x1830_ssi1_dr_d, 2),
1531         INGENIC_PIN_GROUP("ssi1-clk-d", x1830_ssi1_clk_d, 2),
1532         INGENIC_PIN_GROUP("ssi1-gpc-d", x1830_ssi1_gpc_d, 2),
1533         INGENIC_PIN_GROUP("ssi1-ce0-d", x1830_ssi1_ce0_d, 2),
1534         INGENIC_PIN_GROUP("ssi1-ce1-d", x1830_ssi1_ce1_d, 2),
1535         INGENIC_PIN_GROUP("mmc0-1bit", x1830_mmc0_1bit, 0),
1536         INGENIC_PIN_GROUP("mmc0-4bit", x1830_mmc0_4bit, 0),
1537         INGENIC_PIN_GROUP("mmc1-1bit", x1830_mmc1_1bit, 0),
1538         INGENIC_PIN_GROUP("mmc1-4bit", x1830_mmc1_4bit, 0),
1539         INGENIC_PIN_GROUP("i2c0-data", x1830_i2c0, 1),
1540         INGENIC_PIN_GROUP("i2c1-data", x1830_i2c1, 0),
1541         INGENIC_PIN_GROUP("i2c2-data", x1830_i2c2, 1),
1542         INGENIC_PIN_GROUP("i2s-data-tx", x1830_i2s_data_tx, 0),
1543         INGENIC_PIN_GROUP("i2s-data-rx", x1830_i2s_data_rx, 0),
1544         INGENIC_PIN_GROUP("i2s-clk-txrx", x1830_i2s_clk_txrx, 0),
1545         INGENIC_PIN_GROUP("i2s-clk-rx", x1830_i2s_clk_rx, 0),
1546         INGENIC_PIN_GROUP("i2s-sysclk", x1830_i2s_sysclk, 0),
1547         INGENIC_PIN_GROUP("lcd-rgb-18bit", x1830_lcd_rgb_18bit, 0),
1548         INGENIC_PIN_GROUP("lcd-slcd-8bit", x1830_lcd_slcd_8bit, 1),
1549         INGENIC_PIN_GROUP("lcd-slcd-16bit", x1830_lcd_slcd_16bit, 1),
1550         { "lcd-no-pins", },
1551         INGENIC_PIN_GROUP("pwm0-b", x1830_pwm_pwm0_b, 0),
1552         INGENIC_PIN_GROUP("pwm0-c", x1830_pwm_pwm0_c, 1),
1553         INGENIC_PIN_GROUP("pwm1-b", x1830_pwm_pwm1_b, 0),
1554         INGENIC_PIN_GROUP("pwm1-c", x1830_pwm_pwm1_c, 1),
1555         INGENIC_PIN_GROUP("pwm2-c-8", x1830_pwm_pwm2_c_8, 0),
1556         INGENIC_PIN_GROUP("pwm2-c-13", x1830_pwm_pwm2_c_13, 1),
1557         INGENIC_PIN_GROUP("pwm3-c-9", x1830_pwm_pwm3_c_9, 0),
1558         INGENIC_PIN_GROUP("pwm3-c-14", x1830_pwm_pwm3_c_14, 1),
1559         INGENIC_PIN_GROUP("pwm4-c-15", x1830_pwm_pwm4_c_15, 1),
1560         INGENIC_PIN_GROUP("pwm4-c-25", x1830_pwm_pwm4_c_25, 0),
1561         INGENIC_PIN_GROUP("pwm5-c-16", x1830_pwm_pwm5_c_16, 1),
1562         INGENIC_PIN_GROUP("pwm5-c-26", x1830_pwm_pwm5_c_26, 0),
1563         INGENIC_PIN_GROUP("pwm6-c-17", x1830_pwm_pwm6_c_17, 1),
1564         INGENIC_PIN_GROUP("pwm6-c-27", x1830_pwm_pwm6_c_27, 0),
1565         INGENIC_PIN_GROUP("pwm7-c-18", x1830_pwm_pwm7_c_18, 1),
1566         INGENIC_PIN_GROUP("pwm7-c-28", x1830_pwm_pwm7_c_28, 0),
1567         INGENIC_PIN_GROUP("mac", x1830_mac, 0),
1568 };
1569
1570 static const char *x1830_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
1571 static const char *x1830_uart1_groups[] = { "uart1-data", };
1572 static const char *x1830_sfc_groups[] = { "sfc", };
1573 static const char *x1830_ssi0_groups[] = {
1574         "ssi0-dt", "ssi0-dr", "ssi0-clk", "ssi0-gpc", "ssi0-ce0", "ssi0-ce1",
1575 };
1576 static const char *x1830_ssi1_groups[] = {
1577         "ssi1-dt-c", "ssi1-dt-d",
1578         "ssi1-dr-c", "ssi1-dr-d",
1579         "ssi1-clk-c", "ssi1-clk-d",
1580         "ssi1-gpc-c", "ssi1-gpc-d",
1581         "ssi1-ce0-c", "ssi1-ce0-d",
1582         "ssi1-ce1-c", "ssi1-ce1-d",
1583 };
1584 static const char *x1830_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
1585 static const char *x1830_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
1586 static const char *x1830_i2c0_groups[] = { "i2c0-data", };
1587 static const char *x1830_i2c1_groups[] = { "i2c1-data", };
1588 static const char *x1830_i2c2_groups[] = { "i2c2-data", };
1589 static const char *x1830_i2s_groups[] = {
1590         "i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
1591 };
1592 static const char *x1830_lcd_groups[] = {
1593         "lcd-rgb-18bit", "lcd-slcd-8bit", "lcd-slcd-16bit", "lcd-no-pins",
1594 };
1595 static const char *x1830_pwm0_groups[] = { "pwm0-b", "pwm0-c", };
1596 static const char *x1830_pwm1_groups[] = { "pwm1-b", "pwm1-c", };
1597 static const char *x1830_pwm2_groups[] = { "pwm2-c-8", "pwm2-c-13", };
1598 static const char *x1830_pwm3_groups[] = { "pwm3-c-9", "pwm3-c-14", };
1599 static const char *x1830_pwm4_groups[] = { "pwm4-c-15", "pwm4-c-25", };
1600 static const char *x1830_pwm5_groups[] = { "pwm5-c-16", "pwm5-c-26", };
1601 static const char *x1830_pwm6_groups[] = { "pwm6-c-17", "pwm6-c-27", };
1602 static const char *x1830_pwm7_groups[] = { "pwm7-c-18", "pwm7-c-28", };
1603 static const char *x1830_mac_groups[] = { "mac", };
1604
1605 static const struct function_desc x1830_functions[] = {
1606         { "uart0", x1830_uart0_groups, ARRAY_SIZE(x1830_uart0_groups), },
1607         { "uart1", x1830_uart1_groups, ARRAY_SIZE(x1830_uart1_groups), },
1608         { "sfc", x1830_sfc_groups, ARRAY_SIZE(x1830_sfc_groups), },
1609         { "ssi0", x1830_ssi0_groups, ARRAY_SIZE(x1830_ssi0_groups), },
1610         { "ssi1", x1830_ssi1_groups, ARRAY_SIZE(x1830_ssi1_groups), },
1611         { "mmc0", x1830_mmc0_groups, ARRAY_SIZE(x1830_mmc0_groups), },
1612         { "mmc1", x1830_mmc1_groups, ARRAY_SIZE(x1830_mmc1_groups), },
1613         { "i2c0", x1830_i2c0_groups, ARRAY_SIZE(x1830_i2c0_groups), },
1614         { "i2c1", x1830_i2c1_groups, ARRAY_SIZE(x1830_i2c1_groups), },
1615         { "i2c2", x1830_i2c2_groups, ARRAY_SIZE(x1830_i2c2_groups), },
1616         { "i2s", x1830_i2s_groups, ARRAY_SIZE(x1830_i2s_groups), },
1617         { "lcd", x1830_lcd_groups, ARRAY_SIZE(x1830_lcd_groups), },
1618         { "pwm0", x1830_pwm0_groups, ARRAY_SIZE(x1830_pwm0_groups), },
1619         { "pwm1", x1830_pwm1_groups, ARRAY_SIZE(x1830_pwm1_groups), },
1620         { "pwm2", x1830_pwm2_groups, ARRAY_SIZE(x1830_pwm2_groups), },
1621         { "pwm3", x1830_pwm3_groups, ARRAY_SIZE(x1830_pwm3_groups), },
1622         { "pwm4", x1830_pwm4_groups, ARRAY_SIZE(x1830_pwm4_groups), },
1623         { "pwm5", x1830_pwm5_groups, ARRAY_SIZE(x1830_pwm4_groups), },
1624         { "pwm6", x1830_pwm6_groups, ARRAY_SIZE(x1830_pwm4_groups), },
1625         { "pwm7", x1830_pwm7_groups, ARRAY_SIZE(x1830_pwm4_groups), },
1626         { "mac", x1830_mac_groups, ARRAY_SIZE(x1830_mac_groups), },
1627 };
1628
1629 static const struct ingenic_chip_info x1830_chip_info = {
1630         .num_chips = 4,
1631         .reg_offset = 0x1000,
1632         .version = ID_X1830,
1633         .groups = x1830_groups,
1634         .num_groups = ARRAY_SIZE(x1830_groups),
1635         .functions = x1830_functions,
1636         .num_functions = ARRAY_SIZE(x1830_functions),
1637         .pull_ups = x1830_pull_ups,
1638         .pull_downs = x1830_pull_downs,
1639 };
1640
1641 static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg)
1642 {
1643         unsigned int val;
1644
1645         regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val);
1646
1647         return (u32) val;
1648 }
1649
1650 static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc,
1651                 u8 reg, u8 offset, bool set)
1652 {
1653         if (set)
1654                 reg = REG_SET(reg);
1655         else
1656                 reg = REG_CLEAR(reg);
1657
1658         regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset));
1659 }
1660
1661 static void ingenic_gpio_shadow_set_bit(struct ingenic_gpio_chip *jzgc,
1662                 u8 reg, u8 offset, bool set)
1663 {
1664         if (set)
1665                 reg = REG_SET(reg);
1666         else
1667                 reg = REG_CLEAR(reg);
1668
1669         regmap_write(jzgc->jzpc->map, REG_PZ_BASE(
1670                         jzgc->jzpc->info->reg_offset) + reg, BIT(offset));
1671 }
1672
1673 static void ingenic_gpio_shadow_set_bit_load(struct ingenic_gpio_chip *jzgc)
1674 {
1675         regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD(
1676                         jzgc->jzpc->info->reg_offset),
1677                         jzgc->gc.base / PINS_PER_GPIO_CHIP);
1678 }
1679
1680 static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,
1681                                           u8 offset)
1682 {
1683         unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN);
1684
1685         return !!(val & BIT(offset));
1686 }
1687
1688 static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc,
1689                                    u8 offset, int value)
1690 {
1691         if (jzgc->jzpc->info->version >= ID_JZ4760)
1692                 ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_PAT0, offset, !!value);
1693         else
1694                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value);
1695 }
1696
1697 static void irq_set_type(struct ingenic_gpio_chip *jzgc,
1698                 u8 offset, unsigned int type)
1699 {
1700         u8 reg1, reg2;
1701         bool val1, val2;
1702
1703         switch (type) {
1704         case IRQ_TYPE_EDGE_RISING:
1705                 val1 = val2 = true;
1706                 break;
1707         case IRQ_TYPE_EDGE_FALLING:
1708                 val1 = false;
1709                 val2 = true;
1710                 break;
1711         case IRQ_TYPE_LEVEL_HIGH:
1712                 val1 = true;
1713                 val2 = false;
1714                 break;
1715         case IRQ_TYPE_LEVEL_LOW:
1716         default:
1717                 val1 = val2 = false;
1718                 break;
1719         }
1720
1721         if (jzgc->jzpc->info->version >= ID_JZ4760) {
1722                 reg1 = JZ4760_GPIO_PAT1;
1723                 reg2 = JZ4760_GPIO_PAT0;
1724         } else {
1725                 reg1 = JZ4740_GPIO_TRIG;
1726                 reg2 = JZ4740_GPIO_DIR;
1727         }
1728
1729         if (jzgc->jzpc->info->version >= ID_X1000) {
1730                 ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1);
1731                 ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2);
1732                 ingenic_gpio_shadow_set_bit_load(jzgc);
1733         } else {
1734                 ingenic_gpio_set_bit(jzgc, reg2, offset, val1);
1735                 ingenic_gpio_set_bit(jzgc, reg1, offset, val2);
1736         }
1737 }
1738
1739 static void ingenic_gpio_irq_mask(struct irq_data *irqd)
1740 {
1741         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1742         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1743
1744         ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, true);
1745 }
1746
1747 static void ingenic_gpio_irq_unmask(struct irq_data *irqd)
1748 {
1749         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1750         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1751
1752         ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, false);
1753 }
1754
1755 static void ingenic_gpio_irq_enable(struct irq_data *irqd)
1756 {
1757         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1758         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1759         int irq = irqd->hwirq;
1760
1761         if (jzgc->jzpc->info->version >= ID_JZ4760)
1762                 ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_INT, irq, true);
1763         else
1764                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true);
1765
1766         ingenic_gpio_irq_unmask(irqd);
1767 }
1768
1769 static void ingenic_gpio_irq_disable(struct irq_data *irqd)
1770 {
1771         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1772         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1773         int irq = irqd->hwirq;
1774
1775         ingenic_gpio_irq_mask(irqd);
1776
1777         if (jzgc->jzpc->info->version >= ID_JZ4760)
1778                 ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_INT, irq, false);
1779         else
1780                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false);
1781 }
1782
1783 static void ingenic_gpio_irq_ack(struct irq_data *irqd)
1784 {
1785         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1786         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1787         int irq = irqd->hwirq;
1788         bool high;
1789
1790         if (irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) {
1791                 /*
1792                  * Switch to an interrupt for the opposite edge to the one that
1793                  * triggered the interrupt being ACKed.
1794                  */
1795                 high = ingenic_gpio_get_value(jzgc, irq);
1796                 if (high)
1797                         irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_LOW);
1798                 else
1799                         irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_HIGH);
1800         }
1801
1802         if (jzgc->jzpc->info->version >= ID_JZ4760)
1803                 ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_FLAG, irq, false);
1804         else
1805                 ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true);
1806 }
1807
1808 static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
1809 {
1810         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1811         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1812
1813         switch (type) {
1814         case IRQ_TYPE_EDGE_BOTH:
1815         case IRQ_TYPE_EDGE_RISING:
1816         case IRQ_TYPE_EDGE_FALLING:
1817                 irq_set_handler_locked(irqd, handle_edge_irq);
1818                 break;
1819         case IRQ_TYPE_LEVEL_HIGH:
1820         case IRQ_TYPE_LEVEL_LOW:
1821                 irq_set_handler_locked(irqd, handle_level_irq);
1822                 break;
1823         default:
1824                 irq_set_handler_locked(irqd, handle_bad_irq);
1825         }
1826
1827         if (type == IRQ_TYPE_EDGE_BOTH) {
1828                 /*
1829                  * The hardware does not support interrupts on both edges. The
1830                  * best we can do is to set up a single-edge interrupt and then
1831                  * switch to the opposing edge when ACKing the interrupt.
1832                  */
1833                 bool high = ingenic_gpio_get_value(jzgc, irqd->hwirq);
1834
1835                 type = high ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH;
1836         }
1837
1838         irq_set_type(jzgc, irqd->hwirq, type);
1839         return 0;
1840 }
1841
1842 static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on)
1843 {
1844         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
1845         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1846
1847         return irq_set_irq_wake(jzgc->irq, on);
1848 }
1849
1850 static void ingenic_gpio_irq_handler(struct irq_desc *desc)
1851 {
1852         struct gpio_chip *gc = irq_desc_get_handler_data(desc);
1853         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1854         struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data);
1855         unsigned long flag, i;
1856
1857         chained_irq_enter(irq_chip, desc);
1858
1859         if (jzgc->jzpc->info->version >= ID_JZ4760)
1860                 flag = ingenic_gpio_read_reg(jzgc, JZ4760_GPIO_FLAG);
1861         else
1862                 flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG);
1863
1864         for_each_set_bit(i, &flag, 32)
1865                 generic_handle_irq(irq_linear_revmap(gc->irq.domain, i));
1866         chained_irq_exit(irq_chip, desc);
1867 }
1868
1869 static void ingenic_gpio_set(struct gpio_chip *gc,
1870                 unsigned int offset, int value)
1871 {
1872         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1873
1874         ingenic_gpio_set_value(jzgc, offset, value);
1875 }
1876
1877 static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset)
1878 {
1879         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1880
1881         return (int) ingenic_gpio_get_value(jzgc, offset);
1882 }
1883
1884 static int ingenic_gpio_direction_input(struct gpio_chip *gc,
1885                 unsigned int offset)
1886 {
1887         return pinctrl_gpio_direction_input(gc->base + offset);
1888 }
1889
1890 static int ingenic_gpio_direction_output(struct gpio_chip *gc,
1891                 unsigned int offset, int value)
1892 {
1893         ingenic_gpio_set(gc, offset, value);
1894         return pinctrl_gpio_direction_output(gc->base + offset);
1895 }
1896
1897 static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
1898                 unsigned int pin, u8 reg, bool set)
1899 {
1900         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1901         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1902
1903         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
1904                         (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
1905 }
1906
1907 static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc,
1908                 unsigned int pin, u8 reg, bool set)
1909 {
1910         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1911
1912         regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) +
1913                         (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
1914 }
1915
1916 static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc,
1917                 unsigned int pin)
1918 {
1919         regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset),
1920                         pin / PINS_PER_GPIO_CHIP);
1921 }
1922
1923 static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
1924                 unsigned int pin, u8 reg)
1925 {
1926         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1927         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1928         unsigned int val;
1929
1930         regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val);
1931
1932         return val & BIT(idx);
1933 }
1934
1935 static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
1936 {
1937         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
1938         struct ingenic_pinctrl *jzpc = jzgc->jzpc;
1939         unsigned int pin = gc->base + offset;
1940
1941         if (jzpc->info->version >= ID_JZ4760) {
1942                 if (ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_INT) ||
1943                     ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PAT1))
1944                         return GPIO_LINE_DIRECTION_IN;
1945                 return GPIO_LINE_DIRECTION_OUT;
1946         }
1947
1948         if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
1949                 return GPIO_LINE_DIRECTION_IN;
1950
1951         if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR))
1952                 return GPIO_LINE_DIRECTION_OUT;
1953
1954         return GPIO_LINE_DIRECTION_IN;
1955 }
1956
1957 static const struct pinctrl_ops ingenic_pctlops = {
1958         .get_groups_count = pinctrl_generic_get_group_count,
1959         .get_group_name = pinctrl_generic_get_group_name,
1960         .get_group_pins = pinctrl_generic_get_group_pins,
1961         .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
1962         .dt_free_map = pinconf_generic_dt_free_map,
1963 };
1964
1965 static int ingenic_gpio_irq_request(struct irq_data *data)
1966 {
1967         struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
1968         int ret;
1969
1970         ret = ingenic_gpio_direction_input(gpio_chip, data->hwirq);
1971         if (ret)
1972                 return ret;
1973
1974         return gpiochip_reqres_irq(gpio_chip, data->hwirq);
1975 }
1976
1977 static void ingenic_gpio_irq_release(struct irq_data *data)
1978 {
1979         struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
1980
1981         return gpiochip_relres_irq(gpio_chip, data->hwirq);
1982 }
1983
1984 static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
1985                 int pin, int func)
1986 {
1987         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
1988         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
1989
1990         dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n",
1991                         'A' + offt, idx, func);
1992
1993         if (jzpc->info->version >= ID_X1000) {
1994                 ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
1995                 ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false);
1996                 ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, func & 0x2);
1997                 ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, func & 0x1);
1998                 ingenic_shadow_config_pin_load(jzpc, pin);
1999         } else if (jzpc->info->version >= ID_JZ4760) {
2000                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
2001                 ingenic_config_pin(jzpc, pin, GPIO_MSK, false);
2002                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, func & 0x2);
2003                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, func & 0x1);
2004         } else {
2005                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
2006                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
2007                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func > 0);
2008         }
2009
2010         return 0;
2011 }
2012
2013 static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
2014                 unsigned int selector, unsigned int group)
2015 {
2016         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
2017         struct function_desc *func;
2018         struct group_desc *grp;
2019         unsigned int i;
2020         uintptr_t mode;
2021         u8 *pin_modes;
2022
2023         func = pinmux_generic_get_function(pctldev, selector);
2024         if (!func)
2025                 return -EINVAL;
2026
2027         grp = pinctrl_generic_get_group(pctldev, group);
2028         if (!grp)
2029                 return -EINVAL;
2030
2031         dev_dbg(pctldev->dev, "enable function %s group %s\n",
2032                 func->name, grp->name);
2033
2034         mode = (uintptr_t)grp->data;
2035         if (mode <= 3) {
2036                 for (i = 0; i < grp->num_pins; i++)
2037                         ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], mode);
2038         } else {
2039                 pin_modes = grp->data;
2040
2041                 for (i = 0; i < grp->num_pins; i++)
2042                         ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
2043         }
2044
2045         return 0;
2046 }
2047
2048 static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
2049                 struct pinctrl_gpio_range *range,
2050                 unsigned int pin, bool input)
2051 {
2052         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
2053         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
2054         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
2055
2056         dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n",
2057                         'A' + offt, idx, input ? "in" : "out");
2058
2059         if (jzpc->info->version >= ID_X1000) {
2060                 ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
2061                 ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true);
2062                 ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, input);
2063                 ingenic_shadow_config_pin_load(jzpc, pin);
2064         } else if (jzpc->info->version >= ID_JZ4760) {
2065                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
2066                 ingenic_config_pin(jzpc, pin, GPIO_MSK, true);
2067                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, input);
2068         } else {
2069                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
2070                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input);
2071                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
2072         }
2073
2074         return 0;
2075 }
2076
2077 static const struct pinmux_ops ingenic_pmxops = {
2078         .get_functions_count = pinmux_generic_get_function_count,
2079         .get_function_name = pinmux_generic_get_function_name,
2080         .get_function_groups = pinmux_generic_get_function_groups,
2081         .set_mux = ingenic_pinmux_set_mux,
2082         .gpio_set_direction = ingenic_pinmux_gpio_set_direction,
2083 };
2084
2085 static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
2086                 unsigned int pin, unsigned long *config)
2087 {
2088         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
2089         enum pin_config_param param = pinconf_to_config_param(*config);
2090         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
2091         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
2092         bool pull;
2093
2094         if (jzpc->info->version >= ID_JZ4760)
2095                 pull = !ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PEN);
2096         else
2097                 pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
2098
2099         switch (param) {
2100         case PIN_CONFIG_BIAS_DISABLE:
2101                 if (pull)
2102                         return -EINVAL;
2103                 break;
2104
2105         case PIN_CONFIG_BIAS_PULL_UP:
2106                 if (!pull || !(jzpc->info->pull_ups[offt] & BIT(idx)))
2107                         return -EINVAL;
2108                 break;
2109
2110         case PIN_CONFIG_BIAS_PULL_DOWN:
2111                 if (!pull || !(jzpc->info->pull_downs[offt] & BIT(idx)))
2112                         return -EINVAL;
2113                 break;
2114
2115         default:
2116                 return -ENOTSUPP;
2117         }
2118
2119         *config = pinconf_to_config_packed(param, 1);
2120         return 0;
2121 }
2122
2123 static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
2124                 unsigned int pin, unsigned int bias)
2125 {
2126         if (jzpc->info->version >= ID_X1830) {
2127                 unsigned int idx = pin % PINS_PER_GPIO_CHIP;
2128                 unsigned int half = PINS_PER_GPIO_CHIP / 2;
2129                 unsigned int idxh = pin % half * 2;
2130                 unsigned int offt = pin / PINS_PER_GPIO_CHIP;
2131
2132                 if (idx < half) {
2133                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
2134                                         REG_CLEAR(X1830_GPIO_PEL), 3 << idxh);
2135                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
2136                                         REG_SET(X1830_GPIO_PEL), bias << idxh);
2137                 } else {
2138                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
2139                                         REG_CLEAR(X1830_GPIO_PEH), 3 << idxh);
2140                         regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
2141                                         REG_SET(X1830_GPIO_PEH), bias << idxh);
2142                 }
2143
2144         } else if (jzpc->info->version >= ID_JZ4760) {
2145                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PEN, !bias);
2146         } else {
2147                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias);
2148         }
2149 }
2150
2151 static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc,
2152                                      unsigned int pin, bool high)
2153 {
2154         if (jzpc->info->version >= ID_JZ4760)
2155                 ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, high);
2156         else
2157                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high);
2158 }
2159
2160 static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
2161                 unsigned long *configs, unsigned int num_configs)
2162 {
2163         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
2164         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
2165         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
2166         unsigned int cfg, arg;
2167         int ret;
2168
2169         for (cfg = 0; cfg < num_configs; cfg++) {
2170                 switch (pinconf_to_config_param(configs[cfg])) {
2171                 case PIN_CONFIG_BIAS_DISABLE:
2172                 case PIN_CONFIG_BIAS_PULL_UP:
2173                 case PIN_CONFIG_BIAS_PULL_DOWN:
2174                 case PIN_CONFIG_OUTPUT:
2175                         continue;
2176                 default:
2177                         return -ENOTSUPP;
2178                 }
2179         }
2180
2181         for (cfg = 0; cfg < num_configs; cfg++) {
2182                 arg = pinconf_to_config_argument(configs[cfg]);
2183
2184                 switch (pinconf_to_config_param(configs[cfg])) {
2185                 case PIN_CONFIG_BIAS_DISABLE:
2186                         dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n",
2187                                         'A' + offt, idx);
2188                         ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS);
2189                         break;
2190
2191                 case PIN_CONFIG_BIAS_PULL_UP:
2192                         if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
2193                                 return -EINVAL;
2194                         dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n",
2195                                         'A' + offt, idx);
2196                         ingenic_set_bias(jzpc, pin, GPIO_PULL_UP);
2197                         break;
2198
2199                 case PIN_CONFIG_BIAS_PULL_DOWN:
2200                         if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
2201                                 return -EINVAL;
2202                         dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n",
2203                                         'A' + offt, idx);
2204                         ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN);
2205                         break;
2206
2207                 case PIN_CONFIG_OUTPUT:
2208                         ret = pinctrl_gpio_direction_output(pin);
2209                         if (ret)
2210                                 return ret;
2211
2212                         ingenic_set_output_level(jzpc, pin, arg);
2213                         break;
2214
2215                 default:
2216                         /* unreachable */
2217                         break;
2218                 }
2219         }
2220
2221         return 0;
2222 }
2223
2224 static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
2225                 unsigned int group, unsigned long *config)
2226 {
2227         const unsigned int *pins;
2228         unsigned int i, npins, old = 0;
2229         int ret;
2230
2231         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
2232         if (ret)
2233                 return ret;
2234
2235         for (i = 0; i < npins; i++) {
2236                 if (ingenic_pinconf_get(pctldev, pins[i], config))
2237                         return -ENOTSUPP;
2238
2239                 /* configs do not match between two pins */
2240                 if (i && (old != *config))
2241                         return -ENOTSUPP;
2242
2243                 old = *config;
2244         }
2245
2246         return 0;
2247 }
2248
2249 static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
2250                 unsigned int group, unsigned long *configs,
2251                 unsigned int num_configs)
2252 {
2253         const unsigned int *pins;
2254         unsigned int i, npins;
2255         int ret;
2256
2257         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
2258         if (ret)
2259                 return ret;
2260
2261         for (i = 0; i < npins; i++) {
2262                 ret = ingenic_pinconf_set(pctldev,
2263                                 pins[i], configs, num_configs);
2264                 if (ret)
2265                         return ret;
2266         }
2267
2268         return 0;
2269 }
2270
2271 static const struct pinconf_ops ingenic_confops = {
2272         .is_generic = true,
2273         .pin_config_get = ingenic_pinconf_get,
2274         .pin_config_set = ingenic_pinconf_set,
2275         .pin_config_group_get = ingenic_pinconf_group_get,
2276         .pin_config_group_set = ingenic_pinconf_group_set,
2277 };
2278
2279 static const struct regmap_config ingenic_pinctrl_regmap_config = {
2280         .reg_bits = 32,
2281         .val_bits = 32,
2282         .reg_stride = 4,
2283 };
2284
2285 static const struct of_device_id ingenic_gpio_of_match[] __initconst = {
2286         { .compatible = "ingenic,jz4740-gpio", },
2287         { .compatible = "ingenic,jz4725b-gpio", },
2288         { .compatible = "ingenic,jz4760-gpio", },
2289         { .compatible = "ingenic,jz4770-gpio", },
2290         { .compatible = "ingenic,jz4780-gpio", },
2291         { .compatible = "ingenic,x1000-gpio", },
2292         { .compatible = "ingenic,x1830-gpio", },
2293         {},
2294 };
2295
2296 static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc,
2297                                      struct device_node *node)
2298 {
2299         struct ingenic_gpio_chip *jzgc;
2300         struct device *dev = jzpc->dev;
2301         struct gpio_irq_chip *girq;
2302         unsigned int bank;
2303         int err;
2304
2305         err = of_property_read_u32(node, "reg", &bank);
2306         if (err) {
2307                 dev_err(dev, "Cannot read \"reg\" property: %i\n", err);
2308                 return err;
2309         }
2310
2311         jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL);
2312         if (!jzgc)
2313                 return -ENOMEM;
2314
2315         jzgc->jzpc = jzpc;
2316         jzgc->reg_base = bank * jzpc->info->reg_offset;
2317
2318         jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank);
2319         if (!jzgc->gc.label)
2320                 return -ENOMEM;
2321
2322         /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
2323          * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
2324          * <linux/gpio/consumer.h> INSTEAD.
2325          */
2326         jzgc->gc.base = bank * 32;
2327
2328         jzgc->gc.ngpio = 32;
2329         jzgc->gc.parent = dev;
2330         jzgc->gc.of_node = node;
2331         jzgc->gc.owner = THIS_MODULE;
2332
2333         jzgc->gc.set = ingenic_gpio_set;
2334         jzgc->gc.get = ingenic_gpio_get;
2335         jzgc->gc.direction_input = ingenic_gpio_direction_input;
2336         jzgc->gc.direction_output = ingenic_gpio_direction_output;
2337         jzgc->gc.get_direction = ingenic_gpio_get_direction;
2338         jzgc->gc.request = gpiochip_generic_request;
2339         jzgc->gc.free = gpiochip_generic_free;
2340
2341         jzgc->irq = irq_of_parse_and_map(node, 0);
2342         if (!jzgc->irq)
2343                 return -EINVAL;
2344
2345         jzgc->irq_chip.name = jzgc->gc.label;
2346         jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable;
2347         jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable;
2348         jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask;
2349         jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask;
2350         jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack;
2351         jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type;
2352         jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake;
2353         jzgc->irq_chip.irq_request_resources = ingenic_gpio_irq_request;
2354         jzgc->irq_chip.irq_release_resources = ingenic_gpio_irq_release;
2355         jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND;
2356
2357         girq = &jzgc->gc.irq;
2358         girq->chip = &jzgc->irq_chip;
2359         girq->parent_handler = ingenic_gpio_irq_handler;
2360         girq->num_parents = 1;
2361         girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
2362                                      GFP_KERNEL);
2363         if (!girq->parents)
2364                 return -ENOMEM;
2365         girq->parents[0] = jzgc->irq;
2366         girq->default_type = IRQ_TYPE_NONE;
2367         girq->handler = handle_level_irq;
2368
2369         err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc);
2370         if (err)
2371                 return err;
2372
2373         return 0;
2374 }
2375
2376 static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
2377 {
2378         struct device *dev = &pdev->dev;
2379         struct ingenic_pinctrl *jzpc;
2380         struct pinctrl_desc *pctl_desc;
2381         void __iomem *base;
2382         const struct ingenic_chip_info *chip_info;
2383         struct device_node *node;
2384         unsigned int i;
2385         int err;
2386
2387         jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
2388         if (!jzpc)
2389                 return -ENOMEM;
2390
2391         base = devm_platform_ioremap_resource(pdev, 0);
2392         if (IS_ERR(base))
2393                 return PTR_ERR(base);
2394
2395         jzpc->map = devm_regmap_init_mmio(dev, base,
2396                         &ingenic_pinctrl_regmap_config);
2397         if (IS_ERR(jzpc->map)) {
2398                 dev_err(dev, "Failed to create regmap\n");
2399                 return PTR_ERR(jzpc->map);
2400         }
2401
2402         jzpc->dev = dev;
2403         jzpc->info = chip_info = of_device_get_match_data(dev);
2404
2405         pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
2406         if (!pctl_desc)
2407                 return -ENOMEM;
2408
2409         /* fill in pinctrl_desc structure */
2410         pctl_desc->name = dev_name(dev);
2411         pctl_desc->owner = THIS_MODULE;
2412         pctl_desc->pctlops = &ingenic_pctlops;
2413         pctl_desc->pmxops = &ingenic_pmxops;
2414         pctl_desc->confops = &ingenic_confops;
2415         pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
2416         pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev,
2417                         pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL);
2418         if (!jzpc->pdesc)
2419                 return -ENOMEM;
2420
2421         for (i = 0; i < pctl_desc->npins; i++) {
2422                 jzpc->pdesc[i].number = i;
2423                 jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
2424                                                 'A' + (i / PINS_PER_GPIO_CHIP),
2425                                                 i % PINS_PER_GPIO_CHIP);
2426         }
2427
2428         jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
2429         if (IS_ERR(jzpc->pctl)) {
2430                 dev_err(dev, "Failed to register pinctrl\n");
2431                 return PTR_ERR(jzpc->pctl);
2432         }
2433
2434         for (i = 0; i < chip_info->num_groups; i++) {
2435                 const struct group_desc *group = &chip_info->groups[i];
2436
2437                 err = pinctrl_generic_add_group(jzpc->pctl, group->name,
2438                                 group->pins, group->num_pins, group->data);
2439                 if (err < 0) {
2440                         dev_err(dev, "Failed to register group %s\n",
2441                                         group->name);
2442                         return err;
2443                 }
2444         }
2445
2446         for (i = 0; i < chip_info->num_functions; i++) {
2447                 const struct function_desc *func = &chip_info->functions[i];
2448
2449                 err = pinmux_generic_add_function(jzpc->pctl, func->name,
2450                                 func->group_names, func->num_group_names,
2451                                 func->data);
2452                 if (err < 0) {
2453                         dev_err(dev, "Failed to register function %s\n",
2454                                         func->name);
2455                         return err;
2456                 }
2457         }
2458
2459         dev_set_drvdata(dev, jzpc->map);
2460
2461         for_each_child_of_node(dev->of_node, node) {
2462                 if (of_match_node(ingenic_gpio_of_match, node)) {
2463                         err = ingenic_gpio_probe(jzpc, node);
2464                         if (err)
2465                                 return err;
2466                 }
2467         }
2468
2469         return 0;
2470 }
2471
2472 static const struct of_device_id ingenic_pinctrl_of_match[] = {
2473         { .compatible = "ingenic,jz4740-pinctrl", .data = &jz4740_chip_info },
2474         { .compatible = "ingenic,jz4725b-pinctrl", .data = &jz4725b_chip_info },
2475         { .compatible = "ingenic,jz4760-pinctrl", .data = &jz4760_chip_info },
2476         { .compatible = "ingenic,jz4760b-pinctrl", .data = &jz4760_chip_info },
2477         { .compatible = "ingenic,jz4770-pinctrl", .data = &jz4770_chip_info },
2478         { .compatible = "ingenic,jz4780-pinctrl", .data = &jz4780_chip_info },
2479         { .compatible = "ingenic,x1000-pinctrl", .data = &x1000_chip_info },
2480         { .compatible = "ingenic,x1000e-pinctrl", .data = &x1000_chip_info },
2481         { .compatible = "ingenic,x1500-pinctrl", .data = &x1500_chip_info },
2482         { .compatible = "ingenic,x1830-pinctrl", .data = &x1830_chip_info },
2483         {},
2484 };
2485
2486 static struct platform_driver ingenic_pinctrl_driver = {
2487         .driver = {
2488                 .name = "pinctrl-ingenic",
2489                 .of_match_table = ingenic_pinctrl_of_match,
2490         },
2491 };
2492
2493 static int __init ingenic_pinctrl_drv_register(void)
2494 {
2495         return platform_driver_probe(&ingenic_pinctrl_driver,
2496                                      ingenic_pinctrl_probe);
2497 }
2498 subsys_initcall(ingenic_pinctrl_drv_register);