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