xref: /linux/drivers/pinctrl/pinctrl-ingenic.c (revision 8c943137c00a773ece8d324862910d53832a97a1)
1af873fceSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2b5c23aa4SPaul Cercueil /*
3b5c23aa4SPaul Cercueil  * Ingenic SoCs pinctrl driver
4b5c23aa4SPaul Cercueil  *
5b5c23aa4SPaul Cercueil  * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
6a0bb89e8SPaul Boddie  * Copyright (c) 2017, 2019 Paul Boddie <paul@boddie.org.uk>
7424f3969S周琰杰 (Zhou Yanjie)  * Copyright (c) 2019, 2020 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
8b5c23aa4SPaul Cercueil  */
9b5c23aa4SPaul Cercueil 
10b5c23aa4SPaul Cercueil #include <linux/compiler.h>
1128d6eeb4SLinus Walleij #include <linux/gpio/driver.h>
12b5c23aa4SPaul Cercueil #include <linux/interrupt.h>
13b5c23aa4SPaul Cercueil #include <linux/io.h>
140ab1438bSMasahiro Yamada #include <linux/kernel.h>
15*8c943137SAndy Shevchenko #include <linux/mod_devicetable.h>
16*8c943137SAndy Shevchenko #include <linux/of.h>
17b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinctrl.h>
18b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinmux.h>
19b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinconf.h>
20b5c23aa4SPaul Cercueil #include <linux/pinctrl/pinconf-generic.h>
21b5c23aa4SPaul Cercueil #include <linux/platform_device.h>
22*8c943137SAndy Shevchenko #include <linux/property.h>
23b5c23aa4SPaul Cercueil #include <linux/regmap.h>
2471f5e7b3SAidan MacDonald #include <linux/seq_file.h>
25b5c23aa4SPaul Cercueil #include <linux/slab.h>
26b5c23aa4SPaul Cercueil 
27b5c23aa4SPaul Cercueil #include "core.h"
28b5c23aa4SPaul Cercueil #include "pinconf.h"
29b5c23aa4SPaul Cercueil #include "pinmux.h"
30b5c23aa4SPaul Cercueil 
31e72394e2SPaul Cercueil #define GPIO_PIN					0x00
32e72394e2SPaul Cercueil #define GPIO_MSK					0x20
33e72394e2SPaul Cercueil 
34424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_DATA			0x00
35424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPDIR			0x04
36424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPPUR			0x0c
37424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPALR			0x10
38424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPAUR			0x14
39424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIDLR			0x18
40424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIDUR			0x1c
41424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIER			0x20
42424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPIMR			0x24
43424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_GPIO_GPFR			0x28
44424f3969S周琰杰 (Zhou Yanjie) 
45b5c23aa4SPaul Cercueil #define JZ4740_GPIO_DATA			0x10
46b5c23aa4SPaul Cercueil #define JZ4740_GPIO_PULL_DIS		0x30
47b5c23aa4SPaul Cercueil #define JZ4740_GPIO_FUNC			0x40
48b5c23aa4SPaul Cercueil #define JZ4740_GPIO_SELECT			0x50
49b5c23aa4SPaul Cercueil #define JZ4740_GPIO_DIR				0x60
50b5c23aa4SPaul Cercueil #define JZ4740_GPIO_TRIG			0x70
51b5c23aa4SPaul Cercueil #define JZ4740_GPIO_FLAG			0x80
52b5c23aa4SPaul Cercueil 
53b4aa4876SPaul Cercueil #define JZ4770_GPIO_INT				0x10
54b4aa4876SPaul Cercueil #define JZ4770_GPIO_PAT1			0x30
55b4aa4876SPaul Cercueil #define JZ4770_GPIO_PAT0			0x40
56b4aa4876SPaul Cercueil #define JZ4770_GPIO_FLAG			0x50
57b4aa4876SPaul Cercueil #define JZ4770_GPIO_PEN				0x70
58b5c23aa4SPaul Cercueil 
59d7da2a1eS周琰杰 (Zhou Yanjie) #define X1830_GPIO_PEL				0x110
60d7da2a1eS周琰杰 (Zhou Yanjie) #define X1830_GPIO_PEH				0x120
61943e0da1S周琰杰 (Zhou Yanjie) #define X1830_GPIO_SR				0x150
62943e0da1S周琰杰 (Zhou Yanjie) #define X1830_GPIO_SMT				0x160
63943e0da1S周琰杰 (Zhou Yanjie) 
64943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_EDG				0x70
65943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_PEPU				0x80
66943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_PEPD				0x90
67943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_SR				0xd0
68943e0da1S周琰杰 (Zhou Yanjie) #define X2000_GPIO_SMT				0xe0
69fe1ad5eeSZhou Yanjie 
70b5c23aa4SPaul Cercueil #define REG_SET(x)					((x) + 0x4)
71b5c23aa4SPaul Cercueil #define REG_CLEAR(x)				((x) + 0x8)
72b5c23aa4SPaul Cercueil 
73d7da2a1eS周琰杰 (Zhou Yanjie) #define REG_PZ_BASE(x)				((x) * 7)
74d7da2a1eS周琰杰 (Zhou Yanjie) #define REG_PZ_GID2LD(x)			((x) * 7 + 0xf0)
75d7da2a1eS周琰杰 (Zhou Yanjie) 
76d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_DIS				0
77d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_UP				1
78d7da2a1eS周琰杰 (Zhou Yanjie) #define GPIO_PULL_DOWN				2
79d7da2a1eS周琰杰 (Zhou Yanjie) 
80b5c23aa4SPaul Cercueil #define PINS_PER_GPIO_CHIP			32
81424f3969S周琰杰 (Zhou Yanjie) #define JZ4730_PINS_PER_PAIRED_REG	16
82b5c23aa4SPaul Cercueil 
83863becffS周琰杰 (Zhou Yanjie) #define INGENIC_PIN_GROUP_FUNCS(name, id, funcs)		\
84863becffS周琰杰 (Zhou Yanjie) 	{						\
85863becffS周琰杰 (Zhou Yanjie) 		name,					\
86863becffS周琰杰 (Zhou Yanjie) 		id##_pins,				\
87863becffS周琰杰 (Zhou Yanjie) 		ARRAY_SIZE(id##_pins),			\
88863becffS周琰杰 (Zhou Yanjie) 		funcs,					\
89863becffS周琰杰 (Zhou Yanjie) 	}
90863becffS周琰杰 (Zhou Yanjie) 
91863becffS周琰杰 (Zhou Yanjie) #define INGENIC_PIN_GROUP(name, id, func)		\
92863becffS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS(name, id, (void *)(func))
93863becffS周琰杰 (Zhou Yanjie) 
94b5c23aa4SPaul Cercueil enum jz_version {
95424f3969S周琰杰 (Zhou Yanjie) 	ID_JZ4730,
96b5c23aa4SPaul Cercueil 	ID_JZ4740,
97f2a96765SPaul Cercueil 	ID_JZ4725B,
98215c81a3S周琰杰 (Zhou Yanjie) 	ID_JZ4750,
99b582b5a4S周琰杰 (Zhou Yanjie) 	ID_JZ4755,
1000257595aSZhou Yanjie 	ID_JZ4760,
101b5c23aa4SPaul Cercueil 	ID_JZ4770,
1020c990740S周琰杰 (Zhou Yanjie) 	ID_JZ4775,
103b5c23aa4SPaul Cercueil 	ID_JZ4780,
104fe1ad5eeSZhou Yanjie 	ID_X1000,
1055d21595bSZhou Yanjie 	ID_X1500,
106d7da2a1eS周琰杰 (Zhou Yanjie) 	ID_X1830,
107943e0da1S周琰杰 (Zhou Yanjie) 	ID_X2000,
1082a18211bS周琰杰 (Zhou Yanjie) 	ID_X2100,
109b5c23aa4SPaul Cercueil };
110b5c23aa4SPaul Cercueil 
111b5c23aa4SPaul Cercueil struct ingenic_chip_info {
112b5c23aa4SPaul Cercueil 	unsigned int num_chips;
113f742e5ebS周琰杰 (Zhou Yanjie) 	unsigned int reg_offset;
114baf15647SPaul Cercueil 	enum jz_version version;
115b5c23aa4SPaul Cercueil 
116b5c23aa4SPaul Cercueil 	const struct group_desc *groups;
117b5c23aa4SPaul Cercueil 	unsigned int num_groups;
118b5c23aa4SPaul Cercueil 
119b5c23aa4SPaul Cercueil 	const struct function_desc *functions;
120b5c23aa4SPaul Cercueil 	unsigned int num_functions;
121b5c23aa4SPaul Cercueil 
122b5c23aa4SPaul Cercueil 	const u32 *pull_ups, *pull_downs;
1239279c00fSAidan MacDonald 
1249279c00fSAidan MacDonald 	const struct regmap_access_table *access_table;
125b5c23aa4SPaul Cercueil };
126b5c23aa4SPaul Cercueil 
127b5c23aa4SPaul Cercueil struct ingenic_pinctrl {
128b5c23aa4SPaul Cercueil 	struct device *dev;
129b5c23aa4SPaul Cercueil 	struct regmap *map;
130b5c23aa4SPaul Cercueil 	struct pinctrl_dev *pctl;
131b5c23aa4SPaul Cercueil 	struct pinctrl_pin_desc *pdesc;
132b5c23aa4SPaul Cercueil 
133b5c23aa4SPaul Cercueil 	const struct ingenic_chip_info *info;
134b5c23aa4SPaul Cercueil };
135b5c23aa4SPaul Cercueil 
136e72394e2SPaul Cercueil struct ingenic_gpio_chip {
137e72394e2SPaul Cercueil 	struct ingenic_pinctrl *jzpc;
138e72394e2SPaul Cercueil 	struct gpio_chip gc;
139e72394e2SPaul Cercueil 	unsigned int irq, reg_base;
140e72394e2SPaul Cercueil };
141e72394e2SPaul Cercueil 
1428d2d607cSPaul Cercueil static const unsigned long enabled_socs =
1438d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4730) << ID_JZ4730 |
1448d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4740) << ID_JZ4740 |
1458d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4725B) << ID_JZ4725B |
1468d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4750) << ID_JZ4750 |
1478d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4755) << ID_JZ4755 |
1488d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4760) << ID_JZ4760 |
1498d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4770) << ID_JZ4770 |
1508d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4775) << ID_JZ4775 |
1518d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_JZ4780) << ID_JZ4780 |
1528d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_X1000) << ID_X1000 |
1538d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_X1500) << ID_X1500 |
1548d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_X1830) << ID_X1830 |
1558d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_X2000) << ID_X2000 |
1568d2d607cSPaul Cercueil 	IS_ENABLED(CONFIG_MACH_X2100) << ID_X2100;
1578d2d607cSPaul Cercueil 
1588d2d607cSPaul Cercueil static bool
1598d2d607cSPaul Cercueil is_soc_or_above(const struct ingenic_pinctrl *jzpc, enum jz_version version)
1608d2d607cSPaul Cercueil {
1618d2d607cSPaul Cercueil 	return (enabled_socs >> version) &&
1628d2d607cSPaul Cercueil 		(!(enabled_socs & GENMASK(version - 1, 0))
1638d2d607cSPaul Cercueil 		 || jzpc->info->version >= version);
1648d2d607cSPaul Cercueil }
1658d2d607cSPaul Cercueil 
166424f3969S周琰杰 (Zhou Yanjie) static const u32 jz4730_pull_ups[4] = {
167424f3969S周琰杰 (Zhou Yanjie) 	0x3fa3320f, 0xf200ffff, 0xffffffff, 0xffffffff,
168424f3969S周琰杰 (Zhou Yanjie) };
169424f3969S周琰杰 (Zhou Yanjie) 
170424f3969S周琰杰 (Zhou Yanjie) static const u32 jz4730_pull_downs[4] = {
171424f3969S周琰杰 (Zhou Yanjie) 	0x00000df0, 0x0dff0000, 0x00000000, 0x00000000,
172424f3969S周琰杰 (Zhou Yanjie) };
173424f3969S周琰杰 (Zhou Yanjie) 
174424f3969S周琰杰 (Zhou Yanjie) static int jz4730_mmc_1bit_pins[] = { 0x27, 0x26, 0x22, };
175424f3969S周琰杰 (Zhou Yanjie) static int jz4730_mmc_4bit_pins[] = { 0x23, 0x24, 0x25, };
176424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart0_data_pins[] = { 0x7e, 0x7f, };
177424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart1_data_pins[] = { 0x18, 0x19, };
178424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart2_data_pins[] = { 0x6f, 0x7d, };
179424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart3_data_pins[] = { 0x10, 0x15, };
180424f3969S周琰杰 (Zhou Yanjie) static int jz4730_uart3_hwflow_pins[] = { 0x11, 0x17, };
181424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_8bit_pins[] = {
182424f3969S周琰杰 (Zhou Yanjie) 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
183424f3969S周琰杰 (Zhou Yanjie) 	0x3a, 0x39, 0x38,
184424f3969S周琰杰 (Zhou Yanjie) };
185424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_16bit_pins[] = {
186424f3969S周琰杰 (Zhou Yanjie) 	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
187424f3969S周琰杰 (Zhou Yanjie) };
188424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_special_pins[] = { 0x3d, 0x3c, 0x3e, 0x3f, };
189424f3969S周琰杰 (Zhou Yanjie) static int jz4730_lcd_generic_pins[] = { 0x3b, };
190424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs1_pins[] = { 0x53, };
191424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs2_pins[] = { 0x54, };
192424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs3_pins[] = { 0x55, };
193424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs4_pins[] = { 0x56, };
194424f3969S周琰杰 (Zhou Yanjie) static int jz4730_nand_cs5_pins[] = { 0x57, };
195424f3969S周琰杰 (Zhou Yanjie) static int jz4730_pwm_pwm0_pins[] = { 0x5e, };
196424f3969S周琰杰 (Zhou Yanjie) static int jz4730_pwm_pwm1_pins[] = { 0x5f, };
197424f3969S周琰杰 (Zhou Yanjie) 
198424f3969S周琰杰 (Zhou Yanjie) static u8 jz4730_lcd_8bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, };
199424f3969S周琰杰 (Zhou Yanjie) 
200424f3969S周琰杰 (Zhou Yanjie) static const struct group_desc jz4730_groups[] = {
201424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc-1bit", jz4730_mmc_1bit, 1),
202424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc-4bit", jz4730_mmc_4bit, 1),
203424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-data", jz4730_uart0_data, 1),
204424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-data", jz4730_uart1_data, 1),
205424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data", jz4730_uart2_data, 1),
206424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-data", jz4730_uart3_data, 1),
207424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-hwflow", jz4730_uart3_hwflow, 1),
208424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("lcd-8bit", jz4730_lcd_8bit, jz4730_lcd_8bit_funcs),
209424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4730_lcd_16bit, 1),
210424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4730_lcd_special, 1),
211424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4730_lcd_generic, 1),
212424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs1", jz4730_nand_cs1, 1),
213424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs2", jz4730_nand_cs2, 1),
214424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs3", jz4730_nand_cs3, 1),
215424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs4", jz4730_nand_cs4, 1),
216424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs5", jz4730_nand_cs5, 1),
217424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0", jz4730_pwm_pwm0, 1),
218424f3969S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1", jz4730_pwm_pwm1, 1),
219424f3969S周琰杰 (Zhou Yanjie) };
220424f3969S周琰杰 (Zhou Yanjie) 
221424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
222424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart0_groups[] = { "uart0-data", };
223424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart1_groups[] = { "uart1-data", };
224424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart2_groups[] = { "uart2-data", };
225424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
226424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_lcd_groups[] = {
227424f3969S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-special", "lcd-generic",
228424f3969S周琰杰 (Zhou Yanjie) };
229424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_nand_groups[] = {
230424f3969S周琰杰 (Zhou Yanjie) 	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-cs5",
231424f3969S周琰杰 (Zhou Yanjie) };
232424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_pwm0_groups[] = { "pwm0", };
233424f3969S周琰杰 (Zhou Yanjie) static const char *jz4730_pwm1_groups[] = { "pwm1", };
234424f3969S周琰杰 (Zhou Yanjie) 
235424f3969S周琰杰 (Zhou Yanjie) static const struct function_desc jz4730_functions[] = {
236424f3969S周琰杰 (Zhou Yanjie) 	{ "mmc", jz4730_mmc_groups, ARRAY_SIZE(jz4730_mmc_groups), },
237424f3969S周琰杰 (Zhou Yanjie) 	{ "uart0", jz4730_uart0_groups, ARRAY_SIZE(jz4730_uart0_groups), },
238424f3969S周琰杰 (Zhou Yanjie) 	{ "uart1", jz4730_uart1_groups, ARRAY_SIZE(jz4730_uart1_groups), },
239424f3969S周琰杰 (Zhou Yanjie) 	{ "uart2", jz4730_uart2_groups, ARRAY_SIZE(jz4730_uart2_groups), },
240424f3969S周琰杰 (Zhou Yanjie) 	{ "uart3", jz4730_uart3_groups, ARRAY_SIZE(jz4730_uart3_groups), },
241424f3969S周琰杰 (Zhou Yanjie) 	{ "lcd", jz4730_lcd_groups, ARRAY_SIZE(jz4730_lcd_groups), },
242424f3969S周琰杰 (Zhou Yanjie) 	{ "nand", jz4730_nand_groups, ARRAY_SIZE(jz4730_nand_groups), },
243424f3969S周琰杰 (Zhou Yanjie) 	{ "pwm0", jz4730_pwm0_groups, ARRAY_SIZE(jz4730_pwm0_groups), },
244424f3969S周琰杰 (Zhou Yanjie) 	{ "pwm1", jz4730_pwm1_groups, ARRAY_SIZE(jz4730_pwm1_groups), },
245424f3969S周琰杰 (Zhou Yanjie) };
246424f3969S周琰杰 (Zhou Yanjie) 
247424f3969S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4730_chip_info = {
248424f3969S周琰杰 (Zhou Yanjie) 	.num_chips = 4,
249424f3969S周琰杰 (Zhou Yanjie) 	.reg_offset = 0x30,
250424f3969S周琰杰 (Zhou Yanjie) 	.version = ID_JZ4730,
251424f3969S周琰杰 (Zhou Yanjie) 	.groups = jz4730_groups,
252424f3969S周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(jz4730_groups),
253424f3969S周琰杰 (Zhou Yanjie) 	.functions = jz4730_functions,
254424f3969S周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(jz4730_functions),
255424f3969S周琰杰 (Zhou Yanjie) 	.pull_ups = jz4730_pull_ups,
256424f3969S周琰杰 (Zhou Yanjie) 	.pull_downs = jz4730_pull_downs,
257424f3969S周琰杰 (Zhou Yanjie) };
258424f3969S周琰杰 (Zhou Yanjie) 
259b5c23aa4SPaul Cercueil static const u32 jz4740_pull_ups[4] = {
260b5c23aa4SPaul Cercueil 	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
261b5c23aa4SPaul Cercueil };
262b5c23aa4SPaul Cercueil 
263b5c23aa4SPaul Cercueil static const u32 jz4740_pull_downs[4] = {
264b5c23aa4SPaul Cercueil 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
265b5c23aa4SPaul Cercueil };
266b5c23aa4SPaul Cercueil 
267b5c23aa4SPaul Cercueil static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, };
268b5c23aa4SPaul Cercueil static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
269b5c23aa4SPaul Cercueil static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, };
270b5c23aa4SPaul Cercueil static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
271b5c23aa4SPaul Cercueil static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, };
272b5c23aa4SPaul Cercueil static int jz4740_lcd_8bit_pins[] = {
2735e6332a7S周琰杰 (Zhou Yanjie) 	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
2745e6332a7S周琰杰 (Zhou Yanjie) 	0x52, 0x53, 0x54,
275b5c23aa4SPaul Cercueil };
276b5c23aa4SPaul Cercueil static int jz4740_lcd_16bit_pins[] = {
2775e6332a7S周琰杰 (Zhou Yanjie) 	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
278b5c23aa4SPaul Cercueil };
279b5c23aa4SPaul Cercueil static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, };
2805e6332a7S周琰杰 (Zhou Yanjie) static int jz4740_lcd_special_pins[] = { 0x31, 0x32, 0x56, 0x57, };
2815e6332a7S周琰杰 (Zhou Yanjie) static int jz4740_lcd_generic_pins[] = { 0x55, };
282b5c23aa4SPaul Cercueil static int jz4740_nand_cs1_pins[] = { 0x39, };
283b5c23aa4SPaul Cercueil static int jz4740_nand_cs2_pins[] = { 0x3a, };
284b5c23aa4SPaul Cercueil static int jz4740_nand_cs3_pins[] = { 0x3b, };
285b5c23aa4SPaul Cercueil static int jz4740_nand_cs4_pins[] = { 0x3c, };
286bcad94d7SPaul Cercueil static int jz4740_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
287b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm0_pins[] = { 0x77, };
288b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm1_pins[] = { 0x78, };
289b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm2_pins[] = { 0x79, };
290b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm3_pins[] = { 0x7a, };
291b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm4_pins[] = { 0x7b, };
292b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm5_pins[] = { 0x7c, };
293b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm6_pins[] = { 0x7e, };
294b5c23aa4SPaul Cercueil static int jz4740_pwm_pwm7_pins[] = { 0x7f, };
295b5c23aa4SPaul Cercueil 
296b5c23aa4SPaul Cercueil static const struct group_desc jz4740_groups[] = {
297bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit, 0),
298bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit, 0),
299bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data, 1),
300bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow, 1),
301bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data, 2),
302bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit, 0),
303bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit, 0),
304bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit, 0),
3055e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4740_lcd_special, 0),
3065e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4740_lcd_generic, 0),
307bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1, 0),
308bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2, 0),
309bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3, 0),
310bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4, 0),
311bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-fre-fwe", jz4740_nand_fre_fwe, 0),
312bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0, 0),
313bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1, 0),
314bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2, 0),
315bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3, 0),
316bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4, 0),
317bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5, 0),
318bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6, 0),
319bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7, 0),
320b5c23aa4SPaul Cercueil };
321b5c23aa4SPaul Cercueil 
322b5c23aa4SPaul Cercueil static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
323b5c23aa4SPaul Cercueil static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
324b5c23aa4SPaul Cercueil static const char *jz4740_uart1_groups[] = { "uart1-data", };
325b5c23aa4SPaul Cercueil static const char *jz4740_lcd_groups[] = {
3265e6332a7S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-special", "lcd-generic",
327b5c23aa4SPaul Cercueil };
328b5c23aa4SPaul Cercueil static const char *jz4740_nand_groups[] = {
329bcad94d7SPaul Cercueil 	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
330b5c23aa4SPaul Cercueil };
331b5c23aa4SPaul Cercueil static const char *jz4740_pwm0_groups[] = { "pwm0", };
332b5c23aa4SPaul Cercueil static const char *jz4740_pwm1_groups[] = { "pwm1", };
333b5c23aa4SPaul Cercueil static const char *jz4740_pwm2_groups[] = { "pwm2", };
334b5c23aa4SPaul Cercueil static const char *jz4740_pwm3_groups[] = { "pwm3", };
335b5c23aa4SPaul Cercueil static const char *jz4740_pwm4_groups[] = { "pwm4", };
336b5c23aa4SPaul Cercueil static const char *jz4740_pwm5_groups[] = { "pwm5", };
337b5c23aa4SPaul Cercueil static const char *jz4740_pwm6_groups[] = { "pwm6", };
338b5c23aa4SPaul Cercueil static const char *jz4740_pwm7_groups[] = { "pwm7", };
339b5c23aa4SPaul Cercueil 
340b5c23aa4SPaul Cercueil static const struct function_desc jz4740_functions[] = {
341b5c23aa4SPaul Cercueil 	{ "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), },
342b5c23aa4SPaul Cercueil 	{ "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), },
343b5c23aa4SPaul Cercueil 	{ "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), },
344b5c23aa4SPaul Cercueil 	{ "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), },
345b5c23aa4SPaul Cercueil 	{ "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), },
346b5c23aa4SPaul Cercueil 	{ "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), },
347b5c23aa4SPaul Cercueil 	{ "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), },
348b5c23aa4SPaul Cercueil 	{ "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), },
349b5c23aa4SPaul Cercueil 	{ "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), },
350b5c23aa4SPaul Cercueil 	{ "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), },
351b5c23aa4SPaul Cercueil 	{ "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), },
352b5c23aa4SPaul Cercueil 	{ "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), },
353b5c23aa4SPaul Cercueil 	{ "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), },
354b5c23aa4SPaul Cercueil };
355b5c23aa4SPaul Cercueil 
356b5c23aa4SPaul Cercueil static const struct ingenic_chip_info jz4740_chip_info = {
357b5c23aa4SPaul Cercueil 	.num_chips = 4,
358f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
359baf15647SPaul Cercueil 	.version = ID_JZ4740,
360b5c23aa4SPaul Cercueil 	.groups = jz4740_groups,
361b5c23aa4SPaul Cercueil 	.num_groups = ARRAY_SIZE(jz4740_groups),
362b5c23aa4SPaul Cercueil 	.functions = jz4740_functions,
363b5c23aa4SPaul Cercueil 	.num_functions = ARRAY_SIZE(jz4740_functions),
364b5c23aa4SPaul Cercueil 	.pull_ups = jz4740_pull_ups,
365b5c23aa4SPaul Cercueil 	.pull_downs = jz4740_pull_downs,
366b5c23aa4SPaul Cercueil };
367b5c23aa4SPaul Cercueil 
368f2a96765SPaul Cercueil static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, };
369f2a96765SPaul Cercueil static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, };
370f2a96765SPaul Cercueil static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, };
371f2a96765SPaul Cercueil static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, };
372f2a96765SPaul Cercueil static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, };
3735e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_8bit_pins[] = {
3745e6332a7S周琰杰 (Zhou Yanjie) 	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
3755e6332a7S周琰杰 (Zhou Yanjie) 	0x72, 0x73, 0x74,
3765e6332a7S周琰杰 (Zhou Yanjie) };
3775e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_16bit_pins[] = {
3785e6332a7S周琰杰 (Zhou Yanjie) 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
3795e6332a7S周琰杰 (Zhou Yanjie) };
3805e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, };
3815e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, };
3825e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
3835e6332a7S周琰杰 (Zhou Yanjie) static int jz4725b_lcd_generic_pins[] = { 0x75, };
384f2a96765SPaul Cercueil static int jz4725b_nand_cs1_pins[] = { 0x55, };
385f2a96765SPaul Cercueil static int jz4725b_nand_cs2_pins[] = { 0x56, };
386f2a96765SPaul Cercueil static int jz4725b_nand_cs3_pins[] = { 0x57, };
387f2a96765SPaul Cercueil static int jz4725b_nand_cs4_pins[] = { 0x58, };
388f2a96765SPaul Cercueil static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 };
389f2a96765SPaul Cercueil static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d };
390f2a96765SPaul Cercueil static int jz4725b_pwm_pwm0_pins[] = { 0x4a, };
391f2a96765SPaul Cercueil static int jz4725b_pwm_pwm1_pins[] = { 0x4b, };
392f2a96765SPaul Cercueil static int jz4725b_pwm_pwm2_pins[] = { 0x4c, };
393f2a96765SPaul Cercueil static int jz4725b_pwm_pwm3_pins[] = { 0x4d, };
394f2a96765SPaul Cercueil static int jz4725b_pwm_pwm4_pins[] = { 0x4e, };
395f2a96765SPaul Cercueil static int jz4725b_pwm_pwm5_pins[] = { 0x4f, };
396f2a96765SPaul Cercueil 
397bb42b593SPaul Cercueil static u8 jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, };
398f2a96765SPaul Cercueil 
399f2a96765SPaul Cercueil static const struct group_desc jz4725b_groups[] = {
400bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit, 1),
401bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4725b_mmc0_4bit,
402bb42b593SPaul Cercueil 				jz4725b_mmc0_4bit_funcs),
403bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit, 0),
404bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit, 0),
405bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data, 1),
4065e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit, 0),
4075e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit, 0),
4085e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit, 0),
4095e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit, 1),
4105e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special, 0),
4115e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic, 0),
412bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1, 0),
413bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2, 0),
414bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3, 0),
415bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4, 0),
416bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale, 0),
417bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe, 0),
418bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0, 0),
419bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1, 0),
420bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2, 0),
421bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3, 0),
422bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4, 0),
423bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5, 0),
424f2a96765SPaul Cercueil };
425f2a96765SPaul Cercueil 
426f2a96765SPaul Cercueil static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
427f2a96765SPaul Cercueil static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
428f2a96765SPaul Cercueil static const char *jz4725b_uart_groups[] = { "uart-data", };
4295e6332a7S周琰杰 (Zhou Yanjie) static const char *jz4725b_lcd_groups[] = {
4305e6332a7S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
4315e6332a7S周琰杰 (Zhou Yanjie) 	"lcd-special", "lcd-generic",
4325e6332a7S周琰杰 (Zhou Yanjie) };
433f2a96765SPaul Cercueil static const char *jz4725b_nand_groups[] = {
434f2a96765SPaul Cercueil 	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
435f2a96765SPaul Cercueil 	"nand-cle-ale", "nand-fre-fwe",
436f2a96765SPaul Cercueil };
437f2a96765SPaul Cercueil static const char *jz4725b_pwm0_groups[] = { "pwm0", };
438f2a96765SPaul Cercueil static const char *jz4725b_pwm1_groups[] = { "pwm1", };
439f2a96765SPaul Cercueil static const char *jz4725b_pwm2_groups[] = { "pwm2", };
440f2a96765SPaul Cercueil static const char *jz4725b_pwm3_groups[] = { "pwm3", };
441f2a96765SPaul Cercueil static const char *jz4725b_pwm4_groups[] = { "pwm4", };
442f2a96765SPaul Cercueil static const char *jz4725b_pwm5_groups[] = { "pwm5", };
443f2a96765SPaul Cercueil 
444f2a96765SPaul Cercueil static const struct function_desc jz4725b_functions[] = {
445f2a96765SPaul Cercueil 	{ "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), },
446f2a96765SPaul Cercueil 	{ "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), },
447f2a96765SPaul Cercueil 	{ "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), },
448f2a96765SPaul Cercueil 	{ "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), },
449f2a96765SPaul Cercueil 	{ "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), },
450f2a96765SPaul Cercueil 	{ "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), },
451f2a96765SPaul Cercueil 	{ "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), },
452f2a96765SPaul Cercueil 	{ "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), },
453f2a96765SPaul Cercueil 	{ "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), },
454f2a96765SPaul Cercueil 	{ "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), },
455a3240f09SPaul Cercueil 	{ "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), },
456f2a96765SPaul Cercueil };
457f2a96765SPaul Cercueil 
458f2a96765SPaul Cercueil static const struct ingenic_chip_info jz4725b_chip_info = {
459f2a96765SPaul Cercueil 	.num_chips = 4,
460f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
461baf15647SPaul Cercueil 	.version = ID_JZ4725B,
462f2a96765SPaul Cercueil 	.groups = jz4725b_groups,
463f2a96765SPaul Cercueil 	.num_groups = ARRAY_SIZE(jz4725b_groups),
464f2a96765SPaul Cercueil 	.functions = jz4725b_functions,
465f2a96765SPaul Cercueil 	.num_functions = ARRAY_SIZE(jz4725b_functions),
466f2a96765SPaul Cercueil 	.pull_ups = jz4740_pull_ups,
467f2a96765SPaul Cercueil 	.pull_downs = jz4740_pull_downs,
468f2a96765SPaul Cercueil };
469f2a96765SPaul Cercueil 
470215c81a3S周琰杰 (Zhou Yanjie) static const u32 jz4750_pull_ups[6] = {
471215c81a3S周琰杰 (Zhou Yanjie) 	0xffffffff, 0xffffffff, 0x3fffffff, 0x7fffffff, 0x1fff3fff, 0x00ffffff,
472215c81a3S周琰杰 (Zhou Yanjie) };
473215c81a3S周琰杰 (Zhou Yanjie) 
474215c81a3S周琰杰 (Zhou Yanjie) static const u32 jz4750_pull_downs[6] = {
475215c81a3S周琰杰 (Zhou Yanjie) 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
476215c81a3S周琰杰 (Zhou Yanjie) };
477215c81a3S周琰杰 (Zhou Yanjie) 
478215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart0_data_pins[] = { 0xa4, 0xa5, };
479215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart0_hwflow_pins[] = { 0xa6, 0xa7, };
480215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart1_data_pins[] = { 0x90, 0x91, };
481215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart1_hwflow_pins[] = { 0x92, 0x93, };
482215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart2_data_pins[] = { 0x9b, 0x9a, };
483215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart3_data_pins[] = { 0xb0, 0xb1, };
484215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_uart3_hwflow_pins[] = { 0xb2, 0xb3, };
485215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc0_1bit_pins[] = { 0xa8, 0xa9, 0xa0, };
486215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc0_4bit_pins[] = { 0xa1, 0xa2, 0xa3, };
487215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc0_8bit_pins[] = { 0xa4, 0xa5, 0xa6, 0xa7, };
488215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc1_1bit_pins[] = { 0xae, 0xaf, 0xaa, };
489215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_mmc1_4bit_pins[] = { 0xab, 0xac, 0xad, };
490215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_i2c_pins[] = { 0x8c, 0x8d, };
491215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_cim_pins[] = {
492215c81a3S周琰杰 (Zhou Yanjie) 	0x89, 0x8b, 0x8a, 0x88,
493215c81a3S周琰杰 (Zhou Yanjie) 	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
494215c81a3S周琰杰 (Zhou Yanjie) };
495215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_8bit_pins[] = {
496215c81a3S周琰杰 (Zhou Yanjie) 	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
497215c81a3S周琰杰 (Zhou Yanjie) 	0x72, 0x73, 0x74,
498215c81a3S周琰杰 (Zhou Yanjie) };
499215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_16bit_pins[] = {
500215c81a3S周琰杰 (Zhou Yanjie) 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
501215c81a3S周琰杰 (Zhou Yanjie) };
502215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_18bit_pins[] = { 0x70, 0x71, };
503215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, 0xb2, 0xb3, };
504215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
505215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_lcd_generic_pins[] = { 0x75, };
506215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs1_pins[] = { 0x55, };
507215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs2_pins[] = { 0x56, };
508215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs3_pins[] = { 0x57, };
509215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_cs4_pins[] = { 0x58, };
510215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
511215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm0_pins[] = { 0x94, };
512215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm1_pins[] = { 0x95, };
513215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm2_pins[] = { 0x96, };
514215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm3_pins[] = { 0x97, };
515215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm4_pins[] = { 0x98, };
516215c81a3S周琰杰 (Zhou Yanjie) static int jz4750_pwm_pwm5_pins[] = { 0x99, };
517215c81a3S周琰杰 (Zhou Yanjie) 
518215c81a3S周琰杰 (Zhou Yanjie) static const struct group_desc jz4750_groups[] = {
519215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-data", jz4750_uart0_data, 1),
520215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-hwflow", jz4750_uart0_hwflow, 1),
521215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-data", jz4750_uart1_data, 0),
522215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-hwflow", jz4750_uart1_hwflow, 0),
523215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data", jz4750_uart2_data, 1),
524215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-data", jz4750_uart3_data, 0),
525215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-hwflow", jz4750_uart3_hwflow, 0),
526215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-1bit", jz4750_mmc0_1bit, 0),
527215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-4bit", jz4750_mmc0_4bit, 0),
528215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-8bit", jz4750_mmc0_8bit, 0),
529215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-1bit", jz4750_mmc1_1bit, 0),
530215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-4bit", jz4750_mmc1_4bit, 0),
531215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c-data", jz4750_i2c, 0),
532215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("cim-data", jz4750_cim, 0),
533215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-8bit", jz4750_lcd_8bit, 0),
534215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4750_lcd_16bit, 0),
535215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-18bit", jz4750_lcd_18bit, 0),
536215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-24bit", jz4750_lcd_24bit, 1),
537215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4750_lcd_special, 0),
538215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4750_lcd_generic, 0),
539215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs1", jz4750_nand_cs1, 0),
540215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs2", jz4750_nand_cs2, 0),
541215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs3", jz4750_nand_cs3, 0),
542215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs4", jz4750_nand_cs4, 0),
543215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-fre-fwe", jz4750_nand_fre_fwe, 0),
544215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0", jz4750_pwm_pwm0, 0),
545215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1", jz4750_pwm_pwm1, 0),
546215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2", jz4750_pwm_pwm2, 0),
547215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3", jz4750_pwm_pwm3, 0),
548215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm4", jz4750_pwm_pwm4, 0),
549215c81a3S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm5", jz4750_pwm_pwm5, 0),
550215c81a3S周琰杰 (Zhou Yanjie) };
551215c81a3S周琰杰 (Zhou Yanjie) 
552215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
553215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
554215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart2_groups[] = { "uart2-data", };
555215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
556215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_mmc0_groups[] = {
557215c81a3S周琰杰 (Zhou Yanjie) 	"mmc0-1bit", "mmc0-4bit", "mmc0-8bit",
558215c81a3S周琰杰 (Zhou Yanjie) };
559215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_mmc1_groups[] = { "mmc0-1bit", "mmc0-4bit", };
560215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_i2c_groups[] = { "i2c-data", };
561215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_cim_groups[] = { "cim-data", };
562215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_lcd_groups[] = {
563215c81a3S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
564215c81a3S周琰杰 (Zhou Yanjie) 	"lcd-special", "lcd-generic",
565215c81a3S周琰杰 (Zhou Yanjie) };
566215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_nand_groups[] = {
567215c81a3S周琰杰 (Zhou Yanjie) 	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
568215c81a3S周琰杰 (Zhou Yanjie) };
569215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm0_groups[] = { "pwm0", };
570215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm1_groups[] = { "pwm1", };
571215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm2_groups[] = { "pwm2", };
572215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm3_groups[] = { "pwm3", };
573215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm4_groups[] = { "pwm4", };
574215c81a3S周琰杰 (Zhou Yanjie) static const char *jz4750_pwm5_groups[] = { "pwm5", };
575215c81a3S周琰杰 (Zhou Yanjie) 
576215c81a3S周琰杰 (Zhou Yanjie) static const struct function_desc jz4750_functions[] = {
577215c81a3S周琰杰 (Zhou Yanjie) 	{ "uart0", jz4750_uart0_groups, ARRAY_SIZE(jz4750_uart0_groups), },
578215c81a3S周琰杰 (Zhou Yanjie) 	{ "uart1", jz4750_uart1_groups, ARRAY_SIZE(jz4750_uart1_groups), },
579215c81a3S周琰杰 (Zhou Yanjie) 	{ "uart2", jz4750_uart2_groups, ARRAY_SIZE(jz4750_uart2_groups), },
580215c81a3S周琰杰 (Zhou Yanjie) 	{ "uart3", jz4750_uart3_groups, ARRAY_SIZE(jz4750_uart3_groups), },
581215c81a3S周琰杰 (Zhou Yanjie) 	{ "mmc0", jz4750_mmc0_groups, ARRAY_SIZE(jz4750_mmc0_groups), },
582215c81a3S周琰杰 (Zhou Yanjie) 	{ "mmc1", jz4750_mmc1_groups, ARRAY_SIZE(jz4750_mmc1_groups), },
583215c81a3S周琰杰 (Zhou Yanjie) 	{ "i2c", jz4750_i2c_groups, ARRAY_SIZE(jz4750_i2c_groups), },
584215c81a3S周琰杰 (Zhou Yanjie) 	{ "cim", jz4750_cim_groups, ARRAY_SIZE(jz4750_cim_groups), },
585215c81a3S周琰杰 (Zhou Yanjie) 	{ "lcd", jz4750_lcd_groups, ARRAY_SIZE(jz4750_lcd_groups), },
586215c81a3S周琰杰 (Zhou Yanjie) 	{ "nand", jz4750_nand_groups, ARRAY_SIZE(jz4750_nand_groups), },
587215c81a3S周琰杰 (Zhou Yanjie) 	{ "pwm0", jz4750_pwm0_groups, ARRAY_SIZE(jz4750_pwm0_groups), },
588215c81a3S周琰杰 (Zhou Yanjie) 	{ "pwm1", jz4750_pwm1_groups, ARRAY_SIZE(jz4750_pwm1_groups), },
589215c81a3S周琰杰 (Zhou Yanjie) 	{ "pwm2", jz4750_pwm2_groups, ARRAY_SIZE(jz4750_pwm2_groups), },
590215c81a3S周琰杰 (Zhou Yanjie) 	{ "pwm3", jz4750_pwm3_groups, ARRAY_SIZE(jz4750_pwm3_groups), },
591215c81a3S周琰杰 (Zhou Yanjie) 	{ "pwm4", jz4750_pwm4_groups, ARRAY_SIZE(jz4750_pwm4_groups), },
592215c81a3S周琰杰 (Zhou Yanjie) 	{ "pwm5", jz4750_pwm5_groups, ARRAY_SIZE(jz4750_pwm5_groups), },
593215c81a3S周琰杰 (Zhou Yanjie) };
594215c81a3S周琰杰 (Zhou Yanjie) 
595215c81a3S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4750_chip_info = {
596215c81a3S周琰杰 (Zhou Yanjie) 	.num_chips = 6,
597215c81a3S周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
598215c81a3S周琰杰 (Zhou Yanjie) 	.version = ID_JZ4750,
599215c81a3S周琰杰 (Zhou Yanjie) 	.groups = jz4750_groups,
600215c81a3S周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(jz4750_groups),
601215c81a3S周琰杰 (Zhou Yanjie) 	.functions = jz4750_functions,
602215c81a3S周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(jz4750_functions),
603215c81a3S周琰杰 (Zhou Yanjie) 	.pull_ups = jz4750_pull_ups,
604215c81a3S周琰杰 (Zhou Yanjie) 	.pull_downs = jz4750_pull_downs,
605215c81a3S周琰杰 (Zhou Yanjie) };
606215c81a3S周琰杰 (Zhou Yanjie) 
607b582b5a4S周琰杰 (Zhou Yanjie) static const u32 jz4755_pull_ups[6] = {
608b582b5a4S周琰杰 (Zhou Yanjie) 	0xffffffff, 0xffffffff, 0x0fffffff, 0xffffffff, 0x33dc3fff, 0x0000fc00,
609b582b5a4S周琰杰 (Zhou Yanjie) };
610b582b5a4S周琰杰 (Zhou Yanjie) 
611b582b5a4S周琰杰 (Zhou Yanjie) static const u32 jz4755_pull_downs[6] = {
612b582b5a4S周琰杰 (Zhou Yanjie) 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
613b582b5a4S周琰杰 (Zhou Yanjie) };
614b582b5a4S周琰杰 (Zhou Yanjie) 
615b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart0_data_pins[] = { 0x7c, 0x7d, };
616b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
617b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart1_data_pins[] = { 0x97, 0x99, };
618b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_uart2_data_pins[] = { 0x9f, };
619b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dt_b_pins[] = { 0x3b, };
620b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dt_f_pins[] = { 0xa1, };
621b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dr_b_pins[] = { 0x3c, };
622b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_dr_f_pins[] = { 0xa2, };
623b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_clk_b_pins[] = { 0x3a, };
624b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_clk_f_pins[] = { 0xa0, };
625b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_gpc_b_pins[] = { 0x3e, };
626b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_gpc_f_pins[] = { 0xa4, };
627b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce0_b_pins[] = { 0x3d, };
628b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce0_f_pins[] = { 0xa3, };
629b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce1_b_pins[] = { 0x3f, };
630b638e0f1S周琰杰 (Zhou Yanjie) static int jz4755_ssi_ce1_f_pins[] = { 0xa5, };
631b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc0_1bit_pins[] = { 0x2f, 0x50, 0x5c, };
632b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x51, };
633b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc1_1bit_pins[] = { 0x3a, 0x3d, 0x3c, };
634b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_mmc1_4bit_pins[] = { 0x3b, 0x3e, 0x3f, };
635b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_i2c_pins[] = { 0x8c, 0x8d, };
636b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_cim_pins[] = {
637b582b5a4S周琰杰 (Zhou Yanjie) 	0x89, 0x8b, 0x8a, 0x88,
638b582b5a4S周琰杰 (Zhou Yanjie) 	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
639b582b5a4S周琰杰 (Zhou Yanjie) };
640b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_8bit_pins[] = {
641b582b5a4S周琰杰 (Zhou Yanjie) 	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
642b582b5a4S周琰杰 (Zhou Yanjie) 	0x72, 0x73, 0x74,
643b582b5a4S周琰杰 (Zhou Yanjie) };
644b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_16bit_pins[] = {
645b582b5a4S周琰杰 (Zhou Yanjie) 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
646b582b5a4S周琰杰 (Zhou Yanjie) };
647b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_18bit_pins[] = { 0x70, 0x71, };
648b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, };
649b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
650b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_lcd_generic_pins[] = { 0x75, };
651b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs1_pins[] = { 0x55, };
652b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs2_pins[] = { 0x56, };
653b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs3_pins[] = { 0x57, };
654b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_cs4_pins[] = { 0x58, };
655b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
656b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm0_pins[] = { 0x94, };
657b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm1_pins[] = { 0xab, };
658b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm2_pins[] = { 0x96, };
659b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm3_pins[] = { 0x97, };
660b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm4_pins[] = { 0x98, };
661b582b5a4S周琰杰 (Zhou Yanjie) static int jz4755_pwm_pwm5_pins[] = { 0x99, };
662b582b5a4S周琰杰 (Zhou Yanjie) 
663b582b5a4S周琰杰 (Zhou Yanjie) static u8 jz4755_mmc0_1bit_funcs[] = { 2, 2, 1, };
664b582b5a4S周琰杰 (Zhou Yanjie) static u8 jz4755_mmc0_4bit_funcs[] = { 1, 0, 1, };
665b582b5a4S周琰杰 (Zhou Yanjie) static u8 jz4755_lcd_24bit_funcs[] = { 1, 1, 1, 1, 0, 0, };
666b582b5a4S周琰杰 (Zhou Yanjie) 
667b582b5a4S周琰杰 (Zhou Yanjie) static const struct group_desc jz4755_groups[] = {
668b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-data", jz4755_uart0_data, 0),
669b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-hwflow", jz4755_uart0_hwflow, 0),
670b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-data", jz4755_uart1_data, 0),
671b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data", jz4755_uart2_data, 1),
672b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dt-b", jz4755_ssi_dt_b, 0),
673b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dt-f", jz4755_ssi_dt_f, 0),
674b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dr-b", jz4755_ssi_dr_b, 0),
675b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dr-f", jz4755_ssi_dr_f, 0),
676b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-clk-b", jz4755_ssi_clk_b, 0),
677b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-clk-f", jz4755_ssi_clk_f, 0),
678b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-gpc-b", jz4755_ssi_gpc_b, 0),
679b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-gpc-f", jz4755_ssi_gpc_f, 0),
680b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce0-b", jz4755_ssi_ce0_b, 0),
681b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce0-f", jz4755_ssi_ce0_f, 0),
682b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce1-b", jz4755_ssi_ce1_b, 0),
683b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce1-f", jz4755_ssi_ce1_f, 0),
684b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("mmc0-1bit", jz4755_mmc0_1bit,
685b582b5a4S周琰杰 (Zhou Yanjie) 				jz4755_mmc0_1bit_funcs),
686b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("mmc0-4bit", jz4755_mmc0_4bit,
687b582b5a4S周琰杰 (Zhou Yanjie) 				jz4755_mmc0_4bit_funcs),
688b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-1bit", jz4755_mmc1_1bit, 1),
689b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-4bit", jz4755_mmc1_4bit, 1),
690b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c-data", jz4755_i2c, 0),
691b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("cim-data", jz4755_cim, 0),
692b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-8bit", jz4755_lcd_8bit, 0),
693b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4755_lcd_16bit, 0),
694b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-18bit", jz4755_lcd_18bit, 0),
695b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("lcd-24bit", jz4755_lcd_24bit,
696b582b5a4S周琰杰 (Zhou Yanjie) 				jz4755_lcd_24bit_funcs),
697b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4755_lcd_special, 0),
698b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4755_lcd_generic, 0),
699b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs1", jz4755_nand_cs1, 0),
700b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs2", jz4755_nand_cs2, 0),
701b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs3", jz4755_nand_cs3, 0),
702b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-cs4", jz4755_nand_cs4, 0),
703b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nand-fre-fwe", jz4755_nand_fre_fwe, 0),
704b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0", jz4755_pwm_pwm0, 0),
705b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1", jz4755_pwm_pwm1, 1),
706b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2", jz4755_pwm_pwm2, 0),
707b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3", jz4755_pwm_pwm3, 0),
708b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm4", jz4755_pwm_pwm4, 0),
709b582b5a4S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm5", jz4755_pwm_pwm5, 0),
710b582b5a4S周琰杰 (Zhou Yanjie) };
711b582b5a4S周琰杰 (Zhou Yanjie) 
712b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
713b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_uart1_groups[] = { "uart1-data", };
714b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_uart2_groups[] = { "uart2-data", };
715b638e0f1S周琰杰 (Zhou Yanjie) static const char *jz4755_ssi_groups[] = {
716b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi-dt-b", "ssi-dt-f",
717b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi-dr-b", "ssi-dr-f",
718b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi-clk-b", "ssi-clk-f",
719b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi-gpc-b", "ssi-gpc-f",
720b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi-ce0-b", "ssi-ce0-f",
721b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi-ce1-b", "ssi-ce1-f",
722b638e0f1S周琰杰 (Zhou Yanjie) };
723b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
724b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_mmc1_groups[] = { "mmc0-1bit", "mmc0-4bit", };
725b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_i2c_groups[] = { "i2c-data", };
726b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_cim_groups[] = { "cim-data", };
727b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_lcd_groups[] = {
728b582b5a4S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
729b582b5a4S周琰杰 (Zhou Yanjie) 	"lcd-special", "lcd-generic",
730b582b5a4S周琰杰 (Zhou Yanjie) };
731b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_nand_groups[] = {
732b582b5a4S周琰杰 (Zhou Yanjie) 	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
733b582b5a4S周琰杰 (Zhou Yanjie) };
734b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm0_groups[] = { "pwm0", };
735b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm1_groups[] = { "pwm1", };
736b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm2_groups[] = { "pwm2", };
737b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm3_groups[] = { "pwm3", };
738b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm4_groups[] = { "pwm4", };
739b582b5a4S周琰杰 (Zhou Yanjie) static const char *jz4755_pwm5_groups[] = { "pwm5", };
740b582b5a4S周琰杰 (Zhou Yanjie) 
741b582b5a4S周琰杰 (Zhou Yanjie) static const struct function_desc jz4755_functions[] = {
742b582b5a4S周琰杰 (Zhou Yanjie) 	{ "uart0", jz4755_uart0_groups, ARRAY_SIZE(jz4755_uart0_groups), },
743b582b5a4S周琰杰 (Zhou Yanjie) 	{ "uart1", jz4755_uart1_groups, ARRAY_SIZE(jz4755_uart1_groups), },
744b582b5a4S周琰杰 (Zhou Yanjie) 	{ "uart2", jz4755_uart2_groups, ARRAY_SIZE(jz4755_uart2_groups), },
745b638e0f1S周琰杰 (Zhou Yanjie) 	{ "ssi", jz4755_ssi_groups, ARRAY_SIZE(jz4755_ssi_groups), },
746b582b5a4S周琰杰 (Zhou Yanjie) 	{ "mmc0", jz4755_mmc0_groups, ARRAY_SIZE(jz4755_mmc0_groups), },
747b582b5a4S周琰杰 (Zhou Yanjie) 	{ "mmc1", jz4755_mmc1_groups, ARRAY_SIZE(jz4755_mmc1_groups), },
748b582b5a4S周琰杰 (Zhou Yanjie) 	{ "i2c", jz4755_i2c_groups, ARRAY_SIZE(jz4755_i2c_groups), },
749b582b5a4S周琰杰 (Zhou Yanjie) 	{ "cim", jz4755_cim_groups, ARRAY_SIZE(jz4755_cim_groups), },
750b582b5a4S周琰杰 (Zhou Yanjie) 	{ "lcd", jz4755_lcd_groups, ARRAY_SIZE(jz4755_lcd_groups), },
751b582b5a4S周琰杰 (Zhou Yanjie) 	{ "nand", jz4755_nand_groups, ARRAY_SIZE(jz4755_nand_groups), },
752b582b5a4S周琰杰 (Zhou Yanjie) 	{ "pwm0", jz4755_pwm0_groups, ARRAY_SIZE(jz4755_pwm0_groups), },
753b582b5a4S周琰杰 (Zhou Yanjie) 	{ "pwm1", jz4755_pwm1_groups, ARRAY_SIZE(jz4755_pwm1_groups), },
754b582b5a4S周琰杰 (Zhou Yanjie) 	{ "pwm2", jz4755_pwm2_groups, ARRAY_SIZE(jz4755_pwm2_groups), },
755b582b5a4S周琰杰 (Zhou Yanjie) 	{ "pwm3", jz4755_pwm3_groups, ARRAY_SIZE(jz4755_pwm3_groups), },
756b582b5a4S周琰杰 (Zhou Yanjie) 	{ "pwm4", jz4755_pwm4_groups, ARRAY_SIZE(jz4755_pwm4_groups), },
757b582b5a4S周琰杰 (Zhou Yanjie) 	{ "pwm5", jz4755_pwm5_groups, ARRAY_SIZE(jz4755_pwm5_groups), },
758b582b5a4S周琰杰 (Zhou Yanjie) };
759b582b5a4S周琰杰 (Zhou Yanjie) 
760b582b5a4S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4755_chip_info = {
761b582b5a4S周琰杰 (Zhou Yanjie) 	.num_chips = 6,
762b582b5a4S周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
763b582b5a4S周琰杰 (Zhou Yanjie) 	.version = ID_JZ4755,
764b582b5a4S周琰杰 (Zhou Yanjie) 	.groups = jz4755_groups,
765b582b5a4S周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(jz4755_groups),
766b582b5a4S周琰杰 (Zhou Yanjie) 	.functions = jz4755_functions,
767b582b5a4S周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(jz4755_functions),
768b582b5a4S周琰杰 (Zhou Yanjie) 	.pull_ups = jz4755_pull_ups,
769b582b5a4S周琰杰 (Zhou Yanjie) 	.pull_downs = jz4755_pull_downs,
770b582b5a4S周琰杰 (Zhou Yanjie) };
771b582b5a4S周琰杰 (Zhou Yanjie) 
7720257595aSZhou Yanjie static const u32 jz4760_pull_ups[6] = {
773d5e93140SPaul Cercueil 	0xffffffff, 0xfffcf3ff, 0xffffffff, 0xffffcfff, 0xfffffb7c, 0x0000000f,
7740257595aSZhou Yanjie };
7750257595aSZhou Yanjie 
7760257595aSZhou Yanjie static const u32 jz4760_pull_downs[6] = {
7770257595aSZhou Yanjie 	0x00000000, 0x00030c00, 0x00000000, 0x00003000, 0x00000483, 0x00000ff0,
7780257595aSZhou Yanjie };
7790257595aSZhou Yanjie 
7800257595aSZhou Yanjie static int jz4760_uart0_data_pins[] = { 0xa0, 0xa3, };
7810257595aSZhou Yanjie static int jz4760_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
7820257595aSZhou Yanjie static int jz4760_uart1_data_pins[] = { 0x7a, 0x7c, };
7830257595aSZhou Yanjie static int jz4760_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
7840257595aSZhou Yanjie static int jz4760_uart2_data_pins[] = { 0x5c, 0x5e, };
7850257595aSZhou Yanjie static int jz4760_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
7860257595aSZhou Yanjie static int jz4760_uart3_data_pins[] = { 0x6c, 0x85, };
7870257595aSZhou Yanjie static int jz4760_uart3_hwflow_pins[] = { 0x88, 0x89, };
788b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_a_pins[] = { 0x15, };
789b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_b_pins[] = { 0x35, };
790b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_d_pins[] = { 0x75, };
791b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dt_e_pins[] = { 0x91, };
792b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_a_pins[] = { 0x14, };
793b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_b_pins[] = { 0x34, };
794b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_d_pins[] = { 0x74, };
795b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_dr_e_pins[] = { 0x8e, };
796b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_a_pins[] = { 0x12, };
797b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_b_pins[] = { 0x3c, };
798b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_d_pins[] = { 0x78, };
799b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_clk_e_pins[] = { 0x8f, };
800b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_gpc_b_pins[] = { 0x3e, };
801b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_gpc_d_pins[] = { 0x76, };
802b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_gpc_e_pins[] = { 0x93, };
803b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_a_pins[] = { 0x13, };
804b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_b_pins[] = { 0x3d, };
805b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_d_pins[] = { 0x79, };
806b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce0_e_pins[] = { 0x90, };
807b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce1_b_pins[] = { 0x3f, };
808b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce1_d_pins[] = { 0x77, };
809b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi0_ce1_e_pins[] = { 0x92, };
810b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_b_9_pins[] = { 0x29, };
811b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_b_21_pins[] = { 0x35, };
812b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_d_12_pins[] = { 0x6c, };
813b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_d_21_pins[] = { 0x75, };
814b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_e_pins[] = { 0x91, };
815b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dt_f_pins[] = { 0xa3, };
816b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_b_6_pins[] = { 0x26, };
817b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_b_20_pins[] = { 0x34, };
818b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_d_13_pins[] = { 0x6d, };
819b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_d_20_pins[] = { 0x74, };
820b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_e_pins[] = { 0x8e, };
821b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_dr_f_pins[] = { 0xa0, };
822b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_b_7_pins[] = { 0x27, };
823b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_b_28_pins[] = { 0x3c, };
824b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_d_pins[] = { 0x78, };
825b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_e_7_pins[] = { 0x87, };
826b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_e_15_pins[] = { 0x8f, };
827b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_clk_f_pins[] = { 0xa2, };
828b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_gpc_b_pins[] = { 0x3e, };
829b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_gpc_d_pins[] = { 0x76, };
830b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_gpc_e_pins[] = { 0x93, };
831b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_b_8_pins[] = { 0x28, };
832b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_b_29_pins[] = { 0x3d, };
833b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_d_pins[] = { 0x79, };
834b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_e_6_pins[] = { 0x86, };
835b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_e_16_pins[] = { 0x90, };
836b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce0_f_pins[] = { 0xa1, };
837b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce1_b_pins[] = { 0x3f, };
838b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce1_d_pins[] = { 0x77, };
839b638e0f1S周琰杰 (Zhou Yanjie) static int jz4760_ssi1_ce1_e_pins[] = { 0x92, };
8400257595aSZhou Yanjie static int jz4760_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
8410257595aSZhou Yanjie static int jz4760_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
8420257595aSZhou Yanjie static int jz4760_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
8430257595aSZhou Yanjie static int jz4760_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
8440257595aSZhou Yanjie static int jz4760_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
8450257595aSZhou Yanjie static int jz4760_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
8460257595aSZhou Yanjie static int jz4760_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
8470257595aSZhou Yanjie static int jz4760_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
8480257595aSZhou Yanjie static int jz4760_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
8490257595aSZhou Yanjie static int jz4760_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
8500257595aSZhou Yanjie static int jz4760_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
8510257595aSZhou Yanjie static int jz4760_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
8520257595aSZhou Yanjie static int jz4760_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
8530257595aSZhou Yanjie static int jz4760_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
8540257595aSZhou Yanjie static int jz4760_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
8550257595aSZhou Yanjie static int jz4760_nemc_8bit_data_pins[] = {
8560257595aSZhou Yanjie 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
8570257595aSZhou Yanjie };
8580257595aSZhou Yanjie static int jz4760_nemc_16bit_data_pins[] = {
8590257595aSZhou Yanjie 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
8600257595aSZhou Yanjie };
8610257595aSZhou Yanjie static int jz4760_nemc_cle_ale_pins[] = { 0x20, 0x21, };
8620257595aSZhou Yanjie static int jz4760_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
8630257595aSZhou Yanjie static int jz4760_nemc_rd_we_pins[] = { 0x10, 0x11, };
8640257595aSZhou Yanjie static int jz4760_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
8650257595aSZhou Yanjie static int jz4760_nemc_wait_pins[] = { 0x1b, };
8660257595aSZhou Yanjie static int jz4760_nemc_cs1_pins[] = { 0x15, };
8670257595aSZhou Yanjie static int jz4760_nemc_cs2_pins[] = { 0x16, };
8680257595aSZhou Yanjie static int jz4760_nemc_cs3_pins[] = { 0x17, };
8690257595aSZhou Yanjie static int jz4760_nemc_cs4_pins[] = { 0x18, };
8700257595aSZhou Yanjie static int jz4760_nemc_cs5_pins[] = { 0x19, };
8710257595aSZhou Yanjie static int jz4760_nemc_cs6_pins[] = { 0x1a, };
8720257595aSZhou Yanjie static int jz4760_i2c0_pins[] = { 0x7e, 0x7f, };
8730257595aSZhou Yanjie static int jz4760_i2c1_pins[] = { 0x9e, 0x9f, };
8740257595aSZhou Yanjie static int jz4760_cim_pins[] = {
8750257595aSZhou Yanjie 	0x26, 0x27, 0x28, 0x29,
8760257595aSZhou Yanjie 	0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
8770257595aSZhou Yanjie };
878dd1ccfd6SPaul Cercueil static int jz4760_lcd_8bit_pins[] = {
879dd1ccfd6SPaul Cercueil 	0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4c,
880dd1ccfd6SPaul Cercueil 	0x4d, 0x52, 0x53,
8810257595aSZhou Yanjie };
882dd1ccfd6SPaul Cercueil static int jz4760_lcd_16bit_pins[] = {
883dd1ccfd6SPaul Cercueil 	0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59,
884dd1ccfd6SPaul Cercueil };
885dd1ccfd6SPaul Cercueil static int jz4760_lcd_18bit_pins[] = {
886dd1ccfd6SPaul Cercueil 	0x5a, 0x5b,
887dd1ccfd6SPaul Cercueil };
888dd1ccfd6SPaul Cercueil static int jz4760_lcd_24bit_pins[] = {
889dd1ccfd6SPaul Cercueil 	0x40, 0x41, 0x4a, 0x4b, 0x54, 0x55,
890dd1ccfd6SPaul Cercueil };
8915e6332a7S周琰杰 (Zhou Yanjie) static int jz4760_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, };
892dd1ccfd6SPaul Cercueil static int jz4760_lcd_generic_pins[] = { 0x49, };
8930257595aSZhou Yanjie static int jz4760_pwm_pwm0_pins[] = { 0x80, };
8940257595aSZhou Yanjie static int jz4760_pwm_pwm1_pins[] = { 0x81, };
8950257595aSZhou Yanjie static int jz4760_pwm_pwm2_pins[] = { 0x82, };
8960257595aSZhou Yanjie static int jz4760_pwm_pwm3_pins[] = { 0x83, };
8970257595aSZhou Yanjie static int jz4760_pwm_pwm4_pins[] = { 0x84, };
8980257595aSZhou Yanjie static int jz4760_pwm_pwm5_pins[] = { 0x85, };
8990257595aSZhou Yanjie static int jz4760_pwm_pwm6_pins[] = { 0x6a, };
9000257595aSZhou Yanjie static int jz4760_pwm_pwm7_pins[] = { 0x6b, };
901dd1ccfd6SPaul Cercueil static int jz4760_otg_pins[] = { 0x8a, };
9020257595aSZhou Yanjie 
903bb42b593SPaul Cercueil static u8 jz4760_uart3_data_funcs[] = { 0, 1, };
904bb42b593SPaul Cercueil static u8 jz4760_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
9050257595aSZhou Yanjie 
9060257595aSZhou Yanjie static const struct group_desc jz4760_groups[] = {
907bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", jz4760_uart0_data, 0),
908bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", jz4760_uart0_hwflow, 0),
909bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data", jz4760_uart1_data, 0),
910bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-hwflow", jz4760_uart1_hwflow, 0),
911bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data", jz4760_uart2_data, 0),
912bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-hwflow", jz4760_uart2_hwflow, 0),
913bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4760_uart3_data,
914bb42b593SPaul Cercueil 				jz4760_uart3_data_funcs),
915bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart3-hwflow", jz4760_uart3_hwflow, 0),
916b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-a", jz4760_ssi0_dt_a, 2),
917b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-b", jz4760_ssi0_dt_b, 1),
918b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-d", jz4760_ssi0_dt_d, 1),
919b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-e", jz4760_ssi0_dt_e, 0),
920b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-a", jz4760_ssi0_dr_a, 1),
921b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-b", jz4760_ssi0_dr_b, 1),
922b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-d", jz4760_ssi0_dr_d, 1),
923b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-e", jz4760_ssi0_dr_e, 0),
924b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-a", jz4760_ssi0_clk_a, 2),
925b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-b", jz4760_ssi0_clk_b, 1),
926b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-d", jz4760_ssi0_clk_d, 1),
927b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-e", jz4760_ssi0_clk_e, 0),
928b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-gpc-b", jz4760_ssi0_gpc_b, 1),
929b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-gpc-d", jz4760_ssi0_gpc_d, 1),
930b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-gpc-e", jz4760_ssi0_gpc_e, 0),
931b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce0-a", jz4760_ssi0_ce0_a, 2),
932b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce0-b", jz4760_ssi0_ce0_b, 1),
933b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce0-d", jz4760_ssi0_ce0_d, 1),
934b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce0-e", jz4760_ssi0_ce0_e, 0),
935b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce1-b", jz4760_ssi0_ce1_b, 1),
936b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce1-d", jz4760_ssi0_ce1_d, 1),
937b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce1-e", jz4760_ssi0_ce1_e, 0),
938b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-b-9", jz4760_ssi1_dt_b_9, 2),
939b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-b-21", jz4760_ssi1_dt_b_21, 2),
940b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-d-12", jz4760_ssi1_dt_d_12, 2),
941b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-d-21", jz4760_ssi1_dt_d_21, 2),
942b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-e", jz4760_ssi1_dt_e, 1),
943b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-f", jz4760_ssi1_dt_f, 2),
944b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-b-6", jz4760_ssi1_dr_b_6, 2),
945b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-b-20", jz4760_ssi1_dr_b_20, 2),
946b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-d-13", jz4760_ssi1_dr_d_13, 2),
947b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-d-20", jz4760_ssi1_dr_d_20, 2),
948b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-e", jz4760_ssi1_dr_e, 1),
949b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-f", jz4760_ssi1_dr_f, 2),
950b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-b-7", jz4760_ssi1_clk_b_7, 2),
951b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-b-28", jz4760_ssi1_clk_b_28, 2),
952b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-d", jz4760_ssi1_clk_d, 2),
953b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-e-7", jz4760_ssi1_clk_e_7, 2),
954b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-e-15", jz4760_ssi1_clk_e_15, 1),
955b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-f", jz4760_ssi1_clk_f, 2),
956b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-gpc-b", jz4760_ssi1_gpc_b, 2),
957b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-gpc-d", jz4760_ssi1_gpc_d, 2),
958b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-gpc-e", jz4760_ssi1_gpc_e, 1),
959b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce0-b-8", jz4760_ssi1_ce0_b_8, 2),
960b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce0-b-29", jz4760_ssi1_ce0_b_29, 2),
961b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce0-d", jz4760_ssi1_ce0_d, 2),
962b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce0-e-6", jz4760_ssi1_ce0_e_6, 2),
963b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce0-e-16", jz4760_ssi1_ce0_e_16, 1),
964b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce0-f", jz4760_ssi1_ce0_f, 2),
965b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce1-b", jz4760_ssi1_ce1_b, 2),
966b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce1-d", jz4760_ssi1_ce1_d, 2),
967b638e0f1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce1-e", jz4760_ssi1_ce1_e, 1),
968bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4760_mmc0_1bit_a,
969bb42b593SPaul Cercueil 				jz4760_mmc0_1bit_a_funcs),
970bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4760_mmc0_4bit_a, 1),
971bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4760_mmc0_1bit_e, 0),
972bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4760_mmc0_4bit_e, 0),
973bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-8bit-e", jz4760_mmc0_8bit_e, 0),
974bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4760_mmc1_1bit_d, 0),
975bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4760_mmc1_4bit_d, 0),
976bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4760_mmc1_1bit_e, 1),
977bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4760_mmc1_4bit_e, 1),
978bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-8bit-e", jz4760_mmc1_8bit_e, 1),
979bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4760_mmc2_1bit_b, 0),
980bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4760_mmc2_4bit_b, 0),
981bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4760_mmc2_1bit_e, 2),
982bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4760_mmc2_4bit_e, 2),
983bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-8bit-e", jz4760_mmc2_8bit_e, 2),
984bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-8bit-data", jz4760_nemc_8bit_data, 0),
985bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-16bit-data", jz4760_nemc_16bit_data, 0),
986bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cle-ale", jz4760_nemc_cle_ale, 0),
987bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-addr", jz4760_nemc_addr, 0),
988bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-rd-we", jz4760_nemc_rd_we, 0),
989bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4760_nemc_frd_fwe, 0),
990bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-wait", jz4760_nemc_wait, 0),
991bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs1", jz4760_nemc_cs1, 0),
992bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs2", jz4760_nemc_cs2, 0),
993bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs3", jz4760_nemc_cs3, 0),
994bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs4", jz4760_nemc_cs4, 0),
995bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs5", jz4760_nemc_cs5, 0),
996bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs6", jz4760_nemc_cs6, 0),
997bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c0-data", jz4760_i2c0, 0),
998bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data", jz4760_i2c1, 0),
999bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data", jz4760_cim, 0),
1000dd1ccfd6SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-8bit", jz4760_lcd_8bit, 0),
1001dd1ccfd6SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-16bit", jz4760_lcd_16bit, 0),
1002dd1ccfd6SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-18bit", jz4760_lcd_18bit, 0),
1003bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-24bit", jz4760_lcd_24bit, 0),
1004dd1ccfd6SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-special", jz4760_lcd_special, 1),
10055e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4760_lcd_generic, 0),
1006bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", jz4760_pwm_pwm0, 0),
1007bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", jz4760_pwm_pwm1, 0),
1008bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", jz4760_pwm_pwm2, 0),
1009bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", jz4760_pwm_pwm3, 0),
1010bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", jz4760_pwm_pwm4, 0),
1011bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5", jz4760_pwm_pwm5, 0),
1012bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm6", jz4760_pwm_pwm6, 0),
1013bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm7", jz4760_pwm_pwm7, 0),
1014dd1ccfd6SPaul Cercueil 	INGENIC_PIN_GROUP("otg-vbus", jz4760_otg, 0),
10150257595aSZhou Yanjie };
10160257595aSZhou Yanjie 
10170257595aSZhou Yanjie static const char *jz4760_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
10180257595aSZhou Yanjie static const char *jz4760_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
10190257595aSZhou Yanjie static const char *jz4760_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
10200257595aSZhou Yanjie static const char *jz4760_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
1021b638e0f1S周琰杰 (Zhou Yanjie) static const char *jz4760_ssi0_groups[] = {
1022b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
1023b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1024b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e",
1025b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1026b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1027b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1028b638e0f1S周琰杰 (Zhou Yanjie) };
1029b638e0f1S周琰杰 (Zhou Yanjie) static const char *jz4760_ssi1_groups[] = {
1030b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi1-dt-b-9", "ssi1-dt-b-21", "ssi1-dt-d-12", "ssi1-dt-d-21", "ssi1-dt-e", "ssi1-dt-f",
1031b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi1-dr-b-6", "ssi1-dr-b-20", "ssi1-dr-d-13", "ssi1-dr-d-20", "ssi1-dr-e", "ssi1-dr-f",
1032b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi1-clk-b-7", "ssi1-clk-b-28", "ssi1-clk-d", "ssi1-clk-e-7", "ssi1-clk-e-15", "ssi1-clk-f",
1033b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1034b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi1-ce0-b-8", "ssi1-ce0-b-29", "ssi1-ce0-d", "ssi1-ce0-e-6", "ssi1-ce0-e-16", "ssi1-ce0-f",
1035b638e0f1S周琰杰 (Zhou Yanjie) 	"ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1036b638e0f1S周琰杰 (Zhou Yanjie) };
10370257595aSZhou Yanjie static const char *jz4760_mmc0_groups[] = {
10380257595aSZhou Yanjie 	"mmc0-1bit-a", "mmc0-4bit-a",
10390257595aSZhou Yanjie 	"mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
10400257595aSZhou Yanjie };
10410257595aSZhou Yanjie static const char *jz4760_mmc1_groups[] = {
10420257595aSZhou Yanjie 	"mmc1-1bit-d", "mmc1-4bit-d",
10430257595aSZhou Yanjie 	"mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
10440257595aSZhou Yanjie };
10450257595aSZhou Yanjie static const char *jz4760_mmc2_groups[] = {
10460257595aSZhou Yanjie 	"mmc2-1bit-b", "mmc2-4bit-b",
10470257595aSZhou Yanjie 	"mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
10480257595aSZhou Yanjie };
10490257595aSZhou Yanjie static const char *jz4760_nemc_groups[] = {
10500257595aSZhou Yanjie 	"nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
10510257595aSZhou Yanjie 	"nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
10520257595aSZhou Yanjie };
10530257595aSZhou Yanjie static const char *jz4760_cs1_groups[] = { "nemc-cs1", };
10540257595aSZhou Yanjie static const char *jz4760_cs2_groups[] = { "nemc-cs2", };
10550257595aSZhou Yanjie static const char *jz4760_cs3_groups[] = { "nemc-cs3", };
10560257595aSZhou Yanjie static const char *jz4760_cs4_groups[] = { "nemc-cs4", };
10570257595aSZhou Yanjie static const char *jz4760_cs5_groups[] = { "nemc-cs5", };
10580257595aSZhou Yanjie static const char *jz4760_cs6_groups[] = { "nemc-cs6", };
10590257595aSZhou Yanjie static const char *jz4760_i2c0_groups[] = { "i2c0-data", };
10600257595aSZhou Yanjie static const char *jz4760_i2c1_groups[] = { "i2c1-data", };
10610257595aSZhou Yanjie static const char *jz4760_cim_groups[] = { "cim-data", };
1062dd1ccfd6SPaul Cercueil static const char *jz4760_lcd_groups[] = {
1063dd1ccfd6SPaul Cercueil 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
1064dd1ccfd6SPaul Cercueil 	"lcd-special", "lcd-generic",
1065dd1ccfd6SPaul Cercueil };
10660257595aSZhou Yanjie static const char *jz4760_pwm0_groups[] = { "pwm0", };
10670257595aSZhou Yanjie static const char *jz4760_pwm1_groups[] = { "pwm1", };
10680257595aSZhou Yanjie static const char *jz4760_pwm2_groups[] = { "pwm2", };
10690257595aSZhou Yanjie static const char *jz4760_pwm3_groups[] = { "pwm3", };
10700257595aSZhou Yanjie static const char *jz4760_pwm4_groups[] = { "pwm4", };
10710257595aSZhou Yanjie static const char *jz4760_pwm5_groups[] = { "pwm5", };
10720257595aSZhou Yanjie static const char *jz4760_pwm6_groups[] = { "pwm6", };
10730257595aSZhou Yanjie static const char *jz4760_pwm7_groups[] = { "pwm7", };
1074dd1ccfd6SPaul Cercueil static const char *jz4760_otg_groups[] = { "otg-vbus", };
10750257595aSZhou Yanjie 
10760257595aSZhou Yanjie static const struct function_desc jz4760_functions[] = {
10770257595aSZhou Yanjie 	{ "uart0", jz4760_uart0_groups, ARRAY_SIZE(jz4760_uart0_groups), },
10780257595aSZhou Yanjie 	{ "uart1", jz4760_uart1_groups, ARRAY_SIZE(jz4760_uart1_groups), },
10790257595aSZhou Yanjie 	{ "uart2", jz4760_uart2_groups, ARRAY_SIZE(jz4760_uart2_groups), },
10800257595aSZhou Yanjie 	{ "uart3", jz4760_uart3_groups, ARRAY_SIZE(jz4760_uart3_groups), },
1081b638e0f1S周琰杰 (Zhou Yanjie) 	{ "ssi0", jz4760_ssi0_groups, ARRAY_SIZE(jz4760_ssi0_groups), },
1082b638e0f1S周琰杰 (Zhou Yanjie) 	{ "ssi1", jz4760_ssi1_groups, ARRAY_SIZE(jz4760_ssi1_groups), },
10830257595aSZhou Yanjie 	{ "mmc0", jz4760_mmc0_groups, ARRAY_SIZE(jz4760_mmc0_groups), },
10840257595aSZhou Yanjie 	{ "mmc1", jz4760_mmc1_groups, ARRAY_SIZE(jz4760_mmc1_groups), },
10850257595aSZhou Yanjie 	{ "mmc2", jz4760_mmc2_groups, ARRAY_SIZE(jz4760_mmc2_groups), },
10860257595aSZhou Yanjie 	{ "nemc", jz4760_nemc_groups, ARRAY_SIZE(jz4760_nemc_groups), },
10870257595aSZhou Yanjie 	{ "nemc-cs1", jz4760_cs1_groups, ARRAY_SIZE(jz4760_cs1_groups), },
10880257595aSZhou Yanjie 	{ "nemc-cs2", jz4760_cs2_groups, ARRAY_SIZE(jz4760_cs2_groups), },
10890257595aSZhou Yanjie 	{ "nemc-cs3", jz4760_cs3_groups, ARRAY_SIZE(jz4760_cs3_groups), },
10900257595aSZhou Yanjie 	{ "nemc-cs4", jz4760_cs4_groups, ARRAY_SIZE(jz4760_cs4_groups), },
10910257595aSZhou Yanjie 	{ "nemc-cs5", jz4760_cs5_groups, ARRAY_SIZE(jz4760_cs5_groups), },
10920257595aSZhou Yanjie 	{ "nemc-cs6", jz4760_cs6_groups, ARRAY_SIZE(jz4760_cs6_groups), },
10930257595aSZhou Yanjie 	{ "i2c0", jz4760_i2c0_groups, ARRAY_SIZE(jz4760_i2c0_groups), },
10940257595aSZhou Yanjie 	{ "i2c1", jz4760_i2c1_groups, ARRAY_SIZE(jz4760_i2c1_groups), },
10950257595aSZhou Yanjie 	{ "cim", jz4760_cim_groups, ARRAY_SIZE(jz4760_cim_groups), },
10960257595aSZhou Yanjie 	{ "lcd", jz4760_lcd_groups, ARRAY_SIZE(jz4760_lcd_groups), },
10970257595aSZhou Yanjie 	{ "pwm0", jz4760_pwm0_groups, ARRAY_SIZE(jz4760_pwm0_groups), },
10980257595aSZhou Yanjie 	{ "pwm1", jz4760_pwm1_groups, ARRAY_SIZE(jz4760_pwm1_groups), },
10990257595aSZhou Yanjie 	{ "pwm2", jz4760_pwm2_groups, ARRAY_SIZE(jz4760_pwm2_groups), },
11000257595aSZhou Yanjie 	{ "pwm3", jz4760_pwm3_groups, ARRAY_SIZE(jz4760_pwm3_groups), },
11010257595aSZhou Yanjie 	{ "pwm4", jz4760_pwm4_groups, ARRAY_SIZE(jz4760_pwm4_groups), },
11020257595aSZhou Yanjie 	{ "pwm5", jz4760_pwm5_groups, ARRAY_SIZE(jz4760_pwm5_groups), },
11030257595aSZhou Yanjie 	{ "pwm6", jz4760_pwm6_groups, ARRAY_SIZE(jz4760_pwm6_groups), },
11040257595aSZhou Yanjie 	{ "pwm7", jz4760_pwm7_groups, ARRAY_SIZE(jz4760_pwm7_groups), },
1105dd1ccfd6SPaul Cercueil 	{ "otg", jz4760_otg_groups, ARRAY_SIZE(jz4760_otg_groups), },
11060257595aSZhou Yanjie };
11070257595aSZhou Yanjie 
11080257595aSZhou Yanjie static const struct ingenic_chip_info jz4760_chip_info = {
11090257595aSZhou Yanjie 	.num_chips = 6,
1110f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
1111baf15647SPaul Cercueil 	.version = ID_JZ4760,
11120257595aSZhou Yanjie 	.groups = jz4760_groups,
11130257595aSZhou Yanjie 	.num_groups = ARRAY_SIZE(jz4760_groups),
11140257595aSZhou Yanjie 	.functions = jz4760_functions,
11150257595aSZhou Yanjie 	.num_functions = ARRAY_SIZE(jz4760_functions),
11160257595aSZhou Yanjie 	.pull_ups = jz4760_pull_ups,
11170257595aSZhou Yanjie 	.pull_downs = jz4760_pull_downs,
11180257595aSZhou Yanjie };
11190257595aSZhou Yanjie 
1120b5c23aa4SPaul Cercueil static const u32 jz4770_pull_ups[6] = {
1121d5e93140SPaul Cercueil 	0x3fffffff, 0xfff0f3fc, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0x0024f00f,
1122b5c23aa4SPaul Cercueil };
1123b5c23aa4SPaul Cercueil 
1124b5c23aa4SPaul Cercueil static const u32 jz4770_pull_downs[6] = {
1125d5e93140SPaul Cercueil 	0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x005b0ff0,
1126b5c23aa4SPaul Cercueil };
1127b5c23aa4SPaul Cercueil 
1128b5c23aa4SPaul Cercueil static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
1129b5c23aa4SPaul Cercueil static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
1130b5c23aa4SPaul Cercueil static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
1131b5c23aa4SPaul Cercueil static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
1132ff656e47SZhou Yanjie static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, };
1133ff656e47SZhou Yanjie static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
1134b5c23aa4SPaul Cercueil static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
1135b5c23aa4SPaul Cercueil static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
1136d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_a_pins[] = { 0x15, };
1137d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dt_b_pins[] = { 0x35, };
1138f83c2609SPaul Cercueil static int jz4770_ssi0_dt_d_pins[] = { 0x75, };
1139f83c2609SPaul Cercueil static int jz4770_ssi0_dt_e_pins[] = { 0x91, };
1140d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_a_pins[] = { 0x14, };
1141d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_dr_b_pins[] = { 0x34, };
1142f83c2609SPaul Cercueil static int jz4770_ssi0_dr_d_pins[] = { 0x74, };
1143f83c2609SPaul Cercueil static int jz4770_ssi0_dr_e_pins[] = { 0x8e, };
1144d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_a_pins[] = { 0x12, };
1145d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_clk_b_pins[] = { 0x3c, };
1146f83c2609SPaul Cercueil static int jz4770_ssi0_clk_d_pins[] = { 0x78, };
1147f83c2609SPaul Cercueil static int jz4770_ssi0_clk_e_pins[] = { 0x8f, };
1148d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, };
1149f83c2609SPaul Cercueil static int jz4770_ssi0_gpc_d_pins[] = { 0x76, };
1150f83c2609SPaul Cercueil static int jz4770_ssi0_gpc_e_pins[] = { 0x93, };
1151d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_a_pins[] = { 0x13, };
1152d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, };
1153f83c2609SPaul Cercueil static int jz4770_ssi0_ce0_d_pins[] = { 0x79, };
1154f83c2609SPaul Cercueil static int jz4770_ssi0_ce0_e_pins[] = { 0x90, };
1155d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, };
1156f83c2609SPaul Cercueil static int jz4770_ssi0_ce1_d_pins[] = { 0x77, };
1157f83c2609SPaul Cercueil static int jz4770_ssi0_ce1_e_pins[] = { 0x92, };
1158d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dt_b_pins[] = { 0x35, };
1159f83c2609SPaul Cercueil static int jz4770_ssi1_dt_d_pins[] = { 0x75, };
1160f83c2609SPaul Cercueil static int jz4770_ssi1_dt_e_pins[] = { 0x91, };
1161d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_dr_b_pins[] = { 0x34, };
1162f83c2609SPaul Cercueil static int jz4770_ssi1_dr_d_pins[] = { 0x74, };
1163f83c2609SPaul Cercueil static int jz4770_ssi1_dr_e_pins[] = { 0x8e, };
1164d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_clk_b_pins[] = { 0x3c, };
1165f83c2609SPaul Cercueil static int jz4770_ssi1_clk_d_pins[] = { 0x78, };
1166f83c2609SPaul Cercueil static int jz4770_ssi1_clk_e_pins[] = { 0x8f, };
1167d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, };
1168f83c2609SPaul Cercueil static int jz4770_ssi1_gpc_d_pins[] = { 0x76, };
1169f83c2609SPaul Cercueil static int jz4770_ssi1_gpc_e_pins[] = { 0x93, };
1170d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, };
1171f83c2609SPaul Cercueil static int jz4770_ssi1_ce0_d_pins[] = { 0x79, };
1172f83c2609SPaul Cercueil static int jz4770_ssi1_ce0_e_pins[] = { 0x90, };
1173d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, };
1174f83c2609SPaul Cercueil static int jz4770_ssi1_ce1_d_pins[] = { 0x77, };
1175f83c2609SPaul Cercueil static int jz4770_ssi1_ce1_e_pins[] = { 0x92, };
1176b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
1177ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
1178b5c23aa4SPaul Cercueil static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1179ff656e47SZhou Yanjie static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1180ff656e47SZhou Yanjie static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
1181b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
1182ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
1183b5c23aa4SPaul Cercueil static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
1184ff656e47SZhou Yanjie static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
1185ff656e47SZhou Yanjie static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
11865de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
11875de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
11885de1a73eSZhou Yanjie static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
11895de1a73eSZhou Yanjie static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
11905de1a73eSZhou Yanjie static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
1191ff656e47SZhou Yanjie static int jz4770_nemc_8bit_data_pins[] = {
1192b5c23aa4SPaul Cercueil 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1193b5c23aa4SPaul Cercueil };
1194ff656e47SZhou Yanjie static int jz4770_nemc_16bit_data_pins[] = {
1195ff656e47SZhou Yanjie 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1196ff656e47SZhou Yanjie };
1197b5c23aa4SPaul Cercueil static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
1198b5c23aa4SPaul Cercueil static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
1199b5c23aa4SPaul Cercueil static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
1200b5c23aa4SPaul Cercueil static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
12015de1a73eSZhou Yanjie static int jz4770_nemc_wait_pins[] = { 0x1b, };
1202b5c23aa4SPaul Cercueil static int jz4770_nemc_cs1_pins[] = { 0x15, };
1203b5c23aa4SPaul Cercueil static int jz4770_nemc_cs2_pins[] = { 0x16, };
1204b5c23aa4SPaul Cercueil static int jz4770_nemc_cs3_pins[] = { 0x17, };
1205b5c23aa4SPaul Cercueil static int jz4770_nemc_cs4_pins[] = { 0x18, };
1206b5c23aa4SPaul Cercueil static int jz4770_nemc_cs5_pins[] = { 0x19, };
1207b5c23aa4SPaul Cercueil static int jz4770_nemc_cs6_pins[] = { 0x1a, };
1208ff656e47SZhou Yanjie static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, };
1209ff656e47SZhou Yanjie static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, };
1210b5c23aa4SPaul Cercueil static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
1211ff656e47SZhou Yanjie static int jz4770_cim_8bit_pins[] = {
1212ff656e47SZhou Yanjie 	0x26, 0x27, 0x28, 0x29,
1213ff656e47SZhou Yanjie 	0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
1214b5c23aa4SPaul Cercueil };
1215ff656e47SZhou Yanjie static int jz4770_cim_12bit_pins[] = {
1216ff656e47SZhou Yanjie 	0x32, 0x33, 0xb0, 0xb1,
1217ff656e47SZhou Yanjie };
1218016e054dSPaul Cercueil static int jz4770_lcd_8bit_pins[] = {
1219016e054dSPaul Cercueil 	0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d,
12205e6332a7S周琰杰 (Zhou Yanjie) 	0x48, 0x52, 0x53,
12215e6332a7S周琰杰 (Zhou Yanjie) };
12225e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_16bit_pins[] = {
12235e6332a7S周琰杰 (Zhou Yanjie) 	0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59,
12245e6332a7S周琰杰 (Zhou Yanjie) };
12255e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_18bit_pins[] = {
12265e6332a7S周琰杰 (Zhou Yanjie) 	0x5a, 0x5b,
1227016e054dSPaul Cercueil };
1228ff656e47SZhou Yanjie static int jz4770_lcd_24bit_pins[] = {
1229b5c23aa4SPaul Cercueil 	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
1230b5c23aa4SPaul Cercueil 	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
1231b5c23aa4SPaul Cercueil 	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
1232ff656e47SZhou Yanjie 	0x58, 0x59, 0x5a, 0x5b,
1233b5c23aa4SPaul Cercueil };
12345e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, };
12355e6332a7S周琰杰 (Zhou Yanjie) static int jz4770_lcd_generic_pins[] = { 0x49, };
1236b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm0_pins[] = { 0x80, };
1237b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm1_pins[] = { 0x81, };
1238b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm2_pins[] = { 0x82, };
1239b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm3_pins[] = { 0x83, };
1240b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm4_pins[] = { 0x84, };
1241b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm5_pins[] = { 0x85, };
1242b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
1243b5c23aa4SPaul Cercueil static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
12445de1a73eSZhou Yanjie static int jz4770_mac_rmii_pins[] = {
12455de1a73eSZhou Yanjie 	0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
12465de1a73eSZhou Yanjie };
124765afd976S周琰杰 (Zhou Yanjie) static int jz4770_mac_mii_pins[] = {
124865afd976S周琰杰 (Zhou Yanjie) 	0x7b, 0x7a, 0x7d, 0x7c, 0xa7, 0x24, 0xaf,
124965afd976S周琰杰 (Zhou Yanjie) };
1250b5c23aa4SPaul Cercueil 
1251b5c23aa4SPaul Cercueil static const struct group_desc jz4770_groups[] = {
1252bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0),
1253bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0),
1254bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0),
1255bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0),
1256bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data, 0),
1257bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow, 0),
1258bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data,
1259bb42b593SPaul Cercueil 				jz4760_uart3_data_funcs),
1260bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0),
1261bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-a", jz4770_ssi0_dt_a, 2),
1262bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-b", jz4770_ssi0_dt_b, 1),
1263bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-d", jz4770_ssi0_dt_d, 1),
1264bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0),
1265bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-a", jz4770_ssi0_dr_a, 1),
1266bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-b", jz4770_ssi0_dr_b, 1),
1267bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-d", jz4770_ssi0_dr_d, 1),
1268bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0),
1269bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-a", jz4770_ssi0_clk_a, 2),
1270bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-b", jz4770_ssi0_clk_b, 1),
1271bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-d", jz4770_ssi0_clk_d, 1),
1272bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0),
1273bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc-b", jz4770_ssi0_gpc_b, 1),
1274bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc-d", jz4770_ssi0_gpc_d, 1),
1275bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0),
1276bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-a", jz4770_ssi0_ce0_a, 2),
1277bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-b", jz4770_ssi0_ce0_b, 1),
1278bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-d", jz4770_ssi0_ce0_d, 1),
1279bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0),
1280bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1-b", jz4770_ssi0_ce1_b, 1),
1281bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1-d", jz4770_ssi0_ce1_d, 1),
1282bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0),
1283bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-b", jz4770_ssi1_dt_b, 2),
1284bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-d", jz4770_ssi1_dt_d, 2),
1285bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1),
1286bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-b", jz4770_ssi1_dr_b, 2),
1287bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-d", jz4770_ssi1_dr_d, 2),
1288bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1),
1289bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-b", jz4770_ssi1_clk_b, 2),
1290bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-d", jz4770_ssi1_clk_d, 2),
1291bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1),
1292bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-b", jz4770_ssi1_gpc_b, 2),
1293bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-d", jz4770_ssi1_gpc_d, 2),
1294bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1),
1295bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-b", jz4770_ssi1_ce0_b, 2),
1296bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-d", jz4770_ssi1_ce0_d, 2),
1297bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1),
1298bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-b", jz4770_ssi1_ce1_b, 2),
1299bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-d", jz4770_ssi1_ce1_d, 2),
1300bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1),
1301bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a,
1302bb42b593SPaul Cercueil 				jz4760_mmc0_1bit_a_funcs),
1303bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1),
1304bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0),
1305bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0),
1306bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e, 0),
1307bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0),
1308bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0),
1309bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1),
1310bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1),
1311bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e, 1),
1312bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0),
1313bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0),
1314bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2),
1315bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2),
1316bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e, 2),
1317bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data, 0),
1318bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data, 0),
1319bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0),
1320bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0),
1321bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0),
1322bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0),
1323bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0),
1324bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0),
1325bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0),
1326bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0),
1327bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0),
1328bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0),
1329bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0),
1330bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0),
1331bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0),
1332bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2),
1333bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit, 0),
1334bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0),
1335016e054dSPaul Cercueil 	INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0),
13365e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4770_lcd_16bit, 0),
13375e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-18bit", jz4770_lcd_18bit, 0),
1338bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0),
13395e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4770_lcd_special, 1),
13405e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4770_lcd_generic, 0),
1341bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0),
1342bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0),
1343bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0),
1344bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0),
1345bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0),
1346bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0),
1347bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0),
1348bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0),
1349bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii, 0),
1350bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii, 0),
1351dd1ccfd6SPaul Cercueil 	INGENIC_PIN_GROUP("otg-vbus", jz4760_otg, 0),
1352b5c23aa4SPaul Cercueil };
1353b5c23aa4SPaul Cercueil 
1354b5c23aa4SPaul Cercueil static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
1355b5c23aa4SPaul Cercueil static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
1356b5c23aa4SPaul Cercueil static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
1357b5c23aa4SPaul Cercueil static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
1358d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4770_ssi0_groups[] = {
1359d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
1360d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1361d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e",
1362d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1363d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1364d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1365d3ef8c6bS周琰杰 (Zhou Yanjie) };
1366d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4770_ssi1_groups[] = {
1367d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
1368d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
1369d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
1370d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1371d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
1372d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1373d3ef8c6bS周琰杰 (Zhou Yanjie) };
1374b5c23aa4SPaul Cercueil static const char *jz4770_mmc0_groups[] = {
1375ff656e47SZhou Yanjie 	"mmc0-1bit-a", "mmc0-4bit-a",
1376ff656e47SZhou Yanjie 	"mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
1377b5c23aa4SPaul Cercueil };
1378b5c23aa4SPaul Cercueil static const char *jz4770_mmc1_groups[] = {
1379ff656e47SZhou Yanjie 	"mmc1-1bit-d", "mmc1-4bit-d",
1380ff656e47SZhou Yanjie 	"mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
1381b5c23aa4SPaul Cercueil };
13825de1a73eSZhou Yanjie static const char *jz4770_mmc2_groups[] = {
13835de1a73eSZhou Yanjie 	"mmc2-1bit-b", "mmc2-4bit-b",
13845de1a73eSZhou Yanjie 	"mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
13855de1a73eSZhou Yanjie };
1386b5c23aa4SPaul Cercueil static const char *jz4770_nemc_groups[] = {
1387ff656e47SZhou Yanjie 	"nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
13885de1a73eSZhou Yanjie 	"nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1389b5c23aa4SPaul Cercueil };
1390b5c23aa4SPaul Cercueil static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
1391ff656e47SZhou Yanjie static const char *jz4770_cs2_groups[] = { "nemc-cs2", };
1392ff656e47SZhou Yanjie static const char *jz4770_cs3_groups[] = { "nemc-cs3", };
1393ff656e47SZhou Yanjie static const char *jz4770_cs4_groups[] = { "nemc-cs4", };
1394ff656e47SZhou Yanjie static const char *jz4770_cs5_groups[] = { "nemc-cs5", };
1395b5c23aa4SPaul Cercueil static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
1396b5c23aa4SPaul Cercueil static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
1397b5c23aa4SPaul Cercueil static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
1398b5c23aa4SPaul Cercueil static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
1399ff656e47SZhou Yanjie static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
1400016e054dSPaul Cercueil static const char *jz4770_lcd_groups[] = {
14015e6332a7S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
14025e6332a7S周琰杰 (Zhou Yanjie) 	"lcd-special", "lcd-generic",
1403016e054dSPaul Cercueil };
1404b5c23aa4SPaul Cercueil static const char *jz4770_pwm0_groups[] = { "pwm0", };
1405b5c23aa4SPaul Cercueil static const char *jz4770_pwm1_groups[] = { "pwm1", };
1406b5c23aa4SPaul Cercueil static const char *jz4770_pwm2_groups[] = { "pwm2", };
1407b5c23aa4SPaul Cercueil static const char *jz4770_pwm3_groups[] = { "pwm3", };
1408b5c23aa4SPaul Cercueil static const char *jz4770_pwm4_groups[] = { "pwm4", };
1409b5c23aa4SPaul Cercueil static const char *jz4770_pwm5_groups[] = { "pwm5", };
1410b5c23aa4SPaul Cercueil static const char *jz4770_pwm6_groups[] = { "pwm6", };
1411b5c23aa4SPaul Cercueil static const char *jz4770_pwm7_groups[] = { "pwm7", };
14125de1a73eSZhou Yanjie static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", };
1413b5c23aa4SPaul Cercueil 
1414b5c23aa4SPaul Cercueil static const struct function_desc jz4770_functions[] = {
1415b5c23aa4SPaul Cercueil 	{ "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
1416b5c23aa4SPaul Cercueil 	{ "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
1417b5c23aa4SPaul Cercueil 	{ "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
1418b5c23aa4SPaul Cercueil 	{ "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
1419d3ef8c6bS周琰杰 (Zhou Yanjie) 	{ "ssi0", jz4770_ssi0_groups, ARRAY_SIZE(jz4770_ssi0_groups), },
1420d3ef8c6bS周琰杰 (Zhou Yanjie) 	{ "ssi1", jz4770_ssi1_groups, ARRAY_SIZE(jz4770_ssi1_groups), },
1421b5c23aa4SPaul Cercueil 	{ "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
1422b5c23aa4SPaul Cercueil 	{ "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
14235de1a73eSZhou Yanjie 	{ "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), },
1424b5c23aa4SPaul Cercueil 	{ "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
1425b5c23aa4SPaul Cercueil 	{ "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
1426ff656e47SZhou Yanjie 	{ "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
1427ff656e47SZhou Yanjie 	{ "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
1428ff656e47SZhou Yanjie 	{ "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
1429ff656e47SZhou Yanjie 	{ "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
1430b5c23aa4SPaul Cercueil 	{ "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
1431b5c23aa4SPaul Cercueil 	{ "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
1432b5c23aa4SPaul Cercueil 	{ "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
1433b5c23aa4SPaul Cercueil 	{ "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
1434b5c23aa4SPaul Cercueil 	{ "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
1435b5c23aa4SPaul Cercueil 	{ "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
1436b5c23aa4SPaul Cercueil 	{ "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
1437b5c23aa4SPaul Cercueil 	{ "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
1438b5c23aa4SPaul Cercueil 	{ "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
1439b5c23aa4SPaul Cercueil 	{ "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
1440b5c23aa4SPaul Cercueil 	{ "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
1441b5c23aa4SPaul Cercueil 	{ "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
1442b5c23aa4SPaul Cercueil 	{ "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
1443b5c23aa4SPaul Cercueil 	{ "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
14445de1a73eSZhou Yanjie 	{ "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), },
1445dd1ccfd6SPaul Cercueil 	{ "otg", jz4760_otg_groups, ARRAY_SIZE(jz4760_otg_groups), },
1446b5c23aa4SPaul Cercueil };
1447b5c23aa4SPaul Cercueil 
1448b5c23aa4SPaul Cercueil static const struct ingenic_chip_info jz4770_chip_info = {
1449b5c23aa4SPaul Cercueil 	.num_chips = 6,
1450f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
1451baf15647SPaul Cercueil 	.version = ID_JZ4770,
1452b5c23aa4SPaul Cercueil 	.groups = jz4770_groups,
1453b5c23aa4SPaul Cercueil 	.num_groups = ARRAY_SIZE(jz4770_groups),
1454b5c23aa4SPaul Cercueil 	.functions = jz4770_functions,
1455b5c23aa4SPaul Cercueil 	.num_functions = ARRAY_SIZE(jz4770_functions),
1456b5c23aa4SPaul Cercueil 	.pull_ups = jz4770_pull_ups,
1457b5c23aa4SPaul Cercueil 	.pull_downs = jz4770_pull_downs,
1458b5c23aa4SPaul Cercueil };
1459b5c23aa4SPaul Cercueil 
14600c990740S周琰杰 (Zhou Yanjie) static const u32 jz4775_pull_ups[7] = {
14610c990740S周琰杰 (Zhou Yanjie) 	0x28ff00ff, 0xf030f3fc, 0x0fffffff, 0xfffe4000, 0xf0f0000c, 0x0000f00f, 0x0000f3c0,
14620c990740S周琰杰 (Zhou Yanjie) };
14630c990740S周琰杰 (Zhou Yanjie) 
14640c990740S周琰杰 (Zhou Yanjie) static const u32 jz4775_pull_downs[7] = {
14650c990740S周琰杰 (Zhou Yanjie) 	0x00000000, 0x00030c03, 0x00000000, 0x00008000, 0x00000403, 0x00000ff0, 0x00030c00,
14660c990740S周琰杰 (Zhou Yanjie) };
14670c990740S周琰杰 (Zhou Yanjie) 
14680c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart0_data_pins[] = { 0xa0, 0xa3, };
14690c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
14700c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart1_data_pins[] = { 0x7a, 0x7c, };
14710c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
14720c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart2_data_c_pins[] = { 0x54, 0x4a, };
14730c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart2_data_f_pins[] = { 0xa5, 0xa4, };
14740c990740S周琰杰 (Zhou Yanjie) static int jz4775_uart3_data_pins[] = { 0x1e, 0x1f, };
14750c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dt_a_pins[] = { 0x13, };
14760c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dt_d_pins[] = { 0x75, };
14770c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dr_a_pins[] = { 0x14, };
14780c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_dr_d_pins[] = { 0x74, };
14790c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_clk_a_pins[] = { 0x12, };
14800c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_clk_d_pins[] = { 0x78, };
14810c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_gpc_pins[] = { 0x76, };
14820c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_ce0_a_pins[] = { 0x17, };
14830c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_ce0_d_pins[] = { 0x79, };
14840c990740S周琰杰 (Zhou Yanjie) static int jz4775_ssi_ce1_pins[] = { 0x77, };
14850c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
14860c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
14870c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, };
14880c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
14890c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
14900c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
14910c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
14920c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
14930c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
14940c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
14950c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
14960c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
14970c990740S周琰杰 (Zhou Yanjie) static int jz4775_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
14980c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_8bit_data_pins[] = {
14990c990740S周琰杰 (Zhou Yanjie) 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
15000c990740S周琰杰 (Zhou Yanjie) };
15010c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_16bit_data_pins[] = {
15020c990740S周琰杰 (Zhou Yanjie) 	0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1,
15030c990740S周琰杰 (Zhou Yanjie) };
15040c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cle_ale_pins[] = { 0x20, 0x21, };
15050c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
15060c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_rd_we_pins[] = { 0x10, 0x11, };
15070c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
15080c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_wait_pins[] = { 0x1b, };
15090c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cs1_pins[] = { 0x15, };
15100c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cs2_pins[] = { 0x16, };
15110c990740S周琰杰 (Zhou Yanjie) static int jz4775_nemc_cs3_pins[] = { 0x17, };
15120c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2c0_pins[] = { 0x7e, 0x7f, };
15130c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2c1_pins[] = { 0x9e, 0x9f, };
15140c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2c2_pins[] = { 0x80, 0x83, };
15150c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_data_tx_pins[] = { 0xa3, };
15160c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_data_rx_pins[] = { 0xa2, };
15170c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_clk_txrx_pins[] = { 0xa0, 0xa1, };
15180c990740S周琰杰 (Zhou Yanjie) static int jz4775_i2s_sysclk_pins[] = { 0x83, };
15190c990740S周琰杰 (Zhou Yanjie) static int jz4775_dmic_pins[] = { 0xaa, 0xab, };
15200c990740S周琰杰 (Zhou Yanjie) static int jz4775_cim_pins[] = {
15210c990740S周琰杰 (Zhou Yanjie) 	0x26, 0x27, 0x28, 0x29,
15220c990740S周琰杰 (Zhou Yanjie) 	0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
15230c990740S周琰杰 (Zhou Yanjie) };
15240c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_8bit_pins[] = {
15250c990740S周琰杰 (Zhou Yanjie) 	0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d,
15260c990740S周琰杰 (Zhou Yanjie) 	0x48, 0x52, 0x53,
15270c990740S周琰杰 (Zhou Yanjie) };
15280c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_16bit_pins[] = {
15290c990740S周琰杰 (Zhou Yanjie) 	0x4e, 0x4f, 0x50, 0x51, 0x56, 0x57, 0x58, 0x59,
15300c990740S周琰杰 (Zhou Yanjie) };
15310c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_18bit_pins[] = {
15320c990740S周琰杰 (Zhou Yanjie) 	0x5a, 0x5b,
15330c990740S周琰杰 (Zhou Yanjie) };
15340c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_24bit_pins[] = {
15350c990740S周琰杰 (Zhou Yanjie) 	0x40, 0x41, 0x4a, 0x4b, 0x54, 0x55,
15360c990740S周琰杰 (Zhou Yanjie) };
15370c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_special_pins[] = { 0x54, 0x4a, 0x41, 0x40, };
15380c990740S周琰杰 (Zhou Yanjie) static int jz4775_lcd_generic_pins[] = { 0x49, };
15390c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm0_pins[] = { 0x80, };
15400c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm1_pins[] = { 0x81, };
15410c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm2_pins[] = { 0x82, };
15420c990740S周琰杰 (Zhou Yanjie) static int jz4775_pwm_pwm3_pins[] = { 0x83, };
15430c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_rmii_pins[] = {
15440c990740S周琰杰 (Zhou Yanjie) 	0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
15450c990740S周琰杰 (Zhou Yanjie) };
15460c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_mii_pins[] = {
15470c990740S周琰杰 (Zhou Yanjie) 	0x7b, 0x7a, 0x7d, 0x7c, 0xa7, 0x24, 0xaf,
15480c990740S周琰杰 (Zhou Yanjie) };
15490c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_rgmii_pins[] = {
15500c990740S周琰杰 (Zhou Yanjie) 	0xa9, 0x7b, 0x7a, 0xab, 0xaa, 0xac, 0x7d, 0x7c, 0xa5, 0xa4,
15510c990740S周琰杰 (Zhou Yanjie) 	0xad, 0xae, 0xa7, 0xa6,
15520c990740S周琰杰 (Zhou Yanjie) };
15530c990740S周琰杰 (Zhou Yanjie) static int jz4775_mac_gmii_pins[] = {
15540c990740S周琰杰 (Zhou Yanjie) 	0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a,
15550c990740S周琰杰 (Zhou Yanjie) 	0xa8, 0x28, 0x24, 0xaf,
15560c990740S周琰杰 (Zhou Yanjie) };
15570c990740S周琰杰 (Zhou Yanjie) static int jz4775_otg_pins[] = { 0x8a, };
15580c990740S周琰杰 (Zhou Yanjie) 
15590c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_uart3_data_funcs[] = { 0, 1, };
15600c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_mac_mii_funcs[] = { 1, 1, 1, 1, 0, 1, 0, };
15610c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_mac_rgmii_funcs[] = {
15620c990740S周琰杰 (Zhou Yanjie) 	0, 1, 1, 0, 0, 0, 1, 1, 0, 0,
15630c990740S周琰杰 (Zhou Yanjie) 	0, 0, 0, 0,
15640c990740S周琰杰 (Zhou Yanjie) };
15650c990740S周琰杰 (Zhou Yanjie) static u8 jz4775_mac_gmii_funcs[] = {
15660c990740S周琰杰 (Zhou Yanjie) 	1, 1, 1, 1, 1, 1, 1, 1,
15670c990740S周琰杰 (Zhou Yanjie) 	0, 1, 1, 0,
15680c990740S周琰杰 (Zhou Yanjie) };
15690c990740S周琰杰 (Zhou Yanjie) 
15700c990740S周琰杰 (Zhou Yanjie) static const struct group_desc jz4775_groups[] = {
15710c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-data", jz4775_uart0_data, 0),
15720c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-hwflow", jz4775_uart0_hwflow, 0),
15730c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-data", jz4775_uart1_data, 0),
15740c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-hwflow", jz4775_uart1_hwflow, 0),
15750c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data-c", jz4775_uart2_data_c, 2),
15760c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data-f", jz4775_uart2_data_f, 1),
15770c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4775_uart3_data,
15780c990740S周琰杰 (Zhou Yanjie) 				jz4775_uart3_data_funcs),
15790c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dt-a", jz4775_ssi_dt_a, 2),
15800c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dt-d", jz4775_ssi_dt_d, 1),
15810c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dr-a", jz4775_ssi_dr_a, 2),
15820c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-dr-d", jz4775_ssi_dr_d, 1),
15830c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-clk-a", jz4775_ssi_clk_a, 2),
15840c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-clk-d", jz4775_ssi_clk_d, 1),
15850c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-gpc", jz4775_ssi_gpc, 1),
15860c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce0-a", jz4775_ssi_ce0_a, 2),
15870c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce0-d", jz4775_ssi_ce0_d, 1),
15880c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi-ce1", jz4775_ssi_ce1, 1),
15890c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-1bit-a", jz4775_mmc0_1bit_a, 1),
15900c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4775_mmc0_4bit_a, 1),
15910c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-8bit-a", jz4775_mmc0_8bit_a, 1),
15920c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4775_mmc0_1bit_e, 0),
15930c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4775_mmc0_4bit_e, 0),
15940c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4775_mmc1_1bit_d, 0),
15950c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4775_mmc1_4bit_d, 0),
15960c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4775_mmc1_1bit_e, 1),
15970c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4775_mmc1_4bit_e, 1),
15980c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4775_mmc2_1bit_b, 0),
15990c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4775_mmc2_4bit_b, 0),
16000c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4775_mmc2_1bit_e, 2),
16010c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4775_mmc2_4bit_e, 2),
16020c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-8bit-data", jz4775_nemc_8bit_data, 0),
16030c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-16bit-data", jz4775_nemc_16bit_data, 1),
16040c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-cle-ale", jz4775_nemc_cle_ale, 0),
16050c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-addr", jz4775_nemc_addr, 0),
16060c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-rd-we", jz4775_nemc_rd_we, 0),
16070c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4775_nemc_frd_fwe, 0),
16080c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-wait", jz4775_nemc_wait, 0),
16090c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-cs1", jz4775_nemc_cs1, 0),
16100c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-cs2", jz4775_nemc_cs2, 0),
16110c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("nemc-cs3", jz4775_nemc_cs3, 0),
16120c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c0-data", jz4775_i2c0, 0),
16130c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c1-data", jz4775_i2c1, 0),
16140c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data", jz4775_i2c2, 1),
16150c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s-data-tx", jz4775_i2s_data_tx, 1),
16160c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s-data-rx", jz4775_i2s_data_rx, 1),
16170c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s-clk-txrx", jz4775_i2s_clk_txrx, 1),
16180c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s-sysclk", jz4775_i2s_sysclk, 2),
16190c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic", jz4775_dmic, 1),
16200c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("cim-data", jz4775_cim, 0),
16210c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-8bit", jz4775_lcd_8bit, 0),
16220c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4775_lcd_16bit, 0),
16230c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-18bit", jz4775_lcd_18bit, 0),
16240c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-24bit", jz4775_lcd_24bit, 0),
16250c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4775_lcd_generic, 0),
16260c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4775_lcd_special, 1),
16270c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0", jz4775_pwm_pwm0, 0),
16280c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1", jz4775_pwm_pwm1, 0),
16290c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2", jz4775_pwm_pwm2, 0),
16300c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3", jz4775_pwm_pwm3, 0),
16310c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mac-rmii", jz4775_mac_rmii, 0),
16320c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("mac-mii", jz4775_mac_mii,
16330c990740S周琰杰 (Zhou Yanjie) 				jz4775_mac_mii_funcs),
16340c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("mac-rgmii", jz4775_mac_rgmii,
16350c990740S周琰杰 (Zhou Yanjie) 				jz4775_mac_rgmii_funcs),
16360c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("mac-gmii", jz4775_mac_gmii,
16370c990740S周琰杰 (Zhou Yanjie) 				jz4775_mac_gmii_funcs),
16380c990740S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("otg-vbus", jz4775_otg, 0),
16390c990740S周琰杰 (Zhou Yanjie) };
16400c990740S周琰杰 (Zhou Yanjie) 
16410c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
16420c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
16430c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart2_groups[] = { "uart2-data-c", "uart2-data-f", };
16440c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_uart3_groups[] = { "uart3-data", };
16450c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_ssi_groups[] = {
16460c990740S周琰杰 (Zhou Yanjie) 	"ssi-dt-a", "ssi-dt-d",
16470c990740S周琰杰 (Zhou Yanjie) 	"ssi-dr-a", "ssi-dr-d",
16480c990740S周琰杰 (Zhou Yanjie) 	"ssi-clk-a", "ssi-clk-d",
16490c990740S周琰杰 (Zhou Yanjie) 	"ssi-gpc",
16500c990740S周琰杰 (Zhou Yanjie) 	"ssi-ce0-a", "ssi-ce0-d",
16510c990740S周琰杰 (Zhou Yanjie) 	"ssi-ce1",
16520c990740S周琰杰 (Zhou Yanjie) };
16530c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mmc0_groups[] = {
16540c990740S周琰杰 (Zhou Yanjie) 	"mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
16550c990740S周琰杰 (Zhou Yanjie) 	"mmc0-1bit-e", "mmc0-4bit-e",
16560c990740S周琰杰 (Zhou Yanjie) };
16570c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mmc1_groups[] = {
16580c990740S周琰杰 (Zhou Yanjie) 	"mmc1-1bit-d", "mmc1-4bit-d",
16590c990740S周琰杰 (Zhou Yanjie) 	"mmc1-1bit-e", "mmc1-4bit-e",
16600c990740S周琰杰 (Zhou Yanjie) };
16610c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mmc2_groups[] = {
16620c990740S周琰杰 (Zhou Yanjie) 	"mmc2-1bit-b", "mmc2-4bit-b",
16630c990740S周琰杰 (Zhou Yanjie) 	"mmc2-1bit-e", "mmc2-4bit-e",
16640c990740S周琰杰 (Zhou Yanjie) };
16650c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_nemc_groups[] = {
16660c990740S周琰杰 (Zhou Yanjie) 	"nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
16670c990740S周琰杰 (Zhou Yanjie) 	"nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
16680c990740S周琰杰 (Zhou Yanjie) };
16690c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cs1_groups[] = { "nemc-cs1", };
16700c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cs2_groups[] = { "nemc-cs2", };
16710c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cs3_groups[] = { "nemc-cs3", };
16720c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2c0_groups[] = { "i2c0-data", };
16730c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2c1_groups[] = { "i2c1-data", };
16740c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2c2_groups[] = { "i2c2-data", };
16750c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_i2s_groups[] = {
16760c990740S周琰杰 (Zhou Yanjie) 	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
16770c990740S周琰杰 (Zhou Yanjie) };
16780c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_dmic_groups[] = { "dmic", };
16790c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_cim_groups[] = { "cim-data", };
16800c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_lcd_groups[] = {
16810c990740S周琰杰 (Zhou Yanjie) 	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
16820c990740S周琰杰 (Zhou Yanjie) 	"lcd-special", "lcd-generic",
16830c990740S周琰杰 (Zhou Yanjie) };
16840c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm0_groups[] = { "pwm0", };
16850c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm1_groups[] = { "pwm1", };
16860c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm2_groups[] = { "pwm2", };
16870c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_pwm3_groups[] = { "pwm3", };
16880c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_mac_groups[] = {
16890c990740S周琰杰 (Zhou Yanjie) 	"mac-rmii", "mac-mii", "mac-rgmii", "mac-gmii",
16900c990740S周琰杰 (Zhou Yanjie) };
16910c990740S周琰杰 (Zhou Yanjie) static const char *jz4775_otg_groups[] = { "otg-vbus", };
16920c990740S周琰杰 (Zhou Yanjie) 
16930c990740S周琰杰 (Zhou Yanjie) static const struct function_desc jz4775_functions[] = {
16940c990740S周琰杰 (Zhou Yanjie) 	{ "uart0", jz4775_uart0_groups, ARRAY_SIZE(jz4775_uart0_groups), },
16950c990740S周琰杰 (Zhou Yanjie) 	{ "uart1", jz4775_uart1_groups, ARRAY_SIZE(jz4775_uart1_groups), },
16960c990740S周琰杰 (Zhou Yanjie) 	{ "uart2", jz4775_uart2_groups, ARRAY_SIZE(jz4775_uart2_groups), },
16970c990740S周琰杰 (Zhou Yanjie) 	{ "uart3", jz4775_uart3_groups, ARRAY_SIZE(jz4775_uart3_groups), },
16980c990740S周琰杰 (Zhou Yanjie) 	{ "ssi", jz4775_ssi_groups, ARRAY_SIZE(jz4775_ssi_groups), },
16990c990740S周琰杰 (Zhou Yanjie) 	{ "mmc0", jz4775_mmc0_groups, ARRAY_SIZE(jz4775_mmc0_groups), },
17000c990740S周琰杰 (Zhou Yanjie) 	{ "mmc1", jz4775_mmc1_groups, ARRAY_SIZE(jz4775_mmc1_groups), },
17010c990740S周琰杰 (Zhou Yanjie) 	{ "mmc2", jz4775_mmc2_groups, ARRAY_SIZE(jz4775_mmc2_groups), },
17020c990740S周琰杰 (Zhou Yanjie) 	{ "nemc", jz4775_nemc_groups, ARRAY_SIZE(jz4775_nemc_groups), },
17030c990740S周琰杰 (Zhou Yanjie) 	{ "nemc-cs1", jz4775_cs1_groups, ARRAY_SIZE(jz4775_cs1_groups), },
17040c990740S周琰杰 (Zhou Yanjie) 	{ "nemc-cs2", jz4775_cs2_groups, ARRAY_SIZE(jz4775_cs2_groups), },
17050c990740S周琰杰 (Zhou Yanjie) 	{ "nemc-cs3", jz4775_cs3_groups, ARRAY_SIZE(jz4775_cs3_groups), },
17060c990740S周琰杰 (Zhou Yanjie) 	{ "i2c0", jz4775_i2c0_groups, ARRAY_SIZE(jz4775_i2c0_groups), },
17070c990740S周琰杰 (Zhou Yanjie) 	{ "i2c1", jz4775_i2c1_groups, ARRAY_SIZE(jz4775_i2c1_groups), },
17080c990740S周琰杰 (Zhou Yanjie) 	{ "i2c2", jz4775_i2c2_groups, ARRAY_SIZE(jz4775_i2c2_groups), },
17090c990740S周琰杰 (Zhou Yanjie) 	{ "i2s", jz4775_i2s_groups, ARRAY_SIZE(jz4775_i2s_groups), },
17100c990740S周琰杰 (Zhou Yanjie) 	{ "dmic", jz4775_dmic_groups, ARRAY_SIZE(jz4775_dmic_groups), },
17110c990740S周琰杰 (Zhou Yanjie) 	{ "cim", jz4775_cim_groups, ARRAY_SIZE(jz4775_cim_groups), },
17120c990740S周琰杰 (Zhou Yanjie) 	{ "lcd", jz4775_lcd_groups, ARRAY_SIZE(jz4775_lcd_groups), },
17130c990740S周琰杰 (Zhou Yanjie) 	{ "pwm0", jz4775_pwm0_groups, ARRAY_SIZE(jz4775_pwm0_groups), },
17140c990740S周琰杰 (Zhou Yanjie) 	{ "pwm1", jz4775_pwm1_groups, ARRAY_SIZE(jz4775_pwm1_groups), },
17150c990740S周琰杰 (Zhou Yanjie) 	{ "pwm2", jz4775_pwm2_groups, ARRAY_SIZE(jz4775_pwm2_groups), },
17160c990740S周琰杰 (Zhou Yanjie) 	{ "pwm3", jz4775_pwm3_groups, ARRAY_SIZE(jz4775_pwm3_groups), },
17170c990740S周琰杰 (Zhou Yanjie) 	{ "mac", jz4775_mac_groups, ARRAY_SIZE(jz4775_mac_groups), },
17180c990740S周琰杰 (Zhou Yanjie) 	{ "otg", jz4775_otg_groups, ARRAY_SIZE(jz4775_otg_groups), },
17190c990740S周琰杰 (Zhou Yanjie) };
17200c990740S周琰杰 (Zhou Yanjie) 
17210c990740S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info jz4775_chip_info = {
17220c990740S周琰杰 (Zhou Yanjie) 	.num_chips = 7,
17230c990740S周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
17240c990740S周琰杰 (Zhou Yanjie) 	.version = ID_JZ4775,
17250c990740S周琰杰 (Zhou Yanjie) 	.groups = jz4775_groups,
17260c990740S周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(jz4775_groups),
17270c990740S周琰杰 (Zhou Yanjie) 	.functions = jz4775_functions,
17280c990740S周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(jz4775_functions),
17290c990740S周琰杰 (Zhou Yanjie) 	.pull_ups = jz4775_pull_ups,
17300c990740S周琰杰 (Zhou Yanjie) 	.pull_downs = jz4775_pull_downs,
17310c990740S周琰杰 (Zhou Yanjie) };
17320c990740S周琰杰 (Zhou Yanjie) 
1733d9f5dc49S周琰杰 (Zhou Yanjie) static const u32 jz4780_pull_ups[6] = {
1734d9f5dc49S周琰杰 (Zhou Yanjie) 	0x3fffffff, 0xfff0f3fc, 0x0fffffff, 0xffff4fff, 0xfffffb7c, 0x7fa7f00f,
1735d9f5dc49S周琰杰 (Zhou Yanjie) };
1736d9f5dc49S周琰杰 (Zhou Yanjie) 
1737d9f5dc49S周琰杰 (Zhou Yanjie) static const u32 jz4780_pull_downs[6] = {
1738d9f5dc49S周琰杰 (Zhou Yanjie) 	0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
1739d9f5dc49S周琰杰 (Zhou Yanjie) };
1740d9f5dc49S周琰杰 (Zhou Yanjie) 
1741ff656e47SZhou Yanjie static int jz4780_uart2_data_pins[] = { 0x66, 0x67, };
1742ff656e47SZhou Yanjie static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, };
1743ff656e47SZhou Yanjie static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, };
1744d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, };
1745d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, };
1746d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, };
1747d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dt_b_pins[] = { 0x3d, };
1748f83c2609SPaul Cercueil static int jz4780_ssi0_dt_d_pins[] = { 0x79, };
1749d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, };
1750d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, };
1751d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_dr_b_pins[] = { 0x34, };
1752f83c2609SPaul Cercueil static int jz4780_ssi0_dr_d_pins[] = { 0x74, };
1753d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_a_pins[] = { 0x12, };
1754d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, };
1755d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, };
1756f83c2609SPaul Cercueil static int jz4780_ssi0_clk_d_pins[] = { 0x78, };
1757d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, };
1758f83c2609SPaul Cercueil static int jz4780_ssi0_gpc_d_pins[] = { 0x76, };
1759d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, };
1760d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, };
1761d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, };
1762f83c2609SPaul Cercueil static int jz4780_ssi0_ce0_d_pins[] = { 0x77, };
1763d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi0_ce1_b_pins[] = { 0x35, };
1764f83c2609SPaul Cercueil static int jz4780_ssi0_ce1_d_pins[] = { 0x75, };
1765d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dt_b_pins[] = { 0x3d, };
1766f83c2609SPaul Cercueil static int jz4780_ssi1_dt_d_pins[] = { 0x79, };
1767d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_dr_b_pins[] = { 0x34, };
1768f83c2609SPaul Cercueil static int jz4780_ssi1_dr_d_pins[] = { 0x74, };
1769d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_clk_b_pins[] = { 0x3c, };
1770f83c2609SPaul Cercueil static int jz4780_ssi1_clk_d_pins[] = { 0x78, };
1771d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, };
1772f83c2609SPaul Cercueil static int jz4780_ssi1_gpc_d_pins[] = { 0x76, };
1773d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, };
1774f83c2609SPaul Cercueil static int jz4780_ssi1_ce0_d_pins[] = { 0x77, };
1775d3ef8c6bS周琰杰 (Zhou Yanjie) static int jz4780_ssi1_ce1_b_pins[] = { 0x35, };
1776f83c2609SPaul Cercueil static int jz4780_ssi1_ce1_d_pins[] = { 0x75, };
1777ff656e47SZhou Yanjie static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
1778ff656e47SZhou Yanjie static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, };
1779ff656e47SZhou Yanjie static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, };
1780ff656e47SZhou Yanjie static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, };
1781f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_data_tx_pins[] = { 0x87, };
1782f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_data_rx_pins[] = { 0x86, };
1783f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_clk_txrx_pins[] = { 0x6c, 0x6d, };
1784f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_clk_rx_pins[] = { 0x88, 0x89, };
1785f4b5c348S周琰杰 (Zhou Yanjie) static int jz4780_i2s_sysclk_pins[] = { 0x85, };
17866adf2c56S周琰杰 (Zhou Yanjie) static int jz4780_dmic_pins[] = { 0x32, 0x33, };
1787a0bb89e8SPaul Boddie static int jz4780_hdmi_ddc_pins[] = { 0xb9, 0xb8, };
1788ff656e47SZhou Yanjie 
1789bb42b593SPaul Cercueil static u8 jz4780_i2s_clk_txrx_funcs[] = { 1, 0, };
1790ff656e47SZhou Yanjie 
1791ff656e47SZhou Yanjie static const struct group_desc jz4780_groups[] = {
1792bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data, 0),
1793bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow, 0),
1794bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data, 0),
1795bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow, 0),
1796bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data, 1),
1797bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow, 1),
1798bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("uart3-data", jz4770_uart3_data,
1799bb42b593SPaul Cercueil 				jz4760_uart3_data_funcs),
1800bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow, 0),
1801bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data, 2),
1802bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-a-19", jz4780_ssi0_dt_a_19, 2),
1803bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-a-21", jz4780_ssi0_dt_a_21, 2),
1804bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-a-28", jz4780_ssi0_dt_a_28, 2),
1805bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-b", jz4780_ssi0_dt_b, 1),
1806bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-d", jz4780_ssi0_dt_d, 1),
1807bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e, 0),
1808bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-a-20", jz4780_ssi0_dr_a_20, 2),
1809bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-a-27", jz4780_ssi0_dr_a_27, 2),
1810bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-b", jz4780_ssi0_dr_b, 1),
1811bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-d", jz4780_ssi0_dr_d, 1),
1812bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e, 0),
1813bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-a", jz4780_ssi0_clk_a, 2),
1814bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-b-5", jz4780_ssi0_clk_b_5, 1),
1815bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-b-28", jz4780_ssi0_clk_b_28, 1),
1816bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-d", jz4780_ssi0_clk_d, 1),
1817bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e, 0),
1818bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc-b", jz4780_ssi0_gpc_b, 1),
1819bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc-d", jz4780_ssi0_gpc_d, 1),
1820bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e, 0),
1821bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-a-23", jz4780_ssi0_ce0_a_23, 2),
1822bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-a-25", jz4780_ssi0_ce0_a_25, 2),
1823bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-b", jz4780_ssi0_ce0_b, 1),
1824bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-d", jz4780_ssi0_ce0_d, 1),
1825bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e, 0),
1826bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1-b", jz4780_ssi0_ce1_b, 1),
1827bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1-d", jz4780_ssi0_ce1_d, 1),
1828bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e, 0),
1829bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-b", jz4780_ssi1_dt_b, 2),
1830bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-d", jz4780_ssi1_dt_d, 2),
1831bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e, 1),
1832bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-b", jz4780_ssi1_dr_b, 2),
1833bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-d", jz4780_ssi1_dr_d, 2),
1834bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e, 1),
1835bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-b", jz4780_ssi1_clk_b, 2),
1836bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-d", jz4780_ssi1_clk_d, 2),
1837bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e, 1),
1838bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-b", jz4780_ssi1_gpc_b, 2),
1839bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-d", jz4780_ssi1_gpc_d, 2),
1840bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e, 1),
1841bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-b", jz4780_ssi1_ce0_b, 2),
1842bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-d", jz4780_ssi1_ce0_d, 2),
1843bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e, 1),
1844bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-b", jz4780_ssi1_ce1_b, 2),
1845bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-d", jz4780_ssi1_ce1_d, 2),
1846bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e, 1),
1847bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("mmc0-1bit-a", jz4770_mmc0_1bit_a,
1848bb42b593SPaul Cercueil 				jz4760_mmc0_1bit_a_funcs),
1849bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a, 1),
1850bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a, 1),
1851bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e, 0),
1852bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e, 0),
1853bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d, 0),
1854bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d, 0),
1855bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e, 1),
1856bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e, 1),
1857bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b, 0),
1858bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b, 0),
1859bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e, 2),
1860bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e, 2),
1861bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data, 0),
1862bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale, 0),
1863bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr, 0),
1864bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we, 0),
1865bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe, 0),
1866bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait, 0),
1867bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1, 0),
1868bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2, 0),
1869bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3, 0),
1870bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4, 0),
1871bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5, 0),
1872bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6, 0),
1873bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0, 0),
1874bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1, 0),
1875bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2, 2),
1876bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3, 1),
1877bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e, 1),
1878bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f, 1),
1879bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-tx", jz4780_i2s_data_tx, 0),
1880bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-rx", jz4780_i2s_data_rx, 0),
1881bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP_FUNCS("i2s-clk-txrx", jz4780_i2s_clk_txrx,
1882bb42b593SPaul Cercueil 				jz4780_i2s_clk_txrx_funcs),
1883bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-clk-rx", jz4780_i2s_clk_rx, 1),
1884bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-sysclk", jz4780_i2s_sysclk, 2),
18856adf2c56S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic", jz4780_dmic, 1),
1886bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("hdmi-ddc", jz4780_hdmi_ddc, 0),
1887bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit, 0),
1888bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit, 0),
18895e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-8bit", jz4770_lcd_8bit, 0),
18905e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-16bit", jz4770_lcd_16bit, 0),
18915e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-18bit", jz4770_lcd_18bit, 0),
1892bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit, 0),
18935e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-special", jz4770_lcd_special, 1),
18945e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-generic", jz4770_lcd_generic, 0),
1895bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0, 0),
1896bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1, 0),
1897bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2, 0),
1898bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3, 0),
1899bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4, 0),
1900bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5, 0),
1901bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6, 0),
1902bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7, 0),
1903ff656e47SZhou Yanjie };
1904ff656e47SZhou Yanjie 
1905ff656e47SZhou Yanjie static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
1906ff656e47SZhou Yanjie static const char *jz4780_uart4_groups[] = { "uart4-data", };
1907d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4780_ssi0_groups[] = {
1908d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-dt-a-19", "ssi0-dt-a-21", "ssi0-dt-a-28", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
1909d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-dr-a-20", "ssi0-dr-a-27", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
1910d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-clk-a", "ssi0-clk-b-5", "ssi0-clk-b-28", "ssi0-clk-d", "ssi0-clk-e",
1911d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
1912d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-ce0-a-23", "ssi0-ce0-a-25", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
1913d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
1914d3ef8c6bS周琰杰 (Zhou Yanjie) };
1915d3ef8c6bS周琰杰 (Zhou Yanjie) static const char *jz4780_ssi1_groups[] = {
1916d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
1917d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
1918d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
1919d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
1920d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
1921d3ef8c6bS周琰杰 (Zhou Yanjie) 	"ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
1922d3ef8c6bS周琰杰 (Zhou Yanjie) };
1923ff656e47SZhou Yanjie static const char *jz4780_mmc0_groups[] = {
1924ff656e47SZhou Yanjie 	"mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
1925ff656e47SZhou Yanjie 	"mmc0-1bit-e", "mmc0-4bit-e",
1926ff656e47SZhou Yanjie };
1927ff656e47SZhou Yanjie static const char *jz4780_mmc1_groups[] = {
1928ff656e47SZhou Yanjie 	"mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
1929ff656e47SZhou Yanjie };
19305de1a73eSZhou Yanjie static const char *jz4780_mmc2_groups[] = {
19315de1a73eSZhou Yanjie 	"mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e",
19325de1a73eSZhou Yanjie };
1933ff656e47SZhou Yanjie static const char *jz4780_nemc_groups[] = {
1934ff656e47SZhou Yanjie 	"nemc-data", "nemc-cle-ale", "nemc-addr",
19355de1a73eSZhou Yanjie 	"nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
1936ff656e47SZhou Yanjie };
1937ff656e47SZhou Yanjie static const char *jz4780_i2c3_groups[] = { "i2c3-data", };
1938ff656e47SZhou Yanjie static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
1939f4b5c348S周琰杰 (Zhou Yanjie) static const char *jz4780_i2s_groups[] = {
1940f4b5c348S周琰杰 (Zhou Yanjie) 	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
1941f4b5c348S周琰杰 (Zhou Yanjie) };
19426adf2c56S周琰杰 (Zhou Yanjie) static const char *jz4780_dmic_groups[] = { "dmic", };
1943ff656e47SZhou Yanjie static const char *jz4780_cim_groups[] = { "cim-data", };
1944a0bb89e8SPaul Boddie static const char *jz4780_hdmi_ddc_groups[] = { "hdmi-ddc", };
1945ff656e47SZhou Yanjie 
1946ff656e47SZhou Yanjie static const struct function_desc jz4780_functions[] = {
1947ff656e47SZhou Yanjie 	{ "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
1948ff656e47SZhou Yanjie 	{ "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
1949ff656e47SZhou Yanjie 	{ "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), },
1950ff656e47SZhou Yanjie 	{ "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
1951ff656e47SZhou Yanjie 	{ "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), },
1952d3ef8c6bS周琰杰 (Zhou Yanjie) 	{ "ssi0", jz4780_ssi0_groups, ARRAY_SIZE(jz4780_ssi0_groups), },
1953d3ef8c6bS周琰杰 (Zhou Yanjie) 	{ "ssi1", jz4780_ssi1_groups, ARRAY_SIZE(jz4780_ssi1_groups), },
1954ff656e47SZhou Yanjie 	{ "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), },
1955ff656e47SZhou Yanjie 	{ "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), },
19565de1a73eSZhou Yanjie 	{ "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), },
1957ff656e47SZhou Yanjie 	{ "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), },
1958ff656e47SZhou Yanjie 	{ "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
1959ff656e47SZhou Yanjie 	{ "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
1960ff656e47SZhou Yanjie 	{ "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
1961ff656e47SZhou Yanjie 	{ "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
1962ff656e47SZhou Yanjie 	{ "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
1963ff656e47SZhou Yanjie 	{ "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
1964ff656e47SZhou Yanjie 	{ "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
1965ff656e47SZhou Yanjie 	{ "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
1966ff656e47SZhou Yanjie 	{ "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
1967ff656e47SZhou Yanjie 	{ "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), },
1968ff656e47SZhou Yanjie 	{ "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), },
1969f4b5c348S周琰杰 (Zhou Yanjie) 	{ "i2s", jz4780_i2s_groups, ARRAY_SIZE(jz4780_i2s_groups), },
19706adf2c56S周琰杰 (Zhou Yanjie) 	{ "dmic", jz4780_dmic_groups, ARRAY_SIZE(jz4780_dmic_groups), },
1971ff656e47SZhou Yanjie 	{ "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), },
1972ff656e47SZhou Yanjie 	{ "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
1973ff656e47SZhou Yanjie 	{ "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
1974ff656e47SZhou Yanjie 	{ "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
1975ff656e47SZhou Yanjie 	{ "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
1976ff656e47SZhou Yanjie 	{ "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
1977ff656e47SZhou Yanjie 	{ "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
1978ff656e47SZhou Yanjie 	{ "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
1979ff656e47SZhou Yanjie 	{ "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
1980ff656e47SZhou Yanjie 	{ "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
1981a0bb89e8SPaul Boddie 	{ "hdmi-ddc", jz4780_hdmi_ddc_groups,
1982a0bb89e8SPaul Boddie 		      ARRAY_SIZE(jz4780_hdmi_ddc_groups), },
1983ff656e47SZhou Yanjie };
1984ff656e47SZhou Yanjie 
1985ff656e47SZhou Yanjie static const struct ingenic_chip_info jz4780_chip_info = {
1986ff656e47SZhou Yanjie 	.num_chips = 6,
1987f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
1988baf15647SPaul Cercueil 	.version = ID_JZ4780,
1989ff656e47SZhou Yanjie 	.groups = jz4780_groups,
1990ff656e47SZhou Yanjie 	.num_groups = ARRAY_SIZE(jz4780_groups),
1991ff656e47SZhou Yanjie 	.functions = jz4780_functions,
1992ff656e47SZhou Yanjie 	.num_functions = ARRAY_SIZE(jz4780_functions),
1993d9f5dc49S周琰杰 (Zhou Yanjie) 	.pull_ups = jz4780_pull_ups,
1994d9f5dc49S周琰杰 (Zhou Yanjie) 	.pull_downs = jz4780_pull_downs,
1995ff656e47SZhou Yanjie };
1996ff656e47SZhou Yanjie 
1997fe1ad5eeSZhou Yanjie static const u32 x1000_pull_ups[4] = {
1998b4a9372aS周琰杰 (Zhou Yanjie) 	0xffffffff, 0xfdffffff, 0x0dffffff, 0x0000003f,
1999fe1ad5eeSZhou Yanjie };
2000fe1ad5eeSZhou Yanjie 
2001fe1ad5eeSZhou Yanjie static const u32 x1000_pull_downs[4] = {
2002fe1ad5eeSZhou Yanjie 	0x00000000, 0x02000000, 0x02000000, 0x00000000,
2003fe1ad5eeSZhou Yanjie };
2004fe1ad5eeSZhou Yanjie 
2005fe1ad5eeSZhou Yanjie static int x1000_uart0_data_pins[] = { 0x4a, 0x4b, };
2006fe1ad5eeSZhou Yanjie static int x1000_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
2007fe1ad5eeSZhou Yanjie static int x1000_uart1_data_a_pins[] = { 0x04, 0x05, };
2008fe1ad5eeSZhou Yanjie static int x1000_uart1_data_d_pins[] = { 0x62, 0x63, };
2009b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_uart1_hwflow_pins[] = { 0x64, 0x65, };
2010fe1ad5eeSZhou Yanjie static int x1000_uart2_data_a_pins[] = { 0x02, 0x03, };
2011fe1ad5eeSZhou Yanjie static int x1000_uart2_data_d_pins[] = { 0x65, 0x64, };
201228c1caafS周琰杰 (Zhou Yanjie) static int x1000_sfc_data_pins[] = { 0x1d, 0x1c, 0x1e, 0x1f, };
201328c1caafS周琰杰 (Zhou Yanjie) static int x1000_sfc_clk_pins[] = { 0x1a, };
201428c1caafS周琰杰 (Zhou Yanjie) static int x1000_sfc_ce_pins[] = { 0x1b, };
20153b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_22_pins[] = { 0x16, };
20163b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_a_29_pins[] = { 0x1d, };
20173b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dt_d_pins[] = { 0x62, };
20183b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_23_pins[] = { 0x17, };
20193b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_a_28_pins[] = { 0x1c, };
20203b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_dr_d_pins[] = { 0x63, };
20213b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_24_pins[] = { 0x18, };
20223b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_a_26_pins[] = { 0x1a, };
20233b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_clk_d_pins[] = { 0x60, };
20243b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_20_pins[] = { 0x14, };
20253b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_gpc_a_31_pins[] = { 0x1f, };
20263b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_25_pins[] = { 0x19, };
20273b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_a_27_pins[] = { 0x1b, };
20283b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce0_d_pins[] = { 0x61, };
20293b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_21_pins[] = { 0x15, };
20303b31e9b0S周琰杰 (Zhou Yanjie) static int x1000_ssi_ce1_a_30_pins[] = { 0x1e, };
2031fe1ad5eeSZhou Yanjie static int x1000_mmc0_1bit_pins[] = { 0x18, 0x19, 0x17, };
2032fe1ad5eeSZhou Yanjie static int x1000_mmc0_4bit_pins[] = { 0x16, 0x15, 0x14, };
2033fe1ad5eeSZhou Yanjie static int x1000_mmc0_8bit_pins[] = { 0x13, 0x12, 0x11, 0x10, };
2034fe1ad5eeSZhou Yanjie static int x1000_mmc1_1bit_pins[] = { 0x40, 0x41, 0x42, };
2035fe1ad5eeSZhou Yanjie static int x1000_mmc1_4bit_pins[] = { 0x43, 0x44, 0x45, };
2036b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_8bit_data_pins[] = {
2037fe1ad5eeSZhou Yanjie 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2038fe1ad5eeSZhou Yanjie };
2039b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_16bit_data_pins[] = {
2040fe1ad5eeSZhou Yanjie 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2041fe1ad5eeSZhou Yanjie };
2042b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_addr_pins[] = {
2043fe1ad5eeSZhou Yanjie 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2044fe1ad5eeSZhou Yanjie 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
2045fe1ad5eeSZhou Yanjie };
2046b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_rd_we_pins[] = { 0x30, 0x31, };
2047b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_wait_pins[] = { 0x34, };
2048b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs1_pins[] = { 0x32, };
2049b4a9372aS周琰杰 (Zhou Yanjie) static int x1000_emc_cs2_pins[] = { 0x33, };
2050fe1ad5eeSZhou Yanjie static int x1000_i2c0_pins[] = { 0x38, 0x37, };
2051fe1ad5eeSZhou Yanjie static int x1000_i2c1_a_pins[] = { 0x01, 0x00, };
2052fe1ad5eeSZhou Yanjie static int x1000_i2c1_c_pins[] = { 0x5b, 0x5a, };
2053fe1ad5eeSZhou Yanjie static int x1000_i2c2_pins[] = { 0x61, 0x60, };
2054f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_data_tx_pins[] = { 0x24, };
2055f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_data_rx_pins[] = { 0x23, };
2056f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
2057f4b5c348S周琰杰 (Zhou Yanjie) static int x1000_i2s_sysclk_pins[] = { 0x20, };
205828c1caafS周琰杰 (Zhou Yanjie) static int x1000_dmic_if0_pins[] = { 0x35, 0x36, };
205928c1caafS周琰杰 (Zhou Yanjie) static int x1000_dmic_if1_pins[] = { 0x25, };
2060fe1ad5eeSZhou Yanjie static int x1000_cim_pins[] = {
2061fe1ad5eeSZhou Yanjie 	0x08, 0x09, 0x0a, 0x0b,
2062fe1ad5eeSZhou Yanjie 	0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
2063fe1ad5eeSZhou Yanjie };
2064fe1ad5eeSZhou Yanjie static int x1000_lcd_8bit_pins[] = {
2065fe1ad5eeSZhou Yanjie 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2066fe1ad5eeSZhou Yanjie 	0x30, 0x31, 0x32, 0x33, 0x34,
2067fe1ad5eeSZhou Yanjie };
2068fe1ad5eeSZhou Yanjie static int x1000_lcd_16bit_pins[] = {
2069fe1ad5eeSZhou Yanjie 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2070fe1ad5eeSZhou Yanjie };
2071fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm0_pins[] = { 0x59, };
2072fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm1_pins[] = { 0x5a, };
2073fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm2_pins[] = { 0x5b, };
2074fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm3_pins[] = { 0x26, };
2075fe1ad5eeSZhou Yanjie static int x1000_pwm_pwm4_pins[] = { 0x58, };
2076fe1ad5eeSZhou Yanjie static int x1000_mac_pins[] = {
2077fe1ad5eeSZhou Yanjie 	0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x26,
2078fe1ad5eeSZhou Yanjie };
2079fe1ad5eeSZhou Yanjie 
2080fe1ad5eeSZhou Yanjie static const struct group_desc x1000_groups[] = {
2081bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", x1000_uart0_data, 0),
2082bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", x1000_uart0_hwflow, 0),
2083bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data-a", x1000_uart1_data_a, 2),
2084bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data-d", x1000_uart1_data_d, 1),
2085bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-hwflow", x1000_uart1_hwflow, 1),
2086bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data-a", x1000_uart2_data_a, 2),
2087bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data-d", x1000_uart2_data_d, 0),
208828c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data", x1000_sfc_data, 1),
208928c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk", x1000_sfc_clk, 1),
209028c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce", x1000_sfc_ce, 1),
2091bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-dt-a-22", x1000_ssi_dt_a_22, 2),
2092bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-dt-a-29", x1000_ssi_dt_a_29, 2),
2093bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-dt-d", x1000_ssi_dt_d, 0),
2094bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-dr-a-23", x1000_ssi_dr_a_23, 2),
2095bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-dr-a-28", x1000_ssi_dr_a_28, 2),
2096bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-dr-d", x1000_ssi_dr_d, 0),
2097bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-clk-a-24", x1000_ssi_clk_a_24, 2),
2098bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-clk-a-26", x1000_ssi_clk_a_26, 2),
2099bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-clk-d", x1000_ssi_clk_d, 0),
2100bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-gpc-a-20", x1000_ssi_gpc_a_20, 2),
2101bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-gpc-a-31", x1000_ssi_gpc_a_31, 2),
2102bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-ce0-a-25", x1000_ssi_ce0_a_25, 2),
2103bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-ce0-a-27", x1000_ssi_ce0_a_27, 2),
2104bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-ce0-d", x1000_ssi_ce0_d, 0),
2105bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-ce1-a-21", x1000_ssi_ce1_a_21, 2),
2106bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi-ce1-a-30", x1000_ssi_ce1_a_30, 2),
2107bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-1bit", x1000_mmc0_1bit, 1),
2108bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit", x1000_mmc0_4bit, 1),
2109bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-8bit", x1000_mmc0_8bit, 1),
2110bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit", x1000_mmc1_1bit, 0),
2111bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit", x1000_mmc1_4bit, 0),
2112bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-8bit-data", x1000_emc_8bit_data, 0),
2113bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-16bit-data", x1000_emc_16bit_data, 0),
2114bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-addr", x1000_emc_addr, 0),
2115bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-rd-we", x1000_emc_rd_we, 0),
2116bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-wait", x1000_emc_wait, 0),
2117bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-cs1", x1000_emc_cs1, 0),
2118bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("emc-cs2", x1000_emc_cs2, 0),
2119bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c0-data", x1000_i2c0, 0),
2120bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data-a", x1000_i2c1_a, 2),
2121bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data-c", x1000_i2c1_c, 0),
2122bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c2-data", x1000_i2c2, 1),
2123bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-tx", x1000_i2s_data_tx, 1),
2124bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-rx", x1000_i2s_data_rx, 1),
2125bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-clk-txrx", x1000_i2s_clk_txrx, 1),
2126bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-sysclk", x1000_i2s_sysclk, 1),
212728c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if0", x1000_dmic_if0, 0),
212828c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if1", x1000_dmic_if1, 1),
2129bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data", x1000_cim, 2),
2130bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-8bit", x1000_lcd_8bit, 1),
2131bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-16bit", x1000_lcd_16bit, 1),
2132bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", x1000_pwm_pwm0, 0),
2133bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", x1000_pwm_pwm1, 1),
2134bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", x1000_pwm_pwm2, 1),
2135bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", x1000_pwm_pwm3, 2),
2136bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", x1000_pwm_pwm4, 0),
2137bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mac", x1000_mac, 1),
2138fe1ad5eeSZhou Yanjie };
2139fe1ad5eeSZhou Yanjie 
2140fe1ad5eeSZhou Yanjie static const char *x1000_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2141fe1ad5eeSZhou Yanjie static const char *x1000_uart1_groups[] = {
2142b4a9372aS周琰杰 (Zhou Yanjie) 	"uart1-data-a", "uart1-data-d", "uart1-hwflow",
2143fe1ad5eeSZhou Yanjie };
2144fe1ad5eeSZhou Yanjie static const char *x1000_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
214528c1caafS周琰杰 (Zhou Yanjie) static const char *x1000_sfc_groups[] = { "sfc-data", "sfc-clk", "sfc-ce", };
21463b31e9b0S周琰杰 (Zhou Yanjie) static const char *x1000_ssi_groups[] = {
21473b31e9b0S周琰杰 (Zhou Yanjie) 	"ssi-dt-a-22", "ssi-dt-a-29", "ssi-dt-d",
21483b31e9b0S周琰杰 (Zhou Yanjie) 	"ssi-dr-a-23", "ssi-dr-a-28", "ssi-dr-d",
21493b31e9b0S周琰杰 (Zhou Yanjie) 	"ssi-clk-a-24", "ssi-clk-a-26", "ssi-clk-d",
21503b31e9b0S周琰杰 (Zhou Yanjie) 	"ssi-gpc-a-20", "ssi-gpc-a-31",
21513b31e9b0S周琰杰 (Zhou Yanjie) 	"ssi-ce0-a-25", "ssi-ce0-a-27", "ssi-ce0-d",
21523b31e9b0S周琰杰 (Zhou Yanjie) 	"ssi-ce1-a-21", "ssi-ce1-a-30",
21533b31e9b0S周琰杰 (Zhou Yanjie) };
2154fe1ad5eeSZhou Yanjie static const char *x1000_mmc0_groups[] = {
2155fe1ad5eeSZhou Yanjie 	"mmc0-1bit", "mmc0-4bit", "mmc0-8bit",
2156fe1ad5eeSZhou Yanjie };
2157fe1ad5eeSZhou Yanjie static const char *x1000_mmc1_groups[] = {
2158b4a9372aS周琰杰 (Zhou Yanjie) 	"mmc1-1bit", "mmc1-4bit",
2159fe1ad5eeSZhou Yanjie };
2160b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_emc_groups[] = {
2161b4a9372aS周琰杰 (Zhou Yanjie) 	"emc-8bit-data", "emc-16bit-data",
2162b4a9372aS周琰杰 (Zhou Yanjie) 	"emc-addr", "emc-rd-we", "emc-wait",
2163fe1ad5eeSZhou Yanjie };
2164b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_cs1_groups[] = { "emc-cs1", };
2165b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1000_cs2_groups[] = { "emc-cs2", };
2166fe1ad5eeSZhou Yanjie static const char *x1000_i2c0_groups[] = { "i2c0-data", };
2167fe1ad5eeSZhou Yanjie static const char *x1000_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
2168fe1ad5eeSZhou Yanjie static const char *x1000_i2c2_groups[] = { "i2c2-data", };
2169f4b5c348S周琰杰 (Zhou Yanjie) static const char *x1000_i2s_groups[] = {
2170f4b5c348S周琰杰 (Zhou Yanjie) 	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
2171f4b5c348S周琰杰 (Zhou Yanjie) };
217228c1caafS周琰杰 (Zhou Yanjie) static const char *x1000_dmic_groups[] = { "dmic-if0", "dmic-if1", };
2173fe1ad5eeSZhou Yanjie static const char *x1000_cim_groups[] = { "cim-data", };
21745e6332a7S周琰杰 (Zhou Yanjie) static const char *x1000_lcd_groups[] = { "lcd-8bit", "lcd-16bit", };
2175fe1ad5eeSZhou Yanjie static const char *x1000_pwm0_groups[] = { "pwm0", };
2176fe1ad5eeSZhou Yanjie static const char *x1000_pwm1_groups[] = { "pwm1", };
2177fe1ad5eeSZhou Yanjie static const char *x1000_pwm2_groups[] = { "pwm2", };
2178fe1ad5eeSZhou Yanjie static const char *x1000_pwm3_groups[] = { "pwm3", };
2179fe1ad5eeSZhou Yanjie static const char *x1000_pwm4_groups[] = { "pwm4", };
2180fe1ad5eeSZhou Yanjie static const char *x1000_mac_groups[] = { "mac", };
2181fe1ad5eeSZhou Yanjie 
2182fe1ad5eeSZhou Yanjie static const struct function_desc x1000_functions[] = {
2183fe1ad5eeSZhou Yanjie 	{ "uart0", x1000_uart0_groups, ARRAY_SIZE(x1000_uart0_groups), },
2184fe1ad5eeSZhou Yanjie 	{ "uart1", x1000_uart1_groups, ARRAY_SIZE(x1000_uart1_groups), },
2185fe1ad5eeSZhou Yanjie 	{ "uart2", x1000_uart2_groups, ARRAY_SIZE(x1000_uart2_groups), },
21863b31e9b0S周琰杰 (Zhou Yanjie) 	{ "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
21873b31e9b0S周琰杰 (Zhou Yanjie) 	{ "ssi", x1000_ssi_groups, ARRAY_SIZE(x1000_ssi_groups), },
2188fe1ad5eeSZhou Yanjie 	{ "mmc0", x1000_mmc0_groups, ARRAY_SIZE(x1000_mmc0_groups), },
2189fe1ad5eeSZhou Yanjie 	{ "mmc1", x1000_mmc1_groups, ARRAY_SIZE(x1000_mmc1_groups), },
2190b4a9372aS周琰杰 (Zhou Yanjie) 	{ "emc", x1000_emc_groups, ARRAY_SIZE(x1000_emc_groups), },
2191b4a9372aS周琰杰 (Zhou Yanjie) 	{ "emc-cs1", x1000_cs1_groups, ARRAY_SIZE(x1000_cs1_groups), },
2192b4a9372aS周琰杰 (Zhou Yanjie) 	{ "emc-cs2", x1000_cs2_groups, ARRAY_SIZE(x1000_cs2_groups), },
2193fe1ad5eeSZhou Yanjie 	{ "i2c0", x1000_i2c0_groups, ARRAY_SIZE(x1000_i2c0_groups), },
2194fe1ad5eeSZhou Yanjie 	{ "i2c1", x1000_i2c1_groups, ARRAY_SIZE(x1000_i2c1_groups), },
2195fe1ad5eeSZhou Yanjie 	{ "i2c2", x1000_i2c2_groups, ARRAY_SIZE(x1000_i2c2_groups), },
2196f4b5c348S周琰杰 (Zhou Yanjie) 	{ "i2s", x1000_i2s_groups, ARRAY_SIZE(x1000_i2s_groups), },
21976adf2c56S周琰杰 (Zhou Yanjie) 	{ "dmic", x1000_dmic_groups, ARRAY_SIZE(x1000_dmic_groups), },
2198fe1ad5eeSZhou Yanjie 	{ "cim", x1000_cim_groups, ARRAY_SIZE(x1000_cim_groups), },
2199fe1ad5eeSZhou Yanjie 	{ "lcd", x1000_lcd_groups, ARRAY_SIZE(x1000_lcd_groups), },
2200fe1ad5eeSZhou Yanjie 	{ "pwm0", x1000_pwm0_groups, ARRAY_SIZE(x1000_pwm0_groups), },
2201fe1ad5eeSZhou Yanjie 	{ "pwm1", x1000_pwm1_groups, ARRAY_SIZE(x1000_pwm1_groups), },
2202fe1ad5eeSZhou Yanjie 	{ "pwm2", x1000_pwm2_groups, ARRAY_SIZE(x1000_pwm2_groups), },
2203fe1ad5eeSZhou Yanjie 	{ "pwm3", x1000_pwm3_groups, ARRAY_SIZE(x1000_pwm3_groups), },
2204fe1ad5eeSZhou Yanjie 	{ "pwm4", x1000_pwm4_groups, ARRAY_SIZE(x1000_pwm4_groups), },
2205fe1ad5eeSZhou Yanjie 	{ "mac", x1000_mac_groups, ARRAY_SIZE(x1000_mac_groups), },
2206fe1ad5eeSZhou Yanjie };
2207fe1ad5eeSZhou Yanjie 
22089279c00fSAidan MacDonald static const struct regmap_range x1000_access_ranges[] = {
22099279c00fSAidan MacDonald 	regmap_reg_range(0x000, 0x400 - 4),
22109279c00fSAidan MacDonald 	regmap_reg_range(0x700, 0x800 - 4),
22119279c00fSAidan MacDonald };
22129279c00fSAidan MacDonald 
22139279c00fSAidan MacDonald /* shared with X1500 */
22149279c00fSAidan MacDonald static const struct regmap_access_table x1000_access_table = {
22159279c00fSAidan MacDonald 	.yes_ranges = x1000_access_ranges,
22169279c00fSAidan MacDonald 	.n_yes_ranges = ARRAY_SIZE(x1000_access_ranges),
22179279c00fSAidan MacDonald };
22189279c00fSAidan MacDonald 
2219fe1ad5eeSZhou Yanjie static const struct ingenic_chip_info x1000_chip_info = {
2220fe1ad5eeSZhou Yanjie 	.num_chips = 4,
2221f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
2222baf15647SPaul Cercueil 	.version = ID_X1000,
2223fe1ad5eeSZhou Yanjie 	.groups = x1000_groups,
2224fe1ad5eeSZhou Yanjie 	.num_groups = ARRAY_SIZE(x1000_groups),
2225fe1ad5eeSZhou Yanjie 	.functions = x1000_functions,
2226fe1ad5eeSZhou Yanjie 	.num_functions = ARRAY_SIZE(x1000_functions),
2227fe1ad5eeSZhou Yanjie 	.pull_ups = x1000_pull_ups,
2228fe1ad5eeSZhou Yanjie 	.pull_downs = x1000_pull_downs,
22299279c00fSAidan MacDonald 	.access_table = &x1000_access_table,
2230fe1ad5eeSZhou Yanjie };
2231fe1ad5eeSZhou Yanjie 
22325d21595bSZhou Yanjie static int x1500_uart0_data_pins[] = { 0x4a, 0x4b, };
22335d21595bSZhou Yanjie static int x1500_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
22345d21595bSZhou Yanjie static int x1500_uart1_data_a_pins[] = { 0x04, 0x05, };
22355d21595bSZhou Yanjie static int x1500_uart1_data_d_pins[] = { 0x62, 0x63, };
2236b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_uart1_hwflow_pins[] = { 0x64, 0x65, };
22375d21595bSZhou Yanjie static int x1500_uart2_data_a_pins[] = { 0x02, 0x03, };
22385d21595bSZhou Yanjie static int x1500_uart2_data_d_pins[] = { 0x65, 0x64, };
2239b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_1bit_pins[] = { 0x18, 0x19, 0x17, };
2240b4a9372aS周琰杰 (Zhou Yanjie) static int x1500_mmc_4bit_pins[] = { 0x16, 0x15, 0x14, };
22415d21595bSZhou Yanjie static int x1500_i2c0_pins[] = { 0x38, 0x37, };
22425d21595bSZhou Yanjie static int x1500_i2c1_a_pins[] = { 0x01, 0x00, };
22435d21595bSZhou Yanjie static int x1500_i2c1_c_pins[] = { 0x5b, 0x5a, };
22445d21595bSZhou Yanjie static int x1500_i2c2_pins[] = { 0x61, 0x60, };
2245f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_data_tx_pins[] = { 0x24, };
2246f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_data_rx_pins[] = { 0x23, };
2247f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
2248f4b5c348S周琰杰 (Zhou Yanjie) static int x1500_i2s_sysclk_pins[] = { 0x20, };
224928c1caafS周琰杰 (Zhou Yanjie) static int x1500_dmic_if0_pins[] = { 0x35, 0x36, };
225028c1caafS周琰杰 (Zhou Yanjie) static int x1500_dmic_if1_pins[] = { 0x25, };
22515d21595bSZhou Yanjie static int x1500_cim_pins[] = {
22525d21595bSZhou Yanjie 	0x08, 0x09, 0x0a, 0x0b,
22535d21595bSZhou Yanjie 	0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
22545d21595bSZhou Yanjie };
22555d21595bSZhou Yanjie static int x1500_pwm_pwm0_pins[] = { 0x59, };
22565d21595bSZhou Yanjie static int x1500_pwm_pwm1_pins[] = { 0x5a, };
22575d21595bSZhou Yanjie static int x1500_pwm_pwm2_pins[] = { 0x5b, };
22585d21595bSZhou Yanjie static int x1500_pwm_pwm3_pins[] = { 0x26, };
22595d21595bSZhou Yanjie static int x1500_pwm_pwm4_pins[] = { 0x58, };
22605d21595bSZhou Yanjie 
22615d21595bSZhou Yanjie static const struct group_desc x1500_groups[] = {
2262bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", x1500_uart0_data, 0),
2263bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", x1500_uart0_hwflow, 0),
2264bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data-a", x1500_uart1_data_a, 2),
2265bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data-d", x1500_uart1_data_d, 1),
2266bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-hwflow", x1500_uart1_hwflow, 1),
2267bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data-a", x1500_uart2_data_a, 2),
2268bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart2-data-d", x1500_uart2_data_d, 0),
226928c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data", x1000_sfc_data, 1),
227028c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk", x1000_sfc_clk, 1),
227128c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce", x1000_sfc_ce, 1),
2272bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc-1bit", x1500_mmc_1bit, 1),
2273bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc-4bit", x1500_mmc_4bit, 1),
2274bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c0-data", x1500_i2c0, 0),
2275bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data-a", x1500_i2c1_a, 2),
2276bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data-c", x1500_i2c1_c, 0),
2277bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c2-data", x1500_i2c2, 1),
2278bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-tx", x1500_i2s_data_tx, 1),
2279bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-rx", x1500_i2s_data_rx, 1),
2280bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-clk-txrx", x1500_i2s_clk_txrx, 1),
2281bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-sysclk", x1500_i2s_sysclk, 1),
228228c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if0", x1500_dmic_if0, 0),
228328c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if1", x1500_dmic_if1, 1),
2284bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("cim-data", x1500_cim, 2),
2285bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0", x1500_pwm_pwm0, 0),
2286bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1", x1500_pwm_pwm1, 1),
2287bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2", x1500_pwm_pwm2, 1),
2288bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3", x1500_pwm_pwm3, 2),
2289bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4", x1500_pwm_pwm4, 0),
22905d21595bSZhou Yanjie };
22915d21595bSZhou Yanjie 
22925d21595bSZhou Yanjie static const char *x1500_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
22935d21595bSZhou Yanjie static const char *x1500_uart1_groups[] = {
2294b4a9372aS周琰杰 (Zhou Yanjie) 	"uart1-data-a", "uart1-data-d", "uart1-hwflow",
22955d21595bSZhou Yanjie };
22965d21595bSZhou Yanjie static const char *x1500_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
2297b4a9372aS周琰杰 (Zhou Yanjie) static const char *x1500_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
22985d21595bSZhou Yanjie static const char *x1500_i2c0_groups[] = { "i2c0-data", };
22995d21595bSZhou Yanjie static const char *x1500_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
23005d21595bSZhou Yanjie static const char *x1500_i2c2_groups[] = { "i2c2-data", };
2301f4b5c348S周琰杰 (Zhou Yanjie) static const char *x1500_i2s_groups[] = {
2302f4b5c348S周琰杰 (Zhou Yanjie) 	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
2303f4b5c348S周琰杰 (Zhou Yanjie) };
230428c1caafS周琰杰 (Zhou Yanjie) static const char *x1500_dmic_groups[] = { "dmic-if0", "dmic-if1", };
23055d21595bSZhou Yanjie static const char *x1500_cim_groups[] = { "cim-data", };
23065d21595bSZhou Yanjie static const char *x1500_pwm0_groups[] = { "pwm0", };
23075d21595bSZhou Yanjie static const char *x1500_pwm1_groups[] = { "pwm1", };
23085d21595bSZhou Yanjie static const char *x1500_pwm2_groups[] = { "pwm2", };
23095d21595bSZhou Yanjie static const char *x1500_pwm3_groups[] = { "pwm3", };
23105d21595bSZhou Yanjie static const char *x1500_pwm4_groups[] = { "pwm4", };
23115d21595bSZhou Yanjie 
23125d21595bSZhou Yanjie static const struct function_desc x1500_functions[] = {
23135d21595bSZhou Yanjie 	{ "uart0", x1500_uart0_groups, ARRAY_SIZE(x1500_uart0_groups), },
23145d21595bSZhou Yanjie 	{ "uart1", x1500_uart1_groups, ARRAY_SIZE(x1500_uart1_groups), },
23155d21595bSZhou Yanjie 	{ "uart2", x1500_uart2_groups, ARRAY_SIZE(x1500_uart2_groups), },
23163b31e9b0S周琰杰 (Zhou Yanjie) 	{ "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
2317b4a9372aS周琰杰 (Zhou Yanjie) 	{ "mmc", x1500_mmc_groups, ARRAY_SIZE(x1500_mmc_groups), },
23185d21595bSZhou Yanjie 	{ "i2c0", x1500_i2c0_groups, ARRAY_SIZE(x1500_i2c0_groups), },
23195d21595bSZhou Yanjie 	{ "i2c1", x1500_i2c1_groups, ARRAY_SIZE(x1500_i2c1_groups), },
23205d21595bSZhou Yanjie 	{ "i2c2", x1500_i2c2_groups, ARRAY_SIZE(x1500_i2c2_groups), },
2321f4b5c348S周琰杰 (Zhou Yanjie) 	{ "i2s", x1500_i2s_groups, ARRAY_SIZE(x1500_i2s_groups), },
23226adf2c56S周琰杰 (Zhou Yanjie) 	{ "dmic", x1500_dmic_groups, ARRAY_SIZE(x1500_dmic_groups), },
23235d21595bSZhou Yanjie 	{ "cim", x1500_cim_groups, ARRAY_SIZE(x1500_cim_groups), },
23245d21595bSZhou Yanjie 	{ "pwm0", x1500_pwm0_groups, ARRAY_SIZE(x1500_pwm0_groups), },
23255d21595bSZhou Yanjie 	{ "pwm1", x1500_pwm1_groups, ARRAY_SIZE(x1500_pwm1_groups), },
23265d21595bSZhou Yanjie 	{ "pwm2", x1500_pwm2_groups, ARRAY_SIZE(x1500_pwm2_groups), },
23275d21595bSZhou Yanjie 	{ "pwm3", x1500_pwm3_groups, ARRAY_SIZE(x1500_pwm3_groups), },
23285d21595bSZhou Yanjie 	{ "pwm4", x1500_pwm4_groups, ARRAY_SIZE(x1500_pwm4_groups), },
23295d21595bSZhou Yanjie };
23305d21595bSZhou Yanjie 
23315d21595bSZhou Yanjie static const struct ingenic_chip_info x1500_chip_info = {
23325d21595bSZhou Yanjie 	.num_chips = 4,
2333f742e5ebS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
2334baf15647SPaul Cercueil 	.version = ID_X1500,
23355d21595bSZhou Yanjie 	.groups = x1500_groups,
23365d21595bSZhou Yanjie 	.num_groups = ARRAY_SIZE(x1500_groups),
23375d21595bSZhou Yanjie 	.functions = x1500_functions,
23385d21595bSZhou Yanjie 	.num_functions = ARRAY_SIZE(x1500_functions),
23395d21595bSZhou Yanjie 	.pull_ups = x1000_pull_ups,
23405d21595bSZhou Yanjie 	.pull_downs = x1000_pull_downs,
23419279c00fSAidan MacDonald 	.access_table = &x1000_access_table,
23425d21595bSZhou Yanjie };
23435d21595bSZhou Yanjie 
2344d7da2a1eS周琰杰 (Zhou Yanjie) static const u32 x1830_pull_ups[4] = {
2345d7da2a1eS周琰杰 (Zhou Yanjie) 	0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
2346d7da2a1eS周琰杰 (Zhou Yanjie) };
2347d7da2a1eS周琰杰 (Zhou Yanjie) 
2348d7da2a1eS周琰杰 (Zhou Yanjie) static const u32 x1830_pull_downs[4] = {
2349d7da2a1eS周琰杰 (Zhou Yanjie) 	0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
2350d7da2a1eS周琰杰 (Zhou Yanjie) };
2351d7da2a1eS周琰杰 (Zhou Yanjie) 
2352d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_data_pins[] = { 0x33, 0x36, };
2353d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart0_hwflow_pins[] = { 0x34, 0x35, };
2354d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_uart1_data_pins[] = { 0x38, 0x37, };
235528c1caafS周琰杰 (Zhou Yanjie) static int x1830_sfc_data_pins[] = { 0x17, 0x18, 0x1a, 0x19, };
235628c1caafS周琰杰 (Zhou Yanjie) static int x1830_sfc_clk_pins[] = { 0x1b, };
235728c1caafS周琰杰 (Zhou Yanjie) static int x1830_sfc_ce_pins[] = { 0x1c, };
2358d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dt_pins[] = { 0x4c, };
2359d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_dr_pins[] = { 0x4b, };
2360d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_clk_pins[] = { 0x4f, };
2361d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_gpc_pins[] = { 0x4d, };
2362d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce0_pins[] = { 0x50, };
2363d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi0_ce1_pins[] = { 0x4e, };
2364d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_c_pins[] = { 0x53, };
2365d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dt_d_pins[] = { 0x62, };
236611015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_c_pins[] = { 0x54, };
2367d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_dr_d_pins[] = { 0x63, };
236811015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_c_pins[] = { 0x57, };
2369d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_clk_d_pins[] = { 0x66, };
237011015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_c_pins[] = { 0x55, };
2371d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_gpc_d_pins[] = { 0x64, };
237211015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_c_pins[] = { 0x58, };
2373d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce0_d_pins[] = { 0x67, };
237411015196S周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_c_pins[] = { 0x56, };
2375d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_ssi1_ce1_d_pins[] = { 0x65, };
2376d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_1bit_pins[] = { 0x24, 0x25, 0x20, };
2377d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc0_4bit_pins[] = { 0x21, 0x22, 0x23, };
2378d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_1bit_pins[] = { 0x42, 0x43, 0x44, };
2379d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mmc1_4bit_pins[] = { 0x45, 0x46, 0x47, };
2380d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c0_pins[] = { 0x0c, 0x0d, };
2381d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c1_pins[] = { 0x39, 0x3a, };
2382d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_i2c2_pins[] = { 0x5b, 0x5c, };
2383f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_data_tx_pins[] = { 0x53, };
2384f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_data_rx_pins[] = { 0x54, };
2385f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_clk_txrx_pins[] = { 0x58, 0x52, };
2386f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_clk_rx_pins[] = { 0x56, 0x55, };
2387f4b5c348S周琰杰 (Zhou Yanjie) static int x1830_i2s_sysclk_pins[] = { 0x57, };
238828c1caafS周琰杰 (Zhou Yanjie) static int x1830_dmic_if0_pins[] = { 0x48, 0x59, };
238928c1caafS周琰杰 (Zhou Yanjie) static int x1830_dmic_if1_pins[] = { 0x5a, };
23905e6332a7S周琰杰 (Zhou Yanjie) static int x1830_lcd_tft_8bit_pins[] = {
2391b2954743S周琰杰 (Zhou Yanjie) 	0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
23925e6332a7S周琰杰 (Zhou Yanjie) 	0x68, 0x73, 0x72, 0x69,
23935e6332a7S周琰杰 (Zhou Yanjie) };
23945e6332a7S周琰杰 (Zhou Yanjie) static int x1830_lcd_tft_24bit_pins[] = {
23955e6332a7S周琰杰 (Zhou Yanjie) 	0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71,
23965e6332a7S周琰杰 (Zhou Yanjie) 	0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b,
2397b2954743S周琰杰 (Zhou Yanjie) };
2398b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_8bit_pins[] = {
2399b2954743S周琰杰 (Zhou Yanjie) 	0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d,
2400b2954743S周琰杰 (Zhou Yanjie) 	0x69, 0x72, 0x73, 0x7b, 0x7a,
2401b2954743S周琰杰 (Zhou Yanjie) };
2402b2954743S周琰杰 (Zhou Yanjie) static int x1830_lcd_slcd_16bit_pins[] = {
2403b2954743S周琰杰 (Zhou Yanjie) 	0x6e, 0x6f, 0x70, 0x71, 0x76, 0x77, 0x78, 0x79,
2404b2954743S周琰杰 (Zhou Yanjie) };
2405d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_b_pins[] = { 0x31, };
2406d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm0_c_pins[] = { 0x4b, };
2407d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_b_pins[] = { 0x32, };
2408d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm1_c_pins[] = { 0x4c, };
2409d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_8_pins[] = { 0x48, };
2410d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm2_c_13_pins[] = { 0x4d, };
2411d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_9_pins[] = { 0x49, };
2412d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm3_c_14_pins[] = { 0x4e, };
2413d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_15_pins[] = { 0x4f, };
2414d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm4_c_25_pins[] = { 0x59, };
2415d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_16_pins[] = { 0x50, };
2416d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm5_c_26_pins[] = { 0x5a, };
2417d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_17_pins[] = { 0x51, };
2418d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm6_c_27_pins[] = { 0x5b, };
2419d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_18_pins[] = { 0x52, };
2420d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_pwm_pwm7_c_28_pins[] = { 0x5c, };
2421d7da2a1eS周琰杰 (Zhou Yanjie) static int x1830_mac_pins[] = {
2422d7da2a1eS周琰杰 (Zhou Yanjie) 	0x29, 0x30, 0x2f, 0x28, 0x2e, 0x2d, 0x2a, 0x2b, 0x26, 0x27,
2423d7da2a1eS周琰杰 (Zhou Yanjie) };
2424d7da2a1eS周琰杰 (Zhou Yanjie) 
2425d7da2a1eS周琰杰 (Zhou Yanjie) static const struct group_desc x1830_groups[] = {
2426bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-data", x1830_uart0_data, 0),
2427bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart0-hwflow", x1830_uart0_hwflow, 0),
2428bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("uart1-data", x1830_uart1_data, 0),
242928c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data", x1830_sfc_data, 1),
243028c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk", x1830_sfc_clk, 1),
243128c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce", x1830_sfc_ce, 1),
2432bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dt", x1830_ssi0_dt, 0),
2433bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-dr", x1830_ssi0_dr, 0),
2434bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-clk", x1830_ssi0_clk, 0),
2435bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-gpc", x1830_ssi0_gpc, 0),
2436bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce0", x1830_ssi0_ce0, 0),
2437bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi0-ce1", x1830_ssi0_ce1, 0),
2438bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-c", x1830_ssi1_dt_c, 1),
2439bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-c", x1830_ssi1_dr_c, 1),
2440bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-c", x1830_ssi1_clk_c, 1),
2441bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-c", x1830_ssi1_gpc_c, 1),
2442bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-c", x1830_ssi1_ce0_c, 1),
2443bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-c", x1830_ssi1_ce1_c, 1),
2444bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dt-d", x1830_ssi1_dt_d, 2),
2445bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-dr-d", x1830_ssi1_dr_d, 2),
2446bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-clk-d", x1830_ssi1_clk_d, 2),
2447bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-gpc-d", x1830_ssi1_gpc_d, 2),
2448bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce0-d", x1830_ssi1_ce0_d, 2),
2449bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("ssi1-ce1-d", x1830_ssi1_ce1_d, 2),
2450bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-1bit", x1830_mmc0_1bit, 0),
2451bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc0-4bit", x1830_mmc0_4bit, 0),
2452bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-1bit", x1830_mmc1_1bit, 0),
2453bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mmc1-4bit", x1830_mmc1_4bit, 0),
2454bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c0-data", x1830_i2c0, 1),
2455bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c1-data", x1830_i2c1, 0),
2456bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2c2-data", x1830_i2c2, 1),
2457bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-tx", x1830_i2s_data_tx, 0),
2458bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-data-rx", x1830_i2s_data_rx, 0),
2459bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-clk-txrx", x1830_i2s_clk_txrx, 0),
2460bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-clk-rx", x1830_i2s_clk_rx, 0),
2461bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("i2s-sysclk", x1830_i2s_sysclk, 0),
246228c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if0", x1830_dmic_if0, 2),
246328c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if1", x1830_dmic_if1, 2),
24645e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-8bit", x1830_lcd_tft_8bit, 0),
24655e6332a7S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-24bit", x1830_lcd_tft_24bit, 0),
2466bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-slcd-8bit", x1830_lcd_slcd_8bit, 1),
2467bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("lcd-slcd-16bit", x1830_lcd_slcd_16bit, 1),
2468bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0-b", x1830_pwm_pwm0_b, 0),
2469bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm0-c", x1830_pwm_pwm0_c, 1),
2470bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1-b", x1830_pwm_pwm1_b, 0),
2471bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm1-c", x1830_pwm_pwm1_c, 1),
2472bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2-c-8", x1830_pwm_pwm2_c_8, 0),
2473bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm2-c-13", x1830_pwm_pwm2_c_13, 1),
2474bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3-c-9", x1830_pwm_pwm3_c_9, 0),
2475bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm3-c-14", x1830_pwm_pwm3_c_14, 1),
2476bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4-c-15", x1830_pwm_pwm4_c_15, 1),
2477bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm4-c-25", x1830_pwm_pwm4_c_25, 0),
2478bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5-c-16", x1830_pwm_pwm5_c_16, 1),
2479bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm5-c-26", x1830_pwm_pwm5_c_26, 0),
2480bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm6-c-17", x1830_pwm_pwm6_c_17, 1),
2481bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm6-c-27", x1830_pwm_pwm6_c_27, 0),
2482bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm7-c-18", x1830_pwm_pwm7_c_18, 1),
2483bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("pwm7-c-28", x1830_pwm_pwm7_c_28, 0),
2484bb42b593SPaul Cercueil 	INGENIC_PIN_GROUP("mac", x1830_mac, 0),
2485d7da2a1eS周琰杰 (Zhou Yanjie) };
2486d7da2a1eS周琰杰 (Zhou Yanjie) 
2487d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2488d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_uart1_groups[] = { "uart1-data", };
248928c1caafS周琰杰 (Zhou Yanjie) static const char *x1830_sfc_groups[] = { "sfc-data", "sfc-clk", "sfc-ce", };
2490d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_ssi0_groups[] = {
2491d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi0-dt", "ssi0-dr", "ssi0-clk", "ssi0-gpc", "ssi0-ce0", "ssi0-ce1",
2492d7da2a1eS周琰杰 (Zhou Yanjie) };
2493d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_ssi1_groups[] = {
2494d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi1-dt-c", "ssi1-dt-d",
2495d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi1-dr-c", "ssi1-dr-d",
2496d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi1-clk-c", "ssi1-clk-d",
2497d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi1-gpc-c", "ssi1-gpc-d",
2498d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi1-ce0-c", "ssi1-ce0-d",
2499d7da2a1eS周琰杰 (Zhou Yanjie) 	"ssi1-ce1-c", "ssi1-ce1-d",
2500d7da2a1eS周琰杰 (Zhou Yanjie) };
2501d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
2502d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
2503d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c0_groups[] = { "i2c0-data", };
2504d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c1_groups[] = { "i2c1-data", };
2505d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_i2c2_groups[] = { "i2c2-data", };
2506f4b5c348S周琰杰 (Zhou Yanjie) static const char *x1830_i2s_groups[] = {
2507f4b5c348S周琰杰 (Zhou Yanjie) 	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
2508f4b5c348S周琰杰 (Zhou Yanjie) };
250928c1caafS周琰杰 (Zhou Yanjie) static const char *x1830_dmic_groups[] = { "dmic-if0", "dmic-if1", };
2510b2954743S周琰杰 (Zhou Yanjie) static const char *x1830_lcd_groups[] = {
25115e6332a7S周琰杰 (Zhou Yanjie) 	"lcd-tft-8bit", "lcd-tft-24bit", "lcd-slcd-8bit", "lcd-slcd-16bit",
2512b2954743S周琰杰 (Zhou Yanjie) };
2513d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm0_groups[] = { "pwm0-b", "pwm0-c", };
2514d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm1_groups[] = { "pwm1-b", "pwm1-c", };
2515d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm2_groups[] = { "pwm2-c-8", "pwm2-c-13", };
2516d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm3_groups[] = { "pwm3-c-9", "pwm3-c-14", };
2517d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm4_groups[] = { "pwm4-c-15", "pwm4-c-25", };
2518d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm5_groups[] = { "pwm5-c-16", "pwm5-c-26", };
2519d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm6_groups[] = { "pwm6-c-17", "pwm6-c-27", };
2520d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_pwm7_groups[] = { "pwm7-c-18", "pwm7-c-28", };
2521d7da2a1eS周琰杰 (Zhou Yanjie) static const char *x1830_mac_groups[] = { "mac", };
2522d7da2a1eS周琰杰 (Zhou Yanjie) 
2523d7da2a1eS周琰杰 (Zhou Yanjie) static const struct function_desc x1830_functions[] = {
2524d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "uart0", x1830_uart0_groups, ARRAY_SIZE(x1830_uart0_groups), },
2525d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "uart1", x1830_uart1_groups, ARRAY_SIZE(x1830_uart1_groups), },
2526d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "sfc", x1830_sfc_groups, ARRAY_SIZE(x1830_sfc_groups), },
2527d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "ssi0", x1830_ssi0_groups, ARRAY_SIZE(x1830_ssi0_groups), },
2528d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "ssi1", x1830_ssi1_groups, ARRAY_SIZE(x1830_ssi1_groups), },
2529d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "mmc0", x1830_mmc0_groups, ARRAY_SIZE(x1830_mmc0_groups), },
2530d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "mmc1", x1830_mmc1_groups, ARRAY_SIZE(x1830_mmc1_groups), },
2531d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "i2c0", x1830_i2c0_groups, ARRAY_SIZE(x1830_i2c0_groups), },
2532d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "i2c1", x1830_i2c1_groups, ARRAY_SIZE(x1830_i2c1_groups), },
2533d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "i2c2", x1830_i2c2_groups, ARRAY_SIZE(x1830_i2c2_groups), },
2534f4b5c348S周琰杰 (Zhou Yanjie) 	{ "i2s", x1830_i2s_groups, ARRAY_SIZE(x1830_i2s_groups), },
25356adf2c56S周琰杰 (Zhou Yanjie) 	{ "dmic", x1830_dmic_groups, ARRAY_SIZE(x1830_dmic_groups), },
2536b2954743S周琰杰 (Zhou Yanjie) 	{ "lcd", x1830_lcd_groups, ARRAY_SIZE(x1830_lcd_groups), },
2537d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm0", x1830_pwm0_groups, ARRAY_SIZE(x1830_pwm0_groups), },
2538d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm1", x1830_pwm1_groups, ARRAY_SIZE(x1830_pwm1_groups), },
2539d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm2", x1830_pwm2_groups, ARRAY_SIZE(x1830_pwm2_groups), },
2540d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm3", x1830_pwm3_groups, ARRAY_SIZE(x1830_pwm3_groups), },
2541d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm4", x1830_pwm4_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2542d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm5", x1830_pwm5_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2543d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm6", x1830_pwm6_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2544d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "pwm7", x1830_pwm7_groups, ARRAY_SIZE(x1830_pwm4_groups), },
2545d7da2a1eS周琰杰 (Zhou Yanjie) 	{ "mac", x1830_mac_groups, ARRAY_SIZE(x1830_mac_groups), },
2546d7da2a1eS周琰杰 (Zhou Yanjie) };
2547d7da2a1eS周琰杰 (Zhou Yanjie) 
25489279c00fSAidan MacDonald static const struct regmap_range x1830_access_ranges[] = {
25499279c00fSAidan MacDonald 	regmap_reg_range(0x0000, 0x4000 - 4),
25509279c00fSAidan MacDonald 	regmap_reg_range(0x7000, 0x8000 - 4),
25519279c00fSAidan MacDonald };
25529279c00fSAidan MacDonald 
25539279c00fSAidan MacDonald static const struct regmap_access_table x1830_access_table = {
25549279c00fSAidan MacDonald 	.yes_ranges = x1830_access_ranges,
25559279c00fSAidan MacDonald 	.n_yes_ranges = ARRAY_SIZE(x1830_access_ranges),
25569279c00fSAidan MacDonald };
25579279c00fSAidan MacDonald 
2558d7da2a1eS周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x1830_chip_info = {
2559d7da2a1eS周琰杰 (Zhou Yanjie) 	.num_chips = 4,
2560d7da2a1eS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x1000,
2561baf15647SPaul Cercueil 	.version = ID_X1830,
2562d7da2a1eS周琰杰 (Zhou Yanjie) 	.groups = x1830_groups,
2563d7da2a1eS周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(x1830_groups),
2564d7da2a1eS周琰杰 (Zhou Yanjie) 	.functions = x1830_functions,
2565d7da2a1eS周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(x1830_functions),
2566d7da2a1eS周琰杰 (Zhou Yanjie) 	.pull_ups = x1830_pull_ups,
2567d7da2a1eS周琰杰 (Zhou Yanjie) 	.pull_downs = x1830_pull_downs,
25689279c00fSAidan MacDonald 	.access_table = &x1830_access_table,
2569d7da2a1eS周琰杰 (Zhou Yanjie) };
2570d7da2a1eS周琰杰 (Zhou Yanjie) 
2571943e0da1S周琰杰 (Zhou Yanjie) static const u32 x2000_pull_ups[5] = {
2572943e0da1S周琰杰 (Zhou Yanjie) 	0x0003ffff, 0xffffffff, 0x1ff0ffff, 0xc7fe3f3f, 0x8fff003f,
2573943e0da1S周琰杰 (Zhou Yanjie) };
2574943e0da1S周琰杰 (Zhou Yanjie) 
2575943e0da1S周琰杰 (Zhou Yanjie) static const u32 x2000_pull_downs[5] = {
2576943e0da1S周琰杰 (Zhou Yanjie) 	0x0003ffff, 0xffffffff, 0x1ff0ffff, 0x00000000, 0x8fff003f,
2577943e0da1S周琰杰 (Zhou Yanjie) };
2578943e0da1S周琰杰 (Zhou Yanjie) 
2579943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart0_data_pins[] = { 0x77, 0x78, };
2580943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart0_hwflow_pins[] = { 0x79, 0x7a, };
2581943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart1_data_pins[] = { 0x57, 0x58, };
2582943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart1_hwflow_pins[] = { 0x55, 0x56, };
2583943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart2_data_pins[] = { 0x7e, 0x7f, };
2584943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_data_c_pins[] = { 0x59, 0x5a, };
2585943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_data_d_pins[] = { 0x62, 0x63, };
2586943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_hwflow_c_pins[] = { 0x5b, 0x5c, };
2587943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart3_hwflow_d_pins[] = { 0x60, 0x61, };
2588943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_data_a_pins[] = { 0x02, 0x03, };
2589943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_data_c_pins[] = { 0x4b, 0x4c, };
2590943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_hwflow_a_pins[] = { 0x00, 0x01, };
2591943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart4_hwflow_c_pins[] = { 0x49, 0x4a, };
2592943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart5_data_a_pins[] = { 0x04, 0x05, };
2593943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart5_data_c_pins[] = { 0x45, 0x46, };
2594943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart6_data_a_pins[] = { 0x06, 0x07, };
2595943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart6_data_c_pins[] = { 0x47, 0x48, };
2596943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart7_data_a_pins[] = { 0x08, 0x09, };
2597943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart7_data_c_pins[] = { 0x41, 0x42, };
2598943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart8_data_pins[] = { 0x3c, 0x3d, };
2599943e0da1S周琰杰 (Zhou Yanjie) static int x2000_uart9_data_pins[] = { 0x3e, 0x3f, };
260028c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_data_if0_d_pins[] = { 0x73, 0x74, 0x75, 0x76, };
260128c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_data_if0_e_pins[] = { 0x92, 0x93, 0x94, 0x95, };
260228c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_data_if1_pins[] = { 0x77, 0x78, 0x79, 0x7a, };
260328c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_clk_d_pins[] = { 0x71, };
260428c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_clk_e_pins[] = { 0x90, };
260528c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_ce_d_pins[] = { 0x72, };
260628c1caafS周琰杰 (Zhou Yanjie) static int x2000_sfc_ce_e_pins[] = { 0x91, };
2607943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dt_b_pins[] = { 0x3e, };
2608943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dt_d_pins[] = { 0x69, };
2609943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dr_b_pins[] = { 0x3d, };
2610943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_dr_d_pins[] = { 0x6a, };
2611943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_clk_b_pins[] = { 0x3f, };
2612943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi0_clk_d_pins[] = { 0x68, };
261328c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi0_ce_b_pins[] = { 0x3c, };
261428c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi0_ce_d_pins[] = { 0x6d, };
2615943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dt_c_pins[] = { 0x4b, };
2616943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dt_d_pins[] = { 0x72, };
2617943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dt_e_pins[] = { 0x91, };
2618943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dr_c_pins[] = { 0x4a, };
2619943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dr_d_pins[] = { 0x73, };
2620943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_dr_e_pins[] = { 0x92, };
2621943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_clk_c_pins[] = { 0x4c, };
2622943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_clk_d_pins[] = { 0x71, };
2623943e0da1S周琰杰 (Zhou Yanjie) static int x2000_ssi1_clk_e_pins[] = { 0x90, };
262428c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi1_ce_c_pins[] = { 0x49, };
262528c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi1_ce_d_pins[] = { 0x76, };
262628c1caafS周琰杰 (Zhou Yanjie) static int x2000_ssi1_ce_e_pins[] = { 0x95, };
2627943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc0_1bit_pins[] = { 0x71, 0x72, 0x73, };
2628943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc0_4bit_pins[] = { 0x74, 0x75, 0x75, };
2629943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc0_8bit_pins[] = { 0x77, 0x78, 0x79, 0x7a, };
2630943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc1_1bit_pins[] = { 0x68, 0x69, 0x6a, };
2631943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc1_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
2632943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc2_1bit_pins[] = { 0x80, 0x81, 0x82, };
2633943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mmc2_4bit_pins[] = { 0x83, 0x84, 0x85, };
2634943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_8bit_data_pins[] = {
2635943e0da1S周琰杰 (Zhou Yanjie) 	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
2636943e0da1S周琰杰 (Zhou Yanjie) };
2637943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_16bit_data_pins[] = {
2638943e0da1S周琰杰 (Zhou Yanjie) 	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
2639943e0da1S周琰杰 (Zhou Yanjie) };
2640943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_addr_pins[] = {
2641943e0da1S周琰杰 (Zhou Yanjie) 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2642943e0da1S周琰杰 (Zhou Yanjie) 	0x28, 0x29, 0x2a, 0x2b, 0x2c,
2643943e0da1S周琰杰 (Zhou Yanjie) };
2644943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_rd_we_pins[] = { 0x2d, 0x2e, };
2645943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_wait_pins[] = { 0x2f, };
2646943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_cs1_pins[] = { 0x57, };
2647943e0da1S周琰杰 (Zhou Yanjie) static int x2000_emc_cs2_pins[] = { 0x58, };
2648943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c0_pins[] = { 0x4e, 0x4d, };
2649943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c1_c_pins[] = { 0x58, 0x57, };
2650943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c1_d_pins[] = { 0x6c, 0x6b, };
2651943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c2_b_pins[] = { 0x37, 0x36, };
2652943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c2_d_pins[] = { 0x75, 0x74, };
2653943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c2_e_pins[] = { 0x94, 0x93, };
2654943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c3_a_pins[] = { 0x11, 0x10, };
2655943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c3_d_pins[] = { 0x7f, 0x7e, };
2656943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c4_c_pins[] = { 0x5a, 0x59, };
2657943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c4_d_pins[] = { 0x61, 0x60, };
2658943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c5_c_pins[] = { 0x5c, 0x5b, };
2659943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2c5_d_pins[] = { 0x65, 0x64, };
2660943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_data_tx_pins[] = { 0x47, };
2661943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_data_rx_pins[] = { 0x44, };
2662943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_clk_tx_pins[] = { 0x45, 0x46, };
2663943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_clk_rx_pins[] = { 0x42, 0x43, };
2664943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_sysclk_tx_pins[] = { 0x48, };
2665943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s1_sysclk_rx_pins[] = { 0x41, };
2666943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx0_pins[] = { 0x0a, };
2667943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx1_pins[] = { 0x0b, };
2668943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx2_pins[] = { 0x0c, };
2669943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_data_rx3_pins[] = { 0x0d, };
2670943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_clk_rx_pins[] = { 0x11, 0x09, };
2671943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s2_sysclk_rx_pins[] = { 0x07, };
2672943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx0_pins[] = { 0x03, };
2673943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx1_pins[] = { 0x04, };
2674943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx2_pins[] = { 0x05, };
2675943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_data_tx3_pins[] = { 0x06, };
2676943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_clk_tx_pins[] = { 0x10, 0x02, };
2677943e0da1S周琰杰 (Zhou Yanjie) static int x2000_i2s3_sysclk_tx_pins[] = { 0x00, };
267828c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if0_pins[] = { 0x54, 0x55, };
267928c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if1_pins[] = { 0x56, };
268028c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if2_pins[] = { 0x57, };
268128c1caafS周琰杰 (Zhou Yanjie) static int x2000_dmic_if3_pins[] = { 0x58, };
2682943e0da1S周琰杰 (Zhou Yanjie) static int x2000_cim_8bit_pins[] = {
2683943e0da1S周琰杰 (Zhou Yanjie) 	0x0e, 0x0c, 0x0d, 0x4f,
2684943e0da1S周琰杰 (Zhou Yanjie) 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2685943e0da1S周琰杰 (Zhou Yanjie) };
2686943e0da1S周琰杰 (Zhou Yanjie) static int x2000_cim_12bit_pins[] = { 0x08, 0x09, 0x0a, 0x0b, };
2687943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_8bit_pins[] = {
2688943e0da1S周琰杰 (Zhou Yanjie) 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2689943e0da1S周琰杰 (Zhou Yanjie) 	0x38, 0x3a, 0x39, 0x3b,
2690943e0da1S周琰杰 (Zhou Yanjie) };
2691943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_16bit_pins[] = {
2692943e0da1S周琰杰 (Zhou Yanjie) 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
2693943e0da1S周琰杰 (Zhou Yanjie) };
2694943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_18bit_pins[] = {
2695943e0da1S周琰杰 (Zhou Yanjie) 	0x30, 0x31,
2696943e0da1S周琰杰 (Zhou Yanjie) };
2697943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_tft_24bit_pins[] = {
2698943e0da1S周琰杰 (Zhou Yanjie) 	0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
2699943e0da1S周琰杰 (Zhou Yanjie) };
2700943e0da1S周琰杰 (Zhou Yanjie) static int x2000_lcd_slcd_8bit_pins[] = {
2701943e0da1S周琰杰 (Zhou Yanjie) 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2702943e0da1S周琰杰 (Zhou Yanjie) 	0x3a, 0x38, 0x3b, 0x30, 0x39,
2703943e0da1S周琰杰 (Zhou Yanjie) };
2704943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm0_c_pins[] = { 0x40, };
2705943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm0_d_pins[] = { 0x7e, };
2706943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm1_c_pins[] = { 0x41, };
2707943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm1_d_pins[] = { 0x7f, };
2708943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm2_c_pins[] = { 0x42, };
2709943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm2_e_pins[] = { 0x80, };
2710943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm3_c_pins[] = { 0x43, };
2711943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm3_e_pins[] = { 0x81, };
2712943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm4_c_pins[] = { 0x44, };
2713943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm4_e_pins[] = { 0x82, };
2714943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm5_c_pins[] = { 0x45, };
2715943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm5_e_pins[] = { 0x83, };
2716943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm6_c_pins[] = { 0x46, };
2717943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm6_e_pins[] = { 0x84, };
2718943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm7_c_pins[] = { 0x47, };
2719943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm7_e_pins[] = { 0x85, };
2720943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm8_pins[] = { 0x48, };
2721943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm9_pins[] = { 0x49, };
2722943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm10_pins[] = { 0x4a, };
2723943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm11_pins[] = { 0x4b, };
2724943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm12_pins[] = { 0x4c, };
2725943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm13_pins[] = { 0x4d, };
2726943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm14_pins[] = { 0x4e, };
2727943e0da1S周琰杰 (Zhou Yanjie) static int x2000_pwm_pwm15_pins[] = { 0x4f, };
2728943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac0_rmii_pins[] = {
2729943e0da1S周琰杰 (Zhou Yanjie) 	0x4b, 0x47, 0x46, 0x4a, 0x43, 0x42, 0x4c, 0x4d, 0x4e, 0x41,
2730943e0da1S周琰杰 (Zhou Yanjie) };
2731943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac0_rgmii_pins[] = {
2732943e0da1S周琰杰 (Zhou Yanjie) 	0x4b, 0x49, 0x48, 0x47, 0x46, 0x4a, 0x45, 0x44, 0x43, 0x42,
2733943e0da1S周琰杰 (Zhou Yanjie) 	0x4c, 0x4d, 0x4f, 0x4e, 0x41,
2734943e0da1S周琰杰 (Zhou Yanjie) };
2735943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac1_rmii_pins[] = {
2736943e0da1S周琰杰 (Zhou Yanjie) 	0x32, 0x2d, 0x2c, 0x31, 0x29, 0x28, 0x33, 0x34, 0x35, 0x37,
2737943e0da1S周琰杰 (Zhou Yanjie) };
2738943e0da1S周琰杰 (Zhou Yanjie) static int x2000_mac1_rgmii_pins[] = {
2739943e0da1S周琰杰 (Zhou Yanjie) 	0x32, 0x2f, 0x2e, 0x2d, 0x2c, 0x31, 0x2b, 0x2a, 0x29, 0x28,
2740943e0da1S周琰杰 (Zhou Yanjie) 	0x33, 0x34, 0x36, 0x35, 0x37,
2741943e0da1S周琰杰 (Zhou Yanjie) };
2742943e0da1S周琰杰 (Zhou Yanjie) static int x2000_otg_pins[] = { 0x96, };
2743943e0da1S周琰杰 (Zhou Yanjie) 
2744943e0da1S周琰杰 (Zhou Yanjie) static u8 x2000_cim_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, };
2745943e0da1S周琰杰 (Zhou Yanjie) 
2746943e0da1S周琰杰 (Zhou Yanjie) static const struct group_desc x2000_groups[] = {
2747943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-data", x2000_uart0_data, 2),
2748943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-hwflow", x2000_uart0_hwflow, 2),
2749943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-data", x2000_uart1_data, 1),
2750943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-hwflow", x2000_uart1_hwflow, 1),
2751943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data", x2000_uart2_data, 0),
2752943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-data-c", x2000_uart3_data_c, 0),
2753943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-data-d", x2000_uart3_data_d, 1),
2754943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-hwflow-c", x2000_uart3_hwflow_c, 0),
2755943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-hwflow-d", x2000_uart3_hwflow_d, 1),
2756943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-data-a", x2000_uart4_data_a, 1),
2757943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-data-c", x2000_uart4_data_c, 3),
2758943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-hwflow-a", x2000_uart4_hwflow_a, 1),
2759943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-hwflow-c", x2000_uart4_hwflow_c, 3),
2760943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart5-data-a", x2000_uart5_data_a, 1),
2761943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart5-data-c", x2000_uart5_data_c, 3),
2762943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart6-data-a", x2000_uart6_data_a, 1),
2763943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart6-data-c", x2000_uart6_data_c, 3),
2764943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart7-data-a", x2000_uart7_data_a, 1),
2765943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart7-data-c", x2000_uart7_data_c, 3),
2766943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart8-data", x2000_uart8_data, 3),
2767943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart9-data", x2000_uart9_data, 3),
276828c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data-if0-d", x2000_sfc_data_if0_d, 1),
276928c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data-if0-e", x2000_sfc_data_if0_e, 0),
277028c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data-if1", x2000_sfc_data_if1, 1),
277128c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk-d", x2000_sfc_clk_d, 1),
277228c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk-e", x2000_sfc_clk_e, 0),
277328c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce-d", x2000_sfc_ce_d, 1),
277428c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce-e", x2000_sfc_ce_e, 0),
2775943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-b", x2000_ssi0_dt_b, 1),
2776943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-d", x2000_ssi0_dt_d, 1),
2777943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-b", x2000_ssi0_dr_b, 1),
2778943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-d", x2000_ssi0_dr_d, 1),
2779943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-b", x2000_ssi0_clk_b, 1),
2780943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-d", x2000_ssi0_clk_d, 1),
278128c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce-b", x2000_ssi0_ce_b, 1),
278228c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce-d", x2000_ssi0_ce_d, 1),
2783943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-c", x2000_ssi1_dt_c, 2),
2784943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-d", x2000_ssi1_dt_d, 2),
2785943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-e", x2000_ssi1_dt_e, 1),
2786943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-c", x2000_ssi1_dr_c, 2),
2787943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-d", x2000_ssi1_dr_d, 2),
2788943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-e", x2000_ssi1_dr_e, 1),
2789943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-c", x2000_ssi1_clk_c, 2),
2790943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-d", x2000_ssi1_clk_d, 2),
2791943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-e", x2000_ssi1_clk_e, 1),
279228c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce-c", x2000_ssi1_ce_c, 2),
279328c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce-d", x2000_ssi1_ce_d, 2),
279428c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce-e", x2000_ssi1_ce_e, 1),
2795943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-1bit", x2000_mmc0_1bit, 0),
2796943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-4bit", x2000_mmc0_4bit, 0),
2797943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-8bit", x2000_mmc0_8bit, 0),
2798943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-1bit", x2000_mmc1_1bit, 0),
2799943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-4bit", x2000_mmc1_4bit, 0),
2800943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-1bit", x2000_mmc2_1bit, 0),
2801943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-4bit", x2000_mmc2_4bit, 0),
2802943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-8bit-data", x2000_emc_8bit_data, 0),
2803943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-16bit-data", x2000_emc_16bit_data, 0),
2804943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-addr", x2000_emc_addr, 0),
2805943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-rd-we", x2000_emc_rd_we, 0),
2806943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-wait", x2000_emc_wait, 0),
2807943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-cs1", x2000_emc_cs1, 3),
2808943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-cs2", x2000_emc_cs2, 3),
2809943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c0-data", x2000_i2c0, 3),
2810943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c1-data-c", x2000_i2c1_c, 2),
2811943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c1-data-d", x2000_i2c1_d, 1),
2812943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data-b", x2000_i2c2_b, 2),
2813943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data-d", x2000_i2c2_d, 2),
2814943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data-e", x2000_i2c2_e, 1),
2815943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c3-data-a", x2000_i2c3_a, 0),
2816943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c3-data-d", x2000_i2c3_d, 1),
2817943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c4-data-c", x2000_i2c4_c, 1),
2818943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c4-data-d", x2000_i2c4_d, 2),
2819943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c5-data-c", x2000_i2c5_c, 1),
2820943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c5-data-d", x2000_i2c5_d, 1),
2821943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-data-tx", x2000_i2s1_data_tx, 2),
2822943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-data-rx", x2000_i2s1_data_rx, 2),
2823943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-clk-tx", x2000_i2s1_clk_tx, 2),
2824943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-clk-rx", x2000_i2s1_clk_rx, 2),
2825943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-sysclk-tx", x2000_i2s1_sysclk_tx, 2),
2826943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-sysclk-rx", x2000_i2s1_sysclk_rx, 2),
2827943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx0", x2000_i2s2_data_rx0, 2),
2828943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx1", x2000_i2s2_data_rx1, 2),
2829943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx2", x2000_i2s2_data_rx2, 2),
2830943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx3", x2000_i2s2_data_rx3, 2),
2831943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-clk-rx", x2000_i2s2_clk_rx, 2),
2832943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-sysclk-rx", x2000_i2s2_sysclk_rx, 2),
2833943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx0", x2000_i2s3_data_tx0, 2),
2834943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx1", x2000_i2s3_data_tx1, 2),
2835943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx2", x2000_i2s3_data_tx2, 2),
2836943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx3", x2000_i2s3_data_tx3, 2),
2837943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-clk-tx", x2000_i2s3_clk_tx, 2),
2838943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-sysclk-tx", x2000_i2s3_sysclk_tx, 2),
283928c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if0", x2000_dmic_if0, 0),
284028c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if1", x2000_dmic_if1, 0),
284128c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if2", x2000_dmic_if2, 0),
284228c1caafS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if3", x2000_dmic_if3, 0),
2843943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("cim-data-8bit", x2000_cim_8bit,
2844943e0da1S周琰杰 (Zhou Yanjie) 				x2000_cim_8bit_funcs),
2845943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("cim-data-12bit", x2000_cim_12bit, 0),
2846943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-8bit", x2000_lcd_tft_8bit, 1),
2847943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-16bit", x2000_lcd_tft_16bit, 1),
2848943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-18bit", x2000_lcd_tft_18bit, 1),
2849943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-24bit", x2000_lcd_tft_24bit, 1),
2850943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-slcd-8bit", x2000_lcd_slcd_8bit, 2),
2851943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-slcd-16bit", x2000_lcd_tft_16bit, 2),
2852943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0-c", x2000_pwm_pwm0_c, 0),
2853943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0-d", x2000_pwm_pwm0_d, 2),
2854943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1-c", x2000_pwm_pwm1_c, 0),
2855943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1-d", x2000_pwm_pwm1_d, 2),
2856943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2-c", x2000_pwm_pwm2_c, 0),
2857943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2-e", x2000_pwm_pwm2_e, 1),
2858943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3-c", x2000_pwm_pwm3_c, 0),
2859943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3-e", x2000_pwm_pwm3_e, 1),
2860943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm4-c", x2000_pwm_pwm4_c, 0),
2861943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm4-e", x2000_pwm_pwm4_e, 1),
2862943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm5-c", x2000_pwm_pwm5_c, 0),
2863943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm5-e", x2000_pwm_pwm5_e, 1),
2864943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm6-c", x2000_pwm_pwm6_c, 0),
2865943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm6-e", x2000_pwm_pwm6_e, 1),
2866943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm7-c", x2000_pwm_pwm7_c, 0),
2867943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm7-e", x2000_pwm_pwm7_e, 1),
2868943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm8", x2000_pwm_pwm8, 0),
2869943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm9", x2000_pwm_pwm9, 0),
2870943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm10", x2000_pwm_pwm10, 0),
2871943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm11", x2000_pwm_pwm11, 0),
2872943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm12", x2000_pwm_pwm12, 0),
2873943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm13", x2000_pwm_pwm13, 0),
2874943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm14", x2000_pwm_pwm14, 0),
2875943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm15", x2000_pwm_pwm15, 0),
2876943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mac0-rmii", x2000_mac0_rmii, 1),
2877943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mac0-rgmii", x2000_mac0_rgmii, 1),
2878943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mac1-rmii", x2000_mac1_rmii, 3),
2879943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mac1-rgmii", x2000_mac1_rgmii, 3),
2880943e0da1S周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("otg-vbus", x2000_otg, 0),
2881943e0da1S周琰杰 (Zhou Yanjie) };
2882943e0da1S周琰杰 (Zhou Yanjie) 
2883943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
2884943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
2885943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart2_groups[] = { "uart2-data", };
2886943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart3_groups[] = {
2887943e0da1S周琰杰 (Zhou Yanjie) 	"uart3-data-c", "uart3-data-d", "uart3-hwflow-c", "uart3-hwflow-d",
2888943e0da1S周琰杰 (Zhou Yanjie) };
2889943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart4_groups[] = {
2890943e0da1S周琰杰 (Zhou Yanjie) 	"uart4-data-a", "uart4-data-c", "uart4-hwflow-a", "uart4-hwflow-c",
2891943e0da1S周琰杰 (Zhou Yanjie) };
2892943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart5_groups[] = { "uart5-data-a", "uart5-data-c", };
2893943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart6_groups[] = { "uart6-data-a", "uart6-data-c", };
2894943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart7_groups[] = { "uart7-data-a", "uart7-data-c", };
2895943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart8_groups[] = { "uart8-data", };
2896943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_uart9_groups[] = { "uart9-data", };
289728c1caafS周琰杰 (Zhou Yanjie) static const char *x2000_sfc_groups[] = {
289828c1caafS周琰杰 (Zhou Yanjie) 	"sfc-data-if0-d", "sfc-data-if0-e", "sfc-data-if1",
289928c1caafS周琰杰 (Zhou Yanjie) 	"sfc-clk-d", "sfc-clk-e", "sfc-ce-d", "sfc-ce-e",
290028c1caafS周琰杰 (Zhou Yanjie) };
2901943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_ssi0_groups[] = {
2902943e0da1S周琰杰 (Zhou Yanjie) 	"ssi0-dt-b", "ssi0-dt-d",
2903943e0da1S周琰杰 (Zhou Yanjie) 	"ssi0-dr-b", "ssi0-dr-d",
2904943e0da1S周琰杰 (Zhou Yanjie) 	"ssi0-clk-b", "ssi0-clk-d",
290528c1caafS周琰杰 (Zhou Yanjie) 	"ssi0-ce-b", "ssi0-ce-d",
2906943e0da1S周琰杰 (Zhou Yanjie) };
2907943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_ssi1_groups[] = {
2908943e0da1S周琰杰 (Zhou Yanjie) 	"ssi1-dt-c", "ssi1-dt-d", "ssi1-dt-e",
2909943e0da1S周琰杰 (Zhou Yanjie) 	"ssi1-dr-c", "ssi1-dr-d", "ssi1-dr-e",
2910943e0da1S周琰杰 (Zhou Yanjie) 	"ssi1-clk-c", "ssi1-clk-d", "ssi1-clk-e",
291128c1caafS周琰杰 (Zhou Yanjie) 	"ssi1-ce-c", "ssi1-ce-d", "ssi1-ce-e",
2912943e0da1S周琰杰 (Zhou Yanjie) };
2913943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", "mmc0-8bit", };
2914943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
2915943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mmc2_groups[] = { "mmc2-1bit", "mmc2-4bit", };
2916943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_emc_groups[] = {
2917943e0da1S周琰杰 (Zhou Yanjie) 	"emc-8bit-data", "emc-16bit-data",
2918943e0da1S周琰杰 (Zhou Yanjie) 	"emc-addr", "emc-rd-we", "emc-wait",
2919943e0da1S周琰杰 (Zhou Yanjie) };
2920943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_cs1_groups[] = { "emc-cs1", };
2921943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_cs2_groups[] = { "emc-cs2", };
2922943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c0_groups[] = { "i2c0-data", };
2923943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c1_groups[] = { "i2c1-data-c", "i2c1-data-d", };
2924943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c2_groups[] = { "i2c2-data-b", "i2c2-data-d", };
2925943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c3_groups[] = { "i2c3-data-a", "i2c3-data-d", };
2926943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c4_groups[] = { "i2c4-data-c", "i2c4-data-d", };
2927943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2c5_groups[] = { "i2c5-data-c", "i2c5-data-d", };
2928943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2s1_groups[] = {
2929943e0da1S周琰杰 (Zhou Yanjie) 	"i2s1-data-tx", "i2s1-data-rx",
2930943e0da1S周琰杰 (Zhou Yanjie) 	"i2s1-clk-tx", "i2s1-clk-rx",
2931943e0da1S周琰杰 (Zhou Yanjie) 	"i2s1-sysclk-tx", "i2s1-sysclk-rx",
2932943e0da1S周琰杰 (Zhou Yanjie) };
2933943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2s2_groups[] = {
2934943e0da1S周琰杰 (Zhou Yanjie) 	"i2s2-data-rx0", "i2s2-data-rx1", "i2s2-data-rx2", "i2s2-data-rx3",
2935943e0da1S周琰杰 (Zhou Yanjie) 	"i2s2-clk-rx", "i2s2-sysclk-rx",
2936943e0da1S周琰杰 (Zhou Yanjie) };
2937943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_i2s3_groups[] = {
2938943e0da1S周琰杰 (Zhou Yanjie) 	"i2s3-data-tx0", "i2s3-data-tx1", "i2s3-data-tx2", "i2s3-data-tx3",
2939943e0da1S周琰杰 (Zhou Yanjie) 	"i2s3-clk-tx", "i2s3-sysclk-tx",
2940943e0da1S周琰杰 (Zhou Yanjie) };
294128c1caafS周琰杰 (Zhou Yanjie) static const char *x2000_dmic_groups[] = {
294228c1caafS周琰杰 (Zhou Yanjie) 	"dmic-if0", "dmic-if1", "dmic-if2", "dmic-if3",
294328c1caafS周琰杰 (Zhou Yanjie) };
2944943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
2945943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_lcd_groups[] = {
2946943e0da1S周琰杰 (Zhou Yanjie) 	"lcd-tft-8bit", "lcd-tft-16bit", "lcd-tft-18bit", "lcd-tft-24bit",
2947943e0da1S周琰杰 (Zhou Yanjie) 	"lcd-slcd-8bit", "lcd-slcd-16bit",
2948943e0da1S周琰杰 (Zhou Yanjie) };
2949943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm0_groups[] = { "pwm0-c", "pwm0-d", };
2950943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm1_groups[] = { "pwm1-c", "pwm1-d", };
2951943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm2_groups[] = { "pwm2-c", "pwm2-e", };
2952943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm3_groups[] = { "pwm3-c", "pwm3-r", };
2953943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm4_groups[] = { "pwm4-c", "pwm4-e", };
2954943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm5_groups[] = { "pwm5-c", "pwm5-e", };
2955943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm6_groups[] = { "pwm6-c", "pwm6-e", };
2956943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm7_groups[] = { "pwm7-c", "pwm7-e", };
2957943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm8_groups[] = { "pwm8", };
2958943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm9_groups[] = { "pwm9", };
2959943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm10_groups[] = { "pwm10", };
2960943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm11_groups[] = { "pwm11", };
2961943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm12_groups[] = { "pwm12", };
2962943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm13_groups[] = { "pwm13", };
2963943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm14_groups[] = { "pwm14", };
2964943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_pwm15_groups[] = { "pwm15", };
2965943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mac0_groups[] = { "mac0-rmii", "mac0-rgmii", };
2966943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_mac1_groups[] = { "mac1-rmii", "mac1-rgmii", };
2967943e0da1S周琰杰 (Zhou Yanjie) static const char *x2000_otg_groups[] = { "otg-vbus", };
2968943e0da1S周琰杰 (Zhou Yanjie) 
2969943e0da1S周琰杰 (Zhou Yanjie) static const struct function_desc x2000_functions[] = {
2970943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart0", x2000_uart0_groups, ARRAY_SIZE(x2000_uart0_groups), },
2971943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart1", x2000_uart1_groups, ARRAY_SIZE(x2000_uart1_groups), },
2972943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart2", x2000_uart2_groups, ARRAY_SIZE(x2000_uart2_groups), },
2973943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart3", x2000_uart3_groups, ARRAY_SIZE(x2000_uart3_groups), },
2974943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart4", x2000_uart4_groups, ARRAY_SIZE(x2000_uart4_groups), },
2975943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart5", x2000_uart5_groups, ARRAY_SIZE(x2000_uart5_groups), },
2976943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart6", x2000_uart6_groups, ARRAY_SIZE(x2000_uart6_groups), },
2977943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart7", x2000_uart7_groups, ARRAY_SIZE(x2000_uart7_groups), },
2978943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart8", x2000_uart8_groups, ARRAY_SIZE(x2000_uart8_groups), },
2979943e0da1S周琰杰 (Zhou Yanjie) 	{ "uart9", x2000_uart9_groups, ARRAY_SIZE(x2000_uart9_groups), },
2980943e0da1S周琰杰 (Zhou Yanjie) 	{ "sfc", x2000_sfc_groups, ARRAY_SIZE(x2000_sfc_groups), },
2981943e0da1S周琰杰 (Zhou Yanjie) 	{ "ssi0", x2000_ssi0_groups, ARRAY_SIZE(x2000_ssi0_groups), },
2982943e0da1S周琰杰 (Zhou Yanjie) 	{ "ssi1", x2000_ssi1_groups, ARRAY_SIZE(x2000_ssi1_groups), },
2983943e0da1S周琰杰 (Zhou Yanjie) 	{ "mmc0", x2000_mmc0_groups, ARRAY_SIZE(x2000_mmc0_groups), },
2984943e0da1S周琰杰 (Zhou Yanjie) 	{ "mmc1", x2000_mmc1_groups, ARRAY_SIZE(x2000_mmc1_groups), },
2985943e0da1S周琰杰 (Zhou Yanjie) 	{ "mmc2", x2000_mmc2_groups, ARRAY_SIZE(x2000_mmc2_groups), },
2986943e0da1S周琰杰 (Zhou Yanjie) 	{ "emc", x2000_emc_groups, ARRAY_SIZE(x2000_emc_groups), },
2987943e0da1S周琰杰 (Zhou Yanjie) 	{ "emc-cs1", x2000_cs1_groups, ARRAY_SIZE(x2000_cs1_groups), },
2988943e0da1S周琰杰 (Zhou Yanjie) 	{ "emc-cs2", x2000_cs2_groups, ARRAY_SIZE(x2000_cs2_groups), },
2989943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2c0", x2000_i2c0_groups, ARRAY_SIZE(x2000_i2c0_groups), },
2990943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2c1", x2000_i2c1_groups, ARRAY_SIZE(x2000_i2c1_groups), },
2991943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2c2", x2000_i2c2_groups, ARRAY_SIZE(x2000_i2c2_groups), },
2992943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2c3", x2000_i2c3_groups, ARRAY_SIZE(x2000_i2c3_groups), },
2993943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2c4", x2000_i2c4_groups, ARRAY_SIZE(x2000_i2c4_groups), },
2994943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2c5", x2000_i2c5_groups, ARRAY_SIZE(x2000_i2c5_groups), },
2995943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2s1", x2000_i2s1_groups, ARRAY_SIZE(x2000_i2s1_groups), },
2996943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2s2", x2000_i2s2_groups, ARRAY_SIZE(x2000_i2s2_groups), },
2997943e0da1S周琰杰 (Zhou Yanjie) 	{ "i2s3", x2000_i2s3_groups, ARRAY_SIZE(x2000_i2s3_groups), },
2998943e0da1S周琰杰 (Zhou Yanjie) 	{ "dmic", x2000_dmic_groups, ARRAY_SIZE(x2000_dmic_groups), },
2999943e0da1S周琰杰 (Zhou Yanjie) 	{ "cim", x2000_cim_groups, ARRAY_SIZE(x2000_cim_groups), },
3000943e0da1S周琰杰 (Zhou Yanjie) 	{ "lcd", x2000_lcd_groups, ARRAY_SIZE(x2000_lcd_groups), },
3001943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm0", x2000_pwm0_groups, ARRAY_SIZE(x2000_pwm0_groups), },
3002943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm1", x2000_pwm1_groups, ARRAY_SIZE(x2000_pwm1_groups), },
3003943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm2", x2000_pwm2_groups, ARRAY_SIZE(x2000_pwm2_groups), },
3004943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm3", x2000_pwm3_groups, ARRAY_SIZE(x2000_pwm3_groups), },
3005943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm4", x2000_pwm4_groups, ARRAY_SIZE(x2000_pwm4_groups), },
3006943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm5", x2000_pwm5_groups, ARRAY_SIZE(x2000_pwm5_groups), },
3007943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm6", x2000_pwm6_groups, ARRAY_SIZE(x2000_pwm6_groups), },
3008943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm7", x2000_pwm7_groups, ARRAY_SIZE(x2000_pwm7_groups), },
3009943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm8", x2000_pwm8_groups, ARRAY_SIZE(x2000_pwm8_groups), },
3010943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm9", x2000_pwm9_groups, ARRAY_SIZE(x2000_pwm9_groups), },
3011943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm10", x2000_pwm10_groups, ARRAY_SIZE(x2000_pwm10_groups), },
3012943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm11", x2000_pwm11_groups, ARRAY_SIZE(x2000_pwm11_groups), },
3013943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm12", x2000_pwm12_groups, ARRAY_SIZE(x2000_pwm12_groups), },
3014943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm13", x2000_pwm13_groups, ARRAY_SIZE(x2000_pwm13_groups), },
3015943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm14", x2000_pwm14_groups, ARRAY_SIZE(x2000_pwm14_groups), },
3016943e0da1S周琰杰 (Zhou Yanjie) 	{ "pwm15", x2000_pwm15_groups, ARRAY_SIZE(x2000_pwm15_groups), },
3017943e0da1S周琰杰 (Zhou Yanjie) 	{ "mac0", x2000_mac0_groups, ARRAY_SIZE(x2000_mac0_groups), },
3018943e0da1S周琰杰 (Zhou Yanjie) 	{ "mac1", x2000_mac1_groups, ARRAY_SIZE(x2000_mac1_groups), },
3019943e0da1S周琰杰 (Zhou Yanjie) 	{ "otg", x2000_otg_groups, ARRAY_SIZE(x2000_otg_groups), },
3020943e0da1S周琰杰 (Zhou Yanjie) };
3021943e0da1S周琰杰 (Zhou Yanjie) 
30229279c00fSAidan MacDonald static const struct regmap_range x2000_access_ranges[] = {
30239279c00fSAidan MacDonald 	regmap_reg_range(0x000, 0x500 - 4),
30249279c00fSAidan MacDonald 	regmap_reg_range(0x700, 0x800 - 4),
30259279c00fSAidan MacDonald };
30269279c00fSAidan MacDonald 
30279279c00fSAidan MacDonald /* shared with X2100 */
30289279c00fSAidan MacDonald static const struct regmap_access_table x2000_access_table = {
30299279c00fSAidan MacDonald 	.yes_ranges = x2000_access_ranges,
30309279c00fSAidan MacDonald 	.n_yes_ranges = ARRAY_SIZE(x2000_access_ranges),
30319279c00fSAidan MacDonald };
30329279c00fSAidan MacDonald 
3033943e0da1S周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x2000_chip_info = {
3034943e0da1S周琰杰 (Zhou Yanjie) 	.num_chips = 5,
3035943e0da1S周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
3036943e0da1S周琰杰 (Zhou Yanjie) 	.version = ID_X2000,
3037943e0da1S周琰杰 (Zhou Yanjie) 	.groups = x2000_groups,
3038943e0da1S周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(x2000_groups),
3039943e0da1S周琰杰 (Zhou Yanjie) 	.functions = x2000_functions,
3040943e0da1S周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(x2000_functions),
3041943e0da1S周琰杰 (Zhou Yanjie) 	.pull_ups = x2000_pull_ups,
3042943e0da1S周琰杰 (Zhou Yanjie) 	.pull_downs = x2000_pull_downs,
30439279c00fSAidan MacDonald 	.access_table = &x2000_access_table,
3044943e0da1S周琰杰 (Zhou Yanjie) };
3045943e0da1S周琰杰 (Zhou Yanjie) 
30462a18211bS周琰杰 (Zhou Yanjie) static const u32 x2100_pull_ups[5] = {
30472a18211bS周琰杰 (Zhou Yanjie) 	0x0003ffff, 0xffffffff, 0x1ff0ffff, 0xc7fe3f3f, 0x0fbf003f,
30482a18211bS周琰杰 (Zhou Yanjie) };
30492a18211bS周琰杰 (Zhou Yanjie) 
30502a18211bS周琰杰 (Zhou Yanjie) static const u32 x2100_pull_downs[5] = {
30512a18211bS周琰杰 (Zhou Yanjie) 	0x0003ffff, 0xffffffff, 0x1ff0ffff, 0x00000000, 0x0fbf003f,
30522a18211bS周琰杰 (Zhou Yanjie) };
30532a18211bS周琰杰 (Zhou Yanjie) 
30542a18211bS周琰杰 (Zhou Yanjie) static int x2100_mac_pins[] = {
30552a18211bS周琰杰 (Zhou Yanjie) 	0x4b, 0x47, 0x46, 0x4a, 0x43, 0x42, 0x4c, 0x4d, 0x4f, 0x41,
30562a18211bS周琰杰 (Zhou Yanjie) };
30572a18211bS周琰杰 (Zhou Yanjie) 
30582a18211bS周琰杰 (Zhou Yanjie) static const struct group_desc x2100_groups[] = {
30592a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-data", x2000_uart0_data, 2),
30602a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart0-hwflow", x2000_uart0_hwflow, 2),
30612a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-data", x2000_uart1_data, 1),
30622a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart1-hwflow", x2000_uart1_hwflow, 1),
30632a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart2-data", x2000_uart2_data, 0),
30642a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-data-c", x2000_uart3_data_c, 0),
30652a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-data-d", x2000_uart3_data_d, 1),
30662a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-hwflow-c", x2000_uart3_hwflow_c, 0),
30672a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart3-hwflow-d", x2000_uart3_hwflow_d, 1),
30682a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-data-a", x2000_uart4_data_a, 1),
30692a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-data-c", x2000_uart4_data_c, 3),
30702a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-hwflow-a", x2000_uart4_hwflow_a, 1),
30712a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart4-hwflow-c", x2000_uart4_hwflow_c, 3),
30722a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart5-data-a", x2000_uart5_data_a, 1),
30732a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart5-data-c", x2000_uart5_data_c, 3),
30742a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart6-data-a", x2000_uart6_data_a, 1),
30752a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart6-data-c", x2000_uart6_data_c, 3),
30762a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart7-data-a", x2000_uart7_data_a, 1),
30772a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart7-data-c", x2000_uart7_data_c, 3),
30782a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart8-data", x2000_uart8_data, 3),
30792a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("uart9-data", x2000_uart9_data, 3),
30802a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data-if0-d", x2000_sfc_data_if0_d, 1),
30812a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data-if0-e", x2000_sfc_data_if0_e, 0),
30822a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-data-if1", x2000_sfc_data_if1, 1),
30832a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk-d", x2000_sfc_clk_d, 1),
30842a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-clk-e", x2000_sfc_clk_e, 0),
30852a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce-d", x2000_sfc_ce_d, 1),
30862a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("sfc-ce-e", x2000_sfc_ce_e, 0),
30872a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-b", x2000_ssi0_dt_b, 1),
30882a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dt-d", x2000_ssi0_dt_d, 1),
30892a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-b", x2000_ssi0_dr_b, 1),
30902a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-dr-d", x2000_ssi0_dr_d, 1),
30912a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-b", x2000_ssi0_clk_b, 1),
30922a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-clk-d", x2000_ssi0_clk_d, 1),
30932a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce-b", x2000_ssi0_ce_b, 1),
30942a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi0-ce-d", x2000_ssi0_ce_d, 1),
30952a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-c", x2000_ssi1_dt_c, 2),
30962a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-d", x2000_ssi1_dt_d, 2),
30972a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dt-e", x2000_ssi1_dt_e, 1),
30982a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-c", x2000_ssi1_dr_c, 2),
30992a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-d", x2000_ssi1_dr_d, 2),
31002a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-dr-e", x2000_ssi1_dr_e, 1),
31012a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-c", x2000_ssi1_clk_c, 2),
31022a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-d", x2000_ssi1_clk_d, 2),
31032a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-clk-e", x2000_ssi1_clk_e, 1),
31042a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce-c", x2000_ssi1_ce_c, 2),
31052a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce-d", x2000_ssi1_ce_d, 2),
31062a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("ssi1-ce-e", x2000_ssi1_ce_e, 1),
31072a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-1bit", x2000_mmc0_1bit, 0),
31082a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-4bit", x2000_mmc0_4bit, 0),
31092a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc0-8bit", x2000_mmc0_8bit, 0),
31102a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-1bit", x2000_mmc1_1bit, 0),
31112a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc1-4bit", x2000_mmc1_4bit, 0),
31122a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-1bit", x2000_mmc2_1bit, 0),
31132a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mmc2-4bit", x2000_mmc2_4bit, 0),
31142a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-8bit-data", x2000_emc_8bit_data, 0),
31152a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-16bit-data", x2000_emc_16bit_data, 0),
31162a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-addr", x2000_emc_addr, 0),
31172a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-rd-we", x2000_emc_rd_we, 0),
31182a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-wait", x2000_emc_wait, 0),
31192a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-cs1", x2000_emc_cs1, 3),
31202a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("emc-cs2", x2000_emc_cs2, 3),
31212a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c0-data", x2000_i2c0, 3),
31222a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c1-data-c", x2000_i2c1_c, 2),
31232a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c1-data-d", x2000_i2c1_d, 1),
31242a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data-b", x2000_i2c2_b, 2),
31252a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data-d", x2000_i2c2_d, 2),
31262a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c2-data-e", x2000_i2c2_e, 1),
31272a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c3-data-a", x2000_i2c3_a, 0),
31282a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c3-data-d", x2000_i2c3_d, 1),
31292a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c4-data-c", x2000_i2c4_c, 1),
31302a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c4-data-d", x2000_i2c4_d, 2),
31312a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c5-data-c", x2000_i2c5_c, 1),
31322a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2c5-data-d", x2000_i2c5_d, 1),
31332a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-data-tx", x2000_i2s1_data_tx, 2),
31342a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-data-rx", x2000_i2s1_data_rx, 2),
31352a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-clk-tx", x2000_i2s1_clk_tx, 2),
31362a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-clk-rx", x2000_i2s1_clk_rx, 2),
31372a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-sysclk-tx", x2000_i2s1_sysclk_tx, 2),
31382a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s1-sysclk-rx", x2000_i2s1_sysclk_rx, 2),
31392a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx0", x2000_i2s2_data_rx0, 2),
31402a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx1", x2000_i2s2_data_rx1, 2),
31412a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx2", x2000_i2s2_data_rx2, 2),
31422a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-data-rx3", x2000_i2s2_data_rx3, 2),
31432a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-clk-rx", x2000_i2s2_clk_rx, 2),
31442a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s2-sysclk-rx", x2000_i2s2_sysclk_rx, 2),
31452a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx0", x2000_i2s3_data_tx0, 2),
31462a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx1", x2000_i2s3_data_tx1, 2),
31472a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx2", x2000_i2s3_data_tx2, 2),
31482a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-data-tx3", x2000_i2s3_data_tx3, 2),
31492a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-clk-tx", x2000_i2s3_clk_tx, 2),
31502a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("i2s3-sysclk-tx", x2000_i2s3_sysclk_tx, 2),
31512a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if0", x2000_dmic_if0, 0),
31522a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if1", x2000_dmic_if1, 0),
31532a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if2", x2000_dmic_if2, 0),
31542a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("dmic-if3", x2000_dmic_if3, 0),
31552a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP_FUNCS("cim-data-8bit", x2000_cim_8bit,
31562a18211bS周琰杰 (Zhou Yanjie) 				x2000_cim_8bit_funcs),
31572a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("cim-data-12bit", x2000_cim_12bit, 0),
31582a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-8bit", x2000_lcd_tft_8bit, 1),
31592a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-16bit", x2000_lcd_tft_16bit, 1),
31602a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-18bit", x2000_lcd_tft_18bit, 1),
31612a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-tft-24bit", x2000_lcd_tft_24bit, 1),
31622a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-slcd-8bit", x2000_lcd_slcd_8bit, 2),
31632a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("lcd-slcd-16bit", x2000_lcd_tft_16bit, 2),
31642a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0-c", x2000_pwm_pwm0_c, 0),
31652a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm0-d", x2000_pwm_pwm0_d, 2),
31662a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1-c", x2000_pwm_pwm1_c, 0),
31672a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm1-d", x2000_pwm_pwm1_d, 2),
31682a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2-c", x2000_pwm_pwm2_c, 0),
31692a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm2-e", x2000_pwm_pwm2_e, 1),
31702a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3-c", x2000_pwm_pwm3_c, 0),
31712a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm3-e", x2000_pwm_pwm3_e, 1),
31722a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm4-c", x2000_pwm_pwm4_c, 0),
31732a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm4-e", x2000_pwm_pwm4_e, 1),
31742a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm5-c", x2000_pwm_pwm5_c, 0),
31752a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm5-e", x2000_pwm_pwm5_e, 1),
31762a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm6-c", x2000_pwm_pwm6_c, 0),
31772a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm6-e", x2000_pwm_pwm6_e, 1),
31782a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm7-c", x2000_pwm_pwm7_c, 0),
31792a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm7-e", x2000_pwm_pwm7_e, 1),
31802a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm8", x2000_pwm_pwm8, 0),
31812a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm9", x2000_pwm_pwm9, 0),
31822a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm10", x2000_pwm_pwm10, 0),
31832a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm11", x2000_pwm_pwm11, 0),
31842a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm12", x2000_pwm_pwm12, 0),
31852a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm13", x2000_pwm_pwm13, 0),
31862a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm14", x2000_pwm_pwm14, 0),
31872a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("pwm15", x2000_pwm_pwm15, 0),
31882a18211bS周琰杰 (Zhou Yanjie) 	INGENIC_PIN_GROUP("mac", x2100_mac, 1),
31892a18211bS周琰杰 (Zhou Yanjie) };
31902a18211bS周琰杰 (Zhou Yanjie) 
31912a18211bS周琰杰 (Zhou Yanjie) static const char *x2100_mac_groups[] = { "mac", };
31922a18211bS周琰杰 (Zhou Yanjie) 
31932a18211bS周琰杰 (Zhou Yanjie) static const struct function_desc x2100_functions[] = {
31942a18211bS周琰杰 (Zhou Yanjie) 	{ "uart0", x2000_uart0_groups, ARRAY_SIZE(x2000_uart0_groups), },
31952a18211bS周琰杰 (Zhou Yanjie) 	{ "uart1", x2000_uart1_groups, ARRAY_SIZE(x2000_uart1_groups), },
31962a18211bS周琰杰 (Zhou Yanjie) 	{ "uart2", x2000_uart2_groups, ARRAY_SIZE(x2000_uart2_groups), },
31972a18211bS周琰杰 (Zhou Yanjie) 	{ "uart3", x2000_uart3_groups, ARRAY_SIZE(x2000_uart3_groups), },
31982a18211bS周琰杰 (Zhou Yanjie) 	{ "uart4", x2000_uart4_groups, ARRAY_SIZE(x2000_uart4_groups), },
31992a18211bS周琰杰 (Zhou Yanjie) 	{ "uart5", x2000_uart5_groups, ARRAY_SIZE(x2000_uart5_groups), },
32002a18211bS周琰杰 (Zhou Yanjie) 	{ "uart6", x2000_uart6_groups, ARRAY_SIZE(x2000_uart6_groups), },
32012a18211bS周琰杰 (Zhou Yanjie) 	{ "uart7", x2000_uart7_groups, ARRAY_SIZE(x2000_uart7_groups), },
32022a18211bS周琰杰 (Zhou Yanjie) 	{ "uart8", x2000_uart8_groups, ARRAY_SIZE(x2000_uart8_groups), },
32032a18211bS周琰杰 (Zhou Yanjie) 	{ "uart9", x2000_uart9_groups, ARRAY_SIZE(x2000_uart9_groups), },
32042a18211bS周琰杰 (Zhou Yanjie) 	{ "sfc", x2000_sfc_groups, ARRAY_SIZE(x2000_sfc_groups), },
32052a18211bS周琰杰 (Zhou Yanjie) 	{ "ssi0", x2000_ssi0_groups, ARRAY_SIZE(x2000_ssi0_groups), },
32062a18211bS周琰杰 (Zhou Yanjie) 	{ "ssi1", x2000_ssi1_groups, ARRAY_SIZE(x2000_ssi1_groups), },
32072a18211bS周琰杰 (Zhou Yanjie) 	{ "mmc0", x2000_mmc0_groups, ARRAY_SIZE(x2000_mmc0_groups), },
32082a18211bS周琰杰 (Zhou Yanjie) 	{ "mmc1", x2000_mmc1_groups, ARRAY_SIZE(x2000_mmc1_groups), },
32092a18211bS周琰杰 (Zhou Yanjie) 	{ "mmc2", x2000_mmc2_groups, ARRAY_SIZE(x2000_mmc2_groups), },
32102a18211bS周琰杰 (Zhou Yanjie) 	{ "emc", x2000_emc_groups, ARRAY_SIZE(x2000_emc_groups), },
32112a18211bS周琰杰 (Zhou Yanjie) 	{ "emc-cs1", x2000_cs1_groups, ARRAY_SIZE(x2000_cs1_groups), },
32122a18211bS周琰杰 (Zhou Yanjie) 	{ "emc-cs2", x2000_cs2_groups, ARRAY_SIZE(x2000_cs2_groups), },
32132a18211bS周琰杰 (Zhou Yanjie) 	{ "i2c0", x2000_i2c0_groups, ARRAY_SIZE(x2000_i2c0_groups), },
32142a18211bS周琰杰 (Zhou Yanjie) 	{ "i2c1", x2000_i2c1_groups, ARRAY_SIZE(x2000_i2c1_groups), },
32152a18211bS周琰杰 (Zhou Yanjie) 	{ "i2c2", x2000_i2c2_groups, ARRAY_SIZE(x2000_i2c2_groups), },
32162a18211bS周琰杰 (Zhou Yanjie) 	{ "i2c3", x2000_i2c3_groups, ARRAY_SIZE(x2000_i2c3_groups), },
32172a18211bS周琰杰 (Zhou Yanjie) 	{ "i2c4", x2000_i2c4_groups, ARRAY_SIZE(x2000_i2c4_groups), },
32182a18211bS周琰杰 (Zhou Yanjie) 	{ "i2c5", x2000_i2c5_groups, ARRAY_SIZE(x2000_i2c5_groups), },
32192a18211bS周琰杰 (Zhou Yanjie) 	{ "i2s1", x2000_i2s1_groups, ARRAY_SIZE(x2000_i2s1_groups), },
32202a18211bS周琰杰 (Zhou Yanjie) 	{ "i2s2", x2000_i2s2_groups, ARRAY_SIZE(x2000_i2s2_groups), },
32212a18211bS周琰杰 (Zhou Yanjie) 	{ "i2s3", x2000_i2s3_groups, ARRAY_SIZE(x2000_i2s3_groups), },
32222a18211bS周琰杰 (Zhou Yanjie) 	{ "dmic", x2000_dmic_groups, ARRAY_SIZE(x2000_dmic_groups), },
32232a18211bS周琰杰 (Zhou Yanjie) 	{ "cim", x2000_cim_groups, ARRAY_SIZE(x2000_cim_groups), },
32242a18211bS周琰杰 (Zhou Yanjie) 	{ "lcd", x2000_lcd_groups, ARRAY_SIZE(x2000_lcd_groups), },
32252a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm0", x2000_pwm0_groups, ARRAY_SIZE(x2000_pwm0_groups), },
32262a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm1", x2000_pwm1_groups, ARRAY_SIZE(x2000_pwm1_groups), },
32272a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm2", x2000_pwm2_groups, ARRAY_SIZE(x2000_pwm2_groups), },
32282a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm3", x2000_pwm3_groups, ARRAY_SIZE(x2000_pwm3_groups), },
32292a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm4", x2000_pwm4_groups, ARRAY_SIZE(x2000_pwm4_groups), },
32302a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm5", x2000_pwm5_groups, ARRAY_SIZE(x2000_pwm5_groups), },
32312a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm6", x2000_pwm6_groups, ARRAY_SIZE(x2000_pwm6_groups), },
32322a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm7", x2000_pwm7_groups, ARRAY_SIZE(x2000_pwm7_groups), },
32332a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm8", x2000_pwm8_groups, ARRAY_SIZE(x2000_pwm8_groups), },
32342a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm9", x2000_pwm9_groups, ARRAY_SIZE(x2000_pwm9_groups), },
32352a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm10", x2000_pwm10_groups, ARRAY_SIZE(x2000_pwm10_groups), },
32362a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm11", x2000_pwm11_groups, ARRAY_SIZE(x2000_pwm11_groups), },
32372a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm12", x2000_pwm12_groups, ARRAY_SIZE(x2000_pwm12_groups), },
32382a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm13", x2000_pwm13_groups, ARRAY_SIZE(x2000_pwm13_groups), },
32392a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm14", x2000_pwm14_groups, ARRAY_SIZE(x2000_pwm14_groups), },
32402a18211bS周琰杰 (Zhou Yanjie) 	{ "pwm15", x2000_pwm15_groups, ARRAY_SIZE(x2000_pwm15_groups), },
32412a18211bS周琰杰 (Zhou Yanjie) 	{ "mac", x2100_mac_groups, ARRAY_SIZE(x2100_mac_groups), },
32422a18211bS周琰杰 (Zhou Yanjie) };
32432a18211bS周琰杰 (Zhou Yanjie) 
32442a18211bS周琰杰 (Zhou Yanjie) static const struct ingenic_chip_info x2100_chip_info = {
32452a18211bS周琰杰 (Zhou Yanjie) 	.num_chips = 5,
32462a18211bS周琰杰 (Zhou Yanjie) 	.reg_offset = 0x100,
32472a18211bS周琰杰 (Zhou Yanjie) 	.version = ID_X2100,
32482a18211bS周琰杰 (Zhou Yanjie) 	.groups = x2100_groups,
32492a18211bS周琰杰 (Zhou Yanjie) 	.num_groups = ARRAY_SIZE(x2100_groups),
32502a18211bS周琰杰 (Zhou Yanjie) 	.functions = x2100_functions,
32512a18211bS周琰杰 (Zhou Yanjie) 	.num_functions = ARRAY_SIZE(x2100_functions),
32522a18211bS周琰杰 (Zhou Yanjie) 	.pull_ups = x2100_pull_ups,
32532a18211bS周琰杰 (Zhou Yanjie) 	.pull_downs = x2100_pull_downs,
32549279c00fSAidan MacDonald 	.access_table = &x2000_access_table,
32552a18211bS周琰杰 (Zhou Yanjie) };
32562a18211bS周琰杰 (Zhou Yanjie) 
3257b71c1844SZhou Yanjie static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg)
3258e72394e2SPaul Cercueil {
3259e72394e2SPaul Cercueil 	unsigned int val;
3260e72394e2SPaul Cercueil 
3261e72394e2SPaul Cercueil 	regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val);
3262e72394e2SPaul Cercueil 
3263e72394e2SPaul Cercueil 	return (u32) val;
3264e72394e2SPaul Cercueil }
3265e72394e2SPaul Cercueil 
3266b71c1844SZhou Yanjie static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc,
3267e72394e2SPaul Cercueil 		u8 reg, u8 offset, bool set)
3268e72394e2SPaul Cercueil {
32698d2d607cSPaul Cercueil 	if (!is_soc_or_above(jzgc->jzpc, ID_JZ4740)) {
3270424f3969S周琰杰 (Zhou Yanjie) 		regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg,
3271424f3969S周琰杰 (Zhou Yanjie) 				BIT(offset), set ? BIT(offset) : 0);
3272424f3969S周琰杰 (Zhou Yanjie) 		return;
3273424f3969S周琰杰 (Zhou Yanjie) 	}
3274424f3969S周琰杰 (Zhou Yanjie) 
3275e72394e2SPaul Cercueil 	if (set)
3276e72394e2SPaul Cercueil 		reg = REG_SET(reg);
3277e72394e2SPaul Cercueil 	else
3278e72394e2SPaul Cercueil 		reg = REG_CLEAR(reg);
3279e72394e2SPaul Cercueil 
3280e72394e2SPaul Cercueil 	regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset));
3281e72394e2SPaul Cercueil }
3282e72394e2SPaul Cercueil 
3283fe1ad5eeSZhou Yanjie static void ingenic_gpio_shadow_set_bit(struct ingenic_gpio_chip *jzgc,
3284fe1ad5eeSZhou Yanjie 		u8 reg, u8 offset, bool set)
3285fe1ad5eeSZhou Yanjie {
3286fe1ad5eeSZhou Yanjie 	if (set)
3287fe1ad5eeSZhou Yanjie 		reg = REG_SET(reg);
3288fe1ad5eeSZhou Yanjie 	else
3289fe1ad5eeSZhou Yanjie 		reg = REG_CLEAR(reg);
3290fe1ad5eeSZhou Yanjie 
3291d7da2a1eS周琰杰 (Zhou Yanjie) 	regmap_write(jzgc->jzpc->map, REG_PZ_BASE(
3292d7da2a1eS周琰杰 (Zhou Yanjie) 			jzgc->jzpc->info->reg_offset) + reg, BIT(offset));
3293fe1ad5eeSZhou Yanjie }
3294fe1ad5eeSZhou Yanjie 
3295fe1ad5eeSZhou Yanjie static void ingenic_gpio_shadow_set_bit_load(struct ingenic_gpio_chip *jzgc)
3296fe1ad5eeSZhou Yanjie {
3297d7da2a1eS周琰杰 (Zhou Yanjie) 	regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD(
3298d7da2a1eS周琰杰 (Zhou Yanjie) 			jzgc->jzpc->info->reg_offset),
3299fe1ad5eeSZhou Yanjie 			jzgc->gc.base / PINS_PER_GPIO_CHIP);
3300fe1ad5eeSZhou Yanjie }
3301fe1ad5eeSZhou Yanjie 
3302424f3969S周琰杰 (Zhou Yanjie) static void jz4730_gpio_set_bits(struct ingenic_gpio_chip *jzgc,
3303424f3969S周琰杰 (Zhou Yanjie) 		u8 reg_upper, u8 reg_lower, u8 offset, u8 value)
3304424f3969S周琰杰 (Zhou Yanjie) {
3305424f3969S周琰杰 (Zhou Yanjie) 	/*
3306424f3969S周琰杰 (Zhou Yanjie) 	 * JZ4730 function and IRQ registers support two-bits-per-pin
3307424f3969S周琰杰 (Zhou Yanjie) 	 * definitions, split into two groups of 16.
3308424f3969S周琰杰 (Zhou Yanjie) 	 */
3309424f3969S周琰杰 (Zhou Yanjie) 	u8 reg = offset < JZ4730_PINS_PER_PAIRED_REG ? reg_lower : reg_upper;
3310424f3969S周琰杰 (Zhou Yanjie) 	unsigned int idx = offset % JZ4730_PINS_PER_PAIRED_REG;
3311424f3969S周琰杰 (Zhou Yanjie) 	unsigned int mask = GENMASK(1, 0) << idx * 2;
3312424f3969S周琰杰 (Zhou Yanjie) 
3313424f3969S周琰杰 (Zhou Yanjie) 	regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg, mask, value << (idx * 2));
3314424f3969S周琰杰 (Zhou Yanjie) }
3315424f3969S周琰杰 (Zhou Yanjie) 
3316e72394e2SPaul Cercueil static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,
3317e72394e2SPaul Cercueil 					  u8 offset)
3318e72394e2SPaul Cercueil {
3319b71c1844SZhou Yanjie 	unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN);
3320e72394e2SPaul Cercueil 
3321e72394e2SPaul Cercueil 	return !!(val & BIT(offset));
3322e72394e2SPaul Cercueil }
3323e72394e2SPaul Cercueil 
3324e72394e2SPaul Cercueil static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc,
3325e72394e2SPaul Cercueil 				   u8 offset, int value)
3326e72394e2SPaul Cercueil {
33278d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4770))
3328b4aa4876SPaul Cercueil 		ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_PAT0, offset, !!value);
33298d2d607cSPaul Cercueil 	else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3330b71c1844SZhou Yanjie 		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value);
3331424f3969S周琰杰 (Zhou Yanjie) 	else
3332424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_DATA, offset, !!value);
3333e72394e2SPaul Cercueil }
3334e72394e2SPaul Cercueil 
3335e72394e2SPaul Cercueil static void irq_set_type(struct ingenic_gpio_chip *jzgc,
3336e72394e2SPaul Cercueil 		u8 offset, unsigned int type)
3337e72394e2SPaul Cercueil {
3338e72394e2SPaul Cercueil 	u8 reg1, reg2;
3339943e0da1S周琰杰 (Zhou Yanjie) 	bool val1, val2, val3;
3340f831f93aSPaul Cercueil 
3341f831f93aSPaul Cercueil 	switch (type) {
3342943e0da1S周琰杰 (Zhou Yanjie) 	case IRQ_TYPE_EDGE_BOTH:
3343943e0da1S周琰杰 (Zhou Yanjie) 		val1 = val2 = false;
3344943e0da1S周琰杰 (Zhou Yanjie) 		val3 = true;
3345943e0da1S周琰杰 (Zhou Yanjie) 		break;
3346f831f93aSPaul Cercueil 	case IRQ_TYPE_EDGE_RISING:
3347f831f93aSPaul Cercueil 		val1 = val2 = true;
3348943e0da1S周琰杰 (Zhou Yanjie) 		val3 = false;
3349f831f93aSPaul Cercueil 		break;
3350f831f93aSPaul Cercueil 	case IRQ_TYPE_EDGE_FALLING:
3351943e0da1S周琰杰 (Zhou Yanjie) 		val1 = val3 = false;
3352f831f93aSPaul Cercueil 		val2 = true;
3353f831f93aSPaul Cercueil 		break;
3354f831f93aSPaul Cercueil 	case IRQ_TYPE_LEVEL_HIGH:
3355f831f93aSPaul Cercueil 		val1 = true;
3356943e0da1S周琰杰 (Zhou Yanjie) 		val2 = val3 = false;
3357f831f93aSPaul Cercueil 		break;
3358f831f93aSPaul Cercueil 	case IRQ_TYPE_LEVEL_LOW:
3359f831f93aSPaul Cercueil 	default:
3360943e0da1S周琰杰 (Zhou Yanjie) 		val1 = val2 = val3 = false;
3361f831f93aSPaul Cercueil 		break;
3362f831f93aSPaul Cercueil 	}
3363e72394e2SPaul Cercueil 
33648d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) {
3365b4aa4876SPaul Cercueil 		reg1 = JZ4770_GPIO_PAT1;
3366b4aa4876SPaul Cercueil 		reg2 = JZ4770_GPIO_PAT0;
33678d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) {
3368e72394e2SPaul Cercueil 		reg1 = JZ4740_GPIO_TRIG;
3369e72394e2SPaul Cercueil 		reg2 = JZ4740_GPIO_DIR;
3370424f3969S周琰杰 (Zhou Yanjie) 	} else {
3371424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPDIR, offset, false);
3372424f3969S周琰杰 (Zhou Yanjie) 		jz4730_gpio_set_bits(jzgc, JZ4730_GPIO_GPIDUR,
3373424f3969S周琰杰 (Zhou Yanjie) 				JZ4730_GPIO_GPIDLR, offset, (val2 << 1) | val1);
3374424f3969S周琰杰 (Zhou Yanjie) 		return;
3375e72394e2SPaul Cercueil 	}
3376e72394e2SPaul Cercueil 
33778d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_X2000)) {
3378943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1);
3379943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2);
3380943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_gpio_shadow_set_bit_load(jzgc);
3381943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, X2000_GPIO_EDG, offset, val3);
33828d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzgc->jzpc, ID_X1000)) {
3383f831f93aSPaul Cercueil 		ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1);
3384f831f93aSPaul Cercueil 		ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2);
3385fe1ad5eeSZhou Yanjie 		ingenic_gpio_shadow_set_bit_load(jzgc);
3386fe1ad5eeSZhou Yanjie 	} else {
3387f831f93aSPaul Cercueil 		ingenic_gpio_set_bit(jzgc, reg2, offset, val1);
3388f831f93aSPaul Cercueil 		ingenic_gpio_set_bit(jzgc, reg1, offset, val2);
3389e72394e2SPaul Cercueil 	}
3390e72394e2SPaul Cercueil }
3391e72394e2SPaul Cercueil 
3392e72394e2SPaul Cercueil static void ingenic_gpio_irq_mask(struct irq_data *irqd)
3393e72394e2SPaul Cercueil {
3394e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3395e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
33964c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(irqd);
3397e72394e2SPaul Cercueil 
33988d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3399424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, GPIO_MSK, irq, true);
3400424f3969S周琰杰 (Zhou Yanjie) 	else
3401424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIMR, irq, true);
3402e72394e2SPaul Cercueil }
3403e72394e2SPaul Cercueil 
3404e72394e2SPaul Cercueil static void ingenic_gpio_irq_unmask(struct irq_data *irqd)
3405e72394e2SPaul Cercueil {
3406e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3407e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
34084c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(irqd);
3409e72394e2SPaul Cercueil 
34108d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3411424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, GPIO_MSK, irq, false);
3412424f3969S周琰杰 (Zhou Yanjie) 	else
3413424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIMR, irq, false);
3414e72394e2SPaul Cercueil }
3415e72394e2SPaul Cercueil 
3416e72394e2SPaul Cercueil static void ingenic_gpio_irq_enable(struct irq_data *irqd)
3417e72394e2SPaul Cercueil {
3418e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3419e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
34204c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(irqd);
3421e72394e2SPaul Cercueil 
342271f5e7b3SAidan MacDonald 	gpiochip_enable_irq(gc, irq);
342371f5e7b3SAidan MacDonald 
34248d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4770))
3425b4aa4876SPaul Cercueil 		ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, true);
34268d2d607cSPaul Cercueil 	else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3427b71c1844SZhou Yanjie 		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true);
3428424f3969S周琰杰 (Zhou Yanjie) 	else
3429424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIER, irq, true);
3430e72394e2SPaul Cercueil 
3431e72394e2SPaul Cercueil 	ingenic_gpio_irq_unmask(irqd);
3432e72394e2SPaul Cercueil }
3433e72394e2SPaul Cercueil 
3434e72394e2SPaul Cercueil static void ingenic_gpio_irq_disable(struct irq_data *irqd)
3435e72394e2SPaul Cercueil {
3436e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3437e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
34384c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(irqd);
3439e72394e2SPaul Cercueil 
3440e72394e2SPaul Cercueil 	ingenic_gpio_irq_mask(irqd);
3441e72394e2SPaul Cercueil 
34428d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4770))
3443b4aa4876SPaul Cercueil 		ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_INT, irq, false);
34448d2d607cSPaul Cercueil 	else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3445b71c1844SZhou Yanjie 		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false);
3446424f3969S周琰杰 (Zhou Yanjie) 	else
3447424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPIER, irq, false);
344871f5e7b3SAidan MacDonald 
344971f5e7b3SAidan MacDonald 	gpiochip_disable_irq(gc, irq);
3450e72394e2SPaul Cercueil }
3451e72394e2SPaul Cercueil 
3452e72394e2SPaul Cercueil static void ingenic_gpio_irq_ack(struct irq_data *irqd)
3453e72394e2SPaul Cercueil {
3454e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3455e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
34564c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(irqd);
3457e72394e2SPaul Cercueil 	bool high;
3458e72394e2SPaul Cercueil 
3459943e0da1S周琰杰 (Zhou Yanjie) 	if ((irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) &&
34608d2d607cSPaul Cercueil 	    !is_soc_or_above(jzgc->jzpc, ID_X2000)) {
3461e72394e2SPaul Cercueil 		/*
3462e72394e2SPaul Cercueil 		 * Switch to an interrupt for the opposite edge to the one that
3463e72394e2SPaul Cercueil 		 * triggered the interrupt being ACKed.
3464e72394e2SPaul Cercueil 		 */
3465e72394e2SPaul Cercueil 		high = ingenic_gpio_get_value(jzgc, irq);
3466e72394e2SPaul Cercueil 		if (high)
34671c95348bSPaul Cercueil 			irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_LOW);
3468e72394e2SPaul Cercueil 		else
34691c95348bSPaul Cercueil 			irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_HIGH);
3470e72394e2SPaul Cercueil 	}
3471e72394e2SPaul Cercueil 
34728d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4770))
3473b4aa4876SPaul Cercueil 		ingenic_gpio_set_bit(jzgc, JZ4770_GPIO_FLAG, irq, false);
34748d2d607cSPaul Cercueil 	else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3475b71c1844SZhou Yanjie 		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true);
3476424f3969S周琰杰 (Zhou Yanjie) 	else
3477424f3969S周琰杰 (Zhou Yanjie) 		ingenic_gpio_set_bit(jzgc, JZ4730_GPIO_GPFR, irq, false);
3478e72394e2SPaul Cercueil }
3479e72394e2SPaul Cercueil 
3480e72394e2SPaul Cercueil static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
3481e72394e2SPaul Cercueil {
3482e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3483e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
34844c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(irqd);
3485e72394e2SPaul Cercueil 
3486e72394e2SPaul Cercueil 	switch (type) {
3487e72394e2SPaul Cercueil 	case IRQ_TYPE_EDGE_BOTH:
3488e72394e2SPaul Cercueil 	case IRQ_TYPE_EDGE_RISING:
3489e72394e2SPaul Cercueil 	case IRQ_TYPE_EDGE_FALLING:
3490e72394e2SPaul Cercueil 		irq_set_handler_locked(irqd, handle_edge_irq);
3491e72394e2SPaul Cercueil 		break;
3492e72394e2SPaul Cercueil 	case IRQ_TYPE_LEVEL_HIGH:
3493e72394e2SPaul Cercueil 	case IRQ_TYPE_LEVEL_LOW:
3494e72394e2SPaul Cercueil 		irq_set_handler_locked(irqd, handle_level_irq);
3495e72394e2SPaul Cercueil 		break;
3496e72394e2SPaul Cercueil 	default:
3497e72394e2SPaul Cercueil 		irq_set_handler_locked(irqd, handle_bad_irq);
3498e72394e2SPaul Cercueil 	}
3499e72394e2SPaul Cercueil 
35008d2d607cSPaul Cercueil 	if ((type == IRQ_TYPE_EDGE_BOTH) && !is_soc_or_above(jzgc->jzpc, ID_X2000)) {
3501e72394e2SPaul Cercueil 		/*
3502e72394e2SPaul Cercueil 		 * The hardware does not support interrupts on both edges. The
3503e72394e2SPaul Cercueil 		 * best we can do is to set up a single-edge interrupt and then
3504e72394e2SPaul Cercueil 		 * switch to the opposing edge when ACKing the interrupt.
3505e72394e2SPaul Cercueil 		 */
35064c76a7fcSAidan MacDonald 		bool high = ingenic_gpio_get_value(jzgc, irq);
3507e72394e2SPaul Cercueil 
35081c95348bSPaul Cercueil 		type = high ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH;
3509e72394e2SPaul Cercueil 	}
3510e72394e2SPaul Cercueil 
35114c76a7fcSAidan MacDonald 	irq_set_type(jzgc, irq, type);
3512e72394e2SPaul Cercueil 	return 0;
3513e72394e2SPaul Cercueil }
3514e72394e2SPaul Cercueil 
3515e72394e2SPaul Cercueil static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on)
3516e72394e2SPaul Cercueil {
3517e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
3518e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3519e72394e2SPaul Cercueil 
3520e72394e2SPaul Cercueil 	return irq_set_irq_wake(jzgc->irq, on);
3521e72394e2SPaul Cercueil }
3522e72394e2SPaul Cercueil 
3523e72394e2SPaul Cercueil static void ingenic_gpio_irq_handler(struct irq_desc *desc)
3524e72394e2SPaul Cercueil {
3525e72394e2SPaul Cercueil 	struct gpio_chip *gc = irq_desc_get_handler_data(desc);
3526e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3527e72394e2SPaul Cercueil 	struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data);
3528e72394e2SPaul Cercueil 	unsigned long flag, i;
3529e72394e2SPaul Cercueil 
3530e72394e2SPaul Cercueil 	chained_irq_enter(irq_chip, desc);
3531e72394e2SPaul Cercueil 
35328d2d607cSPaul Cercueil 	if (is_soc_or_above(jzgc->jzpc, ID_JZ4770))
3533b4aa4876SPaul Cercueil 		flag = ingenic_gpio_read_reg(jzgc, JZ4770_GPIO_FLAG);
35348d2d607cSPaul Cercueil 	else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740))
3535b71c1844SZhou Yanjie 		flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG);
3536424f3969S周琰杰 (Zhou Yanjie) 	else
3537424f3969S周琰杰 (Zhou Yanjie) 		flag = ingenic_gpio_read_reg(jzgc, JZ4730_GPIO_GPFR);
3538e72394e2SPaul Cercueil 
3539e72394e2SPaul Cercueil 	for_each_set_bit(i, &flag, 32)
3540a9cb09b7SMarc Zyngier 		generic_handle_domain_irq(gc->irq.domain, i);
3541e72394e2SPaul Cercueil 	chained_irq_exit(irq_chip, desc);
3542e72394e2SPaul Cercueil }
3543e72394e2SPaul Cercueil 
3544e72394e2SPaul Cercueil static void ingenic_gpio_set(struct gpio_chip *gc,
3545e72394e2SPaul Cercueil 		unsigned int offset, int value)
3546e72394e2SPaul Cercueil {
3547e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3548e72394e2SPaul Cercueil 
3549e72394e2SPaul Cercueil 	ingenic_gpio_set_value(jzgc, offset, value);
3550e72394e2SPaul Cercueil }
3551e72394e2SPaul Cercueil 
3552e72394e2SPaul Cercueil static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset)
3553e72394e2SPaul Cercueil {
3554e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3555e72394e2SPaul Cercueil 
3556e72394e2SPaul Cercueil 	return (int) ingenic_gpio_get_value(jzgc, offset);
3557e72394e2SPaul Cercueil }
3558e72394e2SPaul Cercueil 
3559e72394e2SPaul Cercueil static int ingenic_gpio_direction_input(struct gpio_chip *gc,
3560e72394e2SPaul Cercueil 		unsigned int offset)
3561e72394e2SPaul Cercueil {
3562e72394e2SPaul Cercueil 	return pinctrl_gpio_direction_input(gc->base + offset);
3563e72394e2SPaul Cercueil }
3564e72394e2SPaul Cercueil 
3565e72394e2SPaul Cercueil static int ingenic_gpio_direction_output(struct gpio_chip *gc,
3566e72394e2SPaul Cercueil 		unsigned int offset, int value)
3567e72394e2SPaul Cercueil {
3568e72394e2SPaul Cercueil 	ingenic_gpio_set(gc, offset, value);
3569e72394e2SPaul Cercueil 	return pinctrl_gpio_direction_output(gc->base + offset);
3570e72394e2SPaul Cercueil }
3571e72394e2SPaul Cercueil 
3572b5c23aa4SPaul Cercueil static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
3573943e0da1S周琰杰 (Zhou Yanjie) 		unsigned int pin, unsigned int reg, bool set)
3574b5c23aa4SPaul Cercueil {
3575b5c23aa4SPaul Cercueil 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3576b5c23aa4SPaul Cercueil 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3577b5c23aa4SPaul Cercueil 
3578424f3969S周琰杰 (Zhou Yanjie) 	if (set) {
35798d2d607cSPaul Cercueil 		if (is_soc_or_above(jzpc, ID_JZ4740))
3580f742e5ebS周琰杰 (Zhou Yanjie) 			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3581424f3969S周琰杰 (Zhou Yanjie) 					REG_SET(reg), BIT(idx));
3582424f3969S周琰杰 (Zhou Yanjie) 		else
3583424f3969S周琰杰 (Zhou Yanjie) 			regmap_set_bits(jzpc->map, offt * jzpc->info->reg_offset +
3584424f3969S周琰杰 (Zhou Yanjie) 					reg, BIT(idx));
3585424f3969S周琰杰 (Zhou Yanjie) 	} else {
35868d2d607cSPaul Cercueil 		if (is_soc_or_above(jzpc, ID_JZ4740))
3587424f3969S周琰杰 (Zhou Yanjie) 			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3588424f3969S周琰杰 (Zhou Yanjie) 					REG_CLEAR(reg), BIT(idx));
3589424f3969S周琰杰 (Zhou Yanjie) 		else
3590424f3969S周琰杰 (Zhou Yanjie) 			regmap_clear_bits(jzpc->map, offt * jzpc->info->reg_offset +
3591424f3969S周琰杰 (Zhou Yanjie) 					reg, BIT(idx));
3592424f3969S周琰杰 (Zhou Yanjie) 	}
3593b5c23aa4SPaul Cercueil }
3594b5c23aa4SPaul Cercueil 
3595fe1ad5eeSZhou Yanjie static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc,
3596fe1ad5eeSZhou Yanjie 		unsigned int pin, u8 reg, bool set)
3597fe1ad5eeSZhou Yanjie {
3598fe1ad5eeSZhou Yanjie 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3599fe1ad5eeSZhou Yanjie 
3600f742e5ebS周琰杰 (Zhou Yanjie) 	regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) +
3601fe1ad5eeSZhou Yanjie 			(set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
3602fe1ad5eeSZhou Yanjie }
3603fe1ad5eeSZhou Yanjie 
3604fe1ad5eeSZhou Yanjie static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc,
3605fe1ad5eeSZhou Yanjie 		unsigned int pin)
3606fe1ad5eeSZhou Yanjie {
3607d7da2a1eS周琰杰 (Zhou Yanjie) 	regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset),
3608d7da2a1eS周琰杰 (Zhou Yanjie) 			pin / PINS_PER_GPIO_CHIP);
3609fe1ad5eeSZhou Yanjie }
3610fe1ad5eeSZhou Yanjie 
3611424f3969S周琰杰 (Zhou Yanjie) static inline void jz4730_config_pin_function(struct ingenic_pinctrl *jzpc,
3612424f3969S周琰杰 (Zhou Yanjie) 		unsigned int pin, u8 reg_upper, u8 reg_lower, u8 value)
3613424f3969S周琰杰 (Zhou Yanjie) {
3614424f3969S周琰杰 (Zhou Yanjie) 	/*
3615424f3969S周琰杰 (Zhou Yanjie) 	 * JZ4730 function and IRQ registers support two-bits-per-pin
3616424f3969S周琰杰 (Zhou Yanjie) 	 * definitions, split into two groups of 16.
3617424f3969S周琰杰 (Zhou Yanjie) 	 */
3618424f3969S周琰杰 (Zhou Yanjie) 	unsigned int idx = pin % JZ4730_PINS_PER_PAIRED_REG;
3619424f3969S周琰杰 (Zhou Yanjie) 	unsigned int mask = GENMASK(1, 0) << idx * 2;
3620424f3969S周琰杰 (Zhou Yanjie) 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3621424f3969S周琰杰 (Zhou Yanjie) 	u8 reg = (pin % PINS_PER_GPIO_CHIP) < JZ4730_PINS_PER_PAIRED_REG ? reg_lower : reg_upper;
3622424f3969S周琰杰 (Zhou Yanjie) 
3623424f3969S周琰杰 (Zhou Yanjie) 	regmap_update_bits(jzpc->map, offt * jzpc->info->reg_offset + reg,
3624424f3969S周琰杰 (Zhou Yanjie) 			mask, value << (idx * 2));
3625424f3969S周琰杰 (Zhou Yanjie) }
3626424f3969S周琰杰 (Zhou Yanjie) 
3627b5c23aa4SPaul Cercueil static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
3628943e0da1S周琰杰 (Zhou Yanjie) 		unsigned int pin, unsigned int reg)
3629b5c23aa4SPaul Cercueil {
3630b5c23aa4SPaul Cercueil 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3631b5c23aa4SPaul Cercueil 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3632b5c23aa4SPaul Cercueil 	unsigned int val;
3633b5c23aa4SPaul Cercueil 
3634f742e5ebS周琰杰 (Zhou Yanjie) 	regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val);
3635b5c23aa4SPaul Cercueil 
3636b5c23aa4SPaul Cercueil 	return val & BIT(idx);
3637b5c23aa4SPaul Cercueil }
3638b5c23aa4SPaul Cercueil 
3639ebd66514SPaul Cercueil static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
3640ebd66514SPaul Cercueil {
3641ebd66514SPaul Cercueil 	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
3642ebd66514SPaul Cercueil 	struct ingenic_pinctrl *jzpc = jzgc->jzpc;
3643ebd66514SPaul Cercueil 	unsigned int pin = gc->base + offset;
3644ebd66514SPaul Cercueil 
36458d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_JZ4770)) {
3646b4aa4876SPaul Cercueil 		if (ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_INT) ||
3647b4aa4876SPaul Cercueil 		    ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PAT1))
36483c827873SMatti Vaittinen 			return GPIO_LINE_DIRECTION_IN;
36493c827873SMatti Vaittinen 		return GPIO_LINE_DIRECTION_OUT;
36508d2d607cSPaul Cercueil 	} else if (!is_soc_or_above(jzpc, ID_JZ4740)) {
3651424f3969S周琰杰 (Zhou Yanjie) 		if (!ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPDIR))
3652424f3969S周琰杰 (Zhou Yanjie) 			return GPIO_LINE_DIRECTION_IN;
3653424f3969S周琰杰 (Zhou Yanjie) 		return GPIO_LINE_DIRECTION_OUT;
36543c827873SMatti Vaittinen 	}
3655ebd66514SPaul Cercueil 
3656ebd66514SPaul Cercueil 	if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
36573c827873SMatti Vaittinen 		return GPIO_LINE_DIRECTION_IN;
3658ebd66514SPaul Cercueil 
36593c827873SMatti Vaittinen 	if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR))
36603c827873SMatti Vaittinen 		return GPIO_LINE_DIRECTION_OUT;
36613c827873SMatti Vaittinen 
36623c827873SMatti Vaittinen 	return GPIO_LINE_DIRECTION_IN;
3663ebd66514SPaul Cercueil }
3664ebd66514SPaul Cercueil 
36655bf7b849SJulia Lawall static const struct pinctrl_ops ingenic_pctlops = {
3666b5c23aa4SPaul Cercueil 	.get_groups_count = pinctrl_generic_get_group_count,
3667b5c23aa4SPaul Cercueil 	.get_group_name = pinctrl_generic_get_group_name,
3668b5c23aa4SPaul Cercueil 	.get_group_pins = pinctrl_generic_get_group_pins,
3669b5c23aa4SPaul Cercueil 	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
3670b5c23aa4SPaul Cercueil 	.dt_free_map = pinconf_generic_dt_free_map,
3671b5c23aa4SPaul Cercueil };
3672b5c23aa4SPaul Cercueil 
36739a0f1341SPaul Cercueil static int ingenic_gpio_irq_request(struct irq_data *data)
36749a0f1341SPaul Cercueil {
36759a0f1341SPaul Cercueil 	struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
36764c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(data);
36779a0f1341SPaul Cercueil 	int ret;
36789a0f1341SPaul Cercueil 
36794c76a7fcSAidan MacDonald 	ret = ingenic_gpio_direction_input(gpio_chip, irq);
36809a0f1341SPaul Cercueil 	if (ret)
36819a0f1341SPaul Cercueil 		return ret;
36829a0f1341SPaul Cercueil 
36834c76a7fcSAidan MacDonald 	return gpiochip_reqres_irq(gpio_chip, irq);
36849a0f1341SPaul Cercueil }
36859a0f1341SPaul Cercueil 
36869a0f1341SPaul Cercueil static void ingenic_gpio_irq_release(struct irq_data *data)
36879a0f1341SPaul Cercueil {
36889a0f1341SPaul Cercueil 	struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
36894c76a7fcSAidan MacDonald 	irq_hw_number_t irq = irqd_to_hwirq(data);
36909a0f1341SPaul Cercueil 
36914c76a7fcSAidan MacDonald 	return gpiochip_relres_irq(gpio_chip, irq);
36929a0f1341SPaul Cercueil }
36939a0f1341SPaul Cercueil 
369471f5e7b3SAidan MacDonald static void ingenic_gpio_irq_print_chip(struct irq_data *data, struct seq_file *p)
369571f5e7b3SAidan MacDonald {
369671f5e7b3SAidan MacDonald 	struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
369771f5e7b3SAidan MacDonald 
369871f5e7b3SAidan MacDonald 	seq_printf(p, "%s", gpio_chip->label);
369971f5e7b3SAidan MacDonald }
370071f5e7b3SAidan MacDonald 
370171f5e7b3SAidan MacDonald static const struct irq_chip ingenic_gpio_irqchip = {
370271f5e7b3SAidan MacDonald 	.irq_enable		= ingenic_gpio_irq_enable,
370371f5e7b3SAidan MacDonald 	.irq_disable		= ingenic_gpio_irq_disable,
370471f5e7b3SAidan MacDonald 	.irq_unmask		= ingenic_gpio_irq_unmask,
370571f5e7b3SAidan MacDonald 	.irq_mask		= ingenic_gpio_irq_mask,
370671f5e7b3SAidan MacDonald 	.irq_ack		= ingenic_gpio_irq_ack,
370771f5e7b3SAidan MacDonald 	.irq_set_type		= ingenic_gpio_irq_set_type,
370871f5e7b3SAidan MacDonald 	.irq_set_wake		= ingenic_gpio_irq_set_wake,
370971f5e7b3SAidan MacDonald 	.irq_request_resources	= ingenic_gpio_irq_request,
371071f5e7b3SAidan MacDonald 	.irq_release_resources	= ingenic_gpio_irq_release,
371171f5e7b3SAidan MacDonald 	.irq_print_chip		= ingenic_gpio_irq_print_chip,
371271f5e7b3SAidan MacDonald 	.flags			= IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_IMMUTABLE,
371371f5e7b3SAidan MacDonald };
371471f5e7b3SAidan MacDonald 
3715b5c23aa4SPaul Cercueil static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
3716b5c23aa4SPaul Cercueil 		int pin, int func)
3717b5c23aa4SPaul Cercueil {
3718b5c23aa4SPaul Cercueil 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3719b5c23aa4SPaul Cercueil 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3720b5c23aa4SPaul Cercueil 
3721b5c23aa4SPaul Cercueil 	dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n",
3722b5c23aa4SPaul Cercueil 			'A' + offt, idx, func);
3723b5c23aa4SPaul Cercueil 
37248d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_X1000)) {
3725b4aa4876SPaul Cercueil 		ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3726fe1ad5eeSZhou Yanjie 		ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false);
3727b4aa4876SPaul Cercueil 		ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
3728b4aa4876SPaul Cercueil 		ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
3729fe1ad5eeSZhou Yanjie 		ingenic_shadow_config_pin_load(jzpc, pin);
37308d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_JZ4770)) {
3731b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3732e72394e2SPaul Cercueil 		ingenic_config_pin(jzpc, pin, GPIO_MSK, false);
3733b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
3734b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
37358d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_JZ4740)) {
3736b5c23aa4SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
3737b5c23aa4SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
37389a85c09aSPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func & 0x1);
3739424f3969S周琰杰 (Zhou Yanjie) 	} else {
3740424f3969S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false);
3741424f3969S周琰杰 (Zhou Yanjie) 		jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, func);
3742b5c23aa4SPaul Cercueil 	}
3743b5c23aa4SPaul Cercueil 
3744b5c23aa4SPaul Cercueil 	return 0;
3745b5c23aa4SPaul Cercueil }
3746b5c23aa4SPaul Cercueil 
3747b5c23aa4SPaul Cercueil static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
3748b5c23aa4SPaul Cercueil 		unsigned int selector, unsigned int group)
3749b5c23aa4SPaul Cercueil {
3750b5c23aa4SPaul Cercueil 	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3751b5c23aa4SPaul Cercueil 	struct function_desc *func;
3752b5c23aa4SPaul Cercueil 	struct group_desc *grp;
3753b5c23aa4SPaul Cercueil 	unsigned int i;
3754bb42b593SPaul Cercueil 	uintptr_t mode;
3755bb42b593SPaul Cercueil 	u8 *pin_modes;
3756b5c23aa4SPaul Cercueil 
3757b5c23aa4SPaul Cercueil 	func = pinmux_generic_get_function(pctldev, selector);
3758b5c23aa4SPaul Cercueil 	if (!func)
3759b5c23aa4SPaul Cercueil 		return -EINVAL;
3760b5c23aa4SPaul Cercueil 
3761b5c23aa4SPaul Cercueil 	grp = pinctrl_generic_get_group(pctldev, group);
3762b5c23aa4SPaul Cercueil 	if (!grp)
3763b5c23aa4SPaul Cercueil 		return -EINVAL;
3764b5c23aa4SPaul Cercueil 
3765b5c23aa4SPaul Cercueil 	dev_dbg(pctldev->dev, "enable function %s group %s\n",
3766b5c23aa4SPaul Cercueil 		func->name, grp->name);
3767b5c23aa4SPaul Cercueil 
3768bb42b593SPaul Cercueil 	mode = (uintptr_t)grp->data;
3769bb42b593SPaul Cercueil 	if (mode <= 3) {
3770bb42b593SPaul Cercueil 		for (i = 0; i < grp->num_pins; i++)
3771bb42b593SPaul Cercueil 			ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], mode);
3772bb42b593SPaul Cercueil 	} else {
3773bb42b593SPaul Cercueil 		pin_modes = grp->data;
3774b5c23aa4SPaul Cercueil 
3775bb42b593SPaul Cercueil 		for (i = 0; i < grp->num_pins; i++)
3776b5c23aa4SPaul Cercueil 			ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
3777b5c23aa4SPaul Cercueil 	}
3778b5c23aa4SPaul Cercueil 
3779b5c23aa4SPaul Cercueil 	return 0;
3780b5c23aa4SPaul Cercueil }
3781b5c23aa4SPaul Cercueil 
3782b5c23aa4SPaul Cercueil static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
3783b5c23aa4SPaul Cercueil 		struct pinctrl_gpio_range *range,
3784b5c23aa4SPaul Cercueil 		unsigned int pin, bool input)
3785b5c23aa4SPaul Cercueil {
3786b5c23aa4SPaul Cercueil 	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3787b5c23aa4SPaul Cercueil 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3788b5c23aa4SPaul Cercueil 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3789b5c23aa4SPaul Cercueil 
3790b5c23aa4SPaul Cercueil 	dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n",
3791b5c23aa4SPaul Cercueil 			'A' + offt, idx, input ? "in" : "out");
3792b5c23aa4SPaul Cercueil 
37938d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_X1000)) {
3794b4aa4876SPaul Cercueil 		ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3795fe1ad5eeSZhou Yanjie 		ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true);
3796b4aa4876SPaul Cercueil 		ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
3797fe1ad5eeSZhou Yanjie 		ingenic_shadow_config_pin_load(jzpc, pin);
37988d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_JZ4770)) {
3799b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
3800e72394e2SPaul Cercueil 		ingenic_config_pin(jzpc, pin, GPIO_MSK, true);
3801b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
38028d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_JZ4740)) {
3803b5c23aa4SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
38040084a786SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input);
3805b5c23aa4SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
3806424f3969S周琰杰 (Zhou Yanjie) 	} else {
3807424f3969S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false);
3808424f3969S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPDIR, !input);
3809424f3969S周琰杰 (Zhou Yanjie) 		jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, 0);
3810b5c23aa4SPaul Cercueil 	}
3811b5c23aa4SPaul Cercueil 
3812b5c23aa4SPaul Cercueil 	return 0;
3813b5c23aa4SPaul Cercueil }
3814b5c23aa4SPaul Cercueil 
38155bf7b849SJulia Lawall static const struct pinmux_ops ingenic_pmxops = {
3816b5c23aa4SPaul Cercueil 	.get_functions_count = pinmux_generic_get_function_count,
3817b5c23aa4SPaul Cercueil 	.get_function_name = pinmux_generic_get_function_name,
3818b5c23aa4SPaul Cercueil 	.get_function_groups = pinmux_generic_get_function_groups,
3819b5c23aa4SPaul Cercueil 	.set_mux = ingenic_pinmux_set_mux,
3820b5c23aa4SPaul Cercueil 	.gpio_set_direction = ingenic_pinmux_gpio_set_direction,
3821b5c23aa4SPaul Cercueil };
3822b5c23aa4SPaul Cercueil 
3823b5c23aa4SPaul Cercueil static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
3824b5c23aa4SPaul Cercueil 		unsigned int pin, unsigned long *config)
3825b5c23aa4SPaul Cercueil {
3826b5c23aa4SPaul Cercueil 	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
3827b5c23aa4SPaul Cercueil 	enum pin_config_param param = pinconf_to_config_param(*config);
3828b5c23aa4SPaul Cercueil 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3829b5c23aa4SPaul Cercueil 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3830943e0da1S周琰杰 (Zhou Yanjie) 	unsigned int arg = 1;
3831943e0da1S周琰杰 (Zhou Yanjie) 	unsigned int bias, reg;
38321d0bd580S周琰杰 (Zhou Yanjie) 	bool pull, pullup, pulldown;
3833b5c23aa4SPaul Cercueil 
38348d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_X2000)) {
3835943e0da1S周琰杰 (Zhou Yanjie) 		pullup = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) &&
3836943e0da1S周琰杰 (Zhou Yanjie) 				!ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) &&
3837943e0da1S周琰杰 (Zhou Yanjie) 				(jzpc->info->pull_ups[offt] & BIT(idx));
3838943e0da1S周琰杰 (Zhou Yanjie) 		pulldown = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) &&
3839943e0da1S周琰杰 (Zhou Yanjie) 				!ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) &&
3840943e0da1S周琰杰 (Zhou Yanjie) 				(jzpc->info->pull_downs[offt] & BIT(idx));
3841943e0da1S周琰杰 (Zhou Yanjie) 
38428d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_X1830)) {
38431d0bd580S周琰杰 (Zhou Yanjie) 		unsigned int half = PINS_PER_GPIO_CHIP / 2;
38441d0bd580S周琰杰 (Zhou Yanjie) 		unsigned int idxh = (pin % half) * 2;
38451d0bd580S周琰杰 (Zhou Yanjie) 
38461d0bd580S周琰杰 (Zhou Yanjie) 		if (idx < half)
38471d0bd580S周琰杰 (Zhou Yanjie) 			regmap_read(jzpc->map, offt * jzpc->info->reg_offset +
38481d0bd580S周琰杰 (Zhou Yanjie) 					X1830_GPIO_PEL, &bias);
38491d0bd580S周琰杰 (Zhou Yanjie) 		else
38501d0bd580S周琰杰 (Zhou Yanjie) 			regmap_read(jzpc->map, offt * jzpc->info->reg_offset +
38511d0bd580S周琰杰 (Zhou Yanjie) 					X1830_GPIO_PEH, &bias);
38521d0bd580S周琰杰 (Zhou Yanjie) 
38531d0bd580S周琰杰 (Zhou Yanjie) 		bias = (bias >> idxh) & (GPIO_PULL_UP | GPIO_PULL_DOWN);
38541d0bd580S周琰杰 (Zhou Yanjie) 
38551d0bd580S周琰杰 (Zhou Yanjie) 		pullup = (bias == GPIO_PULL_UP) && (jzpc->info->pull_ups[offt] & BIT(idx));
38561d0bd580S周琰杰 (Zhou Yanjie) 		pulldown = (bias == GPIO_PULL_DOWN) && (jzpc->info->pull_downs[offt] & BIT(idx));
38571d0bd580S周琰杰 (Zhou Yanjie) 
38581d0bd580S周琰杰 (Zhou Yanjie) 	} else {
38598d2d607cSPaul Cercueil 		if (is_soc_or_above(jzpc, ID_JZ4770))
3860b4aa4876SPaul Cercueil 			pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN);
38618d2d607cSPaul Cercueil 		else if (is_soc_or_above(jzpc, ID_JZ4740))
3862b5c23aa4SPaul Cercueil 			pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
3863424f3969S周琰杰 (Zhou Yanjie) 		else
3864424f3969S周琰杰 (Zhou Yanjie) 			pull = ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPPUR);
3865b5c23aa4SPaul Cercueil 
38661d0bd580S周琰杰 (Zhou Yanjie) 		pullup = pull && (jzpc->info->pull_ups[offt] & BIT(idx));
38671d0bd580S周琰杰 (Zhou Yanjie) 		pulldown = pull && (jzpc->info->pull_downs[offt] & BIT(idx));
38681d0bd580S周琰杰 (Zhou Yanjie) 	}
38691d0bd580S周琰杰 (Zhou Yanjie) 
3870b5c23aa4SPaul Cercueil 	switch (param) {
3871b5c23aa4SPaul Cercueil 	case PIN_CONFIG_BIAS_DISABLE:
38721d0bd580S周琰杰 (Zhou Yanjie) 		if (pullup || pulldown)
3873b5c23aa4SPaul Cercueil 			return -EINVAL;
3874943e0da1S周琰杰 (Zhou Yanjie) 
3875b5c23aa4SPaul Cercueil 		break;
3876b5c23aa4SPaul Cercueil 
3877b5c23aa4SPaul Cercueil 	case PIN_CONFIG_BIAS_PULL_UP:
38781d0bd580S周琰杰 (Zhou Yanjie) 		if (!pullup)
3879b5c23aa4SPaul Cercueil 			return -EINVAL;
3880943e0da1S周琰杰 (Zhou Yanjie) 
3881b5c23aa4SPaul Cercueil 		break;
3882b5c23aa4SPaul Cercueil 
3883b5c23aa4SPaul Cercueil 	case PIN_CONFIG_BIAS_PULL_DOWN:
38841d0bd580S周琰杰 (Zhou Yanjie) 		if (!pulldown)
3885b5c23aa4SPaul Cercueil 			return -EINVAL;
3886943e0da1S周琰杰 (Zhou Yanjie) 
3887943e0da1S周琰杰 (Zhou Yanjie) 		break;
3888943e0da1S周琰杰 (Zhou Yanjie) 
3889943e0da1S周琰杰 (Zhou Yanjie) 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
38908d2d607cSPaul Cercueil 		if (is_soc_or_above(jzpc, ID_X2000))
3891943e0da1S周琰杰 (Zhou Yanjie) 			reg = X2000_GPIO_SMT;
38928d2d607cSPaul Cercueil 		else if (is_soc_or_above(jzpc, ID_X1830))
3893943e0da1S周琰杰 (Zhou Yanjie) 			reg = X1830_GPIO_SMT;
3894943e0da1S周琰杰 (Zhou Yanjie) 		else
3895943e0da1S周琰杰 (Zhou Yanjie) 			return -EINVAL;
3896943e0da1S周琰杰 (Zhou Yanjie) 
3897943e0da1S周琰杰 (Zhou Yanjie) 		arg = !!ingenic_get_pin_config(jzpc, pin, reg);
3898943e0da1S周琰杰 (Zhou Yanjie) 		break;
3899943e0da1S周琰杰 (Zhou Yanjie) 
3900943e0da1S周琰杰 (Zhou Yanjie) 	case PIN_CONFIG_SLEW_RATE:
39018d2d607cSPaul Cercueil 		if (is_soc_or_above(jzpc, ID_X2000))
3902943e0da1S周琰杰 (Zhou Yanjie) 			reg = X2000_GPIO_SR;
39038d2d607cSPaul Cercueil 		else if (is_soc_or_above(jzpc, ID_X1830))
3904943e0da1S周琰杰 (Zhou Yanjie) 			reg = X1830_GPIO_SR;
3905943e0da1S周琰杰 (Zhou Yanjie) 		else
3906943e0da1S周琰杰 (Zhou Yanjie) 			return -EINVAL;
3907943e0da1S周琰杰 (Zhou Yanjie) 
3908943e0da1S周琰杰 (Zhou Yanjie) 		arg = !!ingenic_get_pin_config(jzpc, pin, reg);
3909b5c23aa4SPaul Cercueil 		break;
3910b5c23aa4SPaul Cercueil 
3911b5c23aa4SPaul Cercueil 	default:
3912b5c23aa4SPaul Cercueil 		return -ENOTSUPP;
3913b5c23aa4SPaul Cercueil 	}
3914b5c23aa4SPaul Cercueil 
3915943e0da1S周琰杰 (Zhou Yanjie) 	*config = pinconf_to_config_packed(param, arg);
3916b5c23aa4SPaul Cercueil 	return 0;
3917b5c23aa4SPaul Cercueil }
3918b5c23aa4SPaul Cercueil 
3919b5c23aa4SPaul Cercueil static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
3920d7da2a1eS周琰杰 (Zhou Yanjie) 		unsigned int pin, unsigned int bias)
3921b5c23aa4SPaul Cercueil {
39228d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_X2000)) {
3923943e0da1S周琰杰 (Zhou Yanjie) 		switch (bias) {
39247261851eSPaul Cercueil 		case GPIO_PULL_UP:
3925943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false);
3926943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, true);
3927943e0da1S周琰杰 (Zhou Yanjie) 			break;
3928943e0da1S周琰杰 (Zhou Yanjie) 
39297261851eSPaul Cercueil 		case GPIO_PULL_DOWN:
3930943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false);
3931943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, true);
3932943e0da1S周琰杰 (Zhou Yanjie) 			break;
3933943e0da1S周琰杰 (Zhou Yanjie) 
39347261851eSPaul Cercueil 		case GPIO_PULL_DIS:
3935943e0da1S周琰杰 (Zhou Yanjie) 		default:
3936943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false);
3937943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false);
3938943e0da1S周琰杰 (Zhou Yanjie) 		}
3939943e0da1S周琰杰 (Zhou Yanjie) 
39408d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_X1830)) {
3941d7da2a1eS周琰杰 (Zhou Yanjie) 		unsigned int idx = pin % PINS_PER_GPIO_CHIP;
3942d7da2a1eS周琰杰 (Zhou Yanjie) 		unsigned int half = PINS_PER_GPIO_CHIP / 2;
39431d0bd580S周琰杰 (Zhou Yanjie) 		unsigned int idxh = (pin % half) * 2;
3944d7da2a1eS周琰杰 (Zhou Yanjie) 		unsigned int offt = pin / PINS_PER_GPIO_CHIP;
3945d7da2a1eS周琰杰 (Zhou Yanjie) 
3946d7da2a1eS周琰杰 (Zhou Yanjie) 		if (idx < half) {
3947d7da2a1eS周琰杰 (Zhou Yanjie) 			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3948d7da2a1eS周琰杰 (Zhou Yanjie) 					REG_CLEAR(X1830_GPIO_PEL), 3 << idxh);
3949d7da2a1eS周琰杰 (Zhou Yanjie) 			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3950d7da2a1eS周琰杰 (Zhou Yanjie) 					REG_SET(X1830_GPIO_PEL), bias << idxh);
3951d7da2a1eS周琰杰 (Zhou Yanjie) 		} else {
3952d7da2a1eS周琰杰 (Zhou Yanjie) 			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3953d7da2a1eS周琰杰 (Zhou Yanjie) 					REG_CLEAR(X1830_GPIO_PEH), 3 << idxh);
3954d7da2a1eS周琰杰 (Zhou Yanjie) 			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
3955d7da2a1eS周琰杰 (Zhou Yanjie) 					REG_SET(X1830_GPIO_PEH), bias << idxh);
3956d7da2a1eS周琰杰 (Zhou Yanjie) 		}
3957d7da2a1eS周琰杰 (Zhou Yanjie) 
39588d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_JZ4770)) {
3959b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !bias);
39608d2d607cSPaul Cercueil 	} else if (is_soc_or_above(jzpc, ID_JZ4740)) {
3961d7da2a1eS周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias);
3962424f3969S周琰杰 (Zhou Yanjie) 	} else {
3963424f3969S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPPUR, bias);
3964d7da2a1eS周琰杰 (Zhou Yanjie) 	}
3965b5c23aa4SPaul Cercueil }
3966b5c23aa4SPaul Cercueil 
3967943e0da1S周琰杰 (Zhou Yanjie) static void ingenic_set_schmitt_trigger(struct ingenic_pinctrl *jzpc,
3968943e0da1S周琰杰 (Zhou Yanjie) 		unsigned int pin, bool enable)
3969943e0da1S周琰杰 (Zhou Yanjie) {
39708d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_X2000))
3971943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, X2000_GPIO_SMT, enable);
3972943e0da1S周琰杰 (Zhou Yanjie) 	else
3973943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, X1830_GPIO_SMT, enable);
3974943e0da1S周琰杰 (Zhou Yanjie) }
3975943e0da1S周琰杰 (Zhou Yanjie) 
39767009d046SPaul Cercueil static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc,
39777009d046SPaul Cercueil 				     unsigned int pin, bool high)
39787009d046SPaul Cercueil {
39798d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_JZ4770))
3980b4aa4876SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, high);
39818d2d607cSPaul Cercueil 	else if (is_soc_or_above(jzpc, ID_JZ4740))
39827009d046SPaul Cercueil 		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high);
3983424f3969S周琰杰 (Zhou Yanjie) 	else
3984424f3969S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, JZ4730_GPIO_DATA, high);
39857009d046SPaul Cercueil }
39867009d046SPaul Cercueil 
3987943e0da1S周琰杰 (Zhou Yanjie) static void ingenic_set_slew_rate(struct ingenic_pinctrl *jzpc,
3988943e0da1S周琰杰 (Zhou Yanjie) 		unsigned int pin, unsigned int slew)
3989943e0da1S周琰杰 (Zhou Yanjie) {
39908d2d607cSPaul Cercueil 	if (is_soc_or_above(jzpc, ID_X2000))
3991943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, X2000_GPIO_SR, slew);
3992943e0da1S周琰杰 (Zhou Yanjie) 	else
3993943e0da1S周琰杰 (Zhou Yanjie) 		ingenic_config_pin(jzpc, pin, X1830_GPIO_SR, slew);
3994943e0da1S周琰杰 (Zhou Yanjie) }
3995943e0da1S周琰杰 (Zhou Yanjie) 
3996b5c23aa4SPaul Cercueil static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
3997b5c23aa4SPaul Cercueil 		unsigned long *configs, unsigned int num_configs)
3998b5c23aa4SPaul Cercueil {
3999b5c23aa4SPaul Cercueil 	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
4000b5c23aa4SPaul Cercueil 	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
4001b5c23aa4SPaul Cercueil 	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
40027009d046SPaul Cercueil 	unsigned int cfg, arg;
40037009d046SPaul Cercueil 	int ret;
4004b5c23aa4SPaul Cercueil 
4005b5c23aa4SPaul Cercueil 	for (cfg = 0; cfg < num_configs; cfg++) {
4006b5c23aa4SPaul Cercueil 		switch (pinconf_to_config_param(configs[cfg])) {
4007b5c23aa4SPaul Cercueil 		case PIN_CONFIG_BIAS_DISABLE:
4008b5c23aa4SPaul Cercueil 		case PIN_CONFIG_BIAS_PULL_UP:
4009b5c23aa4SPaul Cercueil 		case PIN_CONFIG_BIAS_PULL_DOWN:
4010943e0da1S周琰杰 (Zhou Yanjie) 		case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
40117009d046SPaul Cercueil 		case PIN_CONFIG_OUTPUT:
4012943e0da1S周琰杰 (Zhou Yanjie) 		case PIN_CONFIG_SLEW_RATE:
4013b5c23aa4SPaul Cercueil 			continue;
4014b5c23aa4SPaul Cercueil 		default:
4015b5c23aa4SPaul Cercueil 			return -ENOTSUPP;
4016b5c23aa4SPaul Cercueil 		}
4017b5c23aa4SPaul Cercueil 	}
4018b5c23aa4SPaul Cercueil 
4019b5c23aa4SPaul Cercueil 	for (cfg = 0; cfg < num_configs; cfg++) {
40207009d046SPaul Cercueil 		arg = pinconf_to_config_argument(configs[cfg]);
40217009d046SPaul Cercueil 
4022b5c23aa4SPaul Cercueil 		switch (pinconf_to_config_param(configs[cfg])) {
4023b5c23aa4SPaul Cercueil 		case PIN_CONFIG_BIAS_DISABLE:
4024b5c23aa4SPaul Cercueil 			dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n",
4025b5c23aa4SPaul Cercueil 					'A' + offt, idx);
4026d7da2a1eS周琰杰 (Zhou Yanjie) 			ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS);
4027b5c23aa4SPaul Cercueil 			break;
4028b5c23aa4SPaul Cercueil 
4029b5c23aa4SPaul Cercueil 		case PIN_CONFIG_BIAS_PULL_UP:
4030b5c23aa4SPaul Cercueil 			if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
4031b5c23aa4SPaul Cercueil 				return -EINVAL;
4032b5c23aa4SPaul Cercueil 			dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n",
4033b5c23aa4SPaul Cercueil 					'A' + offt, idx);
4034d7da2a1eS周琰杰 (Zhou Yanjie) 			ingenic_set_bias(jzpc, pin, GPIO_PULL_UP);
4035b5c23aa4SPaul Cercueil 			break;
4036b5c23aa4SPaul Cercueil 
4037b5c23aa4SPaul Cercueil 		case PIN_CONFIG_BIAS_PULL_DOWN:
4038b5c23aa4SPaul Cercueil 			if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
4039b5c23aa4SPaul Cercueil 				return -EINVAL;
4040b5c23aa4SPaul Cercueil 			dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n",
4041b5c23aa4SPaul Cercueil 					'A' + offt, idx);
4042d7da2a1eS周琰杰 (Zhou Yanjie) 			ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN);
4043b5c23aa4SPaul Cercueil 			break;
4044b5c23aa4SPaul Cercueil 
4045943e0da1S周琰杰 (Zhou Yanjie) 		case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
40468d2d607cSPaul Cercueil 			if (!is_soc_or_above(jzpc, ID_X1830))
4047943e0da1S周琰杰 (Zhou Yanjie) 				return -EINVAL;
4048943e0da1S周琰杰 (Zhou Yanjie) 
4049943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_set_schmitt_trigger(jzpc, pin, arg);
4050943e0da1S周琰杰 (Zhou Yanjie) 			break;
4051943e0da1S周琰杰 (Zhou Yanjie) 
40527009d046SPaul Cercueil 		case PIN_CONFIG_OUTPUT:
40537009d046SPaul Cercueil 			ret = pinctrl_gpio_direction_output(pin);
40547009d046SPaul Cercueil 			if (ret)
40557009d046SPaul Cercueil 				return ret;
40567009d046SPaul Cercueil 
40577009d046SPaul Cercueil 			ingenic_set_output_level(jzpc, pin, arg);
40587009d046SPaul Cercueil 			break;
40597009d046SPaul Cercueil 
4060943e0da1S周琰杰 (Zhou Yanjie) 		case PIN_CONFIG_SLEW_RATE:
40618d2d607cSPaul Cercueil 			if (!is_soc_or_above(jzpc, ID_X1830))
4062943e0da1S周琰杰 (Zhou Yanjie) 				return -EINVAL;
4063943e0da1S周琰杰 (Zhou Yanjie) 
4064943e0da1S周琰杰 (Zhou Yanjie) 			ingenic_set_slew_rate(jzpc, pin, arg);
4065943e0da1S周琰杰 (Zhou Yanjie) 			break;
4066943e0da1S周琰杰 (Zhou Yanjie) 
4067b5c23aa4SPaul Cercueil 		default:
4068d6d43a92SJosh Poimboeuf 			/* unreachable */
4069d6d43a92SJosh Poimboeuf 			break;
4070b5c23aa4SPaul Cercueil 		}
4071b5c23aa4SPaul Cercueil 	}
4072b5c23aa4SPaul Cercueil 
4073b5c23aa4SPaul Cercueil 	return 0;
4074b5c23aa4SPaul Cercueil }
4075b5c23aa4SPaul Cercueil 
4076b5c23aa4SPaul Cercueil static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
4077b5c23aa4SPaul Cercueil 		unsigned int group, unsigned long *config)
4078b5c23aa4SPaul Cercueil {
4079b5c23aa4SPaul Cercueil 	const unsigned int *pins;
4080b5c23aa4SPaul Cercueil 	unsigned int i, npins, old = 0;
4081b5c23aa4SPaul Cercueil 	int ret;
4082b5c23aa4SPaul Cercueil 
4083b5c23aa4SPaul Cercueil 	ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
4084b5c23aa4SPaul Cercueil 	if (ret)
4085b5c23aa4SPaul Cercueil 		return ret;
4086b5c23aa4SPaul Cercueil 
4087b5c23aa4SPaul Cercueil 	for (i = 0; i < npins; i++) {
4088b5c23aa4SPaul Cercueil 		if (ingenic_pinconf_get(pctldev, pins[i], config))
4089b5c23aa4SPaul Cercueil 			return -ENOTSUPP;
4090b5c23aa4SPaul Cercueil 
4091b5c23aa4SPaul Cercueil 		/* configs do not match between two pins */
4092b5c23aa4SPaul Cercueil 		if (i && (old != *config))
4093b5c23aa4SPaul Cercueil 			return -ENOTSUPP;
4094b5c23aa4SPaul Cercueil 
4095b5c23aa4SPaul Cercueil 		old = *config;
4096b5c23aa4SPaul Cercueil 	}
4097b5c23aa4SPaul Cercueil 
4098b5c23aa4SPaul Cercueil 	return 0;
4099b5c23aa4SPaul Cercueil }
4100b5c23aa4SPaul Cercueil 
4101b5c23aa4SPaul Cercueil static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
4102b5c23aa4SPaul Cercueil 		unsigned int group, unsigned long *configs,
4103b5c23aa4SPaul Cercueil 		unsigned int num_configs)
4104b5c23aa4SPaul Cercueil {
4105b5c23aa4SPaul Cercueil 	const unsigned int *pins;
4106b5c23aa4SPaul Cercueil 	unsigned int i, npins;
4107b5c23aa4SPaul Cercueil 	int ret;
4108b5c23aa4SPaul Cercueil 
4109b5c23aa4SPaul Cercueil 	ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
4110b5c23aa4SPaul Cercueil 	if (ret)
4111b5c23aa4SPaul Cercueil 		return ret;
4112b5c23aa4SPaul Cercueil 
4113b5c23aa4SPaul Cercueil 	for (i = 0; i < npins; i++) {
4114b5c23aa4SPaul Cercueil 		ret = ingenic_pinconf_set(pctldev,
4115b5c23aa4SPaul Cercueil 				pins[i], configs, num_configs);
4116b5c23aa4SPaul Cercueil 		if (ret)
4117b5c23aa4SPaul Cercueil 			return ret;
4118b5c23aa4SPaul Cercueil 	}
4119b5c23aa4SPaul Cercueil 
4120b5c23aa4SPaul Cercueil 	return 0;
4121b5c23aa4SPaul Cercueil }
4122b5c23aa4SPaul Cercueil 
41235bf7b849SJulia Lawall static const struct pinconf_ops ingenic_confops = {
4124b5c23aa4SPaul Cercueil 	.is_generic = true,
4125b5c23aa4SPaul Cercueil 	.pin_config_get = ingenic_pinconf_get,
4126b5c23aa4SPaul Cercueil 	.pin_config_set = ingenic_pinconf_set,
4127b5c23aa4SPaul Cercueil 	.pin_config_group_get = ingenic_pinconf_group_get,
4128b5c23aa4SPaul Cercueil 	.pin_config_group_set = ingenic_pinconf_group_set,
4129b5c23aa4SPaul Cercueil };
4130b5c23aa4SPaul Cercueil 
4131b5c23aa4SPaul Cercueil static const struct regmap_config ingenic_pinctrl_regmap_config = {
4132b5c23aa4SPaul Cercueil 	.reg_bits = 32,
4133b5c23aa4SPaul Cercueil 	.val_bits = 32,
4134b5c23aa4SPaul Cercueil 	.reg_stride = 4,
4135b5c23aa4SPaul Cercueil };
4136b5c23aa4SPaul Cercueil 
413728c1caafS周琰杰 (Zhou Yanjie) static const struct of_device_id ingenic_gpio_of_matches[] __initconst = {
413828c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4730-gpio" },
413928c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4740-gpio" },
414028c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4725b-gpio" },
414128c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4750-gpio" },
414228c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4755-gpio" },
414328c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4760-gpio" },
414428c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4770-gpio" },
414528c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4775-gpio" },
414628c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,jz4780-gpio" },
414728c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,x1000-gpio" },
414828c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,x1830-gpio" },
414928c1caafS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,x2000-gpio" },
41502a18211bS周琰杰 (Zhou Yanjie) 	{ .compatible = "ingenic,x2100-gpio" },
4151e72394e2SPaul Cercueil 	{},
4152e72394e2SPaul Cercueil };
4153e72394e2SPaul Cercueil 
4154e72394e2SPaul Cercueil static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc,
4155*8c943137SAndy Shevchenko 				     struct fwnode_handle *fwnode)
4156e72394e2SPaul Cercueil {
4157e72394e2SPaul Cercueil 	struct ingenic_gpio_chip *jzgc;
4158e72394e2SPaul Cercueil 	struct device *dev = jzpc->dev;
4159142b8767SLinus Walleij 	struct gpio_irq_chip *girq;
4160e72394e2SPaul Cercueil 	unsigned int bank;
4161e72394e2SPaul Cercueil 	int err;
4162e72394e2SPaul Cercueil 
4163*8c943137SAndy Shevchenko 	err = fwnode_property_read_u32(fwnode, "reg", &bank);
4164e72394e2SPaul Cercueil 	if (err) {
4165e72394e2SPaul Cercueil 		dev_err(dev, "Cannot read \"reg\" property: %i\n", err);
4166e72394e2SPaul Cercueil 		return err;
4167e72394e2SPaul Cercueil 	}
4168e72394e2SPaul Cercueil 
4169e72394e2SPaul Cercueil 	jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL);
4170e72394e2SPaul Cercueil 	if (!jzgc)
4171e72394e2SPaul Cercueil 		return -ENOMEM;
4172e72394e2SPaul Cercueil 
4173e72394e2SPaul Cercueil 	jzgc->jzpc = jzpc;
4174f742e5ebS周琰杰 (Zhou Yanjie) 	jzgc->reg_base = bank * jzpc->info->reg_offset;
4175e72394e2SPaul Cercueil 
4176e72394e2SPaul Cercueil 	jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank);
4177e72394e2SPaul Cercueil 	if (!jzgc->gc.label)
4178e72394e2SPaul Cercueil 		return -ENOMEM;
4179e72394e2SPaul Cercueil 
4180e72394e2SPaul Cercueil 	/* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
4181e72394e2SPaul Cercueil 	 * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
4182e72394e2SPaul Cercueil 	 * <linux/gpio/consumer.h> INSTEAD.
4183e72394e2SPaul Cercueil 	 */
4184e72394e2SPaul Cercueil 	jzgc->gc.base = bank * 32;
4185e72394e2SPaul Cercueil 
4186e72394e2SPaul Cercueil 	jzgc->gc.ngpio = 32;
4187e72394e2SPaul Cercueil 	jzgc->gc.parent = dev;
4188*8c943137SAndy Shevchenko 	jzgc->gc.fwnode = fwnode;
4189e72394e2SPaul Cercueil 	jzgc->gc.owner = THIS_MODULE;
4190e72394e2SPaul Cercueil 
4191e72394e2SPaul Cercueil 	jzgc->gc.set = ingenic_gpio_set;
4192e72394e2SPaul Cercueil 	jzgc->gc.get = ingenic_gpio_get;
4193e72394e2SPaul Cercueil 	jzgc->gc.direction_input = ingenic_gpio_direction_input;
4194e72394e2SPaul Cercueil 	jzgc->gc.direction_output = ingenic_gpio_direction_output;
4195ebd66514SPaul Cercueil 	jzgc->gc.get_direction = ingenic_gpio_get_direction;
4196e72394e2SPaul Cercueil 	jzgc->gc.request = gpiochip_generic_request;
4197e72394e2SPaul Cercueil 	jzgc->gc.free = gpiochip_generic_free;
4198e72394e2SPaul Cercueil 
4199*8c943137SAndy Shevchenko 	err = fwnode_irq_get(fwnode, 0);
4200*8c943137SAndy Shevchenko 	if (err < 0)
4201*8c943137SAndy Shevchenko 		return err;
4202*8c943137SAndy Shevchenko 	if (!err)
4203e72394e2SPaul Cercueil 		return -EINVAL;
4204*8c943137SAndy Shevchenko 	jzgc->irq = err;
4205e72394e2SPaul Cercueil 
4206142b8767SLinus Walleij 	girq = &jzgc->gc.irq;
420771f5e7b3SAidan MacDonald 	gpio_irq_chip_set_chip(girq, &ingenic_gpio_irqchip);
4208142b8767SLinus Walleij 	girq->parent_handler = ingenic_gpio_irq_handler;
4209142b8767SLinus Walleij 	girq->num_parents = 1;
4210142b8767SLinus Walleij 	girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
4211142b8767SLinus Walleij 				     GFP_KERNEL);
4212142b8767SLinus Walleij 	if (!girq->parents)
4213142b8767SLinus Walleij 		return -ENOMEM;
4214943e0da1S周琰杰 (Zhou Yanjie) 
4215142b8767SLinus Walleij 	girq->parents[0] = jzgc->irq;
4216142b8767SLinus Walleij 	girq->default_type = IRQ_TYPE_NONE;
4217142b8767SLinus Walleij 	girq->handler = handle_level_irq;
4218142b8767SLinus Walleij 
4219142b8767SLinus Walleij 	err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc);
4220e72394e2SPaul Cercueil 	if (err)
4221e72394e2SPaul Cercueil 		return err;
4222e72394e2SPaul Cercueil 
4223e72394e2SPaul Cercueil 	return 0;
4224e72394e2SPaul Cercueil }
4225e72394e2SPaul Cercueil 
42264717b11fSPaul Cercueil static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
4227b5c23aa4SPaul Cercueil {
4228b5c23aa4SPaul Cercueil 	struct device *dev = &pdev->dev;
4229b5c23aa4SPaul Cercueil 	struct ingenic_pinctrl *jzpc;
4230b5c23aa4SPaul Cercueil 	struct pinctrl_desc *pctl_desc;
4231b5c23aa4SPaul Cercueil 	void __iomem *base;
4232b5c23aa4SPaul Cercueil 	const struct ingenic_chip_info *chip_info;
42336626a76eSPaul Cercueil 	struct regmap_config regmap_config;
4234*8c943137SAndy Shevchenko 	struct fwnode_handle *fwnode;
4235b5c23aa4SPaul Cercueil 	unsigned int i;
4236b5c23aa4SPaul Cercueil 	int err;
4237b5c23aa4SPaul Cercueil 
4238*8c943137SAndy Shevchenko 	chip_info = device_get_match_data(dev);
42399aa35178SPaul Cercueil 	if (!chip_info) {
42409aa35178SPaul Cercueil 		dev_err(dev, "Unsupported SoC\n");
42419aa35178SPaul Cercueil 		return -EINVAL;
42429aa35178SPaul Cercueil 	}
42439aa35178SPaul Cercueil 
4244b5c23aa4SPaul Cercueil 	jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
4245b5c23aa4SPaul Cercueil 	if (!jzpc)
4246b5c23aa4SPaul Cercueil 		return -ENOMEM;
4247b5c23aa4SPaul Cercueil 
424894f7a2cbSPaul Cercueil 	base = devm_platform_ioremap_resource(pdev, 0);
4249119fcf47SWei Yongjun 	if (IS_ERR(base))
4250b5c23aa4SPaul Cercueil 		return PTR_ERR(base);
4251b5c23aa4SPaul Cercueil 
42526626a76eSPaul Cercueil 	regmap_config = ingenic_pinctrl_regmap_config;
42539279c00fSAidan MacDonald 	if (chip_info->access_table) {
42549279c00fSAidan MacDonald 		regmap_config.rd_table = chip_info->access_table;
42559279c00fSAidan MacDonald 		regmap_config.wr_table = chip_info->access_table;
42569279c00fSAidan MacDonald 	} else {
42579279c00fSAidan MacDonald 		regmap_config.max_register = chip_info->num_chips * chip_info->reg_offset - 4;
42589279c00fSAidan MacDonald 	}
42596626a76eSPaul Cercueil 
42606626a76eSPaul Cercueil 	jzpc->map = devm_regmap_init_mmio(dev, base, &regmap_config);
4261b5c23aa4SPaul Cercueil 	if (IS_ERR(jzpc->map)) {
4262b5c23aa4SPaul Cercueil 		dev_err(dev, "Failed to create regmap\n");
4263b5c23aa4SPaul Cercueil 		return PTR_ERR(jzpc->map);
4264b5c23aa4SPaul Cercueil 	}
4265b5c23aa4SPaul Cercueil 
4266b5c23aa4SPaul Cercueil 	jzpc->dev = dev;
42679aa35178SPaul Cercueil 	jzpc->info = chip_info;
4268b5c23aa4SPaul Cercueil 
4269b5c23aa4SPaul Cercueil 	pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
4270b5c23aa4SPaul Cercueil 	if (!pctl_desc)
4271b5c23aa4SPaul Cercueil 		return -ENOMEM;
4272b5c23aa4SPaul Cercueil 
4273b5c23aa4SPaul Cercueil 	/* fill in pinctrl_desc structure */
4274b5c23aa4SPaul Cercueil 	pctl_desc->name = dev_name(dev);
4275b5c23aa4SPaul Cercueil 	pctl_desc->owner = THIS_MODULE;
4276b5c23aa4SPaul Cercueil 	pctl_desc->pctlops = &ingenic_pctlops;
4277b5c23aa4SPaul Cercueil 	pctl_desc->pmxops = &ingenic_pmxops;
4278b5c23aa4SPaul Cercueil 	pctl_desc->confops = &ingenic_confops;
4279b5c23aa4SPaul Cercueil 	pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
4280a86854d0SKees Cook 	pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev,
4281a86854d0SKees Cook 			pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL);
4282b5c23aa4SPaul Cercueil 	if (!jzpc->pdesc)
4283b5c23aa4SPaul Cercueil 		return -ENOMEM;
4284b5c23aa4SPaul Cercueil 
4285b5c23aa4SPaul Cercueil 	for (i = 0; i < pctl_desc->npins; i++) {
4286b5c23aa4SPaul Cercueil 		jzpc->pdesc[i].number = i;
4287b5c23aa4SPaul Cercueil 		jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
4288b5c23aa4SPaul Cercueil 						'A' + (i / PINS_PER_GPIO_CHIP),
4289b5c23aa4SPaul Cercueil 						i % PINS_PER_GPIO_CHIP);
4290b5c23aa4SPaul Cercueil 	}
4291b5c23aa4SPaul Cercueil 
4292b5c23aa4SPaul Cercueil 	jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
4293e7f4c4bfSDan Carpenter 	if (IS_ERR(jzpc->pctl)) {
4294b5c23aa4SPaul Cercueil 		dev_err(dev, "Failed to register pinctrl\n");
4295e7f4c4bfSDan Carpenter 		return PTR_ERR(jzpc->pctl);
4296b5c23aa4SPaul Cercueil 	}
4297b5c23aa4SPaul Cercueil 
4298b5c23aa4SPaul Cercueil 	for (i = 0; i < chip_info->num_groups; i++) {
4299b5c23aa4SPaul Cercueil 		const struct group_desc *group = &chip_info->groups[i];
4300b5c23aa4SPaul Cercueil 
4301b5c23aa4SPaul Cercueil 		err = pinctrl_generic_add_group(jzpc->pctl, group->name,
4302b5c23aa4SPaul Cercueil 				group->pins, group->num_pins, group->data);
4303823dd71fSPaul Burton 		if (err < 0) {
4304b5c23aa4SPaul Cercueil 			dev_err(dev, "Failed to register group %s\n",
4305b5c23aa4SPaul Cercueil 					group->name);
4306b5c23aa4SPaul Cercueil 			return err;
4307b5c23aa4SPaul Cercueil 		}
4308b5c23aa4SPaul Cercueil 	}
4309b5c23aa4SPaul Cercueil 
4310b5c23aa4SPaul Cercueil 	for (i = 0; i < chip_info->num_functions; i++) {
4311b5c23aa4SPaul Cercueil 		const struct function_desc *func = &chip_info->functions[i];
4312b5c23aa4SPaul Cercueil 
4313b5c23aa4SPaul Cercueil 		err = pinmux_generic_add_function(jzpc->pctl, func->name,
4314b5c23aa4SPaul Cercueil 				func->group_names, func->num_group_names,
4315b5c23aa4SPaul Cercueil 				func->data);
4316823dd71fSPaul Burton 		if (err < 0) {
4317b5c23aa4SPaul Cercueil 			dev_err(dev, "Failed to register function %s\n",
4318b5c23aa4SPaul Cercueil 					func->name);
4319b5c23aa4SPaul Cercueil 			return err;
4320b5c23aa4SPaul Cercueil 		}
4321b5c23aa4SPaul Cercueil 	}
4322b5c23aa4SPaul Cercueil 
4323b5c23aa4SPaul Cercueil 	dev_set_drvdata(dev, jzpc->map);
4324b5c23aa4SPaul Cercueil 
4325*8c943137SAndy Shevchenko 	device_for_each_child_node(dev, fwnode) {
4326*8c943137SAndy Shevchenko 		if (of_match_node(ingenic_gpio_of_matches, to_of_node(fwnode))) {
4327*8c943137SAndy Shevchenko 			err = ingenic_gpio_probe(jzpc, fwnode);
4328d2cd54c2SYang Li 			if (err) {
4329*8c943137SAndy Shevchenko 				fwnode_handle_put(fwnode);
4330b5c23aa4SPaul Cercueil 				return err;
4331b5c23aa4SPaul Cercueil 			}
4332b5c23aa4SPaul Cercueil 		}
4333d2cd54c2SYang Li 	}
4334b5c23aa4SPaul Cercueil 
4335b5c23aa4SPaul Cercueil 	return 0;
4336b5c23aa4SPaul Cercueil }
4337b5c23aa4SPaul Cercueil 
43380ab1438bSMasahiro Yamada #define IF_ENABLED(cfg, ptr)	PTR_IF(IS_ENABLED(cfg), (ptr))
43390ab1438bSMasahiro Yamada 
434028c1caafS周琰杰 (Zhou Yanjie) static const struct of_device_id ingenic_pinctrl_of_matches[] = {
43419aa35178SPaul Cercueil 	{
4342424f3969S周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,jz4730-pinctrl",
4343424f3969S周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_JZ4730, &jz4730_chip_info)
4344424f3969S周琰杰 (Zhou Yanjie) 	},
4345424f3969S周琰杰 (Zhou Yanjie) 	{
43469aa35178SPaul Cercueil 		.compatible = "ingenic,jz4740-pinctrl",
43479aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_JZ4740, &jz4740_chip_info)
43489aa35178SPaul Cercueil 	},
43499aa35178SPaul Cercueil 	{
43509aa35178SPaul Cercueil 		.compatible = "ingenic,jz4725b-pinctrl",
43519aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_JZ4725B, &jz4725b_chip_info)
43529aa35178SPaul Cercueil 	},
43539aa35178SPaul Cercueil 	{
4354215c81a3S周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,jz4750-pinctrl",
4355215c81a3S周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_JZ4750, &jz4750_chip_info)
4356215c81a3S周琰杰 (Zhou Yanjie) 	},
4357b582b5a4S周琰杰 (Zhou Yanjie) 	{
4358b582b5a4S周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,jz4755-pinctrl",
4359b582b5a4S周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_JZ4755, &jz4755_chip_info)
4360b582b5a4S周琰杰 (Zhou Yanjie) 	},
4361b582b5a4S周琰杰 (Zhou Yanjie) 	{
43629aa35178SPaul Cercueil 		.compatible = "ingenic,jz4760-pinctrl",
43639aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_JZ4760, &jz4760_chip_info)
43649aa35178SPaul Cercueil 	},
43659aa35178SPaul Cercueil 	{
43669aa35178SPaul Cercueil 		.compatible = "ingenic,jz4760b-pinctrl",
43679aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_JZ4760, &jz4760_chip_info)
43689aa35178SPaul Cercueil 	},
43699aa35178SPaul Cercueil 	{
43709aa35178SPaul Cercueil 		.compatible = "ingenic,jz4770-pinctrl",
43719aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_JZ4770, &jz4770_chip_info)
43729aa35178SPaul Cercueil 	},
43739aa35178SPaul Cercueil 	{
43740c990740S周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,jz4775-pinctrl",
43750c990740S周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_JZ4775, &jz4775_chip_info)
43760c990740S周琰杰 (Zhou Yanjie) 	},
43770c990740S周琰杰 (Zhou Yanjie) 	{
43789aa35178SPaul Cercueil 		.compatible = "ingenic,jz4780-pinctrl",
43799aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_JZ4780, &jz4780_chip_info)
43809aa35178SPaul Cercueil 	},
43819aa35178SPaul Cercueil 	{
43829aa35178SPaul Cercueil 		.compatible = "ingenic,x1000-pinctrl",
43839aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_X1000, &x1000_chip_info)
43849aa35178SPaul Cercueil 	},
43859aa35178SPaul Cercueil 	{
43869aa35178SPaul Cercueil 		.compatible = "ingenic,x1000e-pinctrl",
43879aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_X1000, &x1000_chip_info)
43889aa35178SPaul Cercueil 	},
43899aa35178SPaul Cercueil 	{
43909aa35178SPaul Cercueil 		.compatible = "ingenic,x1500-pinctrl",
43919aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_X1500, &x1500_chip_info)
43929aa35178SPaul Cercueil 	},
43939aa35178SPaul Cercueil 	{
43949aa35178SPaul Cercueil 		.compatible = "ingenic,x1830-pinctrl",
43959aa35178SPaul Cercueil 		.data = IF_ENABLED(CONFIG_MACH_X1830, &x1830_chip_info)
43969aa35178SPaul Cercueil 	},
4397943e0da1S周琰杰 (Zhou Yanjie) 	{
4398943e0da1S周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,x2000-pinctrl",
4399943e0da1S周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_X2000, &x2000_chip_info)
4400943e0da1S周琰杰 (Zhou Yanjie) 	},
4401943e0da1S周琰杰 (Zhou Yanjie) 	{
4402943e0da1S周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,x2000e-pinctrl",
4403943e0da1S周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_X2000, &x2000_chip_info)
4404943e0da1S周琰杰 (Zhou Yanjie) 	},
44052a18211bS周琰杰 (Zhou Yanjie) 	{
44062a18211bS周琰杰 (Zhou Yanjie) 		.compatible = "ingenic,x2100-pinctrl",
44072a18211bS周琰杰 (Zhou Yanjie) 		.data = IF_ENABLED(CONFIG_MACH_X2100, &x2100_chip_info)
44082a18211bS周琰杰 (Zhou Yanjie) 	},
44099aa35178SPaul Cercueil 	{ /* sentinel */ },
4410baf15647SPaul Cercueil };
4411baf15647SPaul Cercueil 
4412b5c23aa4SPaul Cercueil static struct platform_driver ingenic_pinctrl_driver = {
4413b5c23aa4SPaul Cercueil 	.driver = {
4414b5c23aa4SPaul Cercueil 		.name = "pinctrl-ingenic",
441528c1caafS周琰杰 (Zhou Yanjie) 		.of_match_table = ingenic_pinctrl_of_matches,
4416b5c23aa4SPaul Cercueil 	},
4417b5c23aa4SPaul Cercueil };
4418b5c23aa4SPaul Cercueil 
4419b5c23aa4SPaul Cercueil static int __init ingenic_pinctrl_drv_register(void)
4420b5c23aa4SPaul Cercueil {
44214717b11fSPaul Cercueil 	return platform_driver_probe(&ingenic_pinctrl_driver,
44224717b11fSPaul Cercueil 				     ingenic_pinctrl_probe);
4423b5c23aa4SPaul Cercueil }
4424556a36a7SPaul Cercueil subsys_initcall(ingenic_pinctrl_drv_register);
4425