Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[sfrench/cifs-2.6.git] / drivers / pinctrl / pinctrl-ingenic.c
1 /*
2  * Ingenic SoCs pinctrl driver
3  *
4  * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
5  *
6  * License terms: GNU General Public License (GPL) version 2
7  */
8
9 #include <linux/compiler.h>
10 #include <linux/gpio/driver.h>
11 #include <linux/interrupt.h>
12 #include <linux/io.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>
23
24 #include "core.h"
25 #include "pinconf.h"
26 #include "pinmux.h"
27
28 #define GPIO_PIN        0x00
29 #define GPIO_MSK        0x20
30
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
38
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
44
45 #define REG_SET(x) ((x) + 0x4)
46 #define REG_CLEAR(x) ((x) + 0x8)
47
48 #define PINS_PER_GPIO_CHIP 32
49
50 enum jz_version {
51         ID_JZ4740,
52         ID_JZ4725B,
53         ID_JZ4770,
54         ID_JZ4780,
55 };
56
57 struct ingenic_chip_info {
58         unsigned int num_chips;
59
60         const struct group_desc *groups;
61         unsigned int num_groups;
62
63         const struct function_desc *functions;
64         unsigned int num_functions;
65
66         const u32 *pull_ups, *pull_downs;
67 };
68
69 struct ingenic_pinctrl {
70         struct device *dev;
71         struct regmap *map;
72         struct pinctrl_dev *pctl;
73         struct pinctrl_pin_desc *pdesc;
74         enum jz_version version;
75
76         const struct ingenic_chip_info *info;
77 };
78
79 struct ingenic_gpio_chip {
80         struct ingenic_pinctrl *jzpc;
81         struct gpio_chip gc;
82         struct irq_chip irq_chip;
83         unsigned int irq, reg_base;
84 };
85
86 static const u32 jz4740_pull_ups[4] = {
87         0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
88 };
89
90 static const u32 jz4740_pull_downs[4] = {
91         0x00000000, 0x00000000, 0x00000000, 0x00000000,
92 };
93
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,
101 };
102 static int jz4740_lcd_16bit_pins[] = {
103         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55,
104 };
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, };
119
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, };
141
142 #define INGENIC_PIN_GROUP(name, id)                     \
143         {                                               \
144                 name,                                   \
145                 id##_pins,                              \
146                 ARRAY_SIZE(id##_pins),                  \
147                 id##_funcs,                             \
148         }
149
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),
160         { "lcd-no-pins", },
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),
173 };
174
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",
180 };
181 static const char *jz4740_nand_groups[] = {
182         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
183 };
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", };
192
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), },
207 };
208
209 static const struct ingenic_chip_info jz4740_chip_info = {
210         .num_chips = 4,
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,
217 };
218
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
237 static int jz4725b_mmc0_1bit_funcs[] = { 1, 1, 1, };
238 static int jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, };
239 static int jz4725b_mmc1_1bit_funcs[] = { 0, 0, 0, };
240 static int jz4725b_mmc1_4bit_funcs[] = { 0, 0, 0, };
241 static int jz4725b_uart_data_funcs[] = { 1, 1, };
242 static int jz4725b_nand_cs1_funcs[] = { 0, };
243 static int jz4725b_nand_cs2_funcs[] = { 0, };
244 static int jz4725b_nand_cs3_funcs[] = { 0, };
245 static int jz4725b_nand_cs4_funcs[] = { 0, };
246 static int jz4725b_nand_cle_ale_funcs[] = { 0, 0, };
247 static int jz4725b_nand_fre_fwe_funcs[] = { 0, 0, };
248 static int jz4725b_pwm_pwm0_funcs[] = { 0, };
249 static int jz4725b_pwm_pwm1_funcs[] = { 0, };
250 static int jz4725b_pwm_pwm2_funcs[] = { 0, };
251 static int jz4725b_pwm_pwm3_funcs[] = { 0, };
252 static int jz4725b_pwm_pwm4_funcs[] = { 0, };
253 static int jz4725b_pwm_pwm5_funcs[] = { 0, };
254
255 static const struct group_desc jz4725b_groups[] = {
256         INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit),
257         INGENIC_PIN_GROUP("mmc0-4bit", jz4725b_mmc0_4bit),
258         INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit),
259         INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit),
260         INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data),
261         INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1),
262         INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2),
263         INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3),
264         INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4),
265         INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale),
266         INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe),
267         INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0),
268         INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1),
269         INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2),
270         INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3),
271         INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4),
272         INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5),
273 };
274
275 static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
276 static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
277 static const char *jz4725b_uart_groups[] = { "uart-data", };
278 static const char *jz4725b_nand_groups[] = {
279         "nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
280         "nand-cle-ale", "nand-fre-fwe",
281 };
282 static const char *jz4725b_pwm0_groups[] = { "pwm0", };
283 static const char *jz4725b_pwm1_groups[] = { "pwm1", };
284 static const char *jz4725b_pwm2_groups[] = { "pwm2", };
285 static const char *jz4725b_pwm3_groups[] = { "pwm3", };
286 static const char *jz4725b_pwm4_groups[] = { "pwm4", };
287 static const char *jz4725b_pwm5_groups[] = { "pwm5", };
288
289 static const struct function_desc jz4725b_functions[] = {
290         { "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), },
291         { "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), },
292         { "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), },
293         { "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), },
294         { "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), },
295         { "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), },
296         { "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), },
297         { "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), },
298         { "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), },
299         { "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), },
300 };
301
302 static const struct ingenic_chip_info jz4725b_chip_info = {
303         .num_chips = 4,
304         .groups = jz4725b_groups,
305         .num_groups = ARRAY_SIZE(jz4725b_groups),
306         .functions = jz4725b_functions,
307         .num_functions = ARRAY_SIZE(jz4725b_functions),
308         .pull_ups = jz4740_pull_ups,
309         .pull_downs = jz4740_pull_downs,
310 };
311
312 static const u32 jz4770_pull_ups[6] = {
313         0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f,
314 };
315
316 static const u32 jz4770_pull_downs[6] = {
317         0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
318 };
319
320 static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
321 static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
322 static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
323 static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
324 static int jz4770_uart2_data_pins[] = { 0x66, 0x67, };
325 static int jz4770_uart2_hwflow_pins[] = { 0x65, 0x64, };
326 static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
327 static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
328 static int jz4770_uart4_data_pins[] = { 0x54, 0x4a, };
329 static int jz4770_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
330 static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
331 static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
332 static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
333 static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
334 static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
335 static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
336 static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
337 static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
338 static int jz4770_nemc_data_pins[] = {
339         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
340 };
341 static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
342 static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
343 static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
344 static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
345 static int jz4770_nemc_cs1_pins[] = { 0x15, };
346 static int jz4770_nemc_cs2_pins[] = { 0x16, };
347 static int jz4770_nemc_cs3_pins[] = { 0x17, };
348 static int jz4770_nemc_cs4_pins[] = { 0x18, };
349 static int jz4770_nemc_cs5_pins[] = { 0x19, };
350 static int jz4770_nemc_cs6_pins[] = { 0x1a, };
351 static int jz4770_i2c0_pins[] = { 0x6e, 0x6f, };
352 static int jz4770_i2c1_pins[] = { 0x8e, 0x8f, };
353 static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
354 static int jz4770_i2c3_pins[] = { 0x6a, 0x6b, };
355 static int jz4770_i2c4_e_pins[] = { 0x8c, 0x8d, };
356 static int jz4770_i2c4_f_pins[] = { 0xb9, 0xb8, };
357 static int jz4770_cim_pins[] = {
358         0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
359 };
360 static int jz4770_lcd_32bit_pins[] = {
361         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
362         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
363         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
364         0x58, 0x59, 0x51,
365 };
366 static int jz4770_pwm_pwm0_pins[] = { 0x80, };
367 static int jz4770_pwm_pwm1_pins[] = { 0x81, };
368 static int jz4770_pwm_pwm2_pins[] = { 0x82, };
369 static int jz4770_pwm_pwm3_pins[] = { 0x83, };
370 static int jz4770_pwm_pwm4_pins[] = { 0x84, };
371 static int jz4770_pwm_pwm5_pins[] = { 0x85, };
372 static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
373 static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
374
375 static int jz4770_uart0_data_funcs[] = { 0, 0, };
376 static int jz4770_uart0_hwflow_funcs[] = { 0, 0, };
377 static int jz4770_uart1_data_funcs[] = { 0, 0, };
378 static int jz4770_uart1_hwflow_funcs[] = { 0, 0, };
379 static int jz4770_uart2_data_funcs[] = { 1, 1, };
380 static int jz4770_uart2_hwflow_funcs[] = { 1, 1, };
381 static int jz4770_uart3_data_funcs[] = { 0, 1, };
382 static int jz4770_uart3_hwflow_funcs[] = { 0, 0, };
383 static int jz4770_uart4_data_funcs[] = { 2, 2, };
384 static int jz4770_mmc0_8bit_a_funcs[] = { 1, 1, 1, 1, 1, };
385 static int jz4770_mmc0_4bit_a_funcs[] = { 1, 1, 1, };
386 static int jz4770_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
387 static int jz4770_mmc0_4bit_e_funcs[] = { 0, 0, 0, };
388 static int jz4770_mmc0_1bit_e_funcs[] = { 0, 0, 0, };
389 static int jz4770_mmc1_4bit_d_funcs[] = { 0, 0, 0, };
390 static int jz4770_mmc1_1bit_d_funcs[] = { 0, 0, 0, };
391 static int jz4770_mmc1_4bit_e_funcs[] = { 1, 1, 1, };
392 static int jz4770_mmc1_1bit_e_funcs[] = { 1, 1, 1, };
393 static int jz4770_nemc_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
394 static int jz4770_nemc_cle_ale_funcs[] = { 0, 0, };
395 static int jz4770_nemc_addr_funcs[] = { 0, 0, 0, 0, };
396 static int jz4770_nemc_rd_we_funcs[] = { 0, 0, };
397 static int jz4770_nemc_frd_fwe_funcs[] = { 0, 0, };
398 static int jz4770_nemc_cs1_funcs[] = { 0, };
399 static int jz4770_nemc_cs2_funcs[] = { 0, };
400 static int jz4770_nemc_cs3_funcs[] = { 0, };
401 static int jz4770_nemc_cs4_funcs[] = { 0, };
402 static int jz4770_nemc_cs5_funcs[] = { 0, };
403 static int jz4770_nemc_cs6_funcs[] = { 0, };
404 static int jz4770_i2c0_funcs[] = { 0, 0, };
405 static int jz4770_i2c1_funcs[] = { 0, 0, };
406 static int jz4770_i2c2_funcs[] = { 2, 2, };
407 static int jz4770_i2c3_funcs[] = { 1, 1, };
408 static int jz4770_i2c4_e_funcs[] = { 1, 1, };
409 static int jz4770_i2c4_f_funcs[] = { 1, 1, };
410 static int jz4770_cim_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
411 static int jz4770_lcd_32bit_funcs[] = {
412         0, 0, 0, 0, 0, 0, 0, 0,
413         0, 0, 0, 0, 0, 0, 0, 0,
414         0, 0, 0,
415 };
416 static int jz4770_pwm_pwm0_funcs[] = { 0, };
417 static int jz4770_pwm_pwm1_funcs[] = { 0, };
418 static int jz4770_pwm_pwm2_funcs[] = { 0, };
419 static int jz4770_pwm_pwm3_funcs[] = { 0, };
420 static int jz4770_pwm_pwm4_funcs[] = { 0, };
421 static int jz4770_pwm_pwm5_funcs[] = { 0, };
422 static int jz4770_pwm_pwm6_funcs[] = { 0, };
423 static int jz4770_pwm_pwm7_funcs[] = { 0, };
424
425 static const struct group_desc jz4770_groups[] = {
426         INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data),
427         INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow),
428         INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data),
429         INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow),
430         INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data),
431         INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow),
432         INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data),
433         INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow),
434         INGENIC_PIN_GROUP("uart4-data", jz4770_uart4_data),
435         INGENIC_PIN_GROUP("mmc0-8bit-a", jz4770_mmc0_8bit_a),
436         INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a),
437         INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a),
438         INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e),
439         INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e),
440         INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d),
441         INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d),
442         INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e),
443         INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e),
444         INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_data),
445         INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale),
446         INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr),
447         INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we),
448         INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe),
449         INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1),
450         INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2),
451         INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3),
452         INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4),
453         INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5),
454         INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6),
455         INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0),
456         INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1),
457         INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2),
458         INGENIC_PIN_GROUP("i2c3-data", jz4770_i2c3),
459         INGENIC_PIN_GROUP("i2c4-data-e", jz4770_i2c4_e),
460         INGENIC_PIN_GROUP("i2c4-data-f", jz4770_i2c4_f),
461         INGENIC_PIN_GROUP("cim-data", jz4770_cim),
462         INGENIC_PIN_GROUP("lcd-32bit", jz4770_lcd_32bit),
463         { "lcd-no-pins", },
464         INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0),
465         INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1),
466         INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2),
467         INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3),
468         INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4),
469         INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5),
470         INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6),
471         INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7),
472 };
473
474 static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
475 static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
476 static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
477 static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
478 static const char *jz4770_uart4_groups[] = { "uart4-data", };
479 static const char *jz4770_mmc0_groups[] = {
480         "mmc0-8bit-a", "mmc0-4bit-a", "mmc0-1bit-a",
481         "mmc0-1bit-e", "mmc0-4bit-e",
482 };
483 static const char *jz4770_mmc1_groups[] = {
484         "mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
485 };
486 static const char *jz4770_nemc_groups[] = {
487         "nemc-data", "nemc-cle-ale", "nemc-addr", "nemc-rd-we", "nemc-frd-fwe",
488 };
489 static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
490 static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
491 static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
492 static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
493 static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
494 static const char *jz4770_i2c3_groups[] = { "i2c3-data", };
495 static const char *jz4770_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
496 static const char *jz4770_cim_groups[] = { "cim-data", };
497 static const char *jz4770_lcd_groups[] = { "lcd-32bit", "lcd-no-pins", };
498 static const char *jz4770_pwm0_groups[] = { "pwm0", };
499 static const char *jz4770_pwm1_groups[] = { "pwm1", };
500 static const char *jz4770_pwm2_groups[] = { "pwm2", };
501 static const char *jz4770_pwm3_groups[] = { "pwm3", };
502 static const char *jz4770_pwm4_groups[] = { "pwm4", };
503 static const char *jz4770_pwm5_groups[] = { "pwm5", };
504 static const char *jz4770_pwm6_groups[] = { "pwm6", };
505 static const char *jz4770_pwm7_groups[] = { "pwm7", };
506
507 static const struct function_desc jz4770_functions[] = {
508         { "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
509         { "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
510         { "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
511         { "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
512         { "uart4", jz4770_uart4_groups, ARRAY_SIZE(jz4770_uart4_groups), },
513         { "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
514         { "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
515         { "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
516         { "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
517         { "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
518         { "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
519         { "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
520         { "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
521         { "i2c3", jz4770_i2c3_groups, ARRAY_SIZE(jz4770_i2c3_groups), },
522         { "i2c4", jz4770_i2c4_groups, ARRAY_SIZE(jz4770_i2c4_groups), },
523         { "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
524         { "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
525         { "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
526         { "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
527         { "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
528         { "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
529         { "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
530         { "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
531         { "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
532         { "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
533 };
534
535 static const struct ingenic_chip_info jz4770_chip_info = {
536         .num_chips = 6,
537         .groups = jz4770_groups,
538         .num_groups = ARRAY_SIZE(jz4770_groups),
539         .functions = jz4770_functions,
540         .num_functions = ARRAY_SIZE(jz4770_functions),
541         .pull_ups = jz4770_pull_ups,
542         .pull_downs = jz4770_pull_downs,
543 };
544
545 static u32 gpio_ingenic_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg)
546 {
547         unsigned int val;
548
549         regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val);
550
551         return (u32) val;
552 }
553
554 static void gpio_ingenic_set_bit(struct ingenic_gpio_chip *jzgc,
555                 u8 reg, u8 offset, bool set)
556 {
557         if (set)
558                 reg = REG_SET(reg);
559         else
560                 reg = REG_CLEAR(reg);
561
562         regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset));
563 }
564
565 static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,
566                                           u8 offset)
567 {
568         unsigned int val = gpio_ingenic_read_reg(jzgc, GPIO_PIN);
569
570         return !!(val & BIT(offset));
571 }
572
573 static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc,
574                                    u8 offset, int value)
575 {
576         if (jzgc->jzpc->version >= ID_JZ4770)
577                 gpio_ingenic_set_bit(jzgc, JZ4770_GPIO_PAT0, offset, !!value);
578         else
579                 gpio_ingenic_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value);
580 }
581
582 static void irq_set_type(struct ingenic_gpio_chip *jzgc,
583                 u8 offset, unsigned int type)
584 {
585         u8 reg1, reg2;
586
587         if (jzgc->jzpc->version >= ID_JZ4770) {
588                 reg1 = JZ4770_GPIO_PAT1;
589                 reg2 = JZ4770_GPIO_PAT0;
590         } else {
591                 reg1 = JZ4740_GPIO_TRIG;
592                 reg2 = JZ4740_GPIO_DIR;
593         }
594
595         switch (type) {
596         case IRQ_TYPE_EDGE_RISING:
597                 gpio_ingenic_set_bit(jzgc, reg2, offset, true);
598                 gpio_ingenic_set_bit(jzgc, reg1, offset, true);
599                 break;
600         case IRQ_TYPE_EDGE_FALLING:
601                 gpio_ingenic_set_bit(jzgc, reg2, offset, false);
602                 gpio_ingenic_set_bit(jzgc, reg1, offset, true);
603                 break;
604         case IRQ_TYPE_LEVEL_HIGH:
605                 gpio_ingenic_set_bit(jzgc, reg2, offset, true);
606                 gpio_ingenic_set_bit(jzgc, reg1, offset, false);
607                 break;
608         case IRQ_TYPE_LEVEL_LOW:
609         default:
610                 gpio_ingenic_set_bit(jzgc, reg2, offset, false);
611                 gpio_ingenic_set_bit(jzgc, reg1, offset, false);
612                 break;
613         }
614 }
615
616 static void ingenic_gpio_irq_mask(struct irq_data *irqd)
617 {
618         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
619         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
620
621         gpio_ingenic_set_bit(jzgc, GPIO_MSK, irqd->hwirq, true);
622 }
623
624 static void ingenic_gpio_irq_unmask(struct irq_data *irqd)
625 {
626         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
627         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
628
629         gpio_ingenic_set_bit(jzgc, GPIO_MSK, irqd->hwirq, false);
630 }
631
632 static void ingenic_gpio_irq_enable(struct irq_data *irqd)
633 {
634         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
635         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
636         int irq = irqd->hwirq;
637
638         if (jzgc->jzpc->version >= ID_JZ4770)
639                 gpio_ingenic_set_bit(jzgc, JZ4770_GPIO_INT, irq, true);
640         else
641                 gpio_ingenic_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true);
642
643         ingenic_gpio_irq_unmask(irqd);
644 }
645
646 static void ingenic_gpio_irq_disable(struct irq_data *irqd)
647 {
648         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
649         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
650         int irq = irqd->hwirq;
651
652         ingenic_gpio_irq_mask(irqd);
653
654         if (jzgc->jzpc->version >= ID_JZ4770)
655                 gpio_ingenic_set_bit(jzgc, JZ4770_GPIO_INT, irq, false);
656         else
657                 gpio_ingenic_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false);
658 }
659
660 static void ingenic_gpio_irq_ack(struct irq_data *irqd)
661 {
662         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
663         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
664         int irq = irqd->hwirq;
665         bool high;
666
667         if (irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) {
668                 /*
669                  * Switch to an interrupt for the opposite edge to the one that
670                  * triggered the interrupt being ACKed.
671                  */
672                 high = ingenic_gpio_get_value(jzgc, irq);
673                 if (high)
674                         irq_set_type(jzgc, irq, IRQ_TYPE_EDGE_FALLING);
675                 else
676                         irq_set_type(jzgc, irq, IRQ_TYPE_EDGE_RISING);
677         }
678
679         if (jzgc->jzpc->version >= ID_JZ4770)
680                 gpio_ingenic_set_bit(jzgc, JZ4770_GPIO_FLAG, irq, false);
681         else
682                 gpio_ingenic_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true);
683 }
684
685 static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
686 {
687         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
688         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
689
690         switch (type) {
691         case IRQ_TYPE_EDGE_BOTH:
692         case IRQ_TYPE_EDGE_RISING:
693         case IRQ_TYPE_EDGE_FALLING:
694                 irq_set_handler_locked(irqd, handle_edge_irq);
695                 break;
696         case IRQ_TYPE_LEVEL_HIGH:
697         case IRQ_TYPE_LEVEL_LOW:
698                 irq_set_handler_locked(irqd, handle_level_irq);
699                 break;
700         default:
701                 irq_set_handler_locked(irqd, handle_bad_irq);
702         }
703
704         if (type == IRQ_TYPE_EDGE_BOTH) {
705                 /*
706                  * The hardware does not support interrupts on both edges. The
707                  * best we can do is to set up a single-edge interrupt and then
708                  * switch to the opposing edge when ACKing the interrupt.
709                  */
710                 bool high = ingenic_gpio_get_value(jzgc, irqd->hwirq);
711
712                 type = high ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING;
713         }
714
715         irq_set_type(jzgc, irqd->hwirq, type);
716         return 0;
717 }
718
719 static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on)
720 {
721         struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
722         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
723
724         return irq_set_irq_wake(jzgc->irq, on);
725 }
726
727 static void ingenic_gpio_irq_handler(struct irq_desc *desc)
728 {
729         struct gpio_chip *gc = irq_desc_get_handler_data(desc);
730         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
731         struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data);
732         unsigned long flag, i;
733
734         chained_irq_enter(irq_chip, desc);
735
736         if (jzgc->jzpc->version >= ID_JZ4770)
737                 flag = gpio_ingenic_read_reg(jzgc, JZ4770_GPIO_FLAG);
738         else
739                 flag = gpio_ingenic_read_reg(jzgc, JZ4740_GPIO_FLAG);
740
741         for_each_set_bit(i, &flag, 32)
742                 generic_handle_irq(irq_linear_revmap(gc->irq.domain, i));
743         chained_irq_exit(irq_chip, desc);
744 }
745
746 static void ingenic_gpio_set(struct gpio_chip *gc,
747                 unsigned int offset, int value)
748 {
749         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
750
751         ingenic_gpio_set_value(jzgc, offset, value);
752 }
753
754 static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset)
755 {
756         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
757
758         return (int) ingenic_gpio_get_value(jzgc, offset);
759 }
760
761 static int ingenic_gpio_direction_input(struct gpio_chip *gc,
762                 unsigned int offset)
763 {
764         return pinctrl_gpio_direction_input(gc->base + offset);
765 }
766
767 static int ingenic_gpio_direction_output(struct gpio_chip *gc,
768                 unsigned int offset, int value)
769 {
770         ingenic_gpio_set(gc, offset, value);
771         return pinctrl_gpio_direction_output(gc->base + offset);
772 }
773
774 static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
775                 unsigned int pin, u8 reg, bool set)
776 {
777         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
778         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
779
780         regmap_write(jzpc->map, offt * 0x100 +
781                         (set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
782 }
783
784 static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
785                 unsigned int pin, u8 reg)
786 {
787         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
788         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
789         unsigned int val;
790
791         regmap_read(jzpc->map, offt * 0x100 + reg, &val);
792
793         return val & BIT(idx);
794 }
795
796 static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
797 {
798         struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
799         struct ingenic_pinctrl *jzpc = jzgc->jzpc;
800         unsigned int pin = gc->base + offset;
801
802         if (jzpc->version >= ID_JZ4770)
803                 return ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PAT1);
804
805         if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
806                 return true;
807
808         return !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR);
809 }
810
811 static const struct pinctrl_ops ingenic_pctlops = {
812         .get_groups_count = pinctrl_generic_get_group_count,
813         .get_group_name = pinctrl_generic_get_group_name,
814         .get_group_pins = pinctrl_generic_get_group_pins,
815         .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
816         .dt_free_map = pinconf_generic_dt_free_map,
817 };
818
819 static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
820                 int pin, int func)
821 {
822         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
823         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
824
825         dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n",
826                         'A' + offt, idx, func);
827
828         if (jzpc->version >= ID_JZ4770) {
829                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
830                 ingenic_config_pin(jzpc, pin, GPIO_MSK, false);
831                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
832                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
833         } else {
834                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
835                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
836                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func > 0);
837         }
838
839         return 0;
840 }
841
842 static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
843                 unsigned int selector, unsigned int group)
844 {
845         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
846         struct function_desc *func;
847         struct group_desc *grp;
848         unsigned int i;
849
850         func = pinmux_generic_get_function(pctldev, selector);
851         if (!func)
852                 return -EINVAL;
853
854         grp = pinctrl_generic_get_group(pctldev, group);
855         if (!grp)
856                 return -EINVAL;
857
858         dev_dbg(pctldev->dev, "enable function %s group %s\n",
859                 func->name, grp->name);
860
861         for (i = 0; i < grp->num_pins; i++) {
862                 int *pin_modes = grp->data;
863
864                 ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
865         }
866
867         return 0;
868 }
869
870 static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
871                 struct pinctrl_gpio_range *range,
872                 unsigned int pin, bool input)
873 {
874         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
875         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
876         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
877
878         dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n",
879                         'A' + offt, idx, input ? "in" : "out");
880
881         if (jzpc->version >= ID_JZ4770) {
882                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
883                 ingenic_config_pin(jzpc, pin, GPIO_MSK, true);
884                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
885         } else {
886                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
887                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input);
888                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
889         }
890
891         return 0;
892 }
893
894 static const struct pinmux_ops ingenic_pmxops = {
895         .get_functions_count = pinmux_generic_get_function_count,
896         .get_function_name = pinmux_generic_get_function_name,
897         .get_function_groups = pinmux_generic_get_function_groups,
898         .set_mux = ingenic_pinmux_set_mux,
899         .gpio_set_direction = ingenic_pinmux_gpio_set_direction,
900 };
901
902 static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
903                 unsigned int pin, unsigned long *config)
904 {
905         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
906         enum pin_config_param param = pinconf_to_config_param(*config);
907         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
908         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
909         bool pull;
910
911         if (jzpc->version >= ID_JZ4770)
912                 pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN);
913         else
914                 pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
915
916         switch (param) {
917         case PIN_CONFIG_BIAS_DISABLE:
918                 if (pull)
919                         return -EINVAL;
920                 break;
921
922         case PIN_CONFIG_BIAS_PULL_UP:
923                 if (!pull || !(jzpc->info->pull_ups[offt] & BIT(idx)))
924                         return -EINVAL;
925                 break;
926
927         case PIN_CONFIG_BIAS_PULL_DOWN:
928                 if (!pull || !(jzpc->info->pull_downs[offt] & BIT(idx)))
929                         return -EINVAL;
930                 break;
931
932         default:
933                 return -ENOTSUPP;
934         }
935
936         *config = pinconf_to_config_packed(param, 1);
937         return 0;
938 }
939
940 static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
941                 unsigned int pin, bool enabled)
942 {
943         if (jzpc->version >= ID_JZ4770)
944                 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !enabled);
945         else
946                 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !enabled);
947 }
948
949 static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
950                 unsigned long *configs, unsigned int num_configs)
951 {
952         struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
953         unsigned int idx = pin % PINS_PER_GPIO_CHIP;
954         unsigned int offt = pin / PINS_PER_GPIO_CHIP;
955         unsigned int cfg;
956
957         for (cfg = 0; cfg < num_configs; cfg++) {
958                 switch (pinconf_to_config_param(configs[cfg])) {
959                 case PIN_CONFIG_BIAS_DISABLE:
960                 case PIN_CONFIG_BIAS_PULL_UP:
961                 case PIN_CONFIG_BIAS_PULL_DOWN:
962                         continue;
963                 default:
964                         return -ENOTSUPP;
965                 }
966         }
967
968         for (cfg = 0; cfg < num_configs; cfg++) {
969                 switch (pinconf_to_config_param(configs[cfg])) {
970                 case PIN_CONFIG_BIAS_DISABLE:
971                         dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n",
972                                         'A' + offt, idx);
973                         ingenic_set_bias(jzpc, pin, false);
974                         break;
975
976                 case PIN_CONFIG_BIAS_PULL_UP:
977                         if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
978                                 return -EINVAL;
979                         dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n",
980                                         'A' + offt, idx);
981                         ingenic_set_bias(jzpc, pin, true);
982                         break;
983
984                 case PIN_CONFIG_BIAS_PULL_DOWN:
985                         if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
986                                 return -EINVAL;
987                         dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n",
988                                         'A' + offt, idx);
989                         ingenic_set_bias(jzpc, pin, true);
990                         break;
991
992                 default:
993                         unreachable();
994                 }
995         }
996
997         return 0;
998 }
999
1000 static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
1001                 unsigned int group, unsigned long *config)
1002 {
1003         const unsigned int *pins;
1004         unsigned int i, npins, old = 0;
1005         int ret;
1006
1007         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
1008         if (ret)
1009                 return ret;
1010
1011         for (i = 0; i < npins; i++) {
1012                 if (ingenic_pinconf_get(pctldev, pins[i], config))
1013                         return -ENOTSUPP;
1014
1015                 /* configs do not match between two pins */
1016                 if (i && (old != *config))
1017                         return -ENOTSUPP;
1018
1019                 old = *config;
1020         }
1021
1022         return 0;
1023 }
1024
1025 static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
1026                 unsigned int group, unsigned long *configs,
1027                 unsigned int num_configs)
1028 {
1029         const unsigned int *pins;
1030         unsigned int i, npins;
1031         int ret;
1032
1033         ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
1034         if (ret)
1035                 return ret;
1036
1037         for (i = 0; i < npins; i++) {
1038                 ret = ingenic_pinconf_set(pctldev,
1039                                 pins[i], configs, num_configs);
1040                 if (ret)
1041                         return ret;
1042         }
1043
1044         return 0;
1045 }
1046
1047 static const struct pinconf_ops ingenic_confops = {
1048         .is_generic = true,
1049         .pin_config_get = ingenic_pinconf_get,
1050         .pin_config_set = ingenic_pinconf_set,
1051         .pin_config_group_get = ingenic_pinconf_group_get,
1052         .pin_config_group_set = ingenic_pinconf_group_set,
1053 };
1054
1055 static const struct regmap_config ingenic_pinctrl_regmap_config = {
1056         .reg_bits = 32,
1057         .val_bits = 32,
1058         .reg_stride = 4,
1059 };
1060
1061 static const struct of_device_id ingenic_pinctrl_of_match[] = {
1062         { .compatible = "ingenic,jz4740-pinctrl", .data = (void *) ID_JZ4740 },
1063         { .compatible = "ingenic,jz4725b-pinctrl", .data = (void *)ID_JZ4725B },
1064         { .compatible = "ingenic,jz4770-pinctrl", .data = (void *) ID_JZ4770 },
1065         { .compatible = "ingenic,jz4780-pinctrl", .data = (void *) ID_JZ4780 },
1066         {},
1067 };
1068
1069 static const struct of_device_id ingenic_gpio_of_match[] __initconst = {
1070         { .compatible = "ingenic,jz4740-gpio", },
1071         { .compatible = "ingenic,jz4770-gpio", },
1072         { .compatible = "ingenic,jz4780-gpio", },
1073         {},
1074 };
1075
1076 static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc,
1077                                      struct device_node *node)
1078 {
1079         struct ingenic_gpio_chip *jzgc;
1080         struct device *dev = jzpc->dev;
1081         unsigned int bank;
1082         int err;
1083
1084         err = of_property_read_u32(node, "reg", &bank);
1085         if (err) {
1086                 dev_err(dev, "Cannot read \"reg\" property: %i\n", err);
1087                 return err;
1088         }
1089
1090         jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL);
1091         if (!jzgc)
1092                 return -ENOMEM;
1093
1094         jzgc->jzpc = jzpc;
1095         jzgc->reg_base = bank * 0x100;
1096
1097         jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank);
1098         if (!jzgc->gc.label)
1099                 return -ENOMEM;
1100
1101         /* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
1102          * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
1103          * <linux/gpio/consumer.h> INSTEAD.
1104          */
1105         jzgc->gc.base = bank * 32;
1106
1107         jzgc->gc.ngpio = 32;
1108         jzgc->gc.parent = dev;
1109         jzgc->gc.of_node = node;
1110         jzgc->gc.owner = THIS_MODULE;
1111
1112         jzgc->gc.set = ingenic_gpio_set;
1113         jzgc->gc.get = ingenic_gpio_get;
1114         jzgc->gc.direction_input = ingenic_gpio_direction_input;
1115         jzgc->gc.direction_output = ingenic_gpio_direction_output;
1116         jzgc->gc.get_direction = ingenic_gpio_get_direction;
1117
1118         if (of_property_read_bool(node, "gpio-ranges")) {
1119                 jzgc->gc.request = gpiochip_generic_request;
1120                 jzgc->gc.free = gpiochip_generic_free;
1121         }
1122
1123         err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc);
1124         if (err)
1125                 return err;
1126
1127         jzgc->irq = irq_of_parse_and_map(node, 0);
1128         if (!jzgc->irq)
1129                 return -EINVAL;
1130
1131         jzgc->irq_chip.name = jzgc->gc.label;
1132         jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable;
1133         jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable;
1134         jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask;
1135         jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask;
1136         jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack;
1137         jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type;
1138         jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake;
1139         jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND;
1140
1141         err = gpiochip_irqchip_add(&jzgc->gc, &jzgc->irq_chip, 0,
1142                         handle_level_irq, IRQ_TYPE_NONE);
1143         if (err)
1144                 return err;
1145
1146         gpiochip_set_chained_irqchip(&jzgc->gc, &jzgc->irq_chip,
1147                         jzgc->irq, ingenic_gpio_irq_handler);
1148         return 0;
1149 }
1150
1151 static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
1152 {
1153         struct device *dev = &pdev->dev;
1154         struct ingenic_pinctrl *jzpc;
1155         struct pinctrl_desc *pctl_desc;
1156         void __iomem *base;
1157         const struct platform_device_id *id = platform_get_device_id(pdev);
1158         const struct of_device_id *of_id = of_match_device(
1159                         ingenic_pinctrl_of_match, dev);
1160         const struct ingenic_chip_info *chip_info;
1161         struct device_node *node;
1162         unsigned int i;
1163         int err;
1164
1165         jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
1166         if (!jzpc)
1167                 return -ENOMEM;
1168
1169         base = devm_ioremap_resource(dev,
1170                         platform_get_resource(pdev, IORESOURCE_MEM, 0));
1171         if (IS_ERR(base))
1172                 return PTR_ERR(base);
1173
1174         jzpc->map = devm_regmap_init_mmio(dev, base,
1175                         &ingenic_pinctrl_regmap_config);
1176         if (IS_ERR(jzpc->map)) {
1177                 dev_err(dev, "Failed to create regmap\n");
1178                 return PTR_ERR(jzpc->map);
1179         }
1180
1181         jzpc->dev = dev;
1182
1183         if (of_id)
1184                 jzpc->version = (enum jz_version)of_id->data;
1185         else
1186                 jzpc->version = (enum jz_version)id->driver_data;
1187
1188         if (jzpc->version >= ID_JZ4770)
1189                 chip_info = &jz4770_chip_info;
1190         else if (jzpc->version >= ID_JZ4725B)
1191                 chip_info = &jz4725b_chip_info;
1192         else
1193                 chip_info = &jz4740_chip_info;
1194         jzpc->info = chip_info;
1195
1196         pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
1197         if (!pctl_desc)
1198                 return -ENOMEM;
1199
1200         /* fill in pinctrl_desc structure */
1201         pctl_desc->name = dev_name(dev);
1202         pctl_desc->owner = THIS_MODULE;
1203         pctl_desc->pctlops = &ingenic_pctlops;
1204         pctl_desc->pmxops = &ingenic_pmxops;
1205         pctl_desc->confops = &ingenic_confops;
1206         pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
1207         pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev,
1208                         pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL);
1209         if (!jzpc->pdesc)
1210                 return -ENOMEM;
1211
1212         for (i = 0; i < pctl_desc->npins; i++) {
1213                 jzpc->pdesc[i].number = i;
1214                 jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
1215                                                 'A' + (i / PINS_PER_GPIO_CHIP),
1216                                                 i % PINS_PER_GPIO_CHIP);
1217         }
1218
1219         jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
1220         if (IS_ERR(jzpc->pctl)) {
1221                 dev_err(dev, "Failed to register pinctrl\n");
1222                 return PTR_ERR(jzpc->pctl);
1223         }
1224
1225         for (i = 0; i < chip_info->num_groups; i++) {
1226                 const struct group_desc *group = &chip_info->groups[i];
1227
1228                 err = pinctrl_generic_add_group(jzpc->pctl, group->name,
1229                                 group->pins, group->num_pins, group->data);
1230                 if (err < 0) {
1231                         dev_err(dev, "Failed to register group %s\n",
1232                                         group->name);
1233                         return err;
1234                 }
1235         }
1236
1237         for (i = 0; i < chip_info->num_functions; i++) {
1238                 const struct function_desc *func = &chip_info->functions[i];
1239
1240                 err = pinmux_generic_add_function(jzpc->pctl, func->name,
1241                                 func->group_names, func->num_group_names,
1242                                 func->data);
1243                 if (err < 0) {
1244                         dev_err(dev, "Failed to register function %s\n",
1245                                         func->name);
1246                         return err;
1247                 }
1248         }
1249
1250         dev_set_drvdata(dev, jzpc->map);
1251
1252         for_each_child_of_node(dev->of_node, node) {
1253                 if (of_match_node(ingenic_gpio_of_match, node)) {
1254                         err = ingenic_gpio_probe(jzpc, node);
1255                         if (err)
1256                                 return err;
1257                 }
1258         }
1259
1260         return 0;
1261 }
1262
1263 static const struct platform_device_id ingenic_pinctrl_ids[] = {
1264         { "jz4740-pinctrl", ID_JZ4740 },
1265         { "jz4725b-pinctrl", ID_JZ4725B },
1266         { "jz4770-pinctrl", ID_JZ4770 },
1267         { "jz4780-pinctrl", ID_JZ4780 },
1268         {},
1269 };
1270
1271 static struct platform_driver ingenic_pinctrl_driver = {
1272         .driver = {
1273                 .name = "pinctrl-ingenic",
1274                 .of_match_table = of_match_ptr(ingenic_pinctrl_of_match),
1275         },
1276         .id_table = ingenic_pinctrl_ids,
1277 };
1278
1279 static int __init ingenic_pinctrl_drv_register(void)
1280 {
1281         return platform_driver_probe(&ingenic_pinctrl_driver,
1282                                      ingenic_pinctrl_probe);
1283 }
1284 subsys_initcall(ingenic_pinctrl_drv_register);