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