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