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