2 * Ingenic SoCs pinctrl driver
4 * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
6 * License terms: GNU General Public License (GPL) version 2
9 #include <linux/compiler.h>
10 #include <linux/gpio/driver.h>
11 #include <linux/interrupt.h>
13 #include <linux/of_device.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_platform.h>
16 #include <linux/pinctrl/pinctrl.h>
17 #include <linux/pinctrl/pinmux.h>
18 #include <linux/pinctrl/pinconf.h>
19 #include <linux/pinctrl/pinconf-generic.h>
20 #include <linux/platform_device.h>
21 #include <linux/regmap.h>
22 #include <linux/slab.h>
31 #define JZ4740_GPIO_DATA 0x10
32 #define JZ4740_GPIO_PULL_DIS 0x30
33 #define JZ4740_GPIO_FUNC 0x40
34 #define JZ4740_GPIO_SELECT 0x50
35 #define JZ4740_GPIO_DIR 0x60
36 #define JZ4740_GPIO_TRIG 0x70
37 #define JZ4740_GPIO_FLAG 0x80
39 #define JZ4770_GPIO_INT 0x10
40 #define JZ4770_GPIO_PAT1 0x30
41 #define JZ4770_GPIO_PAT0 0x40
42 #define JZ4770_GPIO_FLAG 0x50
43 #define JZ4770_GPIO_PEN 0x70
45 #define REG_SET(x) ((x) + 0x4)
46 #define REG_CLEAR(x) ((x) + 0x8)
48 #define PINS_PER_GPIO_CHIP 32
57 struct ingenic_chip_info
{
58 unsigned int num_chips
;
60 const struct group_desc
*groups
;
61 unsigned int num_groups
;
63 const struct function_desc
*functions
;
64 unsigned int num_functions
;
66 const u32
*pull_ups
, *pull_downs
;
69 struct ingenic_pinctrl
{
72 struct pinctrl_dev
*pctl
;
73 struct pinctrl_pin_desc
*pdesc
;
74 enum jz_version version
;
76 const struct ingenic_chip_info
*info
;
79 struct ingenic_gpio_chip
{
80 struct ingenic_pinctrl
*jzpc
;
82 struct irq_chip irq_chip
;
83 unsigned int irq
, reg_base
;
86 static const u32 jz4740_pull_ups
[4] = {
87 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
90 static const u32 jz4740_pull_downs
[4] = {
91 0x00000000, 0x00000000, 0x00000000, 0x00000000,
94 static int jz4740_mmc_1bit_pins
[] = { 0x69, 0x68, 0x6a, };
95 static int jz4740_mmc_4bit_pins
[] = { 0x6b, 0x6c, 0x6d, };
96 static int jz4740_uart0_data_pins
[] = { 0x7a, 0x79, };
97 static int jz4740_uart0_hwflow_pins
[] = { 0x7e, 0x7f, };
98 static int jz4740_uart1_data_pins
[] = { 0x7e, 0x7f, };
99 static int jz4740_lcd_8bit_pins
[] = {
100 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x52, 0x53, 0x54,
102 static int jz4740_lcd_16bit_pins
[] = {
103 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55,
105 static int jz4740_lcd_18bit_pins
[] = { 0x50, 0x51, };
106 static int jz4740_lcd_18bit_tft_pins
[] = { 0x56, 0x57, 0x31, 0x32, };
107 static int jz4740_nand_cs1_pins
[] = { 0x39, };
108 static int jz4740_nand_cs2_pins
[] = { 0x3a, };
109 static int jz4740_nand_cs3_pins
[] = { 0x3b, };
110 static int jz4740_nand_cs4_pins
[] = { 0x3c, };
111 static int jz4740_pwm_pwm0_pins
[] = { 0x77, };
112 static int jz4740_pwm_pwm1_pins
[] = { 0x78, };
113 static int jz4740_pwm_pwm2_pins
[] = { 0x79, };
114 static int jz4740_pwm_pwm3_pins
[] = { 0x7a, };
115 static int jz4740_pwm_pwm4_pins
[] = { 0x7b, };
116 static int jz4740_pwm_pwm5_pins
[] = { 0x7c, };
117 static int jz4740_pwm_pwm6_pins
[] = { 0x7e, };
118 static int jz4740_pwm_pwm7_pins
[] = { 0x7f, };
120 static int jz4740_mmc_1bit_funcs
[] = { 0, 0, 0, };
121 static int jz4740_mmc_4bit_funcs
[] = { 0, 0, 0, };
122 static int jz4740_uart0_data_funcs
[] = { 1, 1, };
123 static int jz4740_uart0_hwflow_funcs
[] = { 1, 1, };
124 static int jz4740_uart1_data_funcs
[] = { 2, 2, };
125 static int jz4740_lcd_8bit_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
126 static int jz4740_lcd_16bit_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, };
127 static int jz4740_lcd_18bit_funcs
[] = { 0, 0, };
128 static int jz4740_lcd_18bit_tft_funcs
[] = { 0, 0, 0, 0, };
129 static int jz4740_nand_cs1_funcs
[] = { 0, };
130 static int jz4740_nand_cs2_funcs
[] = { 0, };
131 static int jz4740_nand_cs3_funcs
[] = { 0, };
132 static int jz4740_nand_cs4_funcs
[] = { 0, };
133 static int jz4740_pwm_pwm0_funcs
[] = { 0, };
134 static int jz4740_pwm_pwm1_funcs
[] = { 0, };
135 static int jz4740_pwm_pwm2_funcs
[] = { 0, };
136 static int jz4740_pwm_pwm3_funcs
[] = { 0, };
137 static int jz4740_pwm_pwm4_funcs
[] = { 0, };
138 static int jz4740_pwm_pwm5_funcs
[] = { 0, };
139 static int jz4740_pwm_pwm6_funcs
[] = { 0, };
140 static int jz4740_pwm_pwm7_funcs
[] = { 0, };
142 #define INGENIC_PIN_GROUP(name, id) \
146 ARRAY_SIZE(id##_pins), \
150 static const struct group_desc jz4740_groups
[] = {
151 INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit
),
152 INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit
),
153 INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data
),
154 INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow
),
155 INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data
),
156 INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit
),
157 INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit
),
158 INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit
),
159 INGENIC_PIN_GROUP("lcd-18bit-tft", jz4740_lcd_18bit_tft
),
161 INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1
),
162 INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2
),
163 INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3
),
164 INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4
),
165 INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0
),
166 INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1
),
167 INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2
),
168 INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3
),
169 INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4
),
170 INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5
),
171 INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6
),
172 INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7
),
175 static const char *jz4740_mmc_groups
[] = { "mmc-1bit", "mmc-4bit", };
176 static const char *jz4740_uart0_groups
[] = { "uart0-data", "uart0-hwflow", };
177 static const char *jz4740_uart1_groups
[] = { "uart1-data", };
178 static const char *jz4740_lcd_groups
[] = {
179 "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-18bit-tft", "lcd-no-pins",
181 static const char *jz4740_nand_groups
[] = {
182 "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
184 static const char *jz4740_pwm0_groups
[] = { "pwm0", };
185 static const char *jz4740_pwm1_groups
[] = { "pwm1", };
186 static const char *jz4740_pwm2_groups
[] = { "pwm2", };
187 static const char *jz4740_pwm3_groups
[] = { "pwm3", };
188 static const char *jz4740_pwm4_groups
[] = { "pwm4", };
189 static const char *jz4740_pwm5_groups
[] = { "pwm5", };
190 static const char *jz4740_pwm6_groups
[] = { "pwm6", };
191 static const char *jz4740_pwm7_groups
[] = { "pwm7", };
193 static const struct function_desc jz4740_functions
[] = {
194 { "mmc", jz4740_mmc_groups
, ARRAY_SIZE(jz4740_mmc_groups
), },
195 { "uart0", jz4740_uart0_groups
, ARRAY_SIZE(jz4740_uart0_groups
), },
196 { "uart1", jz4740_uart1_groups
, ARRAY_SIZE(jz4740_uart1_groups
), },
197 { "lcd", jz4740_lcd_groups
, ARRAY_SIZE(jz4740_lcd_groups
), },
198 { "nand", jz4740_nand_groups
, ARRAY_SIZE(jz4740_nand_groups
), },
199 { "pwm0", jz4740_pwm0_groups
, ARRAY_SIZE(jz4740_pwm0_groups
), },
200 { "pwm1", jz4740_pwm1_groups
, ARRAY_SIZE(jz4740_pwm1_groups
), },
201 { "pwm2", jz4740_pwm2_groups
, ARRAY_SIZE(jz4740_pwm2_groups
), },
202 { "pwm3", jz4740_pwm3_groups
, ARRAY_SIZE(jz4740_pwm3_groups
), },
203 { "pwm4", jz4740_pwm4_groups
, ARRAY_SIZE(jz4740_pwm4_groups
), },
204 { "pwm5", jz4740_pwm5_groups
, ARRAY_SIZE(jz4740_pwm5_groups
), },
205 { "pwm6", jz4740_pwm6_groups
, ARRAY_SIZE(jz4740_pwm6_groups
), },
206 { "pwm7", jz4740_pwm7_groups
, ARRAY_SIZE(jz4740_pwm7_groups
), },
209 static const struct ingenic_chip_info jz4740_chip_info
= {
211 .groups
= jz4740_groups
,
212 .num_groups
= ARRAY_SIZE(jz4740_groups
),
213 .functions
= jz4740_functions
,
214 .num_functions
= ARRAY_SIZE(jz4740_functions
),
215 .pull_ups
= jz4740_pull_ups
,
216 .pull_downs
= jz4740_pull_downs
,
219 static int jz4725b_mmc0_1bit_pins
[] = { 0x48, 0x49, 0x5c, };
220 static int jz4725b_mmc0_4bit_pins
[] = { 0x5d, 0x5b, 0x56, };
221 static int jz4725b_mmc1_1bit_pins
[] = { 0x7a, 0x7b, 0x7c, };
222 static int jz4725b_mmc1_4bit_pins
[] = { 0x7d, 0x7e, 0x7f, };
223 static int jz4725b_uart_data_pins
[] = { 0x4c, 0x4d, };
224 static int jz4725b_nand_cs1_pins
[] = { 0x55, };
225 static int jz4725b_nand_cs2_pins
[] = { 0x56, };
226 static int jz4725b_nand_cs3_pins
[] = { 0x57, };
227 static int jz4725b_nand_cs4_pins
[] = { 0x58, };
228 static int jz4725b_nand_cle_ale_pins
[] = { 0x48, 0x49 };
229 static int jz4725b_nand_fre_fwe_pins
[] = { 0x5c, 0x5d };
230 static int jz4725b_pwm_pwm0_pins
[] = { 0x4a, };
231 static int jz4725b_pwm_pwm1_pins
[] = { 0x4b, };
232 static int jz4725b_pwm_pwm2_pins
[] = { 0x4c, };
233 static int jz4725b_pwm_pwm3_pins
[] = { 0x4d, };
234 static int jz4725b_pwm_pwm4_pins
[] = { 0x4e, };
235 static int jz4725b_pwm_pwm5_pins
[] = { 0x4f, };
236 static int jz4725b_lcd_8bit_pins
[] = {
238 0x60, 0x61, 0x62, 0x63,
239 0x64, 0x65, 0x66, 0x67,
241 static int jz4725b_lcd_16bit_pins
[] = {
242 0x68, 0x69, 0x6a, 0x6b,
243 0x6c, 0x6d, 0x6e, 0x6f,
245 static int jz4725b_lcd_18bit_pins
[] = { 0x70, 0x71, };
246 static int jz4725b_lcd_24bit_pins
[] = { 0x76, 0x77, 0x78, 0x79, };
247 static int jz4725b_lcd_special_pins
[] = { 0x76, 0x77, 0x78, 0x79, };
248 static int jz4725b_lcd_generic_pins
[] = { 0x75, };
250 static int jz4725b_mmc0_1bit_funcs
[] = { 1, 1, 1, };
251 static int jz4725b_mmc0_4bit_funcs
[] = { 1, 0, 1, };
252 static int jz4725b_mmc1_1bit_funcs
[] = { 0, 0, 0, };
253 static int jz4725b_mmc1_4bit_funcs
[] = { 0, 0, 0, };
254 static int jz4725b_uart_data_funcs
[] = { 1, 1, };
255 static int jz4725b_nand_cs1_funcs
[] = { 0, };
256 static int jz4725b_nand_cs2_funcs
[] = { 0, };
257 static int jz4725b_nand_cs3_funcs
[] = { 0, };
258 static int jz4725b_nand_cs4_funcs
[] = { 0, };
259 static int jz4725b_nand_cle_ale_funcs
[] = { 0, 0, };
260 static int jz4725b_nand_fre_fwe_funcs
[] = { 0, 0, };
261 static int jz4725b_pwm_pwm0_funcs
[] = { 0, };
262 static int jz4725b_pwm_pwm1_funcs
[] = { 0, };
263 static int jz4725b_pwm_pwm2_funcs
[] = { 0, };
264 static int jz4725b_pwm_pwm3_funcs
[] = { 0, };
265 static int jz4725b_pwm_pwm4_funcs
[] = { 0, };
266 static int jz4725b_pwm_pwm5_funcs
[] = { 0, };
267 static int jz4725b_lcd_8bit_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
268 static int jz4725b_lcd_16bit_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
269 static int jz4725b_lcd_18bit_funcs
[] = { 0, 0, };
270 static int jz4725b_lcd_24bit_funcs
[] = { 1, 1, 1, 1, };
271 static int jz4725b_lcd_special_funcs
[] = { 0, 0, 0, 0, };
272 static int jz4725b_lcd_generic_funcs
[] = { 0, };
274 static const struct group_desc jz4725b_groups
[] = {
275 INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit
),
276 INGENIC_PIN_GROUP("mmc0-4bit", jz4725b_mmc0_4bit
),
277 INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit
),
278 INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit
),
279 INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data
),
280 INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1
),
281 INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2
),
282 INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3
),
283 INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4
),
284 INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale
),
285 INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe
),
286 INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0
),
287 INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1
),
288 INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2
),
289 INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3
),
290 INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4
),
291 INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5
),
292 INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit
),
293 INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit
),
294 INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit
),
295 INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit
),
296 INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special
),
297 INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic
),
300 static const char *jz4725b_mmc0_groups
[] = { "mmc0-1bit", "mmc0-4bit", };
301 static const char *jz4725b_mmc1_groups
[] = { "mmc1-1bit", "mmc1-4bit", };
302 static const char *jz4725b_uart_groups
[] = { "uart-data", };
303 static const char *jz4725b_nand_groups
[] = {
304 "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
305 "nand-cle-ale", "nand-fre-fwe",
307 static const char *jz4725b_pwm0_groups
[] = { "pwm0", };
308 static const char *jz4725b_pwm1_groups
[] = { "pwm1", };
309 static const char *jz4725b_pwm2_groups
[] = { "pwm2", };
310 static const char *jz4725b_pwm3_groups
[] = { "pwm3", };
311 static const char *jz4725b_pwm4_groups
[] = { "pwm4", };
312 static const char *jz4725b_pwm5_groups
[] = { "pwm5", };
313 static const char *jz4725b_lcd_groups
[] = {
314 "lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
315 "lcd-special", "lcd-generic",
318 static const struct function_desc jz4725b_functions
[] = {
319 { "mmc0", jz4725b_mmc0_groups
, ARRAY_SIZE(jz4725b_mmc0_groups
), },
320 { "mmc1", jz4725b_mmc1_groups
, ARRAY_SIZE(jz4725b_mmc1_groups
), },
321 { "uart", jz4725b_uart_groups
, ARRAY_SIZE(jz4725b_uart_groups
), },
322 { "nand", jz4725b_nand_groups
, ARRAY_SIZE(jz4725b_nand_groups
), },
323 { "pwm0", jz4725b_pwm0_groups
, ARRAY_SIZE(jz4725b_pwm0_groups
), },
324 { "pwm1", jz4725b_pwm1_groups
, ARRAY_SIZE(jz4725b_pwm1_groups
), },
325 { "pwm2", jz4725b_pwm2_groups
, ARRAY_SIZE(jz4725b_pwm2_groups
), },
326 { "pwm3", jz4725b_pwm3_groups
, ARRAY_SIZE(jz4725b_pwm3_groups
), },
327 { "pwm4", jz4725b_pwm4_groups
, ARRAY_SIZE(jz4725b_pwm4_groups
), },
328 { "pwm5", jz4725b_pwm5_groups
, ARRAY_SIZE(jz4725b_pwm5_groups
), },
329 { "lcd", jz4725b_lcd_groups
, ARRAY_SIZE(jz4725b_lcd_groups
), },
332 static const struct ingenic_chip_info jz4725b_chip_info
= {
334 .groups
= jz4725b_groups
,
335 .num_groups
= ARRAY_SIZE(jz4725b_groups
),
336 .functions
= jz4725b_functions
,
337 .num_functions
= ARRAY_SIZE(jz4725b_functions
),
338 .pull_ups
= jz4740_pull_ups
,
339 .pull_downs
= jz4740_pull_downs
,
342 static const u32 jz4770_pull_ups
[6] = {
343 0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f,
346 static const u32 jz4770_pull_downs
[6] = {
347 0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
350 static int jz4770_uart0_data_pins
[] = { 0xa0, 0xa3, };
351 static int jz4770_uart0_hwflow_pins
[] = { 0xa1, 0xa2, };
352 static int jz4770_uart1_data_pins
[] = { 0x7a, 0x7c, };
353 static int jz4770_uart1_hwflow_pins
[] = { 0x7b, 0x7d, };
354 static int jz4770_uart2_data_pins
[] = { 0x5c, 0x5e, };
355 static int jz4770_uart2_hwflow_pins
[] = { 0x5d, 0x5f, };
356 static int jz4770_uart3_data_pins
[] = { 0x6c, 0x85, };
357 static int jz4770_uart3_hwflow_pins
[] = { 0x88, 0x89, };
358 static int jz4770_mmc0_1bit_a_pins
[] = { 0x12, 0x13, 0x14, };
359 static int jz4770_mmc0_4bit_a_pins
[] = { 0x15, 0x16, 0x17, };
360 static int jz4770_mmc0_1bit_e_pins
[] = { 0x9c, 0x9d, 0x94, };
361 static int jz4770_mmc0_4bit_e_pins
[] = { 0x95, 0x96, 0x97, };
362 static int jz4770_mmc0_8bit_e_pins
[] = { 0x98, 0x99, 0x9a, 0x9b, };
363 static int jz4770_mmc1_1bit_d_pins
[] = { 0x78, 0x79, 0x74, };
364 static int jz4770_mmc1_4bit_d_pins
[] = { 0x75, 0x76, 0x77, };
365 static int jz4770_mmc1_1bit_e_pins
[] = { 0x9c, 0x9d, 0x94, };
366 static int jz4770_mmc1_4bit_e_pins
[] = { 0x95, 0x96, 0x97, };
367 static int jz4770_mmc1_8bit_e_pins
[] = { 0x98, 0x99, 0x9a, 0x9b, };
368 static int jz4770_mmc2_1bit_b_pins
[] = { 0x3c, 0x3d, 0x34, };
369 static int jz4770_mmc2_4bit_b_pins
[] = { 0x35, 0x3e, 0x3f, };
370 static int jz4770_mmc2_1bit_e_pins
[] = { 0x9c, 0x9d, 0x94, };
371 static int jz4770_mmc2_4bit_e_pins
[] = { 0x95, 0x96, 0x97, };
372 static int jz4770_mmc2_8bit_e_pins
[] = { 0x98, 0x99, 0x9a, 0x9b, };
373 static int jz4770_nemc_8bit_data_pins
[] = {
374 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
376 static int jz4770_nemc_16bit_data_pins
[] = {
377 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
379 static int jz4770_nemc_cle_ale_pins
[] = { 0x20, 0x21, };
380 static int jz4770_nemc_addr_pins
[] = { 0x22, 0x23, 0x24, 0x25, };
381 static int jz4770_nemc_rd_we_pins
[] = { 0x10, 0x11, };
382 static int jz4770_nemc_frd_fwe_pins
[] = { 0x12, 0x13, };
383 static int jz4770_nemc_wait_pins
[] = { 0x1b, };
384 static int jz4770_nemc_cs1_pins
[] = { 0x15, };
385 static int jz4770_nemc_cs2_pins
[] = { 0x16, };
386 static int jz4770_nemc_cs3_pins
[] = { 0x17, };
387 static int jz4770_nemc_cs4_pins
[] = { 0x18, };
388 static int jz4770_nemc_cs5_pins
[] = { 0x19, };
389 static int jz4770_nemc_cs6_pins
[] = { 0x1a, };
390 static int jz4770_i2c0_pins
[] = { 0x7e, 0x7f, };
391 static int jz4770_i2c1_pins
[] = { 0x9e, 0x9f, };
392 static int jz4770_i2c2_pins
[] = { 0xb0, 0xb1, };
393 static int jz4770_cim_8bit_pins
[] = {
394 0x26, 0x27, 0x28, 0x29,
395 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
397 static int jz4770_cim_12bit_pins
[] = {
398 0x32, 0x33, 0xb0, 0xb1,
400 static int jz4770_lcd_24bit_pins
[] = {
401 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
402 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
403 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
404 0x58, 0x59, 0x5a, 0x5b,
406 static int jz4770_pwm_pwm0_pins
[] = { 0x80, };
407 static int jz4770_pwm_pwm1_pins
[] = { 0x81, };
408 static int jz4770_pwm_pwm2_pins
[] = { 0x82, };
409 static int jz4770_pwm_pwm3_pins
[] = { 0x83, };
410 static int jz4770_pwm_pwm4_pins
[] = { 0x84, };
411 static int jz4770_pwm_pwm5_pins
[] = { 0x85, };
412 static int jz4770_pwm_pwm6_pins
[] = { 0x6a, };
413 static int jz4770_pwm_pwm7_pins
[] = { 0x6b, };
414 static int jz4770_mac_rmii_pins
[] = {
415 0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
417 static int jz4770_mac_mii_pins
[] = { 0xa7, 0xaf, };
419 static int jz4770_uart0_data_funcs
[] = { 0, 0, };
420 static int jz4770_uart0_hwflow_funcs
[] = { 0, 0, };
421 static int jz4770_uart1_data_funcs
[] = { 0, 0, };
422 static int jz4770_uart1_hwflow_funcs
[] = { 0, 0, };
423 static int jz4770_uart2_data_funcs
[] = { 0, 0, };
424 static int jz4770_uart2_hwflow_funcs
[] = { 0, 0, };
425 static int jz4770_uart3_data_funcs
[] = { 0, 1, };
426 static int jz4770_uart3_hwflow_funcs
[] = { 0, 0, };
427 static int jz4770_mmc0_1bit_a_funcs
[] = { 1, 1, 0, };
428 static int jz4770_mmc0_4bit_a_funcs
[] = { 1, 1, 1, };
429 static int jz4770_mmc0_1bit_e_funcs
[] = { 0, 0, 0, };
430 static int jz4770_mmc0_4bit_e_funcs
[] = { 0, 0, 0, };
431 static int jz4770_mmc0_8bit_e_funcs
[] = { 0, 0, 0, 0, };
432 static int jz4770_mmc1_1bit_d_funcs
[] = { 0, 0, 0, };
433 static int jz4770_mmc1_4bit_d_funcs
[] = { 0, 0, 0, };
434 static int jz4770_mmc1_1bit_e_funcs
[] = { 1, 1, 1, };
435 static int jz4770_mmc1_4bit_e_funcs
[] = { 1, 1, 1, };
436 static int jz4770_mmc1_8bit_e_funcs
[] = { 1, 1, 1, 1, };
437 static int jz4770_mmc2_1bit_b_funcs
[] = { 0, 0, 0, };
438 static int jz4770_mmc2_4bit_b_funcs
[] = { 0, 0, 0, };
439 static int jz4770_mmc2_1bit_e_funcs
[] = { 2, 2, 2, };
440 static int jz4770_mmc2_4bit_e_funcs
[] = { 2, 2, 2, };
441 static int jz4770_mmc2_8bit_e_funcs
[] = { 2, 2, 2, 2, };
442 static int jz4770_nemc_8bit_data_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
443 static int jz4770_nemc_16bit_data_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
444 static int jz4770_nemc_cle_ale_funcs
[] = { 0, 0, };
445 static int jz4770_nemc_addr_funcs
[] = { 0, 0, 0, 0, };
446 static int jz4770_nemc_rd_we_funcs
[] = { 0, 0, };
447 static int jz4770_nemc_frd_fwe_funcs
[] = { 0, 0, };
448 static int jz4770_nemc_wait_funcs
[] = { 0, };
449 static int jz4770_nemc_cs1_funcs
[] = { 0, };
450 static int jz4770_nemc_cs2_funcs
[] = { 0, };
451 static int jz4770_nemc_cs3_funcs
[] = { 0, };
452 static int jz4770_nemc_cs4_funcs
[] = { 0, };
453 static int jz4770_nemc_cs5_funcs
[] = { 0, };
454 static int jz4770_nemc_cs6_funcs
[] = { 0, };
455 static int jz4770_i2c0_funcs
[] = { 0, 0, };
456 static int jz4770_i2c1_funcs
[] = { 0, 0, };
457 static int jz4770_i2c2_funcs
[] = { 2, 2, };
458 static int jz4770_cim_8bit_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
459 static int jz4770_cim_12bit_funcs
[] = { 0, 0, 0, 0, };
460 static int jz4770_lcd_24bit_funcs
[] = {
461 0, 0, 0, 0, 0, 0, 0, 0,
462 0, 0, 0, 0, 0, 0, 0, 0,
463 0, 0, 0, 0, 0, 0, 0, 0,
466 static int jz4770_pwm_pwm0_funcs
[] = { 0, };
467 static int jz4770_pwm_pwm1_funcs
[] = { 0, };
468 static int jz4770_pwm_pwm2_funcs
[] = { 0, };
469 static int jz4770_pwm_pwm3_funcs
[] = { 0, };
470 static int jz4770_pwm_pwm4_funcs
[] = { 0, };
471 static int jz4770_pwm_pwm5_funcs
[] = { 0, };
472 static int jz4770_pwm_pwm6_funcs
[] = { 0, };
473 static int jz4770_pwm_pwm7_funcs
[] = { 0, };
474 static int jz4770_mac_rmii_funcs
[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
475 static int jz4770_mac_mii_funcs
[] = { 0, 0, };
477 static const struct group_desc jz4770_groups
[] = {
478 INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data
),
479 INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow
),
480 INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data
),
481 INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow
),
482 INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data
),
483 INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow
),
484 INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data
),
485 INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow
),
486 INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a
),
487 INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a
),
488 INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e
),
489 INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e
),
490 INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e
),
491 INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d
),
492 INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d
),
493 INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e
),
494 INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e
),
495 INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e
),
496 INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b
),
497 INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b
),
498 INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e
),
499 INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e
),
500 INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e
),
501 INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data
),
502 INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data
),
503 INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale
),
504 INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr
),
505 INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we
),
506 INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe
),
507 INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait
),
508 INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1
),
509 INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2
),
510 INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3
),
511 INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4
),
512 INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5
),
513 INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6
),
514 INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0
),
515 INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1
),
516 INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2
),
517 INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit
),
518 INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit
),
519 INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit
),
521 INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0
),
522 INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1
),
523 INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2
),
524 INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3
),
525 INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4
),
526 INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5
),
527 INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6
),
528 INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7
),
529 INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii
),
530 INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii
),
533 static const char *jz4770_uart0_groups
[] = { "uart0-data", "uart0-hwflow", };
534 static const char *jz4770_uart1_groups
[] = { "uart1-data", "uart1-hwflow", };
535 static const char *jz4770_uart2_groups
[] = { "uart2-data", "uart2-hwflow", };
536 static const char *jz4770_uart3_groups
[] = { "uart3-data", "uart3-hwflow", };
537 static const char *jz4770_mmc0_groups
[] = {
538 "mmc0-1bit-a", "mmc0-4bit-a",
539 "mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
541 static const char *jz4770_mmc1_groups
[] = {
542 "mmc1-1bit-d", "mmc1-4bit-d",
543 "mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
545 static const char *jz4770_mmc2_groups
[] = {
546 "mmc2-1bit-b", "mmc2-4bit-b",
547 "mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
549 static const char *jz4770_nemc_groups
[] = {
550 "nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
551 "nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
553 static const char *jz4770_cs1_groups
[] = { "nemc-cs1", };
554 static const char *jz4770_cs2_groups
[] = { "nemc-cs2", };
555 static const char *jz4770_cs3_groups
[] = { "nemc-cs3", };
556 static const char *jz4770_cs4_groups
[] = { "nemc-cs4", };
557 static const char *jz4770_cs5_groups
[] = { "nemc-cs5", };
558 static const char *jz4770_cs6_groups
[] = { "nemc-cs6", };
559 static const char *jz4770_i2c0_groups
[] = { "i2c0-data", };
560 static const char *jz4770_i2c1_groups
[] = { "i2c1-data", };
561 static const char *jz4770_i2c2_groups
[] = { "i2c2-data", };
562 static const char *jz4770_cim_groups
[] = { "cim-data-8bit", "cim-data-12bit", };
563 static const char *jz4770_lcd_groups
[] = { "lcd-24bit", "lcd-no-pins", };
564 static const char *jz4770_pwm0_groups
[] = { "pwm0", };
565 static const char *jz4770_pwm1_groups
[] = { "pwm1", };
566 static const char *jz4770_pwm2_groups
[] = { "pwm2", };
567 static const char *jz4770_pwm3_groups
[] = { "pwm3", };
568 static const char *jz4770_pwm4_groups
[] = { "pwm4", };
569 static const char *jz4770_pwm5_groups
[] = { "pwm5", };
570 static const char *jz4770_pwm6_groups
[] = { "pwm6", };
571 static const char *jz4770_pwm7_groups
[] = { "pwm7", };
572 static const char *jz4770_mac_groups
[] = { "mac-rmii", "mac-mii", };
574 static const struct function_desc jz4770_functions
[] = {
575 { "uart0", jz4770_uart0_groups
, ARRAY_SIZE(jz4770_uart0_groups
), },
576 { "uart1", jz4770_uart1_groups
, ARRAY_SIZE(jz4770_uart1_groups
), },
577 { "uart2", jz4770_uart2_groups
, ARRAY_SIZE(jz4770_uart2_groups
), },
578 { "uart3", jz4770_uart3_groups
, ARRAY_SIZE(jz4770_uart3_groups
), },
579 { "mmc0", jz4770_mmc0_groups
, ARRAY_SIZE(jz4770_mmc0_groups
), },
580 { "mmc1", jz4770_mmc1_groups
, ARRAY_SIZE(jz4770_mmc1_groups
), },
581 { "mmc2", jz4770_mmc2_groups
, ARRAY_SIZE(jz4770_mmc2_groups
), },
582 { "nemc", jz4770_nemc_groups
, ARRAY_SIZE(jz4770_nemc_groups
), },
583 { "nemc-cs1", jz4770_cs1_groups
, ARRAY_SIZE(jz4770_cs1_groups
), },
584 { "nemc-cs2", jz4770_cs2_groups
, ARRAY_SIZE(jz4770_cs2_groups
), },
585 { "nemc-cs3", jz4770_cs3_groups
, ARRAY_SIZE(jz4770_cs3_groups
), },
586 { "nemc-cs4", jz4770_cs4_groups
, ARRAY_SIZE(jz4770_cs4_groups
), },
587 { "nemc-cs5", jz4770_cs5_groups
, ARRAY_SIZE(jz4770_cs5_groups
), },
588 { "nemc-cs6", jz4770_cs6_groups
, ARRAY_SIZE(jz4770_cs6_groups
), },
589 { "i2c0", jz4770_i2c0_groups
, ARRAY_SIZE(jz4770_i2c0_groups
), },
590 { "i2c1", jz4770_i2c1_groups
, ARRAY_SIZE(jz4770_i2c1_groups
), },
591 { "i2c2", jz4770_i2c2_groups
, ARRAY_SIZE(jz4770_i2c2_groups
), },
592 { "cim", jz4770_cim_groups
, ARRAY_SIZE(jz4770_cim_groups
), },
593 { "lcd", jz4770_lcd_groups
, ARRAY_SIZE(jz4770_lcd_groups
), },
594 { "pwm0", jz4770_pwm0_groups
, ARRAY_SIZE(jz4770_pwm0_groups
), },
595 { "pwm1", jz4770_pwm1_groups
, ARRAY_SIZE(jz4770_pwm1_groups
), },
596 { "pwm2", jz4770_pwm2_groups
, ARRAY_SIZE(jz4770_pwm2_groups
), },
597 { "pwm3", jz4770_pwm3_groups
, ARRAY_SIZE(jz4770_pwm3_groups
), },
598 { "pwm4", jz4770_pwm4_groups
, ARRAY_SIZE(jz4770_pwm4_groups
), },
599 { "pwm5", jz4770_pwm5_groups
, ARRAY_SIZE(jz4770_pwm5_groups
), },
600 { "pwm6", jz4770_pwm6_groups
, ARRAY_SIZE(jz4770_pwm6_groups
), },
601 { "pwm7", jz4770_pwm7_groups
, ARRAY_SIZE(jz4770_pwm7_groups
), },
602 { "mac", jz4770_mac_groups
, ARRAY_SIZE(jz4770_mac_groups
), },
605 static const struct ingenic_chip_info jz4770_chip_info
= {
607 .groups
= jz4770_groups
,
608 .num_groups
= ARRAY_SIZE(jz4770_groups
),
609 .functions
= jz4770_functions
,
610 .num_functions
= ARRAY_SIZE(jz4770_functions
),
611 .pull_ups
= jz4770_pull_ups
,
612 .pull_downs
= jz4770_pull_downs
,
615 static int jz4780_uart2_data_pins
[] = { 0x66, 0x67, };
616 static int jz4780_uart2_hwflow_pins
[] = { 0x65, 0x64, };
617 static int jz4780_uart4_data_pins
[] = { 0x54, 0x4a, };
618 static int jz4780_mmc0_8bit_a_pins
[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
619 static int jz4780_i2c3_pins
[] = { 0x6a, 0x6b, };
620 static int jz4780_i2c4_e_pins
[] = { 0x8c, 0x8d, };
621 static int jz4780_i2c4_f_pins
[] = { 0xb9, 0xb8, };
623 static int jz4780_uart2_data_funcs
[] = { 1, 1, };
624 static int jz4780_uart2_hwflow_funcs
[] = { 1, 1, };
625 static int jz4780_uart4_data_funcs
[] = { 2, 2, };
626 static int jz4780_mmc0_8bit_a_funcs
[] = { 1, 1, 1, 1, 1, };
627 static int jz4780_i2c3_funcs
[] = { 1, 1, };
628 static int jz4780_i2c4_e_funcs
[] = { 1, 1, };
629 static int jz4780_i2c4_f_funcs
[] = { 1, 1, };
631 static const struct group_desc jz4780_groups
[] = {
632 INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data
),
633 INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow
),
634 INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data
),
635 INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow
),
636 INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data
),
637 INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow
),
638 INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data
),
639 INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow
),
640 INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data
),
641 INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a
),
642 INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a
),
643 INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a
),
644 INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e
),
645 INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e
),
646 INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d
),
647 INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d
),
648 INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e
),
649 INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e
),
650 INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b
),
651 INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b
),
652 INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e
),
653 INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e
),
654 INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data
),
655 INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale
),
656 INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr
),
657 INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we
),
658 INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe
),
659 INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait
),
660 INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1
),
661 INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2
),
662 INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3
),
663 INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4
),
664 INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5
),
665 INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6
),
666 INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0
),
667 INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1
),
668 INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2
),
669 INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3
),
670 INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e
),
671 INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f
),
672 INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit
),
673 INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit
),
675 INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0
),
676 INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1
),
677 INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2
),
678 INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3
),
679 INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4
),
680 INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5
),
681 INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6
),
682 INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7
),
685 static const char *jz4780_uart2_groups
[] = { "uart2-data", "uart2-hwflow", };
686 static const char *jz4780_uart4_groups
[] = { "uart4-data", };
687 static const char *jz4780_mmc0_groups
[] = {
688 "mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
689 "mmc0-1bit-e", "mmc0-4bit-e",
691 static const char *jz4780_mmc1_groups
[] = {
692 "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
694 static const char *jz4780_mmc2_groups
[] = {
695 "mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e",
697 static const char *jz4780_nemc_groups
[] = {
698 "nemc-data", "nemc-cle-ale", "nemc-addr",
699 "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
701 static const char *jz4780_i2c3_groups
[] = { "i2c3-data", };
702 static const char *jz4780_i2c4_groups
[] = { "i2c4-data-e", "i2c4-data-f", };
703 static const char *jz4780_cim_groups
[] = { "cim-data", };
705 static const struct function_desc jz4780_functions
[] = {
706 { "uart0", jz4770_uart0_groups
, ARRAY_SIZE(jz4770_uart0_groups
), },
707 { "uart1", jz4770_uart1_groups
, ARRAY_SIZE(jz4770_uart1_groups
), },
708 { "uart2", jz4780_uart2_groups
, ARRAY_SIZE(jz4780_uart2_groups
), },
709 { "uart3", jz4770_uart3_groups
, ARRAY_SIZE(jz4770_uart3_groups
), },
710 { "uart4", jz4780_uart4_groups
, ARRAY_SIZE(jz4780_uart4_groups
), },
711 { "mmc0", jz4780_mmc0_groups
, ARRAY_SIZE(jz4780_mmc0_groups
), },
712 { "mmc1", jz4780_mmc1_groups
, ARRAY_SIZE(jz4780_mmc1_groups
), },
713 { "mmc2", jz4780_mmc2_groups
, ARRAY_SIZE(jz4780_mmc2_groups
), },
714 { "nemc", jz4780_nemc_groups
, ARRAY_SIZE(jz4780_nemc_groups
), },
715 { "nemc-cs1", jz4770_cs1_groups
, ARRAY_SIZE(jz4770_cs1_groups
), },
716 { "nemc-cs2", jz4770_cs2_groups
, ARRAY_SIZE(jz4770_cs2_groups
), },
717 { "nemc-cs3", jz4770_cs3_groups
, ARRAY_SIZE(jz4770_cs3_groups
), },
718 { "nemc-cs4", jz4770_cs4_groups
, ARRAY_SIZE(jz4770_cs4_groups
), },
719 { "nemc-cs5", jz4770_cs5_groups
, ARRAY_SIZE(jz4770_cs5_groups
), },
720 { "nemc-cs6", jz4770_cs6_groups
, ARRAY_SIZE(jz4770_cs6_groups
), },
721 { "i2c0", jz4770_i2c0_groups
, ARRAY_SIZE(jz4770_i2c0_groups
), },
722 { "i2c1", jz4770_i2c1_groups
, ARRAY_SIZE(jz4770_i2c1_groups
), },
723 { "i2c2", jz4770_i2c2_groups
, ARRAY_SIZE(jz4770_i2c2_groups
), },
724 { "i2c3", jz4780_i2c3_groups
, ARRAY_SIZE(jz4780_i2c3_groups
), },
725 { "i2c4", jz4780_i2c4_groups
, ARRAY_SIZE(jz4780_i2c4_groups
), },
726 { "cim", jz4780_cim_groups
, ARRAY_SIZE(jz4780_cim_groups
), },
727 { "lcd", jz4770_lcd_groups
, ARRAY_SIZE(jz4770_lcd_groups
), },
728 { "pwm0", jz4770_pwm0_groups
, ARRAY_SIZE(jz4770_pwm0_groups
), },
729 { "pwm1", jz4770_pwm1_groups
, ARRAY_SIZE(jz4770_pwm1_groups
), },
730 { "pwm2", jz4770_pwm2_groups
, ARRAY_SIZE(jz4770_pwm2_groups
), },
731 { "pwm3", jz4770_pwm3_groups
, ARRAY_SIZE(jz4770_pwm3_groups
), },
732 { "pwm4", jz4770_pwm4_groups
, ARRAY_SIZE(jz4770_pwm4_groups
), },
733 { "pwm5", jz4770_pwm5_groups
, ARRAY_SIZE(jz4770_pwm5_groups
), },
734 { "pwm6", jz4770_pwm6_groups
, ARRAY_SIZE(jz4770_pwm6_groups
), },
735 { "pwm7", jz4770_pwm7_groups
, ARRAY_SIZE(jz4770_pwm7_groups
), },
738 static const struct ingenic_chip_info jz4780_chip_info
= {
740 .groups
= jz4780_groups
,
741 .num_groups
= ARRAY_SIZE(jz4780_groups
),
742 .functions
= jz4780_functions
,
743 .num_functions
= ARRAY_SIZE(jz4780_functions
),
744 .pull_ups
= jz4770_pull_ups
,
745 .pull_downs
= jz4770_pull_downs
,
748 static u32
ingenic_gpio_read_reg(struct ingenic_gpio_chip
*jzgc
, u8 reg
)
752 regmap_read(jzgc
->jzpc
->map
, jzgc
->reg_base
+ reg
, &val
);
757 static void ingenic_gpio_set_bit(struct ingenic_gpio_chip
*jzgc
,
758 u8 reg
, u8 offset
, bool set
)
763 reg
= REG_CLEAR(reg
);
765 regmap_write(jzgc
->jzpc
->map
, jzgc
->reg_base
+ reg
, BIT(offset
));
768 static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip
*jzgc
,
771 unsigned int val
= ingenic_gpio_read_reg(jzgc
, GPIO_PIN
);
773 return !!(val
& BIT(offset
));
776 static void ingenic_gpio_set_value(struct ingenic_gpio_chip
*jzgc
,
777 u8 offset
, int value
)
779 if (jzgc
->jzpc
->version
>= ID_JZ4770
)
780 ingenic_gpio_set_bit(jzgc
, JZ4770_GPIO_PAT0
, offset
, !!value
);
782 ingenic_gpio_set_bit(jzgc
, JZ4740_GPIO_DATA
, offset
, !!value
);
785 static void irq_set_type(struct ingenic_gpio_chip
*jzgc
,
786 u8 offset
, unsigned int type
)
790 if (jzgc
->jzpc
->version
>= ID_JZ4770
) {
791 reg1
= JZ4770_GPIO_PAT1
;
792 reg2
= JZ4770_GPIO_PAT0
;
794 reg1
= JZ4740_GPIO_TRIG
;
795 reg2
= JZ4740_GPIO_DIR
;
799 case IRQ_TYPE_EDGE_RISING
:
800 ingenic_gpio_set_bit(jzgc
, reg2
, offset
, true);
801 ingenic_gpio_set_bit(jzgc
, reg1
, offset
, true);
803 case IRQ_TYPE_EDGE_FALLING
:
804 ingenic_gpio_set_bit(jzgc
, reg2
, offset
, false);
805 ingenic_gpio_set_bit(jzgc
, reg1
, offset
, true);
807 case IRQ_TYPE_LEVEL_HIGH
:
808 ingenic_gpio_set_bit(jzgc
, reg2
, offset
, true);
809 ingenic_gpio_set_bit(jzgc
, reg1
, offset
, false);
811 case IRQ_TYPE_LEVEL_LOW
:
813 ingenic_gpio_set_bit(jzgc
, reg2
, offset
, false);
814 ingenic_gpio_set_bit(jzgc
, reg1
, offset
, false);
819 static void ingenic_gpio_irq_mask(struct irq_data
*irqd
)
821 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
822 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
824 ingenic_gpio_set_bit(jzgc
, GPIO_MSK
, irqd
->hwirq
, true);
827 static void ingenic_gpio_irq_unmask(struct irq_data
*irqd
)
829 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
830 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
832 ingenic_gpio_set_bit(jzgc
, GPIO_MSK
, irqd
->hwirq
, false);
835 static void ingenic_gpio_irq_enable(struct irq_data
*irqd
)
837 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
838 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
839 int irq
= irqd
->hwirq
;
841 if (jzgc
->jzpc
->version
>= ID_JZ4770
)
842 ingenic_gpio_set_bit(jzgc
, JZ4770_GPIO_INT
, irq
, true);
844 ingenic_gpio_set_bit(jzgc
, JZ4740_GPIO_SELECT
, irq
, true);
846 ingenic_gpio_irq_unmask(irqd
);
849 static void ingenic_gpio_irq_disable(struct irq_data
*irqd
)
851 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
852 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
853 int irq
= irqd
->hwirq
;
855 ingenic_gpio_irq_mask(irqd
);
857 if (jzgc
->jzpc
->version
>= ID_JZ4770
)
858 ingenic_gpio_set_bit(jzgc
, JZ4770_GPIO_INT
, irq
, false);
860 ingenic_gpio_set_bit(jzgc
, JZ4740_GPIO_SELECT
, irq
, false);
863 static void ingenic_gpio_irq_ack(struct irq_data
*irqd
)
865 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
866 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
867 int irq
= irqd
->hwirq
;
870 if (irqd_get_trigger_type(irqd
) == IRQ_TYPE_EDGE_BOTH
) {
872 * Switch to an interrupt for the opposite edge to the one that
873 * triggered the interrupt being ACKed.
875 high
= ingenic_gpio_get_value(jzgc
, irq
);
877 irq_set_type(jzgc
, irq
, IRQ_TYPE_EDGE_FALLING
);
879 irq_set_type(jzgc
, irq
, IRQ_TYPE_EDGE_RISING
);
882 if (jzgc
->jzpc
->version
>= ID_JZ4770
)
883 ingenic_gpio_set_bit(jzgc
, JZ4770_GPIO_FLAG
, irq
, false);
885 ingenic_gpio_set_bit(jzgc
, JZ4740_GPIO_DATA
, irq
, true);
888 static int ingenic_gpio_irq_set_type(struct irq_data
*irqd
, unsigned int type
)
890 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
891 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
894 case IRQ_TYPE_EDGE_BOTH
:
895 case IRQ_TYPE_EDGE_RISING
:
896 case IRQ_TYPE_EDGE_FALLING
:
897 irq_set_handler_locked(irqd
, handle_edge_irq
);
899 case IRQ_TYPE_LEVEL_HIGH
:
900 case IRQ_TYPE_LEVEL_LOW
:
901 irq_set_handler_locked(irqd
, handle_level_irq
);
904 irq_set_handler_locked(irqd
, handle_bad_irq
);
907 if (type
== IRQ_TYPE_EDGE_BOTH
) {
909 * The hardware does not support interrupts on both edges. The
910 * best we can do is to set up a single-edge interrupt and then
911 * switch to the opposing edge when ACKing the interrupt.
913 bool high
= ingenic_gpio_get_value(jzgc
, irqd
->hwirq
);
915 type
= high
? IRQ_TYPE_EDGE_FALLING
: IRQ_TYPE_EDGE_RISING
;
918 irq_set_type(jzgc
, irqd
->hwirq
, type
);
922 static int ingenic_gpio_irq_set_wake(struct irq_data
*irqd
, unsigned int on
)
924 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(irqd
);
925 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
927 return irq_set_irq_wake(jzgc
->irq
, on
);
930 static void ingenic_gpio_irq_handler(struct irq_desc
*desc
)
932 struct gpio_chip
*gc
= irq_desc_get_handler_data(desc
);
933 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
934 struct irq_chip
*irq_chip
= irq_data_get_irq_chip(&desc
->irq_data
);
935 unsigned long flag
, i
;
937 chained_irq_enter(irq_chip
, desc
);
939 if (jzgc
->jzpc
->version
>= ID_JZ4770
)
940 flag
= ingenic_gpio_read_reg(jzgc
, JZ4770_GPIO_FLAG
);
942 flag
= ingenic_gpio_read_reg(jzgc
, JZ4740_GPIO_FLAG
);
944 for_each_set_bit(i
, &flag
, 32)
945 generic_handle_irq(irq_linear_revmap(gc
->irq
.domain
, i
));
946 chained_irq_exit(irq_chip
, desc
);
949 static void ingenic_gpio_set(struct gpio_chip
*gc
,
950 unsigned int offset
, int value
)
952 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
954 ingenic_gpio_set_value(jzgc
, offset
, value
);
957 static int ingenic_gpio_get(struct gpio_chip
*gc
, unsigned int offset
)
959 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
961 return (int) ingenic_gpio_get_value(jzgc
, offset
);
964 static int ingenic_gpio_direction_input(struct gpio_chip
*gc
,
967 return pinctrl_gpio_direction_input(gc
->base
+ offset
);
970 static int ingenic_gpio_direction_output(struct gpio_chip
*gc
,
971 unsigned int offset
, int value
)
973 ingenic_gpio_set(gc
, offset
, value
);
974 return pinctrl_gpio_direction_output(gc
->base
+ offset
);
977 static inline void ingenic_config_pin(struct ingenic_pinctrl
*jzpc
,
978 unsigned int pin
, u8 reg
, bool set
)
980 unsigned int idx
= pin
% PINS_PER_GPIO_CHIP
;
981 unsigned int offt
= pin
/ PINS_PER_GPIO_CHIP
;
983 regmap_write(jzpc
->map
, offt
* 0x100 +
984 (set
? REG_SET(reg
) : REG_CLEAR(reg
)), BIT(idx
));
987 static inline bool ingenic_get_pin_config(struct ingenic_pinctrl
*jzpc
,
988 unsigned int pin
, u8 reg
)
990 unsigned int idx
= pin
% PINS_PER_GPIO_CHIP
;
991 unsigned int offt
= pin
/ PINS_PER_GPIO_CHIP
;
994 regmap_read(jzpc
->map
, offt
* 0x100 + reg
, &val
);
996 return val
& BIT(idx
);
999 static int ingenic_gpio_get_direction(struct gpio_chip
*gc
, unsigned int offset
)
1001 struct ingenic_gpio_chip
*jzgc
= gpiochip_get_data(gc
);
1002 struct ingenic_pinctrl
*jzpc
= jzgc
->jzpc
;
1003 unsigned int pin
= gc
->base
+ offset
;
1005 if (jzpc
->version
>= ID_JZ4770
)
1006 return ingenic_get_pin_config(jzpc
, pin
, JZ4770_GPIO_PAT1
);
1008 if (ingenic_get_pin_config(jzpc
, pin
, JZ4740_GPIO_SELECT
))
1011 return !ingenic_get_pin_config(jzpc
, pin
, JZ4740_GPIO_DIR
);
1014 static const struct pinctrl_ops ingenic_pctlops
= {
1015 .get_groups_count
= pinctrl_generic_get_group_count
,
1016 .get_group_name
= pinctrl_generic_get_group_name
,
1017 .get_group_pins
= pinctrl_generic_get_group_pins
,
1018 .dt_node_to_map
= pinconf_generic_dt_node_to_map_all
,
1019 .dt_free_map
= pinconf_generic_dt_free_map
,
1022 static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl
*jzpc
,
1025 unsigned int idx
= pin
% PINS_PER_GPIO_CHIP
;
1026 unsigned int offt
= pin
/ PINS_PER_GPIO_CHIP
;
1028 dev_dbg(jzpc
->dev
, "set pin P%c%u to function %u\n",
1029 'A' + offt
, idx
, func
);
1031 if (jzpc
->version
>= ID_JZ4770
) {
1032 ingenic_config_pin(jzpc
, pin
, JZ4770_GPIO_INT
, false);
1033 ingenic_config_pin(jzpc
, pin
, GPIO_MSK
, false);
1034 ingenic_config_pin(jzpc
, pin
, JZ4770_GPIO_PAT1
, func
& 0x2);
1035 ingenic_config_pin(jzpc
, pin
, JZ4770_GPIO_PAT0
, func
& 0x1);
1037 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_FUNC
, true);
1038 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_TRIG
, func
& 0x2);
1039 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_SELECT
, func
> 0);
1045 static int ingenic_pinmux_set_mux(struct pinctrl_dev
*pctldev
,
1046 unsigned int selector
, unsigned int group
)
1048 struct ingenic_pinctrl
*jzpc
= pinctrl_dev_get_drvdata(pctldev
);
1049 struct function_desc
*func
;
1050 struct group_desc
*grp
;
1053 func
= pinmux_generic_get_function(pctldev
, selector
);
1057 grp
= pinctrl_generic_get_group(pctldev
, group
);
1061 dev_dbg(pctldev
->dev
, "enable function %s group %s\n",
1062 func
->name
, grp
->name
);
1064 for (i
= 0; i
< grp
->num_pins
; i
++) {
1065 int *pin_modes
= grp
->data
;
1067 ingenic_pinmux_set_pin_fn(jzpc
, grp
->pins
[i
], pin_modes
[i
]);
1073 static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev
*pctldev
,
1074 struct pinctrl_gpio_range
*range
,
1075 unsigned int pin
, bool input
)
1077 struct ingenic_pinctrl
*jzpc
= pinctrl_dev_get_drvdata(pctldev
);
1078 unsigned int idx
= pin
% PINS_PER_GPIO_CHIP
;
1079 unsigned int offt
= pin
/ PINS_PER_GPIO_CHIP
;
1081 dev_dbg(pctldev
->dev
, "set pin P%c%u to %sput\n",
1082 'A' + offt
, idx
, input
? "in" : "out");
1084 if (jzpc
->version
>= ID_JZ4770
) {
1085 ingenic_config_pin(jzpc
, pin
, JZ4770_GPIO_INT
, false);
1086 ingenic_config_pin(jzpc
, pin
, GPIO_MSK
, true);
1087 ingenic_config_pin(jzpc
, pin
, JZ4770_GPIO_PAT1
, input
);
1089 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_SELECT
, false);
1090 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_DIR
, !input
);
1091 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_FUNC
, false);
1097 static const struct pinmux_ops ingenic_pmxops
= {
1098 .get_functions_count
= pinmux_generic_get_function_count
,
1099 .get_function_name
= pinmux_generic_get_function_name
,
1100 .get_function_groups
= pinmux_generic_get_function_groups
,
1101 .set_mux
= ingenic_pinmux_set_mux
,
1102 .gpio_set_direction
= ingenic_pinmux_gpio_set_direction
,
1105 static int ingenic_pinconf_get(struct pinctrl_dev
*pctldev
,
1106 unsigned int pin
, unsigned long *config
)
1108 struct ingenic_pinctrl
*jzpc
= pinctrl_dev_get_drvdata(pctldev
);
1109 enum pin_config_param param
= pinconf_to_config_param(*config
);
1110 unsigned int idx
= pin
% PINS_PER_GPIO_CHIP
;
1111 unsigned int offt
= pin
/ PINS_PER_GPIO_CHIP
;
1114 if (jzpc
->version
>= ID_JZ4770
)
1115 pull
= !ingenic_get_pin_config(jzpc
, pin
, JZ4770_GPIO_PEN
);
1117 pull
= !ingenic_get_pin_config(jzpc
, pin
, JZ4740_GPIO_PULL_DIS
);
1120 case PIN_CONFIG_BIAS_DISABLE
:
1125 case PIN_CONFIG_BIAS_PULL_UP
:
1126 if (!pull
|| !(jzpc
->info
->pull_ups
[offt
] & BIT(idx
)))
1130 case PIN_CONFIG_BIAS_PULL_DOWN
:
1131 if (!pull
|| !(jzpc
->info
->pull_downs
[offt
] & BIT(idx
)))
1139 *config
= pinconf_to_config_packed(param
, 1);
1143 static void ingenic_set_bias(struct ingenic_pinctrl
*jzpc
,
1144 unsigned int pin
, bool enabled
)
1146 if (jzpc
->version
>= ID_JZ4770
)
1147 ingenic_config_pin(jzpc
, pin
, JZ4770_GPIO_PEN
, !enabled
);
1149 ingenic_config_pin(jzpc
, pin
, JZ4740_GPIO_PULL_DIS
, !enabled
);
1152 static int ingenic_pinconf_set(struct pinctrl_dev
*pctldev
, unsigned int pin
,
1153 unsigned long *configs
, unsigned int num_configs
)
1155 struct ingenic_pinctrl
*jzpc
= pinctrl_dev_get_drvdata(pctldev
);
1156 unsigned int idx
= pin
% PINS_PER_GPIO_CHIP
;
1157 unsigned int offt
= pin
/ PINS_PER_GPIO_CHIP
;
1160 for (cfg
= 0; cfg
< num_configs
; cfg
++) {
1161 switch (pinconf_to_config_param(configs
[cfg
])) {
1162 case PIN_CONFIG_BIAS_DISABLE
:
1163 case PIN_CONFIG_BIAS_PULL_UP
:
1164 case PIN_CONFIG_BIAS_PULL_DOWN
:
1171 for (cfg
= 0; cfg
< num_configs
; cfg
++) {
1172 switch (pinconf_to_config_param(configs
[cfg
])) {
1173 case PIN_CONFIG_BIAS_DISABLE
:
1174 dev_dbg(jzpc
->dev
, "disable pull-over for pin P%c%u\n",
1176 ingenic_set_bias(jzpc
, pin
, false);
1179 case PIN_CONFIG_BIAS_PULL_UP
:
1180 if (!(jzpc
->info
->pull_ups
[offt
] & BIT(idx
)))
1182 dev_dbg(jzpc
->dev
, "set pull-up for pin P%c%u\n",
1184 ingenic_set_bias(jzpc
, pin
, true);
1187 case PIN_CONFIG_BIAS_PULL_DOWN
:
1188 if (!(jzpc
->info
->pull_downs
[offt
] & BIT(idx
)))
1190 dev_dbg(jzpc
->dev
, "set pull-down for pin P%c%u\n",
1192 ingenic_set_bias(jzpc
, pin
, true);
1203 static int ingenic_pinconf_group_get(struct pinctrl_dev
*pctldev
,
1204 unsigned int group
, unsigned long *config
)
1206 const unsigned int *pins
;
1207 unsigned int i
, npins
, old
= 0;
1210 ret
= pinctrl_generic_get_group_pins(pctldev
, group
, &pins
, &npins
);
1214 for (i
= 0; i
< npins
; i
++) {
1215 if (ingenic_pinconf_get(pctldev
, pins
[i
], config
))
1218 /* configs do not match between two pins */
1219 if (i
&& (old
!= *config
))
1228 static int ingenic_pinconf_group_set(struct pinctrl_dev
*pctldev
,
1229 unsigned int group
, unsigned long *configs
,
1230 unsigned int num_configs
)
1232 const unsigned int *pins
;
1233 unsigned int i
, npins
;
1236 ret
= pinctrl_generic_get_group_pins(pctldev
, group
, &pins
, &npins
);
1240 for (i
= 0; i
< npins
; i
++) {
1241 ret
= ingenic_pinconf_set(pctldev
,
1242 pins
[i
], configs
, num_configs
);
1250 static const struct pinconf_ops ingenic_confops
= {
1252 .pin_config_get
= ingenic_pinconf_get
,
1253 .pin_config_set
= ingenic_pinconf_set
,
1254 .pin_config_group_get
= ingenic_pinconf_group_get
,
1255 .pin_config_group_set
= ingenic_pinconf_group_set
,
1258 static const struct regmap_config ingenic_pinctrl_regmap_config
= {
1264 static const struct of_device_id ingenic_pinctrl_of_match
[] = {
1265 { .compatible
= "ingenic,jz4740-pinctrl", .data
= (void *) ID_JZ4740
},
1266 { .compatible
= "ingenic,jz4725b-pinctrl", .data
= (void *)ID_JZ4725B
},
1267 { .compatible
= "ingenic,jz4770-pinctrl", .data
= (void *) ID_JZ4770
},
1268 { .compatible
= "ingenic,jz4780-pinctrl", .data
= (void *) ID_JZ4780
},
1272 static const struct of_device_id ingenic_gpio_of_match
[] __initconst
= {
1273 { .compatible
= "ingenic,jz4740-gpio", },
1274 { .compatible
= "ingenic,jz4770-gpio", },
1275 { .compatible
= "ingenic,jz4780-gpio", },
1279 static int __init
ingenic_gpio_probe(struct ingenic_pinctrl
*jzpc
,
1280 struct device_node
*node
)
1282 struct ingenic_gpio_chip
*jzgc
;
1283 struct device
*dev
= jzpc
->dev
;
1287 err
= of_property_read_u32(node
, "reg", &bank
);
1289 dev_err(dev
, "Cannot read \"reg\" property: %i\n", err
);
1293 jzgc
= devm_kzalloc(dev
, sizeof(*jzgc
), GFP_KERNEL
);
1298 jzgc
->reg_base
= bank
* 0x100;
1300 jzgc
->gc
.label
= devm_kasprintf(dev
, GFP_KERNEL
, "GPIO%c", 'A' + bank
);
1301 if (!jzgc
->gc
.label
)
1304 /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
1305 * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
1306 * <linux/gpio/consumer.h> INSTEAD.
1308 jzgc
->gc
.base
= bank
* 32;
1310 jzgc
->gc
.ngpio
= 32;
1311 jzgc
->gc
.parent
= dev
;
1312 jzgc
->gc
.of_node
= node
;
1313 jzgc
->gc
.owner
= THIS_MODULE
;
1315 jzgc
->gc
.set
= ingenic_gpio_set
;
1316 jzgc
->gc
.get
= ingenic_gpio_get
;
1317 jzgc
->gc
.direction_input
= ingenic_gpio_direction_input
;
1318 jzgc
->gc
.direction_output
= ingenic_gpio_direction_output
;
1319 jzgc
->gc
.get_direction
= ingenic_gpio_get_direction
;
1321 if (of_property_read_bool(node
, "gpio-ranges")) {
1322 jzgc
->gc
.request
= gpiochip_generic_request
;
1323 jzgc
->gc
.free
= gpiochip_generic_free
;
1326 err
= devm_gpiochip_add_data(dev
, &jzgc
->gc
, jzgc
);
1330 jzgc
->irq
= irq_of_parse_and_map(node
, 0);
1334 jzgc
->irq_chip
.name
= jzgc
->gc
.label
;
1335 jzgc
->irq_chip
.irq_enable
= ingenic_gpio_irq_enable
;
1336 jzgc
->irq_chip
.irq_disable
= ingenic_gpio_irq_disable
;
1337 jzgc
->irq_chip
.irq_unmask
= ingenic_gpio_irq_unmask
;
1338 jzgc
->irq_chip
.irq_mask
= ingenic_gpio_irq_mask
;
1339 jzgc
->irq_chip
.irq_ack
= ingenic_gpio_irq_ack
;
1340 jzgc
->irq_chip
.irq_set_type
= ingenic_gpio_irq_set_type
;
1341 jzgc
->irq_chip
.irq_set_wake
= ingenic_gpio_irq_set_wake
;
1342 jzgc
->irq_chip
.flags
= IRQCHIP_MASK_ON_SUSPEND
;
1344 err
= gpiochip_irqchip_add(&jzgc
->gc
, &jzgc
->irq_chip
, 0,
1345 handle_level_irq
, IRQ_TYPE_NONE
);
1349 gpiochip_set_chained_irqchip(&jzgc
->gc
, &jzgc
->irq_chip
,
1350 jzgc
->irq
, ingenic_gpio_irq_handler
);
1354 static int __init
ingenic_pinctrl_probe(struct platform_device
*pdev
)
1356 struct device
*dev
= &pdev
->dev
;
1357 struct ingenic_pinctrl
*jzpc
;
1358 struct pinctrl_desc
*pctl_desc
;
1360 const struct platform_device_id
*id
= platform_get_device_id(pdev
);
1361 const struct of_device_id
*of_id
= of_match_device(
1362 ingenic_pinctrl_of_match
, dev
);
1363 const struct ingenic_chip_info
*chip_info
;
1364 struct device_node
*node
;
1368 jzpc
= devm_kzalloc(dev
, sizeof(*jzpc
), GFP_KERNEL
);
1372 base
= devm_ioremap_resource(dev
,
1373 platform_get_resource(pdev
, IORESOURCE_MEM
, 0));
1375 return PTR_ERR(base
);
1377 jzpc
->map
= devm_regmap_init_mmio(dev
, base
,
1378 &ingenic_pinctrl_regmap_config
);
1379 if (IS_ERR(jzpc
->map
)) {
1380 dev_err(dev
, "Failed to create regmap\n");
1381 return PTR_ERR(jzpc
->map
);
1387 jzpc
->version
= (enum jz_version
)of_id
->data
;
1389 jzpc
->version
= (enum jz_version
)id
->driver_data
;
1391 if (jzpc
->version
>= ID_JZ4780
)
1392 chip_info
= &jz4780_chip_info
;
1393 else if (jzpc
->version
>= ID_JZ4770
)
1394 chip_info
= &jz4770_chip_info
;
1395 else if (jzpc
->version
>= ID_JZ4725B
)
1396 chip_info
= &jz4725b_chip_info
;
1398 chip_info
= &jz4740_chip_info
;
1399 jzpc
->info
= chip_info
;
1401 pctl_desc
= devm_kzalloc(&pdev
->dev
, sizeof(*pctl_desc
), GFP_KERNEL
);
1405 /* fill in pinctrl_desc structure */
1406 pctl_desc
->name
= dev_name(dev
);
1407 pctl_desc
->owner
= THIS_MODULE
;
1408 pctl_desc
->pctlops
= &ingenic_pctlops
;
1409 pctl_desc
->pmxops
= &ingenic_pmxops
;
1410 pctl_desc
->confops
= &ingenic_confops
;
1411 pctl_desc
->npins
= chip_info
->num_chips
* PINS_PER_GPIO_CHIP
;
1412 pctl_desc
->pins
= jzpc
->pdesc
= devm_kcalloc(&pdev
->dev
,
1413 pctl_desc
->npins
, sizeof(*jzpc
->pdesc
), GFP_KERNEL
);
1417 for (i
= 0; i
< pctl_desc
->npins
; i
++) {
1418 jzpc
->pdesc
[i
].number
= i
;
1419 jzpc
->pdesc
[i
].name
= kasprintf(GFP_KERNEL
, "P%c%d",
1420 'A' + (i
/ PINS_PER_GPIO_CHIP
),
1421 i
% PINS_PER_GPIO_CHIP
);
1424 jzpc
->pctl
= devm_pinctrl_register(dev
, pctl_desc
, jzpc
);
1425 if (IS_ERR(jzpc
->pctl
)) {
1426 dev_err(dev
, "Failed to register pinctrl\n");
1427 return PTR_ERR(jzpc
->pctl
);
1430 for (i
= 0; i
< chip_info
->num_groups
; i
++) {
1431 const struct group_desc
*group
= &chip_info
->groups
[i
];
1433 err
= pinctrl_generic_add_group(jzpc
->pctl
, group
->name
,
1434 group
->pins
, group
->num_pins
, group
->data
);
1436 dev_err(dev
, "Failed to register group %s\n",
1442 for (i
= 0; i
< chip_info
->num_functions
; i
++) {
1443 const struct function_desc
*func
= &chip_info
->functions
[i
];
1445 err
= pinmux_generic_add_function(jzpc
->pctl
, func
->name
,
1446 func
->group_names
, func
->num_group_names
,
1449 dev_err(dev
, "Failed to register function %s\n",
1455 dev_set_drvdata(dev
, jzpc
->map
);
1457 for_each_child_of_node(dev
->of_node
, node
) {
1458 if (of_match_node(ingenic_gpio_of_match
, node
)) {
1459 err
= ingenic_gpio_probe(jzpc
, node
);
1468 static const struct platform_device_id ingenic_pinctrl_ids
[] = {
1469 { "jz4740-pinctrl", ID_JZ4740
},
1470 { "jz4725b-pinctrl", ID_JZ4725B
},
1471 { "jz4770-pinctrl", ID_JZ4770
},
1472 { "jz4780-pinctrl", ID_JZ4780
},
1476 static struct platform_driver ingenic_pinctrl_driver
= {
1478 .name
= "pinctrl-ingenic",
1479 .of_match_table
= of_match_ptr(ingenic_pinctrl_of_match
),
1481 .id_table
= ingenic_pinctrl_ids
,
1484 static int __init
ingenic_pinctrl_drv_register(void)
1486 return platform_driver_probe(&ingenic_pinctrl_driver
,
1487 ingenic_pinctrl_probe
);
1489 subsys_initcall(ingenic_pinctrl_drv_register
);