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