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