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