Blame view

drivers/pinctrl/pinctrl-ingenic.c 113 KB
af873fcec   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2
3
4
5
  /*
   * Ingenic SoCs pinctrl driver
   *
   * Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
6
   * Copyright (c) 2019 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
a0bb89e84   Paul Boddie   pinctrl: ingenic:...
7
   * Copyright (c) 2017, 2019 Paul Boddie <paul@boddie.org.uk>
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
8
9
10
   */
  
  #include <linux/compiler.h>
28d6eeb4f   Linus Walleij   pinctrl: ingenic:...
11
  #include <linux/gpio/driver.h>
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
12
13
14
  #include <linux/interrupt.h>
  #include <linux/io.h>
  #include <linux/of_device.h>
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
15
  #include <linux/of_irq.h>
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
16
17
18
19
20
21
22
23
24
25
26
27
  #include <linux/of_platform.h>
  #include <linux/pinctrl/pinctrl.h>
  #include <linux/pinctrl/pinmux.h>
  #include <linux/pinctrl/pinconf.h>
  #include <linux/pinctrl/pinconf-generic.h>
  #include <linux/platform_device.h>
  #include <linux/regmap.h>
  #include <linux/slab.h>
  
  #include "core.h"
  #include "pinconf.h"
  #include "pinmux.h"
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
28
29
  #define GPIO_PIN	0x00
  #define GPIO_MSK	0x20
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
30
31
32
33
34
35
36
  #define JZ4740_GPIO_DATA	0x10
  #define JZ4740_GPIO_PULL_DIS	0x30
  #define JZ4740_GPIO_FUNC	0x40
  #define JZ4740_GPIO_SELECT	0x50
  #define JZ4740_GPIO_DIR		0x60
  #define JZ4740_GPIO_TRIG	0x70
  #define JZ4740_GPIO_FLAG	0x80
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
37
38
39
40
41
  #define JZ4760_GPIO_INT		0x10
  #define JZ4760_GPIO_PAT1	0x30
  #define JZ4760_GPIO_PAT0	0x40
  #define JZ4760_GPIO_FLAG	0x50
  #define JZ4760_GPIO_PEN		0x70
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
42

d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
43
44
  #define X1830_GPIO_PEL			0x110
  #define X1830_GPIO_PEH			0x120
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
45

b5c23aa46   Paul Cercueil   pinctrl: add a pi...
46
47
  #define REG_SET(x) ((x) + 0x4)
  #define REG_CLEAR(x) ((x) + 0x8)
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
48
49
50
51
52
53
  #define REG_PZ_BASE(x) ((x) * 7)
  #define REG_PZ_GID2LD(x) ((x) * 7 + 0xf0)
  
  #define GPIO_PULL_DIS	0
  #define GPIO_PULL_UP	1
  #define GPIO_PULL_DOWN	2
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
54
55
56
57
  #define PINS_PER_GPIO_CHIP 32
  
  enum jz_version {
  	ID_JZ4740,
f2a967658   Paul Cercueil   pinctrl: ingenic:...
58
  	ID_JZ4725B,
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
59
  	ID_JZ4760,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
60
61
  	ID_JZ4770,
  	ID_JZ4780,
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
62
  	ID_X1000,
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
63
  	ID_X1500,
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
64
  	ID_X1830,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
65
66
67
68
  };
  
  struct ingenic_chip_info {
  	unsigned int num_chips;
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
69
  	unsigned int reg_offset;
baf156473   Paul Cercueil   pinctrl: ingenic:...
70
  	enum jz_version version;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  
  	const struct group_desc *groups;
  	unsigned int num_groups;
  
  	const struct function_desc *functions;
  	unsigned int num_functions;
  
  	const u32 *pull_ups, *pull_downs;
  };
  
  struct ingenic_pinctrl {
  	struct device *dev;
  	struct regmap *map;
  	struct pinctrl_dev *pctl;
  	struct pinctrl_pin_desc *pdesc;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
86
87
88
  
  	const struct ingenic_chip_info *info;
  };
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
89
90
91
92
93
94
  struct ingenic_gpio_chip {
  	struct ingenic_pinctrl *jzpc;
  	struct gpio_chip gc;
  	struct irq_chip irq_chip;
  	unsigned int irq, reg_base;
  };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  static const u32 jz4740_pull_ups[4] = {
  	0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
  };
  
  static const u32 jz4740_pull_downs[4] = {
  	0x00000000, 0x00000000, 0x00000000, 0x00000000,
  };
  
  static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, };
  static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
  static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, };
  static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
  static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, };
  static int jz4740_lcd_8bit_pins[] = {
  	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x52, 0x53, 0x54,
  };
  static int jz4740_lcd_16bit_pins[] = {
  	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55,
  };
  static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, };
  static int jz4740_lcd_18bit_tft_pins[] = { 0x56, 0x57, 0x31, 0x32, };
  static int jz4740_nand_cs1_pins[] = { 0x39, };
  static int jz4740_nand_cs2_pins[] = { 0x3a, };
  static int jz4740_nand_cs3_pins[] = { 0x3b, };
  static int jz4740_nand_cs4_pins[] = { 0x3c, };
bcad94d7b   Paul Cercueil   pinctrl: ingenic:...
120
  static int jz4740_nand_fre_fwe_pins[] = { 0x5c, 0x5d, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  static int jz4740_pwm_pwm0_pins[] = { 0x77, };
  static int jz4740_pwm_pwm1_pins[] = { 0x78, };
  static int jz4740_pwm_pwm2_pins[] = { 0x79, };
  static int jz4740_pwm_pwm3_pins[] = { 0x7a, };
  static int jz4740_pwm_pwm4_pins[] = { 0x7b, };
  static int jz4740_pwm_pwm5_pins[] = { 0x7c, };
  static int jz4740_pwm_pwm6_pins[] = { 0x7e, };
  static int jz4740_pwm_pwm7_pins[] = { 0x7f, };
  
  static int jz4740_mmc_1bit_funcs[] = { 0, 0, 0, };
  static int jz4740_mmc_4bit_funcs[] = { 0, 0, 0, };
  static int jz4740_uart0_data_funcs[] = { 1, 1, };
  static int jz4740_uart0_hwflow_funcs[] = { 1, 1, };
  static int jz4740_uart1_data_funcs[] = { 2, 2, };
  static int jz4740_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4740_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4740_lcd_18bit_funcs[] = { 0, 0, };
  static int jz4740_lcd_18bit_tft_funcs[] = { 0, 0, 0, 0, };
  static int jz4740_nand_cs1_funcs[] = { 0, };
  static int jz4740_nand_cs2_funcs[] = { 0, };
  static int jz4740_nand_cs3_funcs[] = { 0, };
  static int jz4740_nand_cs4_funcs[] = { 0, };
bcad94d7b   Paul Cercueil   pinctrl: ingenic:...
143
  static int jz4740_nand_fre_fwe_funcs[] = { 0, 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
  static int jz4740_pwm_pwm0_funcs[] = { 0, };
  static int jz4740_pwm_pwm1_funcs[] = { 0, };
  static int jz4740_pwm_pwm2_funcs[] = { 0, };
  static int jz4740_pwm_pwm3_funcs[] = { 0, };
  static int jz4740_pwm_pwm4_funcs[] = { 0, };
  static int jz4740_pwm_pwm5_funcs[] = { 0, };
  static int jz4740_pwm_pwm6_funcs[] = { 0, };
  static int jz4740_pwm_pwm7_funcs[] = { 0, };
  
  #define INGENIC_PIN_GROUP(name, id)			\
  	{						\
  		name,					\
  		id##_pins,				\
  		ARRAY_SIZE(id##_pins),			\
  		id##_funcs,				\
  	}
  
  static const struct group_desc jz4740_groups[] = {
  	INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit),
  	INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit),
  	INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data),
  	INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit),
  	INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit),
  	INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit),
  	INGENIC_PIN_GROUP("lcd-18bit-tft", jz4740_lcd_18bit_tft),
  	{ "lcd-no-pins", },
  	INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1),
  	INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2),
  	INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3),
  	INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4),
bcad94d7b   Paul Cercueil   pinctrl: ingenic:...
176
  	INGENIC_PIN_GROUP("nand-fre-fwe", jz4740_nand_fre_fwe),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
  	INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4),
  	INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5),
  	INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6),
  	INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7),
  };
  
  static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
  static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
  static const char *jz4740_uart1_groups[] = { "uart1-data", };
  static const char *jz4740_lcd_groups[] = {
  	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-18bit-tft", "lcd-no-pins",
  };
  static const char *jz4740_nand_groups[] = {
bcad94d7b   Paul Cercueil   pinctrl: ingenic:...
194
  	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4", "nand-fre-fwe",
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
  };
  static const char *jz4740_pwm0_groups[] = { "pwm0", };
  static const char *jz4740_pwm1_groups[] = { "pwm1", };
  static const char *jz4740_pwm2_groups[] = { "pwm2", };
  static const char *jz4740_pwm3_groups[] = { "pwm3", };
  static const char *jz4740_pwm4_groups[] = { "pwm4", };
  static const char *jz4740_pwm5_groups[] = { "pwm5", };
  static const char *jz4740_pwm6_groups[] = { "pwm6", };
  static const char *jz4740_pwm7_groups[] = { "pwm7", };
  
  static const struct function_desc jz4740_functions[] = {
  	{ "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), },
  	{ "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), },
  	{ "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), },
  	{ "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), },
  	{ "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), },
  	{ "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), },
  	{ "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), },
  	{ "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), },
  	{ "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), },
  	{ "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), },
  	{ "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), },
  	{ "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), },
  	{ "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), },
  };
  
  static const struct ingenic_chip_info jz4740_chip_info = {
  	.num_chips = 4,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
223
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
224
  	.version = ID_JZ4740,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
225
226
227
228
229
230
231
  	.groups = jz4740_groups,
  	.num_groups = ARRAY_SIZE(jz4740_groups),
  	.functions = jz4740_functions,
  	.num_functions = ARRAY_SIZE(jz4740_functions),
  	.pull_ups = jz4740_pull_ups,
  	.pull_downs = jz4740_pull_downs,
  };
f2a967658   Paul Cercueil   pinctrl: ingenic:...
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  static int jz4725b_mmc0_1bit_pins[] = { 0x48, 0x49, 0x5c, };
  static int jz4725b_mmc0_4bit_pins[] = { 0x5d, 0x5b, 0x56, };
  static int jz4725b_mmc1_1bit_pins[] = { 0x7a, 0x7b, 0x7c, };
  static int jz4725b_mmc1_4bit_pins[] = { 0x7d, 0x7e, 0x7f, };
  static int jz4725b_uart_data_pins[] = { 0x4c, 0x4d, };
  static int jz4725b_nand_cs1_pins[] = { 0x55, };
  static int jz4725b_nand_cs2_pins[] = { 0x56, };
  static int jz4725b_nand_cs3_pins[] = { 0x57, };
  static int jz4725b_nand_cs4_pins[] = { 0x58, };
  static int jz4725b_nand_cle_ale_pins[] = { 0x48, 0x49 };
  static int jz4725b_nand_fre_fwe_pins[] = { 0x5c, 0x5d };
  static int jz4725b_pwm_pwm0_pins[] = { 0x4a, };
  static int jz4725b_pwm_pwm1_pins[] = { 0x4b, };
  static int jz4725b_pwm_pwm2_pins[] = { 0x4c, };
  static int jz4725b_pwm_pwm3_pins[] = { 0x4d, };
  static int jz4725b_pwm_pwm4_pins[] = { 0x4e, };
  static int jz4725b_pwm_pwm5_pins[] = { 0x4f, };
a3240f093   Paul Cercueil   pinctrl: ingenic:...
249
250
251
252
253
254
255
256
257
258
259
260
261
  static int jz4725b_lcd_8bit_pins[] = {
  	0x72, 0x73, 0x74,
  	0x60, 0x61, 0x62, 0x63,
  	0x64, 0x65, 0x66, 0x67,
  };
  static int jz4725b_lcd_16bit_pins[] = {
  	0x68, 0x69, 0x6a, 0x6b,
  	0x6c, 0x6d, 0x6e, 0x6f,
  };
  static int jz4725b_lcd_18bit_pins[] = { 0x70, 0x71, };
  static int jz4725b_lcd_24bit_pins[] = { 0x76, 0x77, 0x78, 0x79, };
  static int jz4725b_lcd_special_pins[] = { 0x76, 0x77, 0x78, 0x79, };
  static int jz4725b_lcd_generic_pins[] = { 0x75, };
f2a967658   Paul Cercueil   pinctrl: ingenic:...
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  
  static int jz4725b_mmc0_1bit_funcs[] = { 1, 1, 1, };
  static int jz4725b_mmc0_4bit_funcs[] = { 1, 0, 1, };
  static int jz4725b_mmc1_1bit_funcs[] = { 0, 0, 0, };
  static int jz4725b_mmc1_4bit_funcs[] = { 0, 0, 0, };
  static int jz4725b_uart_data_funcs[] = { 1, 1, };
  static int jz4725b_nand_cs1_funcs[] = { 0, };
  static int jz4725b_nand_cs2_funcs[] = { 0, };
  static int jz4725b_nand_cs3_funcs[] = { 0, };
  static int jz4725b_nand_cs4_funcs[] = { 0, };
  static int jz4725b_nand_cle_ale_funcs[] = { 0, 0, };
  static int jz4725b_nand_fre_fwe_funcs[] = { 0, 0, };
  static int jz4725b_pwm_pwm0_funcs[] = { 0, };
  static int jz4725b_pwm_pwm1_funcs[] = { 0, };
  static int jz4725b_pwm_pwm2_funcs[] = { 0, };
  static int jz4725b_pwm_pwm3_funcs[] = { 0, };
  static int jz4725b_pwm_pwm4_funcs[] = { 0, };
  static int jz4725b_pwm_pwm5_funcs[] = { 0, };
a3240f093   Paul Cercueil   pinctrl: ingenic:...
280
281
282
283
284
285
  static int jz4725b_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4725b_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4725b_lcd_18bit_funcs[] = { 0, 0, };
  static int jz4725b_lcd_24bit_funcs[] = { 1, 1, 1, 1, };
  static int jz4725b_lcd_special_funcs[] = { 0, 0, 0, 0, };
  static int jz4725b_lcd_generic_funcs[] = { 0, };
f2a967658   Paul Cercueil   pinctrl: ingenic:...
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
  
  static const struct group_desc jz4725b_groups[] = {
  	INGENIC_PIN_GROUP("mmc0-1bit", jz4725b_mmc0_1bit),
  	INGENIC_PIN_GROUP("mmc0-4bit", jz4725b_mmc0_4bit),
  	INGENIC_PIN_GROUP("mmc1-1bit", jz4725b_mmc1_1bit),
  	INGENIC_PIN_GROUP("mmc1-4bit", jz4725b_mmc1_4bit),
  	INGENIC_PIN_GROUP("uart-data", jz4725b_uart_data),
  	INGENIC_PIN_GROUP("nand-cs1", jz4725b_nand_cs1),
  	INGENIC_PIN_GROUP("nand-cs2", jz4725b_nand_cs2),
  	INGENIC_PIN_GROUP("nand-cs3", jz4725b_nand_cs3),
  	INGENIC_PIN_GROUP("nand-cs4", jz4725b_nand_cs4),
  	INGENIC_PIN_GROUP("nand-cle-ale", jz4725b_nand_cle_ale),
  	INGENIC_PIN_GROUP("nand-fre-fwe", jz4725b_nand_fre_fwe),
  	INGENIC_PIN_GROUP("pwm0", jz4725b_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", jz4725b_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", jz4725b_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", jz4725b_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", jz4725b_pwm_pwm4),
  	INGENIC_PIN_GROUP("pwm5", jz4725b_pwm_pwm5),
a3240f093   Paul Cercueil   pinctrl: ingenic:...
305
306
307
308
309
310
  	INGENIC_PIN_GROUP("lcd-8bit", jz4725b_lcd_8bit),
  	INGENIC_PIN_GROUP("lcd-16bit", jz4725b_lcd_16bit),
  	INGENIC_PIN_GROUP("lcd-18bit", jz4725b_lcd_18bit),
  	INGENIC_PIN_GROUP("lcd-24bit", jz4725b_lcd_24bit),
  	INGENIC_PIN_GROUP("lcd-special", jz4725b_lcd_special),
  	INGENIC_PIN_GROUP("lcd-generic", jz4725b_lcd_generic),
f2a967658   Paul Cercueil   pinctrl: ingenic:...
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
  };
  
  static const char *jz4725b_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
  static const char *jz4725b_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
  static const char *jz4725b_uart_groups[] = { "uart-data", };
  static const char *jz4725b_nand_groups[] = {
  	"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
  	"nand-cle-ale", "nand-fre-fwe",
  };
  static const char *jz4725b_pwm0_groups[] = { "pwm0", };
  static const char *jz4725b_pwm1_groups[] = { "pwm1", };
  static const char *jz4725b_pwm2_groups[] = { "pwm2", };
  static const char *jz4725b_pwm3_groups[] = { "pwm3", };
  static const char *jz4725b_pwm4_groups[] = { "pwm4", };
  static const char *jz4725b_pwm5_groups[] = { "pwm5", };
a3240f093   Paul Cercueil   pinctrl: ingenic:...
326
327
328
329
  static const char *jz4725b_lcd_groups[] = {
  	"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-24bit",
  	"lcd-special", "lcd-generic",
  };
f2a967658   Paul Cercueil   pinctrl: ingenic:...
330
331
332
333
334
335
336
337
338
339
340
341
  
  static const struct function_desc jz4725b_functions[] = {
  	{ "mmc0", jz4725b_mmc0_groups, ARRAY_SIZE(jz4725b_mmc0_groups), },
  	{ "mmc1", jz4725b_mmc1_groups, ARRAY_SIZE(jz4725b_mmc1_groups), },
  	{ "uart", jz4725b_uart_groups, ARRAY_SIZE(jz4725b_uart_groups), },
  	{ "nand", jz4725b_nand_groups, ARRAY_SIZE(jz4725b_nand_groups), },
  	{ "pwm0", jz4725b_pwm0_groups, ARRAY_SIZE(jz4725b_pwm0_groups), },
  	{ "pwm1", jz4725b_pwm1_groups, ARRAY_SIZE(jz4725b_pwm1_groups), },
  	{ "pwm2", jz4725b_pwm2_groups, ARRAY_SIZE(jz4725b_pwm2_groups), },
  	{ "pwm3", jz4725b_pwm3_groups, ARRAY_SIZE(jz4725b_pwm3_groups), },
  	{ "pwm4", jz4725b_pwm4_groups, ARRAY_SIZE(jz4725b_pwm4_groups), },
  	{ "pwm5", jz4725b_pwm5_groups, ARRAY_SIZE(jz4725b_pwm5_groups), },
a3240f093   Paul Cercueil   pinctrl: ingenic:...
342
  	{ "lcd", jz4725b_lcd_groups, ARRAY_SIZE(jz4725b_lcd_groups), },
f2a967658   Paul Cercueil   pinctrl: ingenic:...
343
344
345
346
  };
  
  static const struct ingenic_chip_info jz4725b_chip_info = {
  	.num_chips = 4,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
347
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
348
  	.version = ID_JZ4725B,
f2a967658   Paul Cercueil   pinctrl: ingenic:...
349
350
351
352
353
354
355
  	.groups = jz4725b_groups,
  	.num_groups = ARRAY_SIZE(jz4725b_groups),
  	.functions = jz4725b_functions,
  	.num_functions = ARRAY_SIZE(jz4725b_functions),
  	.pull_ups = jz4740_pull_ups,
  	.pull_downs = jz4740_pull_downs,
  };
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
  static const u32 jz4760_pull_ups[6] = {
  	0xffffffff, 0xfffcf3ff, 0xffffffff, 0xffffcfff, 0xfffffb7c, 0xfffff00f,
  };
  
  static const u32 jz4760_pull_downs[6] = {
  	0x00000000, 0x00030c00, 0x00000000, 0x00003000, 0x00000483, 0x00000ff0,
  };
  
  static int jz4760_uart0_data_pins[] = { 0xa0, 0xa3, };
  static int jz4760_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
  static int jz4760_uart1_data_pins[] = { 0x7a, 0x7c, };
  static int jz4760_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
  static int jz4760_uart2_data_pins[] = { 0x5c, 0x5e, };
  static int jz4760_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
  static int jz4760_uart3_data_pins[] = { 0x6c, 0x85, };
  static int jz4760_uart3_hwflow_pins[] = { 0x88, 0x89, };
  static int jz4760_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
  static int jz4760_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
  static int jz4760_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
  static int jz4760_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
  static int jz4760_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
  static int jz4760_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
  static int jz4760_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
  static int jz4760_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
  static int jz4760_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
  static int jz4760_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
  static int jz4760_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
  static int jz4760_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
  static int jz4760_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
  static int jz4760_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
  static int jz4760_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
  static int jz4760_nemc_8bit_data_pins[] = {
  	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  };
  static int jz4760_nemc_16bit_data_pins[] = {
  	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  };
  static int jz4760_nemc_cle_ale_pins[] = { 0x20, 0x21, };
  static int jz4760_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
  static int jz4760_nemc_rd_we_pins[] = { 0x10, 0x11, };
  static int jz4760_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
  static int jz4760_nemc_wait_pins[] = { 0x1b, };
  static int jz4760_nemc_cs1_pins[] = { 0x15, };
  static int jz4760_nemc_cs2_pins[] = { 0x16, };
  static int jz4760_nemc_cs3_pins[] = { 0x17, };
  static int jz4760_nemc_cs4_pins[] = { 0x18, };
  static int jz4760_nemc_cs5_pins[] = { 0x19, };
  static int jz4760_nemc_cs6_pins[] = { 0x1a, };
  static int jz4760_i2c0_pins[] = { 0x7e, 0x7f, };
  static int jz4760_i2c1_pins[] = { 0x9e, 0x9f, };
  static int jz4760_cim_pins[] = {
  	0x26, 0x27, 0x28, 0x29,
  	0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
  };
  static int jz4760_lcd_24bit_pins[] = {
  	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
  	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  	0x58, 0x59, 0x5a, 0x5b,
  };
  static int jz4760_pwm_pwm0_pins[] = { 0x80, };
  static int jz4760_pwm_pwm1_pins[] = { 0x81, };
  static int jz4760_pwm_pwm2_pins[] = { 0x82, };
  static int jz4760_pwm_pwm3_pins[] = { 0x83, };
  static int jz4760_pwm_pwm4_pins[] = { 0x84, };
  static int jz4760_pwm_pwm5_pins[] = { 0x85, };
  static int jz4760_pwm_pwm6_pins[] = { 0x6a, };
  static int jz4760_pwm_pwm7_pins[] = { 0x6b, };
  
  static int jz4760_uart0_data_funcs[] = { 0, 0, };
  static int jz4760_uart0_hwflow_funcs[] = { 0, 0, };
  static int jz4760_uart1_data_funcs[] = { 0, 0, };
  static int jz4760_uart1_hwflow_funcs[] = { 0, 0, };
  static int jz4760_uart2_data_funcs[] = { 0, 0, };
  static int jz4760_uart2_hwflow_funcs[] = { 0, 0, };
  static int jz4760_uart3_data_funcs[] = { 0, 1, };
  static int jz4760_uart3_hwflow_funcs[] = { 0, 0, };
  static int jz4760_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
  static int jz4760_mmc0_4bit_a_funcs[] = { 1, 1, 1, };
  static int jz4760_mmc0_1bit_e_funcs[] = { 0, 0, 0, };
  static int jz4760_mmc0_4bit_e_funcs[] = { 0, 0, 0, };
  static int jz4760_mmc0_8bit_e_funcs[] = { 0, 0, 0, 0, };
  static int jz4760_mmc1_1bit_d_funcs[] = { 0, 0, 0, };
  static int jz4760_mmc1_4bit_d_funcs[] = { 0, 0, 0, };
  static int jz4760_mmc1_1bit_e_funcs[] = { 1, 1, 1, };
  static int jz4760_mmc1_4bit_e_funcs[] = { 1, 1, 1, };
  static int jz4760_mmc1_8bit_e_funcs[] = { 1, 1, 1, 1, };
  static int jz4760_mmc2_1bit_b_funcs[] = { 0, 0, 0, };
  static int jz4760_mmc2_4bit_b_funcs[] = { 0, 0, 0, };
  static int jz4760_mmc2_1bit_e_funcs[] = { 2, 2, 2, };
  static int jz4760_mmc2_4bit_e_funcs[] = { 2, 2, 2, };
  static int jz4760_mmc2_8bit_e_funcs[] = { 2, 2, 2, 2, };
  static int jz4760_nemc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4760_nemc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4760_nemc_cle_ale_funcs[] = { 0, 0, };
  static int jz4760_nemc_addr_funcs[] = { 0, 0, 0, 0, };
  static int jz4760_nemc_rd_we_funcs[] = { 0, 0, };
  static int jz4760_nemc_frd_fwe_funcs[] = { 0, 0, };
  static int jz4760_nemc_wait_funcs[] = { 0, };
  static int jz4760_nemc_cs1_funcs[] = { 0, };
  static int jz4760_nemc_cs2_funcs[] = { 0, };
  static int jz4760_nemc_cs3_funcs[] = { 0, };
  static int jz4760_nemc_cs4_funcs[] = { 0, };
  static int jz4760_nemc_cs5_funcs[] = { 0, };
  static int jz4760_nemc_cs6_funcs[] = { 0, };
  static int jz4760_i2c0_funcs[] = { 0, 0, };
  static int jz4760_i2c1_funcs[] = { 0, 0, };
  static int jz4760_cim_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4760_lcd_24bit_funcs[] = {
  	0, 0, 0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0,
  };
  static int jz4760_pwm_pwm0_funcs[] = { 0, };
  static int jz4760_pwm_pwm1_funcs[] = { 0, };
  static int jz4760_pwm_pwm2_funcs[] = { 0, };
  static int jz4760_pwm_pwm3_funcs[] = { 0, };
  static int jz4760_pwm_pwm4_funcs[] = { 0, };
  static int jz4760_pwm_pwm5_funcs[] = { 0, };
  static int jz4760_pwm_pwm6_funcs[] = { 0, };
  static int jz4760_pwm_pwm7_funcs[] = { 0, };
  
  static const struct group_desc jz4760_groups[] = {
  	INGENIC_PIN_GROUP("uart0-data", jz4760_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", jz4760_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data", jz4760_uart1_data),
  	INGENIC_PIN_GROUP("uart1-hwflow", jz4760_uart1_hwflow),
  	INGENIC_PIN_GROUP("uart2-data", jz4760_uart2_data),
  	INGENIC_PIN_GROUP("uart2-hwflow", jz4760_uart2_hwflow),
  	INGENIC_PIN_GROUP("uart3-data", jz4760_uart3_data),
  	INGENIC_PIN_GROUP("uart3-hwflow", jz4760_uart3_hwflow),
  	INGENIC_PIN_GROUP("mmc0-1bit-a", jz4760_mmc0_1bit_a),
  	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4760_mmc0_4bit_a),
  	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4760_mmc0_1bit_e),
  	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4760_mmc0_4bit_e),
  	INGENIC_PIN_GROUP("mmc0-8bit-e", jz4760_mmc0_8bit_e),
  	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4760_mmc1_1bit_d),
  	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4760_mmc1_4bit_d),
  	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4760_mmc1_1bit_e),
  	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4760_mmc1_4bit_e),
  	INGENIC_PIN_GROUP("mmc1-8bit-e", jz4760_mmc1_8bit_e),
  	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4760_mmc2_1bit_b),
  	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4760_mmc2_4bit_b),
  	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4760_mmc2_1bit_e),
  	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4760_mmc2_4bit_e),
  	INGENIC_PIN_GROUP("mmc2-8bit-e", jz4760_mmc2_8bit_e),
  	INGENIC_PIN_GROUP("nemc-8bit-data", jz4760_nemc_8bit_data),
  	INGENIC_PIN_GROUP("nemc-16bit-data", jz4760_nemc_16bit_data),
  	INGENIC_PIN_GROUP("nemc-cle-ale", jz4760_nemc_cle_ale),
  	INGENIC_PIN_GROUP("nemc-addr", jz4760_nemc_addr),
  	INGENIC_PIN_GROUP("nemc-rd-we", jz4760_nemc_rd_we),
  	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4760_nemc_frd_fwe),
  	INGENIC_PIN_GROUP("nemc-wait", jz4760_nemc_wait),
  	INGENIC_PIN_GROUP("nemc-cs1", jz4760_nemc_cs1),
  	INGENIC_PIN_GROUP("nemc-cs2", jz4760_nemc_cs2),
  	INGENIC_PIN_GROUP("nemc-cs3", jz4760_nemc_cs3),
  	INGENIC_PIN_GROUP("nemc-cs4", jz4760_nemc_cs4),
  	INGENIC_PIN_GROUP("nemc-cs5", jz4760_nemc_cs5),
  	INGENIC_PIN_GROUP("nemc-cs6", jz4760_nemc_cs6),
  	INGENIC_PIN_GROUP("i2c0-data", jz4760_i2c0),
  	INGENIC_PIN_GROUP("i2c1-data", jz4760_i2c1),
  	INGENIC_PIN_GROUP("cim-data", jz4760_cim),
  	INGENIC_PIN_GROUP("lcd-24bit", jz4760_lcd_24bit),
  	{ "lcd-no-pins", },
  	INGENIC_PIN_GROUP("pwm0", jz4760_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", jz4760_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", jz4760_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", jz4760_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", jz4760_pwm_pwm4),
  	INGENIC_PIN_GROUP("pwm5", jz4760_pwm_pwm5),
  	INGENIC_PIN_GROUP("pwm6", jz4760_pwm_pwm6),
  	INGENIC_PIN_GROUP("pwm7", jz4760_pwm_pwm7),
  };
  
  static const char *jz4760_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
  static const char *jz4760_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
  static const char *jz4760_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
  static const char *jz4760_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
  static const char *jz4760_mmc0_groups[] = {
  	"mmc0-1bit-a", "mmc0-4bit-a",
  	"mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
  };
  static const char *jz4760_mmc1_groups[] = {
  	"mmc1-1bit-d", "mmc1-4bit-d",
  	"mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
  };
  static const char *jz4760_mmc2_groups[] = {
  	"mmc2-1bit-b", "mmc2-4bit-b",
  	"mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
  };
  static const char *jz4760_nemc_groups[] = {
  	"nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
  	"nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
  };
  static const char *jz4760_cs1_groups[] = { "nemc-cs1", };
  static const char *jz4760_cs2_groups[] = { "nemc-cs2", };
  static const char *jz4760_cs3_groups[] = { "nemc-cs3", };
  static const char *jz4760_cs4_groups[] = { "nemc-cs4", };
  static const char *jz4760_cs5_groups[] = { "nemc-cs5", };
  static const char *jz4760_cs6_groups[] = { "nemc-cs6", };
  static const char *jz4760_i2c0_groups[] = { "i2c0-data", };
  static const char *jz4760_i2c1_groups[] = { "i2c1-data", };
  static const char *jz4760_cim_groups[] = { "cim-data", };
  static const char *jz4760_lcd_groups[] = { "lcd-24bit", "lcd-no-pins", };
  static const char *jz4760_pwm0_groups[] = { "pwm0", };
  static const char *jz4760_pwm1_groups[] = { "pwm1", };
  static const char *jz4760_pwm2_groups[] = { "pwm2", };
  static const char *jz4760_pwm3_groups[] = { "pwm3", };
  static const char *jz4760_pwm4_groups[] = { "pwm4", };
  static const char *jz4760_pwm5_groups[] = { "pwm5", };
  static const char *jz4760_pwm6_groups[] = { "pwm6", };
  static const char *jz4760_pwm7_groups[] = { "pwm7", };
  
  static const struct function_desc jz4760_functions[] = {
  	{ "uart0", jz4760_uart0_groups, ARRAY_SIZE(jz4760_uart0_groups), },
  	{ "uart1", jz4760_uart1_groups, ARRAY_SIZE(jz4760_uart1_groups), },
  	{ "uart2", jz4760_uart2_groups, ARRAY_SIZE(jz4760_uart2_groups), },
  	{ "uart3", jz4760_uart3_groups, ARRAY_SIZE(jz4760_uart3_groups), },
  	{ "mmc0", jz4760_mmc0_groups, ARRAY_SIZE(jz4760_mmc0_groups), },
  	{ "mmc1", jz4760_mmc1_groups, ARRAY_SIZE(jz4760_mmc1_groups), },
  	{ "mmc2", jz4760_mmc2_groups, ARRAY_SIZE(jz4760_mmc2_groups), },
  	{ "nemc", jz4760_nemc_groups, ARRAY_SIZE(jz4760_nemc_groups), },
  	{ "nemc-cs1", jz4760_cs1_groups, ARRAY_SIZE(jz4760_cs1_groups), },
  	{ "nemc-cs2", jz4760_cs2_groups, ARRAY_SIZE(jz4760_cs2_groups), },
  	{ "nemc-cs3", jz4760_cs3_groups, ARRAY_SIZE(jz4760_cs3_groups), },
  	{ "nemc-cs4", jz4760_cs4_groups, ARRAY_SIZE(jz4760_cs4_groups), },
  	{ "nemc-cs5", jz4760_cs5_groups, ARRAY_SIZE(jz4760_cs5_groups), },
  	{ "nemc-cs6", jz4760_cs6_groups, ARRAY_SIZE(jz4760_cs6_groups), },
  	{ "i2c0", jz4760_i2c0_groups, ARRAY_SIZE(jz4760_i2c0_groups), },
  	{ "i2c1", jz4760_i2c1_groups, ARRAY_SIZE(jz4760_i2c1_groups), },
  	{ "cim", jz4760_cim_groups, ARRAY_SIZE(jz4760_cim_groups), },
  	{ "lcd", jz4760_lcd_groups, ARRAY_SIZE(jz4760_lcd_groups), },
  	{ "pwm0", jz4760_pwm0_groups, ARRAY_SIZE(jz4760_pwm0_groups), },
  	{ "pwm1", jz4760_pwm1_groups, ARRAY_SIZE(jz4760_pwm1_groups), },
  	{ "pwm2", jz4760_pwm2_groups, ARRAY_SIZE(jz4760_pwm2_groups), },
  	{ "pwm3", jz4760_pwm3_groups, ARRAY_SIZE(jz4760_pwm3_groups), },
  	{ "pwm4", jz4760_pwm4_groups, ARRAY_SIZE(jz4760_pwm4_groups), },
  	{ "pwm5", jz4760_pwm5_groups, ARRAY_SIZE(jz4760_pwm5_groups), },
  	{ "pwm6", jz4760_pwm6_groups, ARRAY_SIZE(jz4760_pwm6_groups), },
  	{ "pwm7", jz4760_pwm7_groups, ARRAY_SIZE(jz4760_pwm7_groups), },
  };
  
  static const struct ingenic_chip_info jz4760_chip_info = {
  	.num_chips = 6,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
601
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
602
  	.version = ID_JZ4760,
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
603
604
605
606
607
608
609
  	.groups = jz4760_groups,
  	.num_groups = ARRAY_SIZE(jz4760_groups),
  	.functions = jz4760_functions,
  	.num_functions = ARRAY_SIZE(jz4760_functions),
  	.pull_ups = jz4760_pull_ups,
  	.pull_downs = jz4760_pull_downs,
  };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
610
611
612
613
614
615
616
617
618
619
620
621
  static const u32 jz4770_pull_ups[6] = {
  	0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f,
  };
  
  static const u32 jz4770_pull_downs[6] = {
  	0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
  };
  
  static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
  static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
  static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
  static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
622
623
  static int jz4770_uart2_data_pins[] = { 0x5c, 0x5e, };
  static int jz4770_uart2_hwflow_pins[] = { 0x5d, 0x5f, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
624
625
  static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
  static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
626
627
  static int jz4770_ssi0_dt_a_pins[] = { 0x15, };
  static int jz4770_ssi0_dt_b_pins[] = { 0x35, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
628
629
  static int jz4770_ssi0_dt_d_pins[] = { 0x75, };
  static int jz4770_ssi0_dt_e_pins[] = { 0x91, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
630
631
  static int jz4770_ssi0_dr_a_pins[] = { 0x14, };
  static int jz4770_ssi0_dr_b_pins[] = { 0x34, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
632
633
  static int jz4770_ssi0_dr_d_pins[] = { 0x74, };
  static int jz4770_ssi0_dr_e_pins[] = { 0x8e, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
634
635
  static int jz4770_ssi0_clk_a_pins[] = { 0x12, };
  static int jz4770_ssi0_clk_b_pins[] = { 0x3c, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
636
637
  static int jz4770_ssi0_clk_d_pins[] = { 0x78, };
  static int jz4770_ssi0_clk_e_pins[] = { 0x8f, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
638
  static int jz4770_ssi0_gpc_b_pins[] = { 0x3e, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
639
640
  static int jz4770_ssi0_gpc_d_pins[] = { 0x76, };
  static int jz4770_ssi0_gpc_e_pins[] = { 0x93, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
641
642
  static int jz4770_ssi0_ce0_a_pins[] = { 0x13, };
  static int jz4770_ssi0_ce0_b_pins[] = { 0x3d, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
643
644
  static int jz4770_ssi0_ce0_d_pins[] = { 0x79, };
  static int jz4770_ssi0_ce0_e_pins[] = { 0x90, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
645
  static int jz4770_ssi0_ce1_b_pins[] = { 0x3f, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
646
647
  static int jz4770_ssi0_ce1_d_pins[] = { 0x77, };
  static int jz4770_ssi0_ce1_e_pins[] = { 0x92, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
648
  static int jz4770_ssi1_dt_b_pins[] = { 0x35, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
649
650
  static int jz4770_ssi1_dt_d_pins[] = { 0x75, };
  static int jz4770_ssi1_dt_e_pins[] = { 0x91, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
651
  static int jz4770_ssi1_dr_b_pins[] = { 0x34, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
652
653
  static int jz4770_ssi1_dr_d_pins[] = { 0x74, };
  static int jz4770_ssi1_dr_e_pins[] = { 0x8e, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
654
  static int jz4770_ssi1_clk_b_pins[] = { 0x3c, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
655
656
  static int jz4770_ssi1_clk_d_pins[] = { 0x78, };
  static int jz4770_ssi1_clk_e_pins[] = { 0x8f, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
657
  static int jz4770_ssi1_gpc_b_pins[] = { 0x3e, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
658
659
  static int jz4770_ssi1_gpc_d_pins[] = { 0x76, };
  static int jz4770_ssi1_gpc_e_pins[] = { 0x93, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
660
  static int jz4770_ssi1_ce0_b_pins[] = { 0x3d, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
661
662
  static int jz4770_ssi1_ce0_d_pins[] = { 0x79, };
  static int jz4770_ssi1_ce0_e_pins[] = { 0x90, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
663
  static int jz4770_ssi1_ce1_b_pins[] = { 0x3f, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
664
665
  static int jz4770_ssi1_ce1_d_pins[] = { 0x77, };
  static int jz4770_ssi1_ce1_e_pins[] = { 0x92, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
666
  static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
667
  static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
668
  static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
669
670
  static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
  static int jz4770_mmc0_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
671
  static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
672
  static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
673
  static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
674
675
  static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
  static int jz4770_mmc1_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
676
677
678
679
680
  static int jz4770_mmc2_1bit_b_pins[] = { 0x3c, 0x3d, 0x34, };
  static int jz4770_mmc2_4bit_b_pins[] = { 0x35, 0x3e, 0x3f, };
  static int jz4770_mmc2_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
  static int jz4770_mmc2_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
  static int jz4770_mmc2_8bit_e_pins[] = { 0x98, 0x99, 0x9a, 0x9b, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
681
  static int jz4770_nemc_8bit_data_pins[] = {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
682
683
  	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
684
685
686
  static int jz4770_nemc_16bit_data_pins[] = {
  	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
687
688
689
690
  static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
  static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
  static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
  static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
691
  static int jz4770_nemc_wait_pins[] = { 0x1b, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
692
693
694
695
696
697
  static int jz4770_nemc_cs1_pins[] = { 0x15, };
  static int jz4770_nemc_cs2_pins[] = { 0x16, };
  static int jz4770_nemc_cs3_pins[] = { 0x17, };
  static int jz4770_nemc_cs4_pins[] = { 0x18, };
  static int jz4770_nemc_cs5_pins[] = { 0x19, };
  static int jz4770_nemc_cs6_pins[] = { 0x1a, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
698
699
  static int jz4770_i2c0_pins[] = { 0x7e, 0x7f, };
  static int jz4770_i2c1_pins[] = { 0x9e, 0x9f, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
700
  static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
701
702
703
704
705
706
  static int jz4770_cim_8bit_pins[] = {
  	0x26, 0x27, 0x28, 0x29,
  	0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
  };
  static int jz4770_cim_12bit_pins[] = {
  	0x32, 0x33, 0xb0, 0xb1,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
707
  };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
708
  static int jz4770_lcd_24bit_pins[] = {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
709
710
711
  	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
  	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
712
  	0x58, 0x59, 0x5a, 0x5b,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
713
714
715
716
717
718
719
720
721
  };
  static int jz4770_pwm_pwm0_pins[] = { 0x80, };
  static int jz4770_pwm_pwm1_pins[] = { 0x81, };
  static int jz4770_pwm_pwm2_pins[] = { 0x82, };
  static int jz4770_pwm_pwm3_pins[] = { 0x83, };
  static int jz4770_pwm_pwm4_pins[] = { 0x84, };
  static int jz4770_pwm_pwm5_pins[] = { 0x85, };
  static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
  static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
722
723
724
725
  static int jz4770_mac_rmii_pins[] = {
  	0xa9, 0xab, 0xaa, 0xac, 0xa5, 0xa4, 0xad, 0xae, 0xa6, 0xa8,
  };
  static int jz4770_mac_mii_pins[] = { 0xa7, 0xaf, };
ae75b53e0   Paul Cercueil   pinctrl: ingenic:...
726
  static int jz4770_otg_pins[] = { 0x8a, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
727
728
729
730
731
  
  static int jz4770_uart0_data_funcs[] = { 0, 0, };
  static int jz4770_uart0_hwflow_funcs[] = { 0, 0, };
  static int jz4770_uart1_data_funcs[] = { 0, 0, };
  static int jz4770_uart1_hwflow_funcs[] = { 0, 0, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
732
733
  static int jz4770_uart2_data_funcs[] = { 0, 0, };
  static int jz4770_uart2_hwflow_funcs[] = { 0, 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
734
735
  static int jz4770_uart3_data_funcs[] = { 0, 1, };
  static int jz4770_uart3_hwflow_funcs[] = { 0, 0, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
  static int jz4770_ssi0_dt_a_funcs[] = { 2, };
  static int jz4770_ssi0_dt_b_funcs[] = { 1, };
  static int jz4770_ssi0_dt_d_funcs[] = { 1, };
  static int jz4770_ssi0_dt_e_funcs[] = { 0, };
  static int jz4770_ssi0_dr_a_funcs[] = { 1, };
  static int jz4770_ssi0_dr_b_funcs[] = { 1, };
  static int jz4770_ssi0_dr_d_funcs[] = { 1, };
  static int jz4770_ssi0_dr_e_funcs[] = { 0, };
  static int jz4770_ssi0_clk_a_funcs[] = { 2, };
  static int jz4770_ssi0_clk_b_funcs[] = { 1, };
  static int jz4770_ssi0_clk_d_funcs[] = { 1, };
  static int jz4770_ssi0_clk_e_funcs[] = { 0, };
  static int jz4770_ssi0_gpc_b_funcs[] = { 1, };
  static int jz4770_ssi0_gpc_d_funcs[] = { 1, };
  static int jz4770_ssi0_gpc_e_funcs[] = { 0, };
  static int jz4770_ssi0_ce0_a_funcs[] = { 2, };
  static int jz4770_ssi0_ce0_b_funcs[] = { 1, };
  static int jz4770_ssi0_ce0_d_funcs[] = { 1, };
  static int jz4770_ssi0_ce0_e_funcs[] = { 0, };
  static int jz4770_ssi0_ce1_b_funcs[] = { 1, };
  static int jz4770_ssi0_ce1_d_funcs[] = { 1, };
  static int jz4770_ssi0_ce1_e_funcs[] = { 0, };
  static int jz4770_ssi1_dt_b_funcs[] = { 2, };
  static int jz4770_ssi1_dt_d_funcs[] = { 2, };
  static int jz4770_ssi1_dt_e_funcs[] = { 1, };
  static int jz4770_ssi1_dr_b_funcs[] = { 2, };
  static int jz4770_ssi1_dr_d_funcs[] = { 2, };
  static int jz4770_ssi1_dr_e_funcs[] = { 1, };
  static int jz4770_ssi1_clk_b_funcs[] = { 2, };
  static int jz4770_ssi1_clk_d_funcs[] = { 2, };
  static int jz4770_ssi1_clk_e_funcs[] = { 1, };
  static int jz4770_ssi1_gpc_b_funcs[] = { 2, };
  static int jz4770_ssi1_gpc_d_funcs[] = { 2, };
  static int jz4770_ssi1_gpc_e_funcs[] = { 1, };
  static int jz4770_ssi1_ce0_b_funcs[] = { 2, };
  static int jz4770_ssi1_ce0_d_funcs[] = { 2, };
  static int jz4770_ssi1_ce0_e_funcs[] = { 1, };
  static int jz4770_ssi1_ce1_b_funcs[] = { 2, };
  static int jz4770_ssi1_ce1_d_funcs[] = { 2, };
  static int jz4770_ssi1_ce1_e_funcs[] = { 1, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
776
  static int jz4770_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
777
  static int jz4770_mmc0_4bit_a_funcs[] = { 1, 1, 1, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
778
  static int jz4770_mmc0_1bit_e_funcs[] = { 0, 0, 0, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
779
780
  static int jz4770_mmc0_4bit_e_funcs[] = { 0, 0, 0, };
  static int jz4770_mmc0_8bit_e_funcs[] = { 0, 0, 0, 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
781
  static int jz4770_mmc1_1bit_d_funcs[] = { 0, 0, 0, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
782
  static int jz4770_mmc1_4bit_d_funcs[] = { 0, 0, 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
783
  static int jz4770_mmc1_1bit_e_funcs[] = { 1, 1, 1, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
784
785
  static int jz4770_mmc1_4bit_e_funcs[] = { 1, 1, 1, };
  static int jz4770_mmc1_8bit_e_funcs[] = { 1, 1, 1, 1, };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
786
787
788
789
790
  static int jz4770_mmc2_1bit_b_funcs[] = { 0, 0, 0, };
  static int jz4770_mmc2_4bit_b_funcs[] = { 0, 0, 0, };
  static int jz4770_mmc2_1bit_e_funcs[] = { 2, 2, 2, };
  static int jz4770_mmc2_4bit_e_funcs[] = { 2, 2, 2, };
  static int jz4770_mmc2_8bit_e_funcs[] = { 2, 2, 2, 2, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
791
792
  static int jz4770_nemc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4770_nemc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
793
794
795
796
  static int jz4770_nemc_cle_ale_funcs[] = { 0, 0, };
  static int jz4770_nemc_addr_funcs[] = { 0, 0, 0, 0, };
  static int jz4770_nemc_rd_we_funcs[] = { 0, 0, };
  static int jz4770_nemc_frd_fwe_funcs[] = { 0, 0, };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
797
  static int jz4770_nemc_wait_funcs[] = { 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
798
799
800
801
802
803
804
805
806
  static int jz4770_nemc_cs1_funcs[] = { 0, };
  static int jz4770_nemc_cs2_funcs[] = { 0, };
  static int jz4770_nemc_cs3_funcs[] = { 0, };
  static int jz4770_nemc_cs4_funcs[] = { 0, };
  static int jz4770_nemc_cs5_funcs[] = { 0, };
  static int jz4770_nemc_cs6_funcs[] = { 0, };
  static int jz4770_i2c0_funcs[] = { 0, 0, };
  static int jz4770_i2c1_funcs[] = { 0, 0, };
  static int jz4770_i2c2_funcs[] = { 2, 2, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
807
808
809
810
  static int jz4770_cim_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4770_cim_12bit_funcs[] = { 0, 0, 0, 0, };
  static int jz4770_lcd_24bit_funcs[] = {
  	0, 0, 0, 0, 0, 0, 0, 0,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
811
812
  	0, 0, 0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0, 0, 0, 0, 0,
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
813
  	0, 0, 0, 0,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
814
815
816
817
818
819
820
821
822
  };
  static int jz4770_pwm_pwm0_funcs[] = { 0, };
  static int jz4770_pwm_pwm1_funcs[] = { 0, };
  static int jz4770_pwm_pwm2_funcs[] = { 0, };
  static int jz4770_pwm_pwm3_funcs[] = { 0, };
  static int jz4770_pwm_pwm4_funcs[] = { 0, };
  static int jz4770_pwm_pwm5_funcs[] = { 0, };
  static int jz4770_pwm_pwm6_funcs[] = { 0, };
  static int jz4770_pwm_pwm7_funcs[] = { 0, };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
823
824
  static int jz4770_mac_rmii_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  static int jz4770_mac_mii_funcs[] = { 0, 0, };
ae75b53e0   Paul Cercueil   pinctrl: ingenic:...
825
  static int jz4770_otg_funcs[] = { 0, };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
826
827
828
829
830
831
832
833
834
835
  
  static const struct group_desc jz4770_groups[] = {
  	INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data),
  	INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow),
  	INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data),
  	INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow),
  	INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data),
  	INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow),
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
  	INGENIC_PIN_GROUP("ssi0-dt-a", jz4770_ssi0_dt_a),
  	INGENIC_PIN_GROUP("ssi0-dt-b", jz4770_ssi0_dt_b),
  	INGENIC_PIN_GROUP("ssi0-dt-d", jz4770_ssi0_dt_d),
  	INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e),
  	INGENIC_PIN_GROUP("ssi0-dr-a", jz4770_ssi0_dr_a),
  	INGENIC_PIN_GROUP("ssi0-dr-b", jz4770_ssi0_dr_b),
  	INGENIC_PIN_GROUP("ssi0-dr-d", jz4770_ssi0_dr_d),
  	INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e),
  	INGENIC_PIN_GROUP("ssi0-clk-a", jz4770_ssi0_clk_a),
  	INGENIC_PIN_GROUP("ssi0-clk-b", jz4770_ssi0_clk_b),
  	INGENIC_PIN_GROUP("ssi0-clk-d", jz4770_ssi0_clk_d),
  	INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e),
  	INGENIC_PIN_GROUP("ssi0-gpc-b", jz4770_ssi0_gpc_b),
  	INGENIC_PIN_GROUP("ssi0-gpc-d", jz4770_ssi0_gpc_d),
  	INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e),
  	INGENIC_PIN_GROUP("ssi0-ce0-a", jz4770_ssi0_ce0_a),
  	INGENIC_PIN_GROUP("ssi0-ce0-b", jz4770_ssi0_ce0_b),
  	INGENIC_PIN_GROUP("ssi0-ce0-d", jz4770_ssi0_ce0_d),
  	INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e),
  	INGENIC_PIN_GROUP("ssi0-ce1-b", jz4770_ssi0_ce1_b),
  	INGENIC_PIN_GROUP("ssi0-ce1-d", jz4770_ssi0_ce1_d),
  	INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e),
  	INGENIC_PIN_GROUP("ssi1-dt-b", jz4770_ssi1_dt_b),
  	INGENIC_PIN_GROUP("ssi1-dt-d", jz4770_ssi1_dt_d),
  	INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e),
  	INGENIC_PIN_GROUP("ssi1-dr-b", jz4770_ssi1_dr_b),
  	INGENIC_PIN_GROUP("ssi1-dr-d", jz4770_ssi1_dr_d),
  	INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e),
  	INGENIC_PIN_GROUP("ssi1-clk-b", jz4770_ssi1_clk_b),
  	INGENIC_PIN_GROUP("ssi1-clk-d", jz4770_ssi1_clk_d),
  	INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e),
  	INGENIC_PIN_GROUP("ssi1-gpc-b", jz4770_ssi1_gpc_b),
  	INGENIC_PIN_GROUP("ssi1-gpc-d", jz4770_ssi1_gpc_d),
  	INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e),
  	INGENIC_PIN_GROUP("ssi1-ce0-b", jz4770_ssi1_ce0_b),
  	INGENIC_PIN_GROUP("ssi1-ce0-d", jz4770_ssi1_ce0_d),
  	INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e),
  	INGENIC_PIN_GROUP("ssi1-ce1-b", jz4770_ssi1_ce1_b),
  	INGENIC_PIN_GROUP("ssi1-ce1-d", jz4770_ssi1_ce1_d),
  	INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
876
  	INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
877
  	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
878
  	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
879
880
  	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e),
  	INGENIC_PIN_GROUP("mmc0-8bit-e", jz4770_mmc0_8bit_e),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
881
  	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
882
  	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
883
  	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
884
885
  	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e),
  	INGENIC_PIN_GROUP("mmc1-8bit-e", jz4770_mmc1_8bit_e),
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
886
887
888
889
890
  	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b),
  	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b),
  	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e),
  	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e),
  	INGENIC_PIN_GROUP("mmc2-8bit-e", jz4770_mmc2_8bit_e),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
891
892
  	INGENIC_PIN_GROUP("nemc-8bit-data", jz4770_nemc_8bit_data),
  	INGENIC_PIN_GROUP("nemc-16bit-data", jz4770_nemc_16bit_data),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
893
894
895
896
  	INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale),
  	INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr),
  	INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we),
  	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe),
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
897
  	INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
898
899
900
901
902
903
904
905
906
  	INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1),
  	INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2),
  	INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3),
  	INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4),
  	INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5),
  	INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6),
  	INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0),
  	INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1),
  	INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
907
908
909
  	INGENIC_PIN_GROUP("cim-data-8bit", jz4770_cim_8bit),
  	INGENIC_PIN_GROUP("cim-data-12bit", jz4770_cim_12bit),
  	INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
910
911
912
913
914
915
916
917
918
  	{ "lcd-no-pins", },
  	INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4),
  	INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5),
  	INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6),
  	INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7),
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
919
920
  	INGENIC_PIN_GROUP("mac-rmii", jz4770_mac_rmii),
  	INGENIC_PIN_GROUP("mac-mii", jz4770_mac_mii),
ae75b53e0   Paul Cercueil   pinctrl: ingenic:...
921
  	INGENIC_PIN_GROUP("otg-vbus", jz4770_otg),
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
922
923
924
925
926
927
  };
  
  static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
  static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
  static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
  static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
  static const char *jz4770_ssi0_groups[] = {
  	"ssi0-dt-a", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
  	"ssi0-dr-a", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
  	"ssi0-clk-a", "ssi0-clk-b", "ssi0-clk-d", "ssi0-clk-e",
  	"ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
  	"ssi0-ce0-a", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
  	"ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
  };
  static const char *jz4770_ssi1_groups[] = {
  	"ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
  	"ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
  	"ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
  	"ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
  	"ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
  	"ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
  };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
944
  static const char *jz4770_mmc0_groups[] = {
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
945
946
  	"mmc0-1bit-a", "mmc0-4bit-a",
  	"mmc0-1bit-e", "mmc0-4bit-e", "mmc0-8bit-e",
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
947
948
  };
  static const char *jz4770_mmc1_groups[] = {
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
949
950
  	"mmc1-1bit-d", "mmc1-4bit-d",
  	"mmc1-1bit-e", "mmc1-4bit-e", "mmc1-8bit-e",
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
951
  };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
952
953
954
955
  static const char *jz4770_mmc2_groups[] = {
  	"mmc2-1bit-b", "mmc2-4bit-b",
  	"mmc2-1bit-e", "mmc2-4bit-e", "mmc2-8bit-e",
  };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
956
  static const char *jz4770_nemc_groups[] = {
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
957
  	"nemc-8bit-data", "nemc-16bit-data", "nemc-cle-ale",
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
958
  	"nemc-addr", "nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
959
960
  };
  static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
961
962
963
964
  static const char *jz4770_cs2_groups[] = { "nemc-cs2", };
  static const char *jz4770_cs3_groups[] = { "nemc-cs3", };
  static const char *jz4770_cs4_groups[] = { "nemc-cs4", };
  static const char *jz4770_cs5_groups[] = { "nemc-cs5", };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
965
966
967
968
  static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
  static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
  static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
  static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
969
970
  static const char *jz4770_cim_groups[] = { "cim-data-8bit", "cim-data-12bit", };
  static const char *jz4770_lcd_groups[] = { "lcd-24bit", "lcd-no-pins", };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
971
972
973
974
975
976
977
978
  static const char *jz4770_pwm0_groups[] = { "pwm0", };
  static const char *jz4770_pwm1_groups[] = { "pwm1", };
  static const char *jz4770_pwm2_groups[] = { "pwm2", };
  static const char *jz4770_pwm3_groups[] = { "pwm3", };
  static const char *jz4770_pwm4_groups[] = { "pwm4", };
  static const char *jz4770_pwm5_groups[] = { "pwm5", };
  static const char *jz4770_pwm6_groups[] = { "pwm6", };
  static const char *jz4770_pwm7_groups[] = { "pwm7", };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
979
  static const char *jz4770_mac_groups[] = { "mac-rmii", "mac-mii", };
ae75b53e0   Paul Cercueil   pinctrl: ingenic:...
980
  static const char *jz4770_otg_groups[] = { "otg-vbus", };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
981
982
983
984
985
986
  
  static const struct function_desc jz4770_functions[] = {
  	{ "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
  	{ "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
  	{ "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
  	{ "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
987
988
  	{ "ssi0", jz4770_ssi0_groups, ARRAY_SIZE(jz4770_ssi0_groups), },
  	{ "ssi1", jz4770_ssi1_groups, ARRAY_SIZE(jz4770_ssi1_groups), },
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
989
990
  	{ "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
  	{ "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
991
  	{ "mmc2", jz4770_mmc2_groups, ARRAY_SIZE(jz4770_mmc2_groups), },
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
992
993
  	{ "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
  	{ "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
994
995
996
997
  	{ "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
  	{ "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
  	{ "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
  	{ "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
998
999
1000
1001
  	{ "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
  	{ "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
  	{ "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
  	{ "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
  	{ "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
  	{ "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
  	{ "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
  	{ "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
  	{ "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
  	{ "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
  	{ "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
  	{ "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
  	{ "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
  	{ "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
1012
  	{ "mac", jz4770_mac_groups, ARRAY_SIZE(jz4770_mac_groups), },
ae75b53e0   Paul Cercueil   pinctrl: ingenic:...
1013
  	{ "otg", jz4770_otg_groups, ARRAY_SIZE(jz4770_otg_groups), },
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
1014
1015
1016
1017
  };
  
  static const struct ingenic_chip_info jz4770_chip_info = {
  	.num_chips = 6,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1018
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
1019
  	.version = ID_JZ4770,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
1020
1021
1022
1023
1024
1025
1026
  	.groups = jz4770_groups,
  	.num_groups = ARRAY_SIZE(jz4770_groups),
  	.functions = jz4770_functions,
  	.num_functions = ARRAY_SIZE(jz4770_functions),
  	.pull_ups = jz4770_pull_ups,
  	.pull_downs = jz4770_pull_downs,
  };
d9f5dc495   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1027
1028
1029
1030
1031
1032
1033
  static const u32 jz4780_pull_ups[6] = {
  	0x3fffffff, 0xfff0f3fc, 0x0fffffff, 0xffff4fff, 0xfffffb7c, 0x7fa7f00f,
  };
  
  static const u32 jz4780_pull_downs[6] = {
  	0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
  };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1034
1035
1036
  static int jz4780_uart2_data_pins[] = { 0x66, 0x67, };
  static int jz4780_uart2_hwflow_pins[] = { 0x65, 0x64, };
  static int jz4780_uart4_data_pins[] = { 0x54, 0x4a, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1037
1038
1039
1040
  static int jz4780_ssi0_dt_a_19_pins[] = { 0x13, };
  static int jz4780_ssi0_dt_a_21_pins[] = { 0x15, };
  static int jz4780_ssi0_dt_a_28_pins[] = { 0x1c, };
  static int jz4780_ssi0_dt_b_pins[] = { 0x3d, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1041
  static int jz4780_ssi0_dt_d_pins[] = { 0x79, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1042
1043
1044
  static int jz4780_ssi0_dr_a_20_pins[] = { 0x14, };
  static int jz4780_ssi0_dr_a_27_pins[] = { 0x1b, };
  static int jz4780_ssi0_dr_b_pins[] = { 0x34, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1045
  static int jz4780_ssi0_dr_d_pins[] = { 0x74, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1046
1047
1048
  static int jz4780_ssi0_clk_a_pins[] = { 0x12, };
  static int jz4780_ssi0_clk_b_5_pins[] = { 0x25, };
  static int jz4780_ssi0_clk_b_28_pins[] = { 0x3c, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1049
  static int jz4780_ssi0_clk_d_pins[] = { 0x78, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1050
  static int jz4780_ssi0_gpc_b_pins[] = { 0x3e, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1051
  static int jz4780_ssi0_gpc_d_pins[] = { 0x76, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1052
1053
1054
  static int jz4780_ssi0_ce0_a_23_pins[] = { 0x17, };
  static int jz4780_ssi0_ce0_a_25_pins[] = { 0x19, };
  static int jz4780_ssi0_ce0_b_pins[] = { 0x3f, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1055
  static int jz4780_ssi0_ce0_d_pins[] = { 0x77, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1056
  static int jz4780_ssi0_ce1_b_pins[] = { 0x35, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1057
  static int jz4780_ssi0_ce1_d_pins[] = { 0x75, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1058
  static int jz4780_ssi1_dt_b_pins[] = { 0x3d, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1059
  static int jz4780_ssi1_dt_d_pins[] = { 0x79, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1060
  static int jz4780_ssi1_dr_b_pins[] = { 0x34, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1061
  static int jz4780_ssi1_dr_d_pins[] = { 0x74, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1062
  static int jz4780_ssi1_clk_b_pins[] = { 0x3c, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1063
  static int jz4780_ssi1_clk_d_pins[] = { 0x78, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1064
  static int jz4780_ssi1_gpc_b_pins[] = { 0x3e, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1065
  static int jz4780_ssi1_gpc_d_pins[] = { 0x76, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1066
  static int jz4780_ssi1_ce0_b_pins[] = { 0x3f, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1067
  static int jz4780_ssi1_ce0_d_pins[] = { 0x77, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1068
  static int jz4780_ssi1_ce1_b_pins[] = { 0x35, };
f83c26090   Paul Cercueil   pinctrl: ingenic:...
1069
  static int jz4780_ssi1_ce1_d_pins[] = { 0x75, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1070
1071
1072
1073
  static int jz4780_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
  static int jz4780_i2c3_pins[] = { 0x6a, 0x6b, };
  static int jz4780_i2c4_e_pins[] = { 0x8c, 0x8d, };
  static int jz4780_i2c4_f_pins[] = { 0xb9, 0xb8, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1074
1075
1076
1077
1078
  static int jz4780_i2s_data_tx_pins[] = { 0x87, };
  static int jz4780_i2s_data_rx_pins[] = { 0x86, };
  static int jz4780_i2s_clk_txrx_pins[] = { 0x6c, 0x6d, };
  static int jz4780_i2s_clk_rx_pins[] = { 0x88, 0x89, };
  static int jz4780_i2s_sysclk_pins[] = { 0x85, };
a0bb89e84   Paul Boddie   pinctrl: ingenic:...
1079
  static int jz4780_hdmi_ddc_pins[] = { 0xb9, 0xb8, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1080
1081
1082
1083
  
  static int jz4780_uart2_data_funcs[] = { 1, 1, };
  static int jz4780_uart2_hwflow_funcs[] = { 1, 1, };
  static int jz4780_uart4_data_funcs[] = { 2, 2, };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  static int jz4780_ssi0_dt_a_19_funcs[] = { 2, };
  static int jz4780_ssi0_dt_a_21_funcs[] = { 2, };
  static int jz4780_ssi0_dt_a_28_funcs[] = { 2, };
  static int jz4780_ssi0_dt_b_funcs[] = { 1, };
  static int jz4780_ssi0_dt_d_funcs[] = { 1, };
  static int jz4780_ssi0_dr_a_20_funcs[] = { 2, };
  static int jz4780_ssi0_dr_a_27_funcs[] = { 2, };
  static int jz4780_ssi0_dr_b_funcs[] = { 1, };
  static int jz4780_ssi0_dr_d_funcs[] = { 1, };
  static int jz4780_ssi0_clk_a_funcs[] = { 2, };
  static int jz4780_ssi0_clk_b_5_funcs[] = { 1, };
  static int jz4780_ssi0_clk_b_28_funcs[] = { 1, };
  static int jz4780_ssi0_clk_d_funcs[] = { 1, };
  static int jz4780_ssi0_gpc_b_funcs[] = { 1, };
  static int jz4780_ssi0_gpc_d_funcs[] = { 1, };
  static int jz4780_ssi0_ce0_a_23_funcs[] = { 2, };
  static int jz4780_ssi0_ce0_a_25_funcs[] = { 2, };
  static int jz4780_ssi0_ce0_b_funcs[] = { 1, };
  static int jz4780_ssi0_ce0_d_funcs[] = { 1, };
  static int jz4780_ssi0_ce1_b_funcs[] = { 1, };
  static int jz4780_ssi0_ce1_d_funcs[] = { 1, };
  static int jz4780_ssi1_dt_b_funcs[] = { 2, };
  static int jz4780_ssi1_dt_d_funcs[] = { 2, };
  static int jz4780_ssi1_dr_b_funcs[] = { 2, };
  static int jz4780_ssi1_dr_d_funcs[] = { 2, };
  static int jz4780_ssi1_clk_b_funcs[] = { 2, };
  static int jz4780_ssi1_clk_d_funcs[] = { 2, };
  static int jz4780_ssi1_gpc_b_funcs[] = { 2, };
  static int jz4780_ssi1_gpc_d_funcs[] = { 2, };
  static int jz4780_ssi1_ce0_b_funcs[] = { 2, };
  static int jz4780_ssi1_ce0_d_funcs[] = { 2, };
  static int jz4780_ssi1_ce1_b_funcs[] = { 2, };
  static int jz4780_ssi1_ce1_d_funcs[] = { 2, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1117
1118
1119
1120
  static int jz4780_mmc0_8bit_a_funcs[] = { 1, 1, 1, 1, 1, };
  static int jz4780_i2c3_funcs[] = { 1, 1, };
  static int jz4780_i2c4_e_funcs[] = { 1, 1, };
  static int jz4780_i2c4_f_funcs[] = { 1, 1, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1121
1122
1123
1124
1125
  static int jz4780_i2s_data_tx_funcs[] = { 0, };
  static int jz4780_i2s_data_rx_funcs[] = { 0, };
  static int jz4780_i2s_clk_txrx_funcs[] = { 1, 0, };
  static int jz4780_i2s_clk_rx_funcs[] = { 1, 1, };
  static int jz4780_i2s_sysclk_funcs[] = { 2, };
a0bb89e84   Paul Boddie   pinctrl: ingenic:...
1126
  static int jz4780_hdmi_ddc_funcs[] = { 0, 0, };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
  
  static const struct group_desc jz4780_groups[] = {
  	INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data),
  	INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow),
  	INGENIC_PIN_GROUP("uart2-data", jz4780_uart2_data),
  	INGENIC_PIN_GROUP("uart2-hwflow", jz4780_uart2_hwflow),
  	INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data),
  	INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow),
  	INGENIC_PIN_GROUP("uart4-data", jz4780_uart4_data),
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
  	INGENIC_PIN_GROUP("ssi0-dt-a-19", jz4780_ssi0_dt_a_19),
  	INGENIC_PIN_GROUP("ssi0-dt-a-21", jz4780_ssi0_dt_a_21),
  	INGENIC_PIN_GROUP("ssi0-dt-a-28", jz4780_ssi0_dt_a_28),
  	INGENIC_PIN_GROUP("ssi0-dt-b", jz4780_ssi0_dt_b),
  	INGENIC_PIN_GROUP("ssi0-dt-d", jz4780_ssi0_dt_d),
  	INGENIC_PIN_GROUP("ssi0-dt-e", jz4770_ssi0_dt_e),
  	INGENIC_PIN_GROUP("ssi0-dr-a-20", jz4780_ssi0_dr_a_20),
  	INGENIC_PIN_GROUP("ssi0-dr-a-27", jz4780_ssi0_dr_a_27),
  	INGENIC_PIN_GROUP("ssi0-dr-b", jz4780_ssi0_dr_b),
  	INGENIC_PIN_GROUP("ssi0-dr-d", jz4780_ssi0_dr_d),
  	INGENIC_PIN_GROUP("ssi0-dr-e", jz4770_ssi0_dr_e),
  	INGENIC_PIN_GROUP("ssi0-clk-a", jz4780_ssi0_clk_a),
  	INGENIC_PIN_GROUP("ssi0-clk-b-5", jz4780_ssi0_clk_b_5),
  	INGENIC_PIN_GROUP("ssi0-clk-b-28", jz4780_ssi0_clk_b_28),
  	INGENIC_PIN_GROUP("ssi0-clk-d", jz4780_ssi0_clk_d),
  	INGENIC_PIN_GROUP("ssi0-clk-e", jz4770_ssi0_clk_e),
  	INGENIC_PIN_GROUP("ssi0-gpc-b", jz4780_ssi0_gpc_b),
  	INGENIC_PIN_GROUP("ssi0-gpc-d", jz4780_ssi0_gpc_d),
  	INGENIC_PIN_GROUP("ssi0-gpc-e", jz4770_ssi0_gpc_e),
  	INGENIC_PIN_GROUP("ssi0-ce0-a-23", jz4780_ssi0_ce0_a_23),
  	INGENIC_PIN_GROUP("ssi0-ce0-a-25", jz4780_ssi0_ce0_a_25),
  	INGENIC_PIN_GROUP("ssi0-ce0-b", jz4780_ssi0_ce0_b),
  	INGENIC_PIN_GROUP("ssi0-ce0-d", jz4780_ssi0_ce0_d),
  	INGENIC_PIN_GROUP("ssi0-ce0-e", jz4770_ssi0_ce0_e),
  	INGENIC_PIN_GROUP("ssi0-ce1-b", jz4780_ssi0_ce1_b),
  	INGENIC_PIN_GROUP("ssi0-ce1-d", jz4780_ssi0_ce1_d),
  	INGENIC_PIN_GROUP("ssi0-ce1-e", jz4770_ssi0_ce1_e),
  	INGENIC_PIN_GROUP("ssi1-dt-b", jz4780_ssi1_dt_b),
  	INGENIC_PIN_GROUP("ssi1-dt-d", jz4780_ssi1_dt_d),
  	INGENIC_PIN_GROUP("ssi1-dt-e", jz4770_ssi1_dt_e),
  	INGENIC_PIN_GROUP("ssi1-dr-b", jz4780_ssi1_dr_b),
  	INGENIC_PIN_GROUP("ssi1-dr-d", jz4780_ssi1_dr_d),
  	INGENIC_PIN_GROUP("ssi1-dr-e", jz4770_ssi1_dr_e),
  	INGENIC_PIN_GROUP("ssi1-clk-b", jz4780_ssi1_clk_b),
  	INGENIC_PIN_GROUP("ssi1-clk-d", jz4780_ssi1_clk_d),
  	INGENIC_PIN_GROUP("ssi1-clk-e", jz4770_ssi1_clk_e),
  	INGENIC_PIN_GROUP("ssi1-gpc-b", jz4780_ssi1_gpc_b),
  	INGENIC_PIN_GROUP("ssi1-gpc-d", jz4780_ssi1_gpc_d),
  	INGENIC_PIN_GROUP("ssi1-gpc-e", jz4770_ssi1_gpc_e),
  	INGENIC_PIN_GROUP("ssi1-ce0-b", jz4780_ssi1_ce0_b),
  	INGENIC_PIN_GROUP("ssi1-ce0-d", jz4780_ssi1_ce0_d),
  	INGENIC_PIN_GROUP("ssi1-ce0-e", jz4770_ssi1_ce0_e),
  	INGENIC_PIN_GROUP("ssi1-ce1-b", jz4780_ssi1_ce1_b),
  	INGENIC_PIN_GROUP("ssi1-ce1-d", jz4780_ssi1_ce1_d),
  	INGENIC_PIN_GROUP("ssi1-ce1-e", jz4770_ssi1_ce1_e),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1183
1184
1185
1186
1187
1188
1189
1190
1191
  	INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a),
  	INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a),
  	INGENIC_PIN_GROUP("mmc0-8bit-a", jz4780_mmc0_8bit_a),
  	INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e),
  	INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e),
  	INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d),
  	INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d),
  	INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e),
  	INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e),
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
1192
1193
1194
1195
  	INGENIC_PIN_GROUP("mmc2-1bit-b", jz4770_mmc2_1bit_b),
  	INGENIC_PIN_GROUP("mmc2-4bit-b", jz4770_mmc2_4bit_b),
  	INGENIC_PIN_GROUP("mmc2-1bit-e", jz4770_mmc2_1bit_e),
  	INGENIC_PIN_GROUP("mmc2-4bit-e", jz4770_mmc2_4bit_e),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1196
1197
1198
1199
1200
  	INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_8bit_data),
  	INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale),
  	INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr),
  	INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we),
  	INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe),
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
1201
  	INGENIC_PIN_GROUP("nemc-wait", jz4770_nemc_wait),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
  	INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1),
  	INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2),
  	INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3),
  	INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4),
  	INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5),
  	INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6),
  	INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0),
  	INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1),
  	INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2),
  	INGENIC_PIN_GROUP("i2c3-data", jz4780_i2c3),
  	INGENIC_PIN_GROUP("i2c4-data-e", jz4780_i2c4_e),
  	INGENIC_PIN_GROUP("i2c4-data-f", jz4780_i2c4_f),
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1214
1215
1216
1217
1218
  	INGENIC_PIN_GROUP("i2s-data-tx", jz4780_i2s_data_tx),
  	INGENIC_PIN_GROUP("i2s-data-rx", jz4780_i2s_data_rx),
  	INGENIC_PIN_GROUP("i2s-clk-txrx", jz4780_i2s_clk_txrx),
  	INGENIC_PIN_GROUP("i2s-clk-rx", jz4780_i2s_clk_rx),
  	INGENIC_PIN_GROUP("i2s-sysclk", jz4780_i2s_sysclk),
a0bb89e84   Paul Boddie   pinctrl: ingenic:...
1219
  	INGENIC_PIN_GROUP("hdmi-ddc", jz4780_hdmi_ddc),
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
  	INGENIC_PIN_GROUP("cim-data", jz4770_cim_8bit),
  	INGENIC_PIN_GROUP("lcd-24bit", jz4770_lcd_24bit),
  	{ "lcd-no-pins", },
  	INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4),
  	INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5),
  	INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6),
  	INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7),
  };
  
  static const char *jz4780_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
  static const char *jz4780_uart4_groups[] = { "uart4-data", };
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
  static const char *jz4780_ssi0_groups[] = {
  	"ssi0-dt-a-19", "ssi0-dt-a-21", "ssi0-dt-a-28", "ssi0-dt-b", "ssi0-dt-d", "ssi0-dt-e",
  	"ssi0-dr-a-20", "ssi0-dr-a-27", "ssi0-dr-b", "ssi0-dr-d", "ssi0-dr-e",
  	"ssi0-clk-a", "ssi0-clk-b-5", "ssi0-clk-b-28", "ssi0-clk-d", "ssi0-clk-e",
  	"ssi0-gpc-b", "ssi0-gpc-d", "ssi0-gpc-e",
  	"ssi0-ce0-a-23", "ssi0-ce0-a-25", "ssi0-ce0-b", "ssi0-ce0-d", "ssi0-ce0-e",
  	"ssi0-ce1-b", "ssi0-ce1-d", "ssi0-ce1-e",
  };
  static const char *jz4780_ssi1_groups[] = {
  	"ssi1-dt-b", "ssi1-dt-d", "ssi1-dt-e",
  	"ssi1-dr-b", "ssi1-dr-d", "ssi1-dr-e",
  	"ssi1-clk-b", "ssi1-clk-d", "ssi1-clk-e",
  	"ssi1-gpc-b", "ssi1-gpc-d", "ssi1-gpc-e",
  	"ssi1-ce0-b", "ssi1-ce0-d", "ssi1-ce0-e",
  	"ssi1-ce1-b", "ssi1-ce1-d", "ssi1-ce1-e",
  };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1251
1252
1253
1254
1255
1256
1257
  static const char *jz4780_mmc0_groups[] = {
  	"mmc0-1bit-a", "mmc0-4bit-a", "mmc0-8bit-a",
  	"mmc0-1bit-e", "mmc0-4bit-e",
  };
  static const char *jz4780_mmc1_groups[] = {
  	"mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
  };
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
1258
1259
1260
  static const char *jz4780_mmc2_groups[] = {
  	"mmc2-1bit-b", "mmc2-4bit-b", "mmc2-1bit-e", "mmc2-4bit-e",
  };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1261
1262
  static const char *jz4780_nemc_groups[] = {
  	"nemc-data", "nemc-cle-ale", "nemc-addr",
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
1263
  	"nemc-rd-we", "nemc-frd-fwe", "nemc-wait",
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1264
1265
1266
  };
  static const char *jz4780_i2c3_groups[] = { "i2c3-data", };
  static const char *jz4780_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1267
1268
1269
  static const char *jz4780_i2s_groups[] = {
  	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
  };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1270
  static const char *jz4780_cim_groups[] = { "cim-data", };
a0bb89e84   Paul Boddie   pinctrl: ingenic:...
1271
  static const char *jz4780_hdmi_ddc_groups[] = { "hdmi-ddc", };
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1272
1273
1274
1275
1276
1277
1278
  
  static const struct function_desc jz4780_functions[] = {
  	{ "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
  	{ "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
  	{ "uart2", jz4780_uart2_groups, ARRAY_SIZE(jz4780_uart2_groups), },
  	{ "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
  	{ "uart4", jz4780_uart4_groups, ARRAY_SIZE(jz4780_uart4_groups), },
d3ef8c6b2   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1279
1280
  	{ "ssi0", jz4780_ssi0_groups, ARRAY_SIZE(jz4780_ssi0_groups), },
  	{ "ssi1", jz4780_ssi1_groups, ARRAY_SIZE(jz4780_ssi1_groups), },
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1281
1282
  	{ "mmc0", jz4780_mmc0_groups, ARRAY_SIZE(jz4780_mmc0_groups), },
  	{ "mmc1", jz4780_mmc1_groups, ARRAY_SIZE(jz4780_mmc1_groups), },
5de1a73e7   Zhou Yanjie   Pinctrl: Ingenic:...
1283
  	{ "mmc2", jz4780_mmc2_groups, ARRAY_SIZE(jz4780_mmc2_groups), },
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
  	{ "nemc", jz4780_nemc_groups, ARRAY_SIZE(jz4780_nemc_groups), },
  	{ "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
  	{ "nemc-cs2", jz4770_cs2_groups, ARRAY_SIZE(jz4770_cs2_groups), },
  	{ "nemc-cs3", jz4770_cs3_groups, ARRAY_SIZE(jz4770_cs3_groups), },
  	{ "nemc-cs4", jz4770_cs4_groups, ARRAY_SIZE(jz4770_cs4_groups), },
  	{ "nemc-cs5", jz4770_cs5_groups, ARRAY_SIZE(jz4770_cs5_groups), },
  	{ "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
  	{ "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
  	{ "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
  	{ "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
  	{ "i2c3", jz4780_i2c3_groups, ARRAY_SIZE(jz4780_i2c3_groups), },
  	{ "i2c4", jz4780_i2c4_groups, ARRAY_SIZE(jz4780_i2c4_groups), },
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1296
  	{ "i2s", jz4780_i2s_groups, ARRAY_SIZE(jz4780_i2s_groups), },
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
  	{ "cim", jz4780_cim_groups, ARRAY_SIZE(jz4780_cim_groups), },
  	{ "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
  	{ "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
  	{ "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
  	{ "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
  	{ "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
  	{ "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
  	{ "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
  	{ "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
  	{ "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
a0bb89e84   Paul Boddie   pinctrl: ingenic:...
1307
1308
  	{ "hdmi-ddc", jz4780_hdmi_ddc_groups,
  		      ARRAY_SIZE(jz4780_hdmi_ddc_groups), },
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1309
1310
1311
1312
  };
  
  static const struct ingenic_chip_info jz4780_chip_info = {
  	.num_chips = 6,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1313
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
1314
  	.version = ID_JZ4780,
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1315
1316
1317
1318
  	.groups = jz4780_groups,
  	.num_groups = ARRAY_SIZE(jz4780_groups),
  	.functions = jz4780_functions,
  	.num_functions = ARRAY_SIZE(jz4780_functions),
d9f5dc495   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1319
1320
  	.pull_ups = jz4780_pull_ups,
  	.pull_downs = jz4780_pull_downs,
ff656e47a   Zhou Yanjie   Pinctrl: Ingenic:...
1321
  };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1322
  static const u32 x1000_pull_ups[4] = {
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1323
  	0xffffffff, 0xfdffffff, 0x0dffffff, 0x0000003f,
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
  };
  
  static const u32 x1000_pull_downs[4] = {
  	0x00000000, 0x02000000, 0x02000000, 0x00000000,
  };
  
  static int x1000_uart0_data_pins[] = { 0x4a, 0x4b, };
  static int x1000_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
  static int x1000_uart1_data_a_pins[] = { 0x04, 0x05, };
  static int x1000_uart1_data_d_pins[] = { 0x62, 0x63, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1334
  static int x1000_uart1_hwflow_pins[] = { 0x64, 0x65, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1335
1336
  static int x1000_uart2_data_a_pins[] = { 0x02, 0x03, };
  static int x1000_uart2_data_d_pins[] = { 0x65, 0x64, };
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
  static int x1000_sfc_pins[] = { 0x1d, 0x1c, 0x1e, 0x1f, 0x1a, 0x1b, };
  static int x1000_ssi_dt_a_22_pins[] = { 0x16, };
  static int x1000_ssi_dt_a_29_pins[] = { 0x1d, };
  static int x1000_ssi_dt_d_pins[] = { 0x62, };
  static int x1000_ssi_dr_a_23_pins[] = { 0x17, };
  static int x1000_ssi_dr_a_28_pins[] = { 0x1c, };
  static int x1000_ssi_dr_d_pins[] = { 0x63, };
  static int x1000_ssi_clk_a_24_pins[] = { 0x18, };
  static int x1000_ssi_clk_a_26_pins[] = { 0x1a, };
  static int x1000_ssi_clk_d_pins[] = { 0x60, };
  static int x1000_ssi_gpc_a_20_pins[] = { 0x14, };
  static int x1000_ssi_gpc_a_31_pins[] = { 0x1f, };
  static int x1000_ssi_ce0_a_25_pins[] = { 0x19, };
  static int x1000_ssi_ce0_a_27_pins[] = { 0x1b, };
  static int x1000_ssi_ce0_d_pins[] = { 0x61, };
  static int x1000_ssi_ce1_a_21_pins[] = { 0x15, };
  static int x1000_ssi_ce1_a_30_pins[] = { 0x1e, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1354
1355
1356
1357
1358
  static int x1000_mmc0_1bit_pins[] = { 0x18, 0x19, 0x17, };
  static int x1000_mmc0_4bit_pins[] = { 0x16, 0x15, 0x14, };
  static int x1000_mmc0_8bit_pins[] = { 0x13, 0x12, 0x11, 0x10, };
  static int x1000_mmc1_1bit_pins[] = { 0x40, 0x41, 0x42, };
  static int x1000_mmc1_4bit_pins[] = { 0x43, 0x44, 0x45, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1359
  static int x1000_emc_8bit_data_pins[] = {
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1360
1361
  	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1362
  static int x1000_emc_16bit_data_pins[] = {
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1363
1364
  	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1365
  static int x1000_emc_addr_pins[] = {
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1366
1367
1368
  	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
  };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1369
1370
1371
1372
  static int x1000_emc_rd_we_pins[] = { 0x30, 0x31, };
  static int x1000_emc_wait_pins[] = { 0x34, };
  static int x1000_emc_cs1_pins[] = { 0x32, };
  static int x1000_emc_cs2_pins[] = { 0x33, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1373
1374
1375
1376
  static int x1000_i2c0_pins[] = { 0x38, 0x37, };
  static int x1000_i2c1_a_pins[] = { 0x01, 0x00, };
  static int x1000_i2c1_c_pins[] = { 0x5b, 0x5a, };
  static int x1000_i2c2_pins[] = { 0x61, 0x60, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1377
1378
1379
1380
  static int x1000_i2s_data_tx_pins[] = { 0x24, };
  static int x1000_i2s_data_rx_pins[] = { 0x23, };
  static int x1000_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
  static int x1000_i2s_sysclk_pins[] = { 0x20, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
  static int x1000_cim_pins[] = {
  	0x08, 0x09, 0x0a, 0x0b,
  	0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
  };
  static int x1000_lcd_8bit_pins[] = {
  	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  	0x30, 0x31, 0x32, 0x33, 0x34,
  };
  static int x1000_lcd_16bit_pins[] = {
  	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  };
  static int x1000_pwm_pwm0_pins[] = { 0x59, };
  static int x1000_pwm_pwm1_pins[] = { 0x5a, };
  static int x1000_pwm_pwm2_pins[] = { 0x5b, };
  static int x1000_pwm_pwm3_pins[] = { 0x26, };
  static int x1000_pwm_pwm4_pins[] = { 0x58, };
  static int x1000_mac_pins[] = {
  	0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x26,
  };
  
  static int x1000_uart0_data_funcs[] = { 0, 0, };
  static int x1000_uart0_hwflow_funcs[] = { 0, 0, };
  static int x1000_uart1_data_a_funcs[] = { 2, 2, };
  static int x1000_uart1_data_d_funcs[] = { 1, 1, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1405
  static int x1000_uart1_hwflow_funcs[] = { 1, 1, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1406
1407
  static int x1000_uart2_data_a_funcs[] = { 2, 2, };
  static int x1000_uart2_data_d_funcs[] = { 0, 0, };
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
  static int x1000_sfc_funcs[] = { 1, 1, 1, 1, 1, 1, };
  static int x1000_ssi_dt_a_22_funcs[] = { 2, };
  static int x1000_ssi_dt_a_29_funcs[] = { 2, };
  static int x1000_ssi_dt_d_funcs[] = { 0, };
  static int x1000_ssi_dr_a_23_funcs[] = { 2, };
  static int x1000_ssi_dr_a_28_funcs[] = { 2, };
  static int x1000_ssi_dr_d_funcs[] = { 0, };
  static int x1000_ssi_clk_a_24_funcs[] = { 2, };
  static int x1000_ssi_clk_a_26_funcs[] = { 2, };
  static int x1000_ssi_clk_d_funcs[] = { 0, };
  static int x1000_ssi_gpc_a_20_funcs[] = { 2, };
  static int x1000_ssi_gpc_a_31_funcs[] = { 2, };
  static int x1000_ssi_ce0_a_25_funcs[] = { 2, };
  static int x1000_ssi_ce0_a_27_funcs[] = { 2, };
  static int x1000_ssi_ce0_d_funcs[] = { 0, };
  static int x1000_ssi_ce1_a_21_funcs[] = { 2, };
  static int x1000_ssi_ce1_a_30_funcs[] = { 2, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1425
1426
1427
1428
1429
  static int x1000_mmc0_1bit_funcs[] = { 1, 1, 1, };
  static int x1000_mmc0_4bit_funcs[] = { 1, 1, 1, };
  static int x1000_mmc0_8bit_funcs[] = { 1, 1, 1, 1, 1, };
  static int x1000_mmc1_1bit_funcs[] = { 0, 0, 0, };
  static int x1000_mmc1_4bit_funcs[] = { 0, 0, 0, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1430
1431
1432
  static int x1000_emc_8bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
  static int x1000_emc_16bit_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
  static int x1000_emc_addr_funcs[] = {
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1433
1434
  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1435
1436
1437
1438
  static int x1000_emc_rd_we_funcs[] = { 0, 0, };
  static int x1000_emc_wait_funcs[] = { 0, };
  static int x1000_emc_cs1_funcs[] = { 0, };
  static int x1000_emc_cs2_funcs[] = { 0, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1439
1440
1441
1442
  static int x1000_i2c0_funcs[] = { 0, 0, };
  static int x1000_i2c1_a_funcs[] = { 2, 2, };
  static int x1000_i2c1_c_funcs[] = { 0, 0, };
  static int x1000_i2c2_funcs[] = { 1, 1, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1443
1444
1445
1446
  static int x1000_i2s_data_tx_funcs[] = { 1, };
  static int x1000_i2s_data_rx_funcs[] = { 1, };
  static int x1000_i2s_clk_txrx_funcs[] = { 1, 1, };
  static int x1000_i2s_sysclk_funcs[] = { 1, };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
  static int x1000_cim_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, };
  static int x1000_lcd_8bit_funcs[] = {
  	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  };
  static int x1000_lcd_16bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, };
  static int x1000_pwm_pwm0_funcs[] = { 0, };
  static int x1000_pwm_pwm1_funcs[] = { 1, };
  static int x1000_pwm_pwm2_funcs[] = { 1, };
  static int x1000_pwm_pwm3_funcs[] = { 2, };
  static int x1000_pwm_pwm4_funcs[] = { 0, };
  static int x1000_mac_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, };
  
  static const struct group_desc x1000_groups[] = {
  	INGENIC_PIN_GROUP("uart0-data", x1000_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", x1000_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data-a", x1000_uart1_data_a),
  	INGENIC_PIN_GROUP("uart1-data-d", x1000_uart1_data_d),
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1464
  	INGENIC_PIN_GROUP("uart1-hwflow", x1000_uart1_hwflow),
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1465
1466
  	INGENIC_PIN_GROUP("uart2-data-a", x1000_uart2_data_a),
  	INGENIC_PIN_GROUP("uart2-data-d", x1000_uart2_data_d),
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
  	INGENIC_PIN_GROUP("sfc", x1000_sfc),
  	INGENIC_PIN_GROUP("ssi-dt-a-22", x1000_ssi_dt_a_22),
  	INGENIC_PIN_GROUP("ssi-dt-a-29", x1000_ssi_dt_a_29),
  	INGENIC_PIN_GROUP("ssi-dt-d", x1000_ssi_dt_d),
  	INGENIC_PIN_GROUP("ssi-dr-a-23", x1000_ssi_dr_a_23),
  	INGENIC_PIN_GROUP("ssi-dr-a-28", x1000_ssi_dr_a_28),
  	INGENIC_PIN_GROUP("ssi-dr-d", x1000_ssi_dr_d),
  	INGENIC_PIN_GROUP("ssi-clk-a-24", x1000_ssi_clk_a_24),
  	INGENIC_PIN_GROUP("ssi-clk-a-26", x1000_ssi_clk_a_26),
  	INGENIC_PIN_GROUP("ssi-clk-d", x1000_ssi_clk_d),
  	INGENIC_PIN_GROUP("ssi-gpc-a-20", x1000_ssi_gpc_a_20),
  	INGENIC_PIN_GROUP("ssi-gpc-a-31", x1000_ssi_gpc_a_31),
  	INGENIC_PIN_GROUP("ssi-ce0-a-25", x1000_ssi_ce0_a_25),
  	INGENIC_PIN_GROUP("ssi-ce0-a-27", x1000_ssi_ce0_a_27),
  	INGENIC_PIN_GROUP("ssi-ce0-d", x1000_ssi_ce0_d),
  	INGENIC_PIN_GROUP("ssi-ce1-a-21", x1000_ssi_ce1_a_21),
  	INGENIC_PIN_GROUP("ssi-ce1-a-30", x1000_ssi_ce1_a_30),
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1484
1485
1486
1487
1488
  	INGENIC_PIN_GROUP("mmc0-1bit", x1000_mmc0_1bit),
  	INGENIC_PIN_GROUP("mmc0-4bit", x1000_mmc0_4bit),
  	INGENIC_PIN_GROUP("mmc0-8bit", x1000_mmc0_8bit),
  	INGENIC_PIN_GROUP("mmc1-1bit", x1000_mmc1_1bit),
  	INGENIC_PIN_GROUP("mmc1-4bit", x1000_mmc1_4bit),
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1489
1490
1491
1492
1493
1494
1495
  	INGENIC_PIN_GROUP("emc-8bit-data", x1000_emc_8bit_data),
  	INGENIC_PIN_GROUP("emc-16bit-data", x1000_emc_16bit_data),
  	INGENIC_PIN_GROUP("emc-addr", x1000_emc_addr),
  	INGENIC_PIN_GROUP("emc-rd-we", x1000_emc_rd_we),
  	INGENIC_PIN_GROUP("emc-wait", x1000_emc_wait),
  	INGENIC_PIN_GROUP("emc-cs1", x1000_emc_cs1),
  	INGENIC_PIN_GROUP("emc-cs2", x1000_emc_cs2),
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1496
1497
1498
1499
  	INGENIC_PIN_GROUP("i2c0-data", x1000_i2c0),
  	INGENIC_PIN_GROUP("i2c1-data-a", x1000_i2c1_a),
  	INGENIC_PIN_GROUP("i2c1-data-c", x1000_i2c1_c),
  	INGENIC_PIN_GROUP("i2c2-data", x1000_i2c2),
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1500
1501
1502
1503
  	INGENIC_PIN_GROUP("i2s-data-tx", x1000_i2s_data_tx),
  	INGENIC_PIN_GROUP("i2s-data-rx", x1000_i2s_data_rx),
  	INGENIC_PIN_GROUP("i2s-clk-txrx", x1000_i2s_clk_txrx),
  	INGENIC_PIN_GROUP("i2s-sysclk", x1000_i2s_sysclk),
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
  	INGENIC_PIN_GROUP("cim-data", x1000_cim),
  	INGENIC_PIN_GROUP("lcd-8bit", x1000_lcd_8bit),
  	INGENIC_PIN_GROUP("lcd-16bit", x1000_lcd_16bit),
  	{ "lcd-no-pins", },
  	INGENIC_PIN_GROUP("pwm0", x1000_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", x1000_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", x1000_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", x1000_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", x1000_pwm_pwm4),
  	INGENIC_PIN_GROUP("mac", x1000_mac),
  };
  
  static const char *x1000_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
  static const char *x1000_uart1_groups[] = {
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1518
  	"uart1-data-a", "uart1-data-d", "uart1-hwflow",
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1519
1520
  };
  static const char *x1000_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1521
1522
1523
1524
1525
1526
1527
1528
1529
  static const char *x1000_sfc_groups[] = { "sfc", };
  static const char *x1000_ssi_groups[] = {
  	"ssi-dt-a-22", "ssi-dt-a-29", "ssi-dt-d",
  	"ssi-dr-a-23", "ssi-dr-a-28", "ssi-dr-d",
  	"ssi-clk-a-24", "ssi-clk-a-26", "ssi-clk-d",
  	"ssi-gpc-a-20", "ssi-gpc-a-31",
  	"ssi-ce0-a-25", "ssi-ce0-a-27", "ssi-ce0-d",
  	"ssi-ce1-a-21", "ssi-ce1-a-30",
  };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1530
1531
1532
1533
  static const char *x1000_mmc0_groups[] = {
  	"mmc0-1bit", "mmc0-4bit", "mmc0-8bit",
  };
  static const char *x1000_mmc1_groups[] = {
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1534
  	"mmc1-1bit", "mmc1-4bit",
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1535
  };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1536
1537
1538
  static const char *x1000_emc_groups[] = {
  	"emc-8bit-data", "emc-16bit-data",
  	"emc-addr", "emc-rd-we", "emc-wait",
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1539
  };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1540
1541
  static const char *x1000_cs1_groups[] = { "emc-cs1", };
  static const char *x1000_cs2_groups[] = { "emc-cs2", };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1542
1543
1544
  static const char *x1000_i2c0_groups[] = { "i2c0-data", };
  static const char *x1000_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
  static const char *x1000_i2c2_groups[] = { "i2c2-data", };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1545
1546
1547
  static const char *x1000_i2s_groups[] = {
  	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
  };
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
  static const char *x1000_cim_groups[] = { "cim-data", };
  static const char *x1000_lcd_groups[] = {
  	"lcd-8bit", "lcd-16bit", "lcd-no-pins",
  };
  static const char *x1000_pwm0_groups[] = { "pwm0", };
  static const char *x1000_pwm1_groups[] = { "pwm1", };
  static const char *x1000_pwm2_groups[] = { "pwm2", };
  static const char *x1000_pwm3_groups[] = { "pwm3", };
  static const char *x1000_pwm4_groups[] = { "pwm4", };
  static const char *x1000_mac_groups[] = { "mac", };
  
  static const struct function_desc x1000_functions[] = {
  	{ "uart0", x1000_uart0_groups, ARRAY_SIZE(x1000_uart0_groups), },
  	{ "uart1", x1000_uart1_groups, ARRAY_SIZE(x1000_uart1_groups), },
  	{ "uart2", x1000_uart2_groups, ARRAY_SIZE(x1000_uart2_groups), },
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1563
1564
  	{ "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
  	{ "ssi", x1000_ssi_groups, ARRAY_SIZE(x1000_ssi_groups), },
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1565
1566
  	{ "mmc0", x1000_mmc0_groups, ARRAY_SIZE(x1000_mmc0_groups), },
  	{ "mmc1", x1000_mmc1_groups, ARRAY_SIZE(x1000_mmc1_groups), },
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1567
1568
1569
  	{ "emc", x1000_emc_groups, ARRAY_SIZE(x1000_emc_groups), },
  	{ "emc-cs1", x1000_cs1_groups, ARRAY_SIZE(x1000_cs1_groups), },
  	{ "emc-cs2", x1000_cs2_groups, ARRAY_SIZE(x1000_cs2_groups), },
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1570
1571
1572
  	{ "i2c0", x1000_i2c0_groups, ARRAY_SIZE(x1000_i2c0_groups), },
  	{ "i2c1", x1000_i2c1_groups, ARRAY_SIZE(x1000_i2c1_groups), },
  	{ "i2c2", x1000_i2c2_groups, ARRAY_SIZE(x1000_i2c2_groups), },
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1573
  	{ "i2s", x1000_i2s_groups, ARRAY_SIZE(x1000_i2s_groups), },
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
  	{ "cim", x1000_cim_groups, ARRAY_SIZE(x1000_cim_groups), },
  	{ "lcd", x1000_lcd_groups, ARRAY_SIZE(x1000_lcd_groups), },
  	{ "pwm0", x1000_pwm0_groups, ARRAY_SIZE(x1000_pwm0_groups), },
  	{ "pwm1", x1000_pwm1_groups, ARRAY_SIZE(x1000_pwm1_groups), },
  	{ "pwm2", x1000_pwm2_groups, ARRAY_SIZE(x1000_pwm2_groups), },
  	{ "pwm3", x1000_pwm3_groups, ARRAY_SIZE(x1000_pwm3_groups), },
  	{ "pwm4", x1000_pwm4_groups, ARRAY_SIZE(x1000_pwm4_groups), },
  	{ "mac", x1000_mac_groups, ARRAY_SIZE(x1000_mac_groups), },
  };
  
  static const struct ingenic_chip_info x1000_chip_info = {
  	.num_chips = 4,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1586
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
1587
  	.version = ID_X1000,
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
1588
1589
1590
1591
1592
1593
1594
  	.groups = x1000_groups,
  	.num_groups = ARRAY_SIZE(x1000_groups),
  	.functions = x1000_functions,
  	.num_functions = ARRAY_SIZE(x1000_functions),
  	.pull_ups = x1000_pull_ups,
  	.pull_downs = x1000_pull_downs,
  };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1595
1596
1597
1598
  static int x1500_uart0_data_pins[] = { 0x4a, 0x4b, };
  static int x1500_uart0_hwflow_pins[] = { 0x4c, 0x4d, };
  static int x1500_uart1_data_a_pins[] = { 0x04, 0x05, };
  static int x1500_uart1_data_d_pins[] = { 0x62, 0x63, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1599
  static int x1500_uart1_hwflow_pins[] = { 0x64, 0x65, };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1600
1601
  static int x1500_uart2_data_a_pins[] = { 0x02, 0x03, };
  static int x1500_uart2_data_d_pins[] = { 0x65, 0x64, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1602
1603
  static int x1500_mmc_1bit_pins[] = { 0x18, 0x19, 0x17, };
  static int x1500_mmc_4bit_pins[] = { 0x16, 0x15, 0x14, };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1604
1605
1606
1607
  static int x1500_i2c0_pins[] = { 0x38, 0x37, };
  static int x1500_i2c1_a_pins[] = { 0x01, 0x00, };
  static int x1500_i2c1_c_pins[] = { 0x5b, 0x5a, };
  static int x1500_i2c2_pins[] = { 0x61, 0x60, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1608
1609
1610
1611
  static int x1500_i2s_data_tx_pins[] = { 0x24, };
  static int x1500_i2s_data_rx_pins[] = { 0x23, };
  static int x1500_i2s_clk_txrx_pins[] = { 0x21, 0x22, };
  static int x1500_i2s_sysclk_pins[] = { 0x20, };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
  static int x1500_cim_pins[] = {
  	0x08, 0x09, 0x0a, 0x0b,
  	0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c,
  };
  static int x1500_pwm_pwm0_pins[] = { 0x59, };
  static int x1500_pwm_pwm1_pins[] = { 0x5a, };
  static int x1500_pwm_pwm2_pins[] = { 0x5b, };
  static int x1500_pwm_pwm3_pins[] = { 0x26, };
  static int x1500_pwm_pwm4_pins[] = { 0x58, };
  
  static int x1500_uart0_data_funcs[] = { 0, 0, };
  static int x1500_uart0_hwflow_funcs[] = { 0, 0, };
  static int x1500_uart1_data_a_funcs[] = { 2, 2, };
  static int x1500_uart1_data_d_funcs[] = { 1, 1, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1626
  static int x1500_uart1_hwflow_funcs[] = { 1, 1, };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1627
1628
  static int x1500_uart2_data_a_funcs[] = { 2, 2, };
  static int x1500_uart2_data_d_funcs[] = { 0, 0, };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1629
1630
  static int x1500_mmc_1bit_funcs[] = { 1, 1, 1, };
  static int x1500_mmc_4bit_funcs[] = { 1, 1, 1, };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1631
1632
1633
1634
  static int x1500_i2c0_funcs[] = { 0, 0, };
  static int x1500_i2c1_a_funcs[] = { 2, 2, };
  static int x1500_i2c1_c_funcs[] = { 0, 0, };
  static int x1500_i2c2_funcs[] = { 1, 1, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1635
1636
1637
1638
  static int x1500_i2s_data_tx_funcs[] = { 1, };
  static int x1500_i2s_data_rx_funcs[] = { 1, };
  static int x1500_i2s_clk_txrx_funcs[] = { 1, 1, };
  static int x1500_i2s_sysclk_funcs[] = { 1, };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
  static int x1500_cim_funcs[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, };
  static int x1500_pwm_pwm0_funcs[] = { 0, };
  static int x1500_pwm_pwm1_funcs[] = { 1, };
  static int x1500_pwm_pwm2_funcs[] = { 1, };
  static int x1500_pwm_pwm3_funcs[] = { 2, };
  static int x1500_pwm_pwm4_funcs[] = { 0, };
  
  static const struct group_desc x1500_groups[] = {
  	INGENIC_PIN_GROUP("uart0-data", x1500_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", x1500_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data-a", x1500_uart1_data_a),
  	INGENIC_PIN_GROUP("uart1-data-d", x1500_uart1_data_d),
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1651
  	INGENIC_PIN_GROUP("uart1-hwflow", x1500_uart1_hwflow),
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1652
1653
  	INGENIC_PIN_GROUP("uart2-data-a", x1500_uart2_data_a),
  	INGENIC_PIN_GROUP("uart2-data-d", x1500_uart2_data_d),
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1654
  	INGENIC_PIN_GROUP("sfc", x1000_sfc),
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1655
1656
  	INGENIC_PIN_GROUP("mmc-1bit", x1500_mmc_1bit),
  	INGENIC_PIN_GROUP("mmc-4bit", x1500_mmc_4bit),
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1657
1658
1659
1660
  	INGENIC_PIN_GROUP("i2c0-data", x1500_i2c0),
  	INGENIC_PIN_GROUP("i2c1-data-a", x1500_i2c1_a),
  	INGENIC_PIN_GROUP("i2c1-data-c", x1500_i2c1_c),
  	INGENIC_PIN_GROUP("i2c2-data", x1500_i2c2),
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1661
1662
1663
1664
  	INGENIC_PIN_GROUP("i2s-data-tx", x1500_i2s_data_tx),
  	INGENIC_PIN_GROUP("i2s-data-rx", x1500_i2s_data_rx),
  	INGENIC_PIN_GROUP("i2s-clk-txrx", x1500_i2s_clk_txrx),
  	INGENIC_PIN_GROUP("i2s-sysclk", x1500_i2s_sysclk),
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
  	INGENIC_PIN_GROUP("cim-data", x1500_cim),
  	{ "lcd-no-pins", },
  	INGENIC_PIN_GROUP("pwm0", x1500_pwm_pwm0),
  	INGENIC_PIN_GROUP("pwm1", x1500_pwm_pwm1),
  	INGENIC_PIN_GROUP("pwm2", x1500_pwm_pwm2),
  	INGENIC_PIN_GROUP("pwm3", x1500_pwm_pwm3),
  	INGENIC_PIN_GROUP("pwm4", x1500_pwm_pwm4),
  };
  
  static const char *x1500_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
  static const char *x1500_uart1_groups[] = {
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1676
  	"uart1-data-a", "uart1-data-d", "uart1-hwflow",
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1677
1678
  };
  static const char *x1500_uart2_groups[] = { "uart2-data-a", "uart2-data-d", };
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1679
  static const char *x1500_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1680
1681
1682
  static const char *x1500_i2c0_groups[] = { "i2c0-data", };
  static const char *x1500_i2c1_groups[] = { "i2c1-data-a", "i2c1-data-c", };
  static const char *x1500_i2c2_groups[] = { "i2c2-data", };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1683
1684
1685
  static const char *x1500_i2s_groups[] = {
  	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-sysclk",
  };
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
  static const char *x1500_cim_groups[] = { "cim-data", };
  static const char *x1500_lcd_groups[] = { "lcd-no-pins", };
  static const char *x1500_pwm0_groups[] = { "pwm0", };
  static const char *x1500_pwm1_groups[] = { "pwm1", };
  static const char *x1500_pwm2_groups[] = { "pwm2", };
  static const char *x1500_pwm3_groups[] = { "pwm3", };
  static const char *x1500_pwm4_groups[] = { "pwm4", };
  
  static const struct function_desc x1500_functions[] = {
  	{ "uart0", x1500_uart0_groups, ARRAY_SIZE(x1500_uart0_groups), },
  	{ "uart1", x1500_uart1_groups, ARRAY_SIZE(x1500_uart1_groups), },
  	{ "uart2", x1500_uart2_groups, ARRAY_SIZE(x1500_uart2_groups), },
3b31e9b0e   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1698
  	{ "sfc", x1000_sfc_groups, ARRAY_SIZE(x1000_sfc_groups), },
b4a9372ad   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1699
  	{ "mmc", x1500_mmc_groups, ARRAY_SIZE(x1500_mmc_groups), },
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1700
1701
1702
  	{ "i2c0", x1500_i2c0_groups, ARRAY_SIZE(x1500_i2c0_groups), },
  	{ "i2c1", x1500_i2c1_groups, ARRAY_SIZE(x1500_i2c1_groups), },
  	{ "i2c2", x1500_i2c2_groups, ARRAY_SIZE(x1500_i2c2_groups), },
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1703
  	{ "i2s", x1500_i2s_groups, ARRAY_SIZE(x1500_i2s_groups), },
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
  	{ "cim", x1500_cim_groups, ARRAY_SIZE(x1500_cim_groups), },
  	{ "lcd", x1500_lcd_groups, ARRAY_SIZE(x1500_lcd_groups), },
  	{ "pwm0", x1500_pwm0_groups, ARRAY_SIZE(x1500_pwm0_groups), },
  	{ "pwm1", x1500_pwm1_groups, ARRAY_SIZE(x1500_pwm1_groups), },
  	{ "pwm2", x1500_pwm2_groups, ARRAY_SIZE(x1500_pwm2_groups), },
  	{ "pwm3", x1500_pwm3_groups, ARRAY_SIZE(x1500_pwm3_groups), },
  	{ "pwm4", x1500_pwm4_groups, ARRAY_SIZE(x1500_pwm4_groups), },
  };
  
  static const struct ingenic_chip_info x1500_chip_info = {
  	.num_chips = 4,
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1715
  	.reg_offset = 0x100,
baf156473   Paul Cercueil   pinctrl: ingenic:...
1716
  	.version = ID_X1500,
5d21595b1   Zhou Yanjie   pinctrl: Ingenic:...
1717
1718
1719
1720
1721
1722
1723
  	.groups = x1500_groups,
  	.num_groups = ARRAY_SIZE(x1500_groups),
  	.functions = x1500_functions,
  	.num_functions = ARRAY_SIZE(x1500_functions),
  	.pull_ups = x1000_pull_ups,
  	.pull_downs = x1000_pull_downs,
  };
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
  static const u32 x1830_pull_ups[4] = {
  	0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
  };
  
  static const u32 x1830_pull_downs[4] = {
  	0x5fdfffc0, 0xffffefff, 0x1ffffbff, 0x0fcff3fc,
  };
  
  static int x1830_uart0_data_pins[] = { 0x33, 0x36, };
  static int x1830_uart0_hwflow_pins[] = { 0x34, 0x35, };
  static int x1830_uart1_data_pins[] = { 0x38, 0x37, };
  static int x1830_sfc_pins[] = { 0x17, 0x18, 0x1a, 0x19, 0x1b, 0x1c, };
  static int x1830_ssi0_dt_pins[] = { 0x4c, };
  static int x1830_ssi0_dr_pins[] = { 0x4b, };
  static int x1830_ssi0_clk_pins[] = { 0x4f, };
  static int x1830_ssi0_gpc_pins[] = { 0x4d, };
  static int x1830_ssi0_ce0_pins[] = { 0x50, };
  static int x1830_ssi0_ce1_pins[] = { 0x4e, };
  static int x1830_ssi1_dt_c_pins[] = { 0x53, };
  static int x1830_ssi1_dr_c_pins[] = { 0x54, };
  static int x1830_ssi1_clk_c_pins[] = { 0x57, };
  static int x1830_ssi1_gpc_c_pins[] = { 0x55, };
  static int x1830_ssi1_ce0_c_pins[] = { 0x58, };
  static int x1830_ssi1_ce1_c_pins[] = { 0x56, };
  static int x1830_ssi1_dt_d_pins[] = { 0x62, };
  static int x1830_ssi1_dr_d_pins[] = { 0x63, };
  static int x1830_ssi1_clk_d_pins[] = { 0x66, };
  static int x1830_ssi1_gpc_d_pins[] = { 0x64, };
  static int x1830_ssi1_ce0_d_pins[] = { 0x67, };
  static int x1830_ssi1_ce1_d_pins[] = { 0x65, };
  static int x1830_mmc0_1bit_pins[] = { 0x24, 0x25, 0x20, };
  static int x1830_mmc0_4bit_pins[] = { 0x21, 0x22, 0x23, };
  static int x1830_mmc1_1bit_pins[] = { 0x42, 0x43, 0x44, };
  static int x1830_mmc1_4bit_pins[] = { 0x45, 0x46, 0x47, };
  static int x1830_i2c0_pins[] = { 0x0c, 0x0d, };
  static int x1830_i2c1_pins[] = { 0x39, 0x3a, };
  static int x1830_i2c2_pins[] = { 0x5b, 0x5c, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1761
1762
1763
1764
1765
  static int x1830_i2s_data_tx_pins[] = { 0x53, };
  static int x1830_i2s_data_rx_pins[] = { 0x54, };
  static int x1830_i2s_clk_txrx_pins[] = { 0x58, 0x52, };
  static int x1830_i2s_clk_rx_pins[] = { 0x56, 0x55, };
  static int x1830_i2s_sysclk_pins[] = { 0x57, };
b29547436   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
  static int x1830_lcd_rgb_18bit_pins[] = {
  	0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
  	0x68, 0x69, 0x6c, 0x6d, 0x6e, 0x6f,
  	0x70, 0x71, 0x72, 0x73, 0x76, 0x77,
  	0x78, 0x79, 0x7a, 0x7b,
  };
  static int x1830_lcd_slcd_8bit_pins[] = {
  	0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d,
  	0x69, 0x72, 0x73, 0x7b, 0x7a,
  };
  static int x1830_lcd_slcd_16bit_pins[] = {
  	0x6e, 0x6f, 0x70, 0x71, 0x76, 0x77, 0x78, 0x79,
  };
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
  static int x1830_pwm_pwm0_b_pins[] = { 0x31, };
  static int x1830_pwm_pwm0_c_pins[] = { 0x4b, };
  static int x1830_pwm_pwm1_b_pins[] = { 0x32, };
  static int x1830_pwm_pwm1_c_pins[] = { 0x4c, };
  static int x1830_pwm_pwm2_c_8_pins[] = { 0x48, };
  static int x1830_pwm_pwm2_c_13_pins[] = { 0x4d, };
  static int x1830_pwm_pwm3_c_9_pins[] = { 0x49, };
  static int x1830_pwm_pwm3_c_14_pins[] = { 0x4e, };
  static int x1830_pwm_pwm4_c_15_pins[] = { 0x4f, };
  static int x1830_pwm_pwm4_c_25_pins[] = { 0x59, };
  static int x1830_pwm_pwm5_c_16_pins[] = { 0x50, };
  static int x1830_pwm_pwm5_c_26_pins[] = { 0x5a, };
  static int x1830_pwm_pwm6_c_17_pins[] = { 0x51, };
  static int x1830_pwm_pwm6_c_27_pins[] = { 0x5b, };
  static int x1830_pwm_pwm7_c_18_pins[] = { 0x52, };
  static int x1830_pwm_pwm7_c_28_pins[] = { 0x5c, };
  static int x1830_mac_pins[] = {
  	0x29, 0x30, 0x2f, 0x28, 0x2e, 0x2d, 0x2a, 0x2b, 0x26, 0x27,
  };
  
  static int x1830_uart0_data_funcs[] = { 0, 0, };
  static int x1830_uart0_hwflow_funcs[] = { 0, 0, };
  static int x1830_uart1_data_funcs[] = { 0, 0, };
  static int x1830_sfc_funcs[] = { 1, 1, 1, 1, 1, 1, };
  static int x1830_ssi0_dt_funcs[] = { 0, };
  static int x1830_ssi0_dr_funcs[] = { 0, };
  static int x1830_ssi0_clk_funcs[] = { 0, };
  static int x1830_ssi0_gpc_funcs[] = { 0, };
  static int x1830_ssi0_ce0_funcs[] = { 0, };
  static int x1830_ssi0_ce1_funcs[] = { 0, };
  static int x1830_ssi1_dt_c_funcs[] = { 1, };
  static int x1830_ssi1_dr_c_funcs[] = { 1, };
  static int x1830_ssi1_clk_c_funcs[] = { 1, };
  static int x1830_ssi1_gpc_c_funcs[] = { 1, };
  static int x1830_ssi1_ce0_c_funcs[] = { 1, };
  static int x1830_ssi1_ce1_c_funcs[] = { 1, };
  static int x1830_ssi1_dt_d_funcs[] = { 2, };
  static int x1830_ssi1_dr_d_funcs[] = { 2, };
  static int x1830_ssi1_clk_d_funcs[] = { 2, };
  static int x1830_ssi1_gpc_d_funcs[] = { 2, };
  static int x1830_ssi1_ce0_d_funcs[] = { 2, };
  static int x1830_ssi1_ce1_d_funcs[] = { 2, };
  static int x1830_mmc0_1bit_funcs[] = { 0, 0, 0, };
  static int x1830_mmc0_4bit_funcs[] = { 0, 0, 0, };
  static int x1830_mmc1_1bit_funcs[] = { 0, 0, 0, };
  static int x1830_mmc1_4bit_funcs[] = { 0, 0, 0, };
  static int x1830_i2c0_funcs[] = { 1, 1, };
  static int x1830_i2c1_funcs[] = { 0, 0, };
  static int x1830_i2c2_funcs[] = { 1, 1, };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1828
1829
1830
1831
1832
  static int x1830_i2s_data_tx_funcs[] = { 0, };
  static int x1830_i2s_data_rx_funcs[] = { 0, };
  static int x1830_i2s_clk_txrx_funcs[] = { 0, 0, };
  static int x1830_i2s_clk_rx_funcs[] = { 0, 0, };
  static int x1830_i2s_sysclk_funcs[] = { 0, };
b29547436   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
  static int x1830_lcd_rgb_18bit_funcs[] = {
  	0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0, 0, 0,
  	0, 0, 0, 0,
  };
  static int x1830_lcd_slcd_8bit_funcs[] = {
  	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  };
  static int x1830_lcd_slcd_16bit_funcs[] = { 1, 1, 1, 1, 1, 1, 1, 1, };
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
  static int x1830_pwm_pwm0_b_funcs[] = { 0, };
  static int x1830_pwm_pwm0_c_funcs[] = { 1, };
  static int x1830_pwm_pwm1_b_funcs[] = { 0, };
  static int x1830_pwm_pwm1_c_funcs[] = { 1, };
  static int x1830_pwm_pwm2_c_8_funcs[] = { 0, };
  static int x1830_pwm_pwm2_c_13_funcs[] = { 1, };
  static int x1830_pwm_pwm3_c_9_funcs[] = { 0, };
  static int x1830_pwm_pwm3_c_14_funcs[] = { 1, };
  static int x1830_pwm_pwm4_c_15_funcs[] = { 1, };
  static int x1830_pwm_pwm4_c_25_funcs[] = { 0, };
  static int x1830_pwm_pwm5_c_16_funcs[] = { 1, };
  static int x1830_pwm_pwm5_c_26_funcs[] = { 0, };
  static int x1830_pwm_pwm6_c_17_funcs[] = { 1, };
  static int x1830_pwm_pwm6_c_27_funcs[] = { 0, };
  static int x1830_pwm_pwm7_c_18_funcs[] = { 1, };
  static int x1830_pwm_pwm7_c_28_funcs[] = { 0, };
  static int x1830_mac_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  
  static const struct group_desc x1830_groups[] = {
  	INGENIC_PIN_GROUP("uart0-data", x1830_uart0_data),
  	INGENIC_PIN_GROUP("uart0-hwflow", x1830_uart0_hwflow),
  	INGENIC_PIN_GROUP("uart1-data", x1830_uart1_data),
  	INGENIC_PIN_GROUP("sfc", x1830_sfc),
  	INGENIC_PIN_GROUP("ssi0-dt", x1830_ssi0_dt),
  	INGENIC_PIN_GROUP("ssi0-dr", x1830_ssi0_dr),
  	INGENIC_PIN_GROUP("ssi0-clk", x1830_ssi0_clk),
  	INGENIC_PIN_GROUP("ssi0-gpc", x1830_ssi0_gpc),
  	INGENIC_PIN_GROUP("ssi0-ce0", x1830_ssi0_ce0),
  	INGENIC_PIN_GROUP("ssi0-ce1", x1830_ssi0_ce1),
  	INGENIC_PIN_GROUP("ssi1-dt-c", x1830_ssi1_dt_c),
  	INGENIC_PIN_GROUP("ssi1-dr-c", x1830_ssi1_dr_c),
  	INGENIC_PIN_GROUP("ssi1-clk-c", x1830_ssi1_clk_c),
  	INGENIC_PIN_GROUP("ssi1-gpc-c", x1830_ssi1_gpc_c),
  	INGENIC_PIN_GROUP("ssi1-ce0-c", x1830_ssi1_ce0_c),
  	INGENIC_PIN_GROUP("ssi1-ce1-c", x1830_ssi1_ce1_c),
  	INGENIC_PIN_GROUP("ssi1-dt-d", x1830_ssi1_dt_d),
  	INGENIC_PIN_GROUP("ssi1-dr-d", x1830_ssi1_dr_d),
  	INGENIC_PIN_GROUP("ssi1-clk-d", x1830_ssi1_clk_d),
  	INGENIC_PIN_GROUP("ssi1-gpc-d", x1830_ssi1_gpc_d),
  	INGENIC_PIN_GROUP("ssi1-ce0-d", x1830_ssi1_ce0_d),
  	INGENIC_PIN_GROUP("ssi1-ce1-d", x1830_ssi1_ce1_d),
  	INGENIC_PIN_GROUP("mmc0-1bit", x1830_mmc0_1bit),
  	INGENIC_PIN_GROUP("mmc0-4bit", x1830_mmc0_4bit),
  	INGENIC_PIN_GROUP("mmc1-1bit", x1830_mmc1_1bit),
  	INGENIC_PIN_GROUP("mmc1-4bit", x1830_mmc1_4bit),
  	INGENIC_PIN_GROUP("i2c0-data", x1830_i2c0),
  	INGENIC_PIN_GROUP("i2c1-data", x1830_i2c1),
  	INGENIC_PIN_GROUP("i2c2-data", x1830_i2c2),
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1891
1892
1893
1894
1895
  	INGENIC_PIN_GROUP("i2s-data-tx", x1830_i2s_data_tx),
  	INGENIC_PIN_GROUP("i2s-data-rx", x1830_i2s_data_rx),
  	INGENIC_PIN_GROUP("i2s-clk-txrx", x1830_i2s_clk_txrx),
  	INGENIC_PIN_GROUP("i2s-clk-rx", x1830_i2s_clk_rx),
  	INGENIC_PIN_GROUP("i2s-sysclk", x1830_i2s_sysclk),
b29547436   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1896
1897
1898
1899
  	INGENIC_PIN_GROUP("lcd-rgb-18bit", x1830_lcd_rgb_18bit),
  	INGENIC_PIN_GROUP("lcd-slcd-8bit", x1830_lcd_slcd_8bit),
  	INGENIC_PIN_GROUP("lcd-slcd-16bit", x1830_lcd_slcd_16bit),
  	{ "lcd-no-pins", },
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
  	INGENIC_PIN_GROUP("pwm0-b", x1830_pwm_pwm0_b),
  	INGENIC_PIN_GROUP("pwm0-c", x1830_pwm_pwm0_c),
  	INGENIC_PIN_GROUP("pwm1-b", x1830_pwm_pwm1_b),
  	INGENIC_PIN_GROUP("pwm1-c", x1830_pwm_pwm1_c),
  	INGENIC_PIN_GROUP("pwm2-c-8", x1830_pwm_pwm2_c_8),
  	INGENIC_PIN_GROUP("pwm2-c-13", x1830_pwm_pwm2_c_13),
  	INGENIC_PIN_GROUP("pwm3-c-9", x1830_pwm_pwm3_c_9),
  	INGENIC_PIN_GROUP("pwm3-c-14", x1830_pwm_pwm3_c_14),
  	INGENIC_PIN_GROUP("pwm4-c-15", x1830_pwm_pwm4_c_15),
  	INGENIC_PIN_GROUP("pwm4-c-25", x1830_pwm_pwm4_c_25),
  	INGENIC_PIN_GROUP("pwm5-c-16", x1830_pwm_pwm5_c_16),
  	INGENIC_PIN_GROUP("pwm5-c-26", x1830_pwm_pwm5_c_26),
  	INGENIC_PIN_GROUP("pwm6-c-17", x1830_pwm_pwm6_c_17),
  	INGENIC_PIN_GROUP("pwm6-c-27", x1830_pwm_pwm6_c_27),
  	INGENIC_PIN_GROUP("pwm7-c-18", x1830_pwm_pwm7_c_18),
  	INGENIC_PIN_GROUP("pwm7-c-28", x1830_pwm_pwm7_c_28),
  	INGENIC_PIN_GROUP("mac", x1830_mac),
  };
  
  static const char *x1830_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
  static const char *x1830_uart1_groups[] = { "uart1-data", };
  static const char *x1830_sfc_groups[] = { "sfc", };
  static const char *x1830_ssi0_groups[] = {
  	"ssi0-dt", "ssi0-dr", "ssi0-clk", "ssi0-gpc", "ssi0-ce0", "ssi0-ce1",
  };
  static const char *x1830_ssi1_groups[] = {
  	"ssi1-dt-c", "ssi1-dt-d",
  	"ssi1-dr-c", "ssi1-dr-d",
  	"ssi1-clk-c", "ssi1-clk-d",
  	"ssi1-gpc-c", "ssi1-gpc-d",
  	"ssi1-ce0-c", "ssi1-ce0-d",
  	"ssi1-ce1-c", "ssi1-ce1-d",
  };
  static const char *x1830_mmc0_groups[] = { "mmc0-1bit", "mmc0-4bit", };
  static const char *x1830_mmc1_groups[] = { "mmc1-1bit", "mmc1-4bit", };
  static const char *x1830_i2c0_groups[] = { "i2c0-data", };
  static const char *x1830_i2c1_groups[] = { "i2c1-data", };
  static const char *x1830_i2c2_groups[] = { "i2c2-data", };
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1938
1939
1940
  static const char *x1830_i2s_groups[] = {
  	"i2s-data-tx", "i2s-data-rx", "i2s-clk-txrx", "i2s-clk-rx", "i2s-sysclk",
  };
b29547436   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1941
1942
1943
  static const char *x1830_lcd_groups[] = {
  	"lcd-rgb-18bit", "lcd-slcd-8bit", "lcd-slcd-16bit", "lcd-no-pins",
  };
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
  static const char *x1830_pwm0_groups[] = { "pwm0-b", "pwm0-c", };
  static const char *x1830_pwm1_groups[] = { "pwm1-b", "pwm1-c", };
  static const char *x1830_pwm2_groups[] = { "pwm2-c-8", "pwm2-c-13", };
  static const char *x1830_pwm3_groups[] = { "pwm3-c-9", "pwm3-c-14", };
  static const char *x1830_pwm4_groups[] = { "pwm4-c-15", "pwm4-c-25", };
  static const char *x1830_pwm5_groups[] = { "pwm5-c-16", "pwm5-c-26", };
  static const char *x1830_pwm6_groups[] = { "pwm6-c-17", "pwm6-c-27", };
  static const char *x1830_pwm7_groups[] = { "pwm7-c-18", "pwm7-c-28", };
  static const char *x1830_mac_groups[] = { "mac", };
  
  static const struct function_desc x1830_functions[] = {
  	{ "uart0", x1830_uart0_groups, ARRAY_SIZE(x1830_uart0_groups), },
  	{ "uart1", x1830_uart1_groups, ARRAY_SIZE(x1830_uart1_groups), },
  	{ "sfc", x1830_sfc_groups, ARRAY_SIZE(x1830_sfc_groups), },
  	{ "ssi0", x1830_ssi0_groups, ARRAY_SIZE(x1830_ssi0_groups), },
  	{ "ssi1", x1830_ssi1_groups, ARRAY_SIZE(x1830_ssi1_groups), },
  	{ "mmc0", x1830_mmc0_groups, ARRAY_SIZE(x1830_mmc0_groups), },
  	{ "mmc1", x1830_mmc1_groups, ARRAY_SIZE(x1830_mmc1_groups), },
  	{ "i2c0", x1830_i2c0_groups, ARRAY_SIZE(x1830_i2c0_groups), },
  	{ "i2c1", x1830_i2c1_groups, ARRAY_SIZE(x1830_i2c1_groups), },
  	{ "i2c2", x1830_i2c2_groups, ARRAY_SIZE(x1830_i2c2_groups), },
f4b5c348d   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1965
  	{ "i2s", x1830_i2s_groups, ARRAY_SIZE(x1830_i2s_groups), },
b29547436   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1966
  	{ "lcd", x1830_lcd_groups, ARRAY_SIZE(x1830_lcd_groups), },
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
  	{ "pwm0", x1830_pwm0_groups, ARRAY_SIZE(x1830_pwm0_groups), },
  	{ "pwm1", x1830_pwm1_groups, ARRAY_SIZE(x1830_pwm1_groups), },
  	{ "pwm2", x1830_pwm2_groups, ARRAY_SIZE(x1830_pwm2_groups), },
  	{ "pwm3", x1830_pwm3_groups, ARRAY_SIZE(x1830_pwm3_groups), },
  	{ "pwm4", x1830_pwm4_groups, ARRAY_SIZE(x1830_pwm4_groups), },
  	{ "pwm5", x1830_pwm5_groups, ARRAY_SIZE(x1830_pwm4_groups), },
  	{ "pwm6", x1830_pwm6_groups, ARRAY_SIZE(x1830_pwm4_groups), },
  	{ "pwm7", x1830_pwm7_groups, ARRAY_SIZE(x1830_pwm4_groups), },
  	{ "mac", x1830_mac_groups, ARRAY_SIZE(x1830_mac_groups), },
  };
  
  static const struct ingenic_chip_info x1830_chip_info = {
  	.num_chips = 4,
  	.reg_offset = 0x1000,
baf156473   Paul Cercueil   pinctrl: ingenic:...
1981
  	.version = ID_X1830,
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
1982
1983
1984
1985
1986
1987
1988
  	.groups = x1830_groups,
  	.num_groups = ARRAY_SIZE(x1830_groups),
  	.functions = x1830_functions,
  	.num_functions = ARRAY_SIZE(x1830_functions),
  	.pull_ups = x1830_pull_ups,
  	.pull_downs = x1830_pull_downs,
  };
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
1989
  static u32 ingenic_gpio_read_reg(struct ingenic_gpio_chip *jzgc, u8 reg)
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
1990
1991
1992
1993
1994
1995
1996
  {
  	unsigned int val;
  
  	regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val);
  
  	return (u32) val;
  }
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
1997
  static void ingenic_gpio_set_bit(struct ingenic_gpio_chip *jzgc,
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
1998
1999
2000
2001
2002
2003
2004
2005
2006
  		u8 reg, u8 offset, bool set)
  {
  	if (set)
  		reg = REG_SET(reg);
  	else
  		reg = REG_CLEAR(reg);
  
  	regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset));
  }
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2007
2008
2009
2010
2011
2012
2013
  static void ingenic_gpio_shadow_set_bit(struct ingenic_gpio_chip *jzgc,
  		u8 reg, u8 offset, bool set)
  {
  	if (set)
  		reg = REG_SET(reg);
  	else
  		reg = REG_CLEAR(reg);
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2014
2015
  	regmap_write(jzgc->jzpc->map, REG_PZ_BASE(
  			jzgc->jzpc->info->reg_offset) + reg, BIT(offset));
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2016
2017
2018
2019
  }
  
  static void ingenic_gpio_shadow_set_bit_load(struct ingenic_gpio_chip *jzgc)
  {
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2020
2021
  	regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD(
  			jzgc->jzpc->info->reg_offset),
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2022
2023
  			jzgc->gc.base / PINS_PER_GPIO_CHIP);
  }
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2024
2025
2026
  static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,
  					  u8 offset)
  {
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2027
  	unsigned int val = ingenic_gpio_read_reg(jzgc, GPIO_PIN);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2028
2029
2030
2031
2032
2033
2034
  
  	return !!(val & BIT(offset));
  }
  
  static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc,
  				   u8 offset, int value)
  {
baf156473   Paul Cercueil   pinctrl: ingenic:...
2035
  	if (jzgc->jzpc->info->version >= ID_JZ4760)
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2036
  		ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_PAT0, offset, !!value);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2037
  	else
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2038
  		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, offset, !!value);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2039
2040
2041
2042
2043
2044
  }
  
  static void irq_set_type(struct ingenic_gpio_chip *jzgc,
  		u8 offset, unsigned int type)
  {
  	u8 reg1, reg2;
f831f93af   Paul Cercueil   pinctrl: ingenic:...
2045
  	bool val1, val2;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2046
2047
2048
  
  	switch (type) {
  	case IRQ_TYPE_EDGE_RISING:
f831f93af   Paul Cercueil   pinctrl: ingenic:...
2049
  		val1 = val2 = true;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2050
2051
  		break;
  	case IRQ_TYPE_EDGE_FALLING:
f831f93af   Paul Cercueil   pinctrl: ingenic:...
2052
2053
  		val1 = false;
  		val2 = true;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2054
2055
  		break;
  	case IRQ_TYPE_LEVEL_HIGH:
f831f93af   Paul Cercueil   pinctrl: ingenic:...
2056
2057
  		val1 = true;
  		val2 = false;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2058
2059
2060
  		break;
  	case IRQ_TYPE_LEVEL_LOW:
  	default:
f831f93af   Paul Cercueil   pinctrl: ingenic:...
2061
  		val1 = val2 = false;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2062
2063
  		break;
  	}
f831f93af   Paul Cercueil   pinctrl: ingenic:...
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
  
  	if (jzgc->jzpc->info->version >= ID_JZ4760) {
  		reg1 = JZ4760_GPIO_PAT1;
  		reg2 = JZ4760_GPIO_PAT0;
  	} else {
  		reg1 = JZ4740_GPIO_TRIG;
  		reg2 = JZ4740_GPIO_DIR;
  	}
  
  	if (jzgc->jzpc->info->version >= ID_X1000) {
  		ingenic_gpio_shadow_set_bit(jzgc, reg2, offset, val1);
  		ingenic_gpio_shadow_set_bit(jzgc, reg1, offset, val2);
  		ingenic_gpio_shadow_set_bit_load(jzgc);
  	} else {
  		ingenic_gpio_set_bit(jzgc, reg2, offset, val1);
  		ingenic_gpio_set_bit(jzgc, reg1, offset, val2);
  	}
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2081
2082
2083
2084
2085
2086
  }
  
  static void ingenic_gpio_irq_mask(struct irq_data *irqd)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2087
  	ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, true);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2088
2089
2090
2091
2092
2093
  }
  
  static void ingenic_gpio_irq_unmask(struct irq_data *irqd)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2094
  	ingenic_gpio_set_bit(jzgc, GPIO_MSK, irqd->hwirq, false);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2095
2096
2097
2098
2099
2100
2101
  }
  
  static void ingenic_gpio_irq_enable(struct irq_data *irqd)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  	int irq = irqd->hwirq;
baf156473   Paul Cercueil   pinctrl: ingenic:...
2102
  	if (jzgc->jzpc->info->version >= ID_JZ4760)
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2103
  		ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_INT, irq, true);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2104
  	else
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2105
  		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, true);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
  
  	ingenic_gpio_irq_unmask(irqd);
  }
  
  static void ingenic_gpio_irq_disable(struct irq_data *irqd)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  	int irq = irqd->hwirq;
  
  	ingenic_gpio_irq_mask(irqd);
baf156473   Paul Cercueil   pinctrl: ingenic:...
2117
  	if (jzgc->jzpc->info->version >= ID_JZ4760)
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2118
  		ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_INT, irq, false);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2119
  	else
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2120
  		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_SELECT, irq, false);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
  }
  
  static void ingenic_gpio_irq_ack(struct irq_data *irqd)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  	int irq = irqd->hwirq;
  	bool high;
  
  	if (irqd_get_trigger_type(irqd) == IRQ_TYPE_EDGE_BOTH) {
  		/*
  		 * Switch to an interrupt for the opposite edge to the one that
  		 * triggered the interrupt being ACKed.
  		 */
  		high = ingenic_gpio_get_value(jzgc, irq);
  		if (high)
1c95348ba   Paul Cercueil   pinctrl: ingenic:...
2137
  			irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_LOW);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2138
  		else
1c95348ba   Paul Cercueil   pinctrl: ingenic:...
2139
  			irq_set_type(jzgc, irq, IRQ_TYPE_LEVEL_HIGH);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2140
  	}
baf156473   Paul Cercueil   pinctrl: ingenic:...
2141
  	if (jzgc->jzpc->info->version >= ID_JZ4760)
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2142
  		ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_FLAG, irq, false);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2143
  	else
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2144
  		ingenic_gpio_set_bit(jzgc, JZ4740_GPIO_DATA, irq, true);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
  }
  
  static int ingenic_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  
  	switch (type) {
  	case IRQ_TYPE_EDGE_BOTH:
  	case IRQ_TYPE_EDGE_RISING:
  	case IRQ_TYPE_EDGE_FALLING:
  		irq_set_handler_locked(irqd, handle_edge_irq);
  		break;
  	case IRQ_TYPE_LEVEL_HIGH:
  	case IRQ_TYPE_LEVEL_LOW:
  		irq_set_handler_locked(irqd, handle_level_irq);
  		break;
  	default:
  		irq_set_handler_locked(irqd, handle_bad_irq);
  	}
  
  	if (type == IRQ_TYPE_EDGE_BOTH) {
  		/*
  		 * The hardware does not support interrupts on both edges. The
  		 * best we can do is to set up a single-edge interrupt and then
  		 * switch to the opposing edge when ACKing the interrupt.
  		 */
  		bool high = ingenic_gpio_get_value(jzgc, irqd->hwirq);
1c95348ba   Paul Cercueil   pinctrl: ingenic:...
2173
  		type = high ? IRQ_TYPE_LEVEL_LOW : IRQ_TYPE_LEVEL_HIGH;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
  	}
  
  	irq_set_type(jzgc, irqd->hwirq, type);
  	return 0;
  }
  
  static int ingenic_gpio_irq_set_wake(struct irq_data *irqd, unsigned int on)
  {
  	struct gpio_chip *gc = irq_data_get_irq_chip_data(irqd);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  
  	return irq_set_irq_wake(jzgc->irq, on);
  }
  
  static void ingenic_gpio_irq_handler(struct irq_desc *desc)
  {
  	struct gpio_chip *gc = irq_desc_get_handler_data(desc);
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  	struct irq_chip *irq_chip = irq_data_get_irq_chip(&desc->irq_data);
  	unsigned long flag, i;
  
  	chained_irq_enter(irq_chip, desc);
baf156473   Paul Cercueil   pinctrl: ingenic:...
2196
  	if (jzgc->jzpc->info->version >= ID_JZ4760)
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2197
  		flag = ingenic_gpio_read_reg(jzgc, JZ4760_GPIO_FLAG);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2198
  	else
b71c18441   Zhou Yanjie   Pinctrl: Ingenic:...
2199
  		flag = ingenic_gpio_read_reg(jzgc, JZ4740_GPIO_FLAG);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
  
  	for_each_set_bit(i, &flag, 32)
  		generic_handle_irq(irq_linear_revmap(gc->irq.domain, i));
  	chained_irq_exit(irq_chip, desc);
  }
  
  static void ingenic_gpio_set(struct gpio_chip *gc,
  		unsigned int offset, int value)
  {
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  
  	ingenic_gpio_set_value(jzgc, offset, value);
  }
  
  static int ingenic_gpio_get(struct gpio_chip *gc, unsigned int offset)
  {
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  
  	return (int) ingenic_gpio_get_value(jzgc, offset);
  }
  
  static int ingenic_gpio_direction_input(struct gpio_chip *gc,
  		unsigned int offset)
  {
  	return pinctrl_gpio_direction_input(gc->base + offset);
  }
  
  static int ingenic_gpio_direction_output(struct gpio_chip *gc,
  		unsigned int offset, int value)
  {
  	ingenic_gpio_set(gc, offset, value);
  	return pinctrl_gpio_direction_output(gc->base + offset);
  }
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2233
2234
2235
2236
2237
  static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
  		unsigned int pin, u8 reg, bool set)
  {
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2238
  	regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2239
2240
  			(set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
  }
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2241
2242
2243
2244
  static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc,
  		unsigned int pin, u8 reg, bool set)
  {
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2245
  	regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) +
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2246
2247
2248
2249
2250
2251
  			(set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
  }
  
  static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc,
  		unsigned int pin)
  {
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2252
2253
  	regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset),
  			pin / PINS_PER_GPIO_CHIP);
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2254
  }
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2255
2256
2257
2258
2259
2260
  static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
  		unsigned int pin, u8 reg)
  {
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
  	unsigned int val;
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2261
  	regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2262
2263
2264
  
  	return val & BIT(idx);
  }
ebd665141   Paul Cercueil   pinctrl: ingenic:...
2265
2266
2267
2268
2269
  static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
  {
  	struct ingenic_gpio_chip *jzgc = gpiochip_get_data(gc);
  	struct ingenic_pinctrl *jzpc = jzgc->jzpc;
  	unsigned int pin = gc->base + offset;
3c8278735   Matti Vaittinen   pinctrl: Use new ...
2270
  	if (jzpc->info->version >= ID_JZ4760) {
84e7a946d   Paul Cercueil   pinctrl: ingenic:...
2271
2272
  		if (ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_INT) ||
  		    ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PAT1))
3c8278735   Matti Vaittinen   pinctrl: Use new ...
2273
2274
2275
  			return GPIO_LINE_DIRECTION_IN;
  		return GPIO_LINE_DIRECTION_OUT;
  	}
ebd665141   Paul Cercueil   pinctrl: ingenic:...
2276
2277
  
  	if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT))
3c8278735   Matti Vaittinen   pinctrl: Use new ...
2278
2279
2280
2281
  		return GPIO_LINE_DIRECTION_IN;
  
  	if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR))
  		return GPIO_LINE_DIRECTION_OUT;
ebd665141   Paul Cercueil   pinctrl: ingenic:...
2282

3c8278735   Matti Vaittinen   pinctrl: Use new ...
2283
  	return GPIO_LINE_DIRECTION_IN;
ebd665141   Paul Cercueil   pinctrl: ingenic:...
2284
  }
5bf7b849f   Julia Lawall   pinctrl: ingenic:...
2285
  static const struct pinctrl_ops ingenic_pctlops = {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2286
2287
2288
2289
2290
2291
  	.get_groups_count = pinctrl_generic_get_group_count,
  	.get_group_name = pinctrl_generic_get_group_name,
  	.get_group_pins = pinctrl_generic_get_group_pins,
  	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  	.dt_free_map = pinconf_generic_dt_free_map,
  };
9a0f1341d   Paul Cercueil   pinctrl: ingenic:...
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
  static int ingenic_gpio_irq_request(struct irq_data *data)
  {
  	struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
  	int ret;
  
  	ret = ingenic_gpio_direction_input(gpio_chip, data->hwirq);
  	if (ret)
  		return ret;
  
  	return gpiochip_reqres_irq(gpio_chip, data->hwirq);
  }
  
  static void ingenic_gpio_irq_release(struct irq_data *data)
  {
  	struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
  
  	return gpiochip_relres_irq(gpio_chip, data->hwirq);
  }
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2310
2311
2312
2313
2314
2315
2316
2317
2318
  static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
  		int pin, int func)
  {
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
  
  	dev_dbg(jzpc->dev, "set pin P%c%u to function %u
  ",
  			'A' + offt, idx, func);
baf156473   Paul Cercueil   pinctrl: ingenic:...
2319
  	if (jzpc->info->version >= ID_X1000) {
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2320
2321
2322
2323
2324
  		ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
  		ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false);
  		ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, func & 0x2);
  		ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, func & 0x1);
  		ingenic_shadow_config_pin_load(jzpc, pin);
baf156473   Paul Cercueil   pinctrl: ingenic:...
2325
  	} else if (jzpc->info->version >= ID_JZ4760) {
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2326
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2327
  		ingenic_config_pin(jzpc, pin, GPIO_MSK, false);
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2328
2329
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, func & 0x2);
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, func & 0x1);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
  	} else {
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func > 0);
  	}
  
  	return 0;
  }
  
  static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
  		unsigned int selector, unsigned int group)
  {
  	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
  	struct function_desc *func;
  	struct group_desc *grp;
  	unsigned int i;
  
  	func = pinmux_generic_get_function(pctldev, selector);
  	if (!func)
  		return -EINVAL;
  
  	grp = pinctrl_generic_get_group(pctldev, group);
  	if (!grp)
  		return -EINVAL;
  
  	dev_dbg(pctldev->dev, "enable function %s group %s
  ",
  		func->name, grp->name);
  
  	for (i = 0; i < grp->num_pins; i++) {
  		int *pin_modes = grp->data;
  
  		ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
  	}
  
  	return 0;
  }
  
  static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
  		struct pinctrl_gpio_range *range,
  		unsigned int pin, bool input)
  {
  	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
  
  	dev_dbg(pctldev->dev, "set pin P%c%u to %sput
  ",
  			'A' + offt, idx, input ? "in" : "out");
baf156473   Paul Cercueil   pinctrl: ingenic:...
2379
  	if (jzpc->info->version >= ID_X1000) {
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2380
2381
2382
2383
  		ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
  		ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true);
  		ingenic_shadow_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, input);
  		ingenic_shadow_config_pin_load(jzpc, pin);
baf156473   Paul Cercueil   pinctrl: ingenic:...
2384
  	} else if (jzpc->info->version >= ID_JZ4760) {
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2385
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_INT, false);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2386
  		ingenic_config_pin(jzpc, pin, GPIO_MSK, true);
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2387
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT1, input);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2388
2389
  	} else {
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
0084a786c   Paul Cercueil   pinctrl: ingenic:...
2390
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2391
2392
2393
2394
2395
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
  	}
  
  	return 0;
  }
5bf7b849f   Julia Lawall   pinctrl: ingenic:...
2396
  static const struct pinmux_ops ingenic_pmxops = {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
  	.get_functions_count = pinmux_generic_get_function_count,
  	.get_function_name = pinmux_generic_get_function_name,
  	.get_function_groups = pinmux_generic_get_function_groups,
  	.set_mux = ingenic_pinmux_set_mux,
  	.gpio_set_direction = ingenic_pinmux_gpio_set_direction,
  };
  
  static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
  		unsigned int pin, unsigned long *config)
  {
  	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
  	enum pin_config_param param = pinconf_to_config_param(*config);
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
  	bool pull;
baf156473   Paul Cercueil   pinctrl: ingenic:...
2412
  	if (jzpc->info->version >= ID_JZ4760)
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2413
  		pull = !ingenic_get_pin_config(jzpc, pin, JZ4760_GPIO_PEN);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
  	else
  		pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
  
  	switch (param) {
  	case PIN_CONFIG_BIAS_DISABLE:
  		if (pull)
  			return -EINVAL;
  		break;
  
  	case PIN_CONFIG_BIAS_PULL_UP:
  		if (!pull || !(jzpc->info->pull_ups[offt] & BIT(idx)))
  			return -EINVAL;
  		break;
  
  	case PIN_CONFIG_BIAS_PULL_DOWN:
  		if (!pull || !(jzpc->info->pull_downs[offt] & BIT(idx)))
  			return -EINVAL;
  		break;
  
  	default:
  		return -ENOTSUPP;
  	}
  
  	*config = pinconf_to_config_packed(param, 1);
  	return 0;
  }
  
  static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2442
  		unsigned int pin, unsigned int bias)
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2443
  {
baf156473   Paul Cercueil   pinctrl: ingenic:...
2444
  	if (jzpc->info->version >= ID_X1830) {
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
  		unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  		unsigned int half = PINS_PER_GPIO_CHIP / 2;
  		unsigned int idxh = pin % half * 2;
  		unsigned int offt = pin / PINS_PER_GPIO_CHIP;
  
  		if (idx < half) {
  			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
  					REG_CLEAR(X1830_GPIO_PEL), 3 << idxh);
  			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
  					REG_SET(X1830_GPIO_PEL), bias << idxh);
  		} else {
  			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
  					REG_CLEAR(X1830_GPIO_PEH), 3 << idxh);
  			regmap_write(jzpc->map, offt * jzpc->info->reg_offset +
  					REG_SET(X1830_GPIO_PEH), bias << idxh);
  		}
baf156473   Paul Cercueil   pinctrl: ingenic:...
2461
  	} else if (jzpc->info->version >= ID_JZ4760) {
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2462
2463
2464
2465
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PEN, !bias);
  	} else {
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias);
  	}
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2466
  }
7009d046a   Paul Cercueil   pinctrl: ingenic:...
2467
2468
2469
  static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc,
  				     unsigned int pin, bool high)
  {
baf156473   Paul Cercueil   pinctrl: ingenic:...
2470
  	if (jzpc->info->version >= ID_JZ4760)
7009d046a   Paul Cercueil   pinctrl: ingenic:...
2471
2472
2473
2474
  		ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PAT0, high);
  	else
  		ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high);
  }
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2475
2476
2477
2478
2479
2480
  static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  		unsigned long *configs, unsigned int num_configs)
  {
  	struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
  	unsigned int idx = pin % PINS_PER_GPIO_CHIP;
  	unsigned int offt = pin / PINS_PER_GPIO_CHIP;
7009d046a   Paul Cercueil   pinctrl: ingenic:...
2481
2482
  	unsigned int cfg, arg;
  	int ret;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2483
2484
2485
2486
2487
2488
  
  	for (cfg = 0; cfg < num_configs; cfg++) {
  		switch (pinconf_to_config_param(configs[cfg])) {
  		case PIN_CONFIG_BIAS_DISABLE:
  		case PIN_CONFIG_BIAS_PULL_UP:
  		case PIN_CONFIG_BIAS_PULL_DOWN:
7009d046a   Paul Cercueil   pinctrl: ingenic:...
2489
  		case PIN_CONFIG_OUTPUT:
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2490
2491
2492
2493
2494
2495
2496
  			continue;
  		default:
  			return -ENOTSUPP;
  		}
  	}
  
  	for (cfg = 0; cfg < num_configs; cfg++) {
7009d046a   Paul Cercueil   pinctrl: ingenic:...
2497
  		arg = pinconf_to_config_argument(configs[cfg]);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2498
2499
2500
2501
2502
  		switch (pinconf_to_config_param(configs[cfg])) {
  		case PIN_CONFIG_BIAS_DISABLE:
  			dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u
  ",
  					'A' + offt, idx);
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2503
  			ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2504
2505
2506
2507
2508
2509
2510
2511
  			break;
  
  		case PIN_CONFIG_BIAS_PULL_UP:
  			if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
  				return -EINVAL;
  			dev_dbg(jzpc->dev, "set pull-up for pin P%c%u
  ",
  					'A' + offt, idx);
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2512
  			ingenic_set_bias(jzpc, pin, GPIO_PULL_UP);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2513
2514
2515
2516
2517
2518
2519
2520
  			break;
  
  		case PIN_CONFIG_BIAS_PULL_DOWN:
  			if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
  				return -EINVAL;
  			dev_dbg(jzpc->dev, "set pull-down for pin P%c%u
  ",
  					'A' + offt, idx);
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2521
  			ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2522
  			break;
7009d046a   Paul Cercueil   pinctrl: ingenic:...
2523
2524
2525
2526
2527
2528
2529
  		case PIN_CONFIG_OUTPUT:
  			ret = pinctrl_gpio_direction_output(pin);
  			if (ret)
  				return ret;
  
  			ingenic_set_output_level(jzpc, pin, arg);
  			break;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2530
  		default:
d6d43a921   Josh Poimboeuf   pinctrl: ingenic:...
2531
2532
  			/* unreachable */
  			break;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
  		}
  	}
  
  	return 0;
  }
  
  static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
  		unsigned int group, unsigned long *config)
  {
  	const unsigned int *pins;
  	unsigned int i, npins, old = 0;
  	int ret;
  
  	ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
  	if (ret)
  		return ret;
  
  	for (i = 0; i < npins; i++) {
  		if (ingenic_pinconf_get(pctldev, pins[i], config))
  			return -ENOTSUPP;
  
  		/* configs do not match between two pins */
  		if (i && (old != *config))
  			return -ENOTSUPP;
  
  		old = *config;
  	}
  
  	return 0;
  }
  
  static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
  		unsigned int group, unsigned long *configs,
  		unsigned int num_configs)
  {
  	const unsigned int *pins;
  	unsigned int i, npins;
  	int ret;
  
  	ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
  	if (ret)
  		return ret;
  
  	for (i = 0; i < npins; i++) {
  		ret = ingenic_pinconf_set(pctldev,
  				pins[i], configs, num_configs);
  		if (ret)
  			return ret;
  	}
  
  	return 0;
  }
5bf7b849f   Julia Lawall   pinctrl: ingenic:...
2585
  static const struct pinconf_ops ingenic_confops = {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
  	.is_generic = true,
  	.pin_config_get = ingenic_pinconf_get,
  	.pin_config_set = ingenic_pinconf_set,
  	.pin_config_group_get = ingenic_pinconf_group_get,
  	.pin_config_group_set = ingenic_pinconf_group_set,
  };
  
  static const struct regmap_config ingenic_pinctrl_regmap_config = {
  	.reg_bits = 32,
  	.val_bits = 32,
  	.reg_stride = 4,
  };
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2598
2599
  static const struct of_device_id ingenic_gpio_of_match[] __initconst = {
  	{ .compatible = "ingenic,jz4740-gpio", },
b5fc06a10   Paul Cercueil   pinctrl: ingenic:...
2600
  	{ .compatible = "ingenic,jz4725b-gpio", },
0257595a5   Zhou Yanjie   pinctrl: Ingenic:...
2601
  	{ .compatible = "ingenic,jz4760-gpio", },
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2602
2603
  	{ .compatible = "ingenic,jz4770-gpio", },
  	{ .compatible = "ingenic,jz4780-gpio", },
fe1ad5eed   Zhou Yanjie   pinctrl: Ingenic:...
2604
  	{ .compatible = "ingenic,x1000-gpio", },
d7da2a1e4   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2605
  	{ .compatible = "ingenic,x1830-gpio", },
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2606
2607
2608
2609
2610
2611
2612
2613
  	{},
  };
  
  static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc,
  				     struct device_node *node)
  {
  	struct ingenic_gpio_chip *jzgc;
  	struct device *dev = jzpc->dev;
142b87675   Linus Walleij   pinctrl: ingenic:...
2614
  	struct gpio_irq_chip *girq;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
  	unsigned int bank;
  	int err;
  
  	err = of_property_read_u32(node, "reg", &bank);
  	if (err) {
  		dev_err(dev, "Cannot read \"reg\" property: %i
  ", err);
  		return err;
  	}
  
  	jzgc = devm_kzalloc(dev, sizeof(*jzgc), GFP_KERNEL);
  	if (!jzgc)
  		return -ENOMEM;
  
  	jzgc->jzpc = jzpc;
f742e5ebd   周琰杰 (Zhou Yanjie)   pinctrl: Ingenic:...
2630
  	jzgc->reg_base = bank * jzpc->info->reg_offset;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
  
  	jzgc->gc.label = devm_kasprintf(dev, GFP_KERNEL, "GPIO%c", 'A' + bank);
  	if (!jzgc->gc.label)
  		return -ENOMEM;
  
  	/* DO NOT EXPAND THIS: FOR BACKWARD GPIO NUMBERSPACE COMPATIBIBILITY
  	 * ONLY: WORK TO TRANSITION CONSUMERS TO USE THE GPIO DESCRIPTOR API IN
  	 * <linux/gpio/consumer.h> INSTEAD.
  	 */
  	jzgc->gc.base = bank * 32;
  
  	jzgc->gc.ngpio = 32;
  	jzgc->gc.parent = dev;
  	jzgc->gc.of_node = node;
  	jzgc->gc.owner = THIS_MODULE;
  
  	jzgc->gc.set = ingenic_gpio_set;
  	jzgc->gc.get = ingenic_gpio_get;
  	jzgc->gc.direction_input = ingenic_gpio_direction_input;
  	jzgc->gc.direction_output = ingenic_gpio_direction_output;
ebd665141   Paul Cercueil   pinctrl: ingenic:...
2651
  	jzgc->gc.get_direction = ingenic_gpio_get_direction;
d6471d6e0   Thierry Reding   pinctrl: Uncondit...
2652
2653
  	jzgc->gc.request = gpiochip_generic_request;
  	jzgc->gc.free = gpiochip_generic_free;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2654

e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
  	jzgc->irq = irq_of_parse_and_map(node, 0);
  	if (!jzgc->irq)
  		return -EINVAL;
  
  	jzgc->irq_chip.name = jzgc->gc.label;
  	jzgc->irq_chip.irq_enable = ingenic_gpio_irq_enable;
  	jzgc->irq_chip.irq_disable = ingenic_gpio_irq_disable;
  	jzgc->irq_chip.irq_unmask = ingenic_gpio_irq_unmask;
  	jzgc->irq_chip.irq_mask = ingenic_gpio_irq_mask;
  	jzgc->irq_chip.irq_ack = ingenic_gpio_irq_ack;
  	jzgc->irq_chip.irq_set_type = ingenic_gpio_irq_set_type;
  	jzgc->irq_chip.irq_set_wake = ingenic_gpio_irq_set_wake;
9a0f1341d   Paul Cercueil   pinctrl: ingenic:...
2667
2668
  	jzgc->irq_chip.irq_request_resources = ingenic_gpio_irq_request;
  	jzgc->irq_chip.irq_release_resources = ingenic_gpio_irq_release;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2669
  	jzgc->irq_chip.flags = IRQCHIP_MASK_ON_SUSPEND;
142b87675   Linus Walleij   pinctrl: ingenic:...
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
  	girq = &jzgc->gc.irq;
  	girq->chip = &jzgc->irq_chip;
  	girq->parent_handler = ingenic_gpio_irq_handler;
  	girq->num_parents = 1;
  	girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),
  				     GFP_KERNEL);
  	if (!girq->parents)
  		return -ENOMEM;
  	girq->parents[0] = jzgc->irq;
  	girq->default_type = IRQ_TYPE_NONE;
  	girq->handler = handle_level_irq;
  
  	err = devm_gpiochip_add_data(dev, &jzgc->gc, jzgc);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2683
2684
  	if (err)
  		return err;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2685
2686
  	return 0;
  }
4717b11f8   Paul Cercueil   pinctrl: ingenic:...
2687
  static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2688
2689
2690
2691
2692
  {
  	struct device *dev = &pdev->dev;
  	struct ingenic_pinctrl *jzpc;
  	struct pinctrl_desc *pctl_desc;
  	void __iomem *base;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2693
  	const struct ingenic_chip_info *chip_info;
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2694
  	struct device_node *node;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2695
2696
2697
2698
2699
2700
  	unsigned int i;
  	int err;
  
  	jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
  	if (!jzpc)
  		return -ENOMEM;
94f7a2cb4   Paul Cercueil   pinctrl: ingenic:...
2701
  	base = devm_platform_ioremap_resource(pdev, 0);
119fcf47f   Wei Yongjun   pinctrl: ingenic:...
2702
  	if (IS_ERR(base))
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2703
  		return PTR_ERR(base);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
  
  	jzpc->map = devm_regmap_init_mmio(dev, base,
  			&ingenic_pinctrl_regmap_config);
  	if (IS_ERR(jzpc->map)) {
  		dev_err(dev, "Failed to create regmap
  ");
  		return PTR_ERR(jzpc->map);
  	}
  
  	jzpc->dev = dev;
baf156473   Paul Cercueil   pinctrl: ingenic:...
2714
  	jzpc->info = chip_info = of_device_get_match_data(dev);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
  
  	pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
  	if (!pctl_desc)
  		return -ENOMEM;
  
  	/* fill in pinctrl_desc structure */
  	pctl_desc->name = dev_name(dev);
  	pctl_desc->owner = THIS_MODULE;
  	pctl_desc->pctlops = &ingenic_pctlops;
  	pctl_desc->pmxops = &ingenic_pmxops;
  	pctl_desc->confops = &ingenic_confops;
  	pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
a86854d0c   Kees Cook   treewide: devm_kz...
2727
2728
  	pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev,
  			pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
  	if (!jzpc->pdesc)
  		return -ENOMEM;
  
  	for (i = 0; i < pctl_desc->npins; i++) {
  		jzpc->pdesc[i].number = i;
  		jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
  						'A' + (i / PINS_PER_GPIO_CHIP),
  						i % PINS_PER_GPIO_CHIP);
  	}
  
  	jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
e7f4c4bf9   Dan Carpenter   pinctrl: ingenic:...
2740
  	if (IS_ERR(jzpc->pctl)) {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2741
2742
  		dev_err(dev, "Failed to register pinctrl
  ");
e7f4c4bf9   Dan Carpenter   pinctrl: ingenic:...
2743
  		return PTR_ERR(jzpc->pctl);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2744
2745
2746
2747
2748
2749
2750
  	}
  
  	for (i = 0; i < chip_info->num_groups; i++) {
  		const struct group_desc *group = &chip_info->groups[i];
  
  		err = pinctrl_generic_add_group(jzpc->pctl, group->name,
  				group->pins, group->num_pins, group->data);
823dd71f5   Paul Burton   pinctrl: ingenic:...
2751
  		if (err < 0) {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
  			dev_err(dev, "Failed to register group %s
  ",
  					group->name);
  			return err;
  		}
  	}
  
  	for (i = 0; i < chip_info->num_functions; i++) {
  		const struct function_desc *func = &chip_info->functions[i];
  
  		err = pinmux_generic_add_function(jzpc->pctl, func->name,
  				func->group_names, func->num_group_names,
  				func->data);
823dd71f5   Paul Burton   pinctrl: ingenic:...
2765
  		if (err < 0) {
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2766
2767
2768
2769
2770
2771
2772
2773
  			dev_err(dev, "Failed to register function %s
  ",
  					func->name);
  			return err;
  		}
  	}
  
  	dev_set_drvdata(dev, jzpc->map);
e72394e2e   Paul Cercueil   pinctrl: ingenic:...
2774
2775
2776
2777
2778
  	for_each_child_of_node(dev->of_node, node) {
  		if (of_match_node(ingenic_gpio_of_match, node)) {
  			err = ingenic_gpio_probe(jzpc, node);
  			if (err)
  				return err;
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2779
2780
2781
2782
2783
  		}
  	}
  
  	return 0;
  }
baf156473   Paul Cercueil   pinctrl: ingenic:...
2784
2785
2786
2787
  static const struct of_device_id ingenic_pinctrl_of_match[] = {
  	{ .compatible = "ingenic,jz4740-pinctrl", .data = &jz4740_chip_info },
  	{ .compatible = "ingenic,jz4725b-pinctrl", .data = &jz4725b_chip_info },
  	{ .compatible = "ingenic,jz4760-pinctrl", .data = &jz4760_chip_info },
5ffdbb7ec   Paul Cercueil   pinctrl: ingenic:...
2788
  	{ .compatible = "ingenic,jz4760b-pinctrl", .data = &jz4760_chip_info },
baf156473   Paul Cercueil   pinctrl: ingenic:...
2789
2790
2791
  	{ .compatible = "ingenic,jz4770-pinctrl", .data = &jz4770_chip_info },
  	{ .compatible = "ingenic,jz4780-pinctrl", .data = &jz4780_chip_info },
  	{ .compatible = "ingenic,x1000-pinctrl", .data = &x1000_chip_info },
5ffdbb7ec   Paul Cercueil   pinctrl: ingenic:...
2792
  	{ .compatible = "ingenic,x1000e-pinctrl", .data = &x1000_chip_info },
baf156473   Paul Cercueil   pinctrl: ingenic:...
2793
2794
2795
2796
  	{ .compatible = "ingenic,x1500-pinctrl", .data = &x1500_chip_info },
  	{ .compatible = "ingenic,x1830-pinctrl", .data = &x1830_chip_info },
  	{},
  };
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2797
2798
2799
  static struct platform_driver ingenic_pinctrl_driver = {
  	.driver = {
  		.name = "pinctrl-ingenic",
5ec008bfa   Paul Cercueil   pinctrl: ingenic:...
2800
  		.of_match_table = ingenic_pinctrl_of_match,
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2801
  	},
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2802
2803
2804
2805
  };
  
  static int __init ingenic_pinctrl_drv_register(void)
  {
4717b11f8   Paul Cercueil   pinctrl: ingenic:...
2806
2807
  	return platform_driver_probe(&ingenic_pinctrl_driver,
  				     ingenic_pinctrl_probe);
b5c23aa46   Paul Cercueil   pinctrl: add a pi...
2808
  }
556a36a71   Paul Cercueil   pinctrl: ingenic:...
2809
  subsys_initcall(ingenic_pinctrl_drv_register);