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) {
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) {
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);
1285