1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * SP7021 Pin Controller Driver.
4  * Copyright (C) Sunplus Tech / Tibbo Tech.
5  */
6 
7 #include <linux/gpio/driver.h>
8 #include <linux/kernel.h>
9 #include <linux/pinctrl/pinctrl.h>
10 
11 #include "sppctl.h"
12 
13 #define D_PIS(x, y)	"P" __stringify(x) "_0" __stringify(y)
14 #define D(x, y)		((x) * 8 + (y))
15 #define P(x, y)		PINCTRL_PIN(D(x, y), D_PIS(x, y))
16 
17 const char * const sppctl_gpio_list_s[] = {
18 	D_PIS(0, 0),  D_PIS(0, 1),  D_PIS(0, 2),  D_PIS(0, 3),
19 	D_PIS(0, 4),  D_PIS(0, 5),  D_PIS(0, 6),  D_PIS(0, 7),
20 	D_PIS(1, 0),  D_PIS(1, 1),  D_PIS(1, 2),  D_PIS(1, 3),
21 	D_PIS(1, 4),  D_PIS(1, 5),  D_PIS(1, 6),  D_PIS(1, 7),
22 	D_PIS(2, 0),  D_PIS(2, 1),  D_PIS(2, 2),  D_PIS(2, 3),
23 	D_PIS(2, 4),  D_PIS(2, 5),  D_PIS(2, 6),  D_PIS(2, 7),
24 	D_PIS(3, 0),  D_PIS(3, 1),  D_PIS(3, 2),  D_PIS(3, 3),
25 	D_PIS(3, 4),  D_PIS(3, 5),  D_PIS(3, 6),  D_PIS(3, 7),
26 	D_PIS(4, 0),  D_PIS(4, 1),  D_PIS(4, 2),  D_PIS(4, 3),
27 	D_PIS(4, 4),  D_PIS(4, 5),  D_PIS(4, 6),  D_PIS(4, 7),
28 	D_PIS(5, 0),  D_PIS(5, 1),  D_PIS(5, 2),  D_PIS(5, 3),
29 	D_PIS(5, 4),  D_PIS(5, 5),  D_PIS(5, 6),  D_PIS(5, 7),
30 	D_PIS(6, 0),  D_PIS(6, 1),  D_PIS(6, 2),  D_PIS(6, 3),
31 	D_PIS(6, 4),  D_PIS(6, 5),  D_PIS(6, 6),  D_PIS(6, 7),
32 	D_PIS(7, 0),  D_PIS(7, 1),  D_PIS(7, 2),  D_PIS(7, 3),
33 	D_PIS(7, 4),  D_PIS(7, 5),  D_PIS(7, 6),  D_PIS(7, 7),
34 	D_PIS(8, 0),  D_PIS(8, 1),  D_PIS(8, 2),  D_PIS(8, 3),
35 	D_PIS(8, 4),  D_PIS(8, 5),  D_PIS(8, 6),  D_PIS(8, 7),
36 	D_PIS(9, 0),  D_PIS(9, 1),  D_PIS(9, 2),  D_PIS(9, 3),
37 	D_PIS(9, 4),  D_PIS(9, 5),  D_PIS(9, 6),  D_PIS(9, 7),
38 	D_PIS(10, 0), D_PIS(10, 1), D_PIS(10, 2), D_PIS(10, 3),
39 	D_PIS(10, 4), D_PIS(10, 5), D_PIS(10, 6), D_PIS(10, 7),
40 	D_PIS(11, 0), D_PIS(11, 1), D_PIS(11, 2), D_PIS(11, 3),
41 	D_PIS(11, 4), D_PIS(11, 5), D_PIS(11, 6), D_PIS(11, 7),
42 	D_PIS(12, 0), D_PIS(12, 1), D_PIS(12, 2),
43 };
44 
45 const size_t sppctl_gpio_list_sz = ARRAY_SIZE(sppctl_gpio_list_s);
46 
47 const unsigned int sppctl_pins_gpio[] = {
48 	D(0, 0), D(0, 1), D(0, 2), D(0, 3), D(0, 4), D(0, 5), D(0, 6), D(0, 7),
49 	D(1, 0), D(1, 1), D(1, 2), D(1, 3), D(1, 4), D(1, 5), D(1, 6), D(1, 7),
50 	D(2, 0), D(2, 1), D(2, 2), D(2, 3), D(2, 4), D(2, 5), D(2, 6), D(2, 7),
51 	D(3, 0), D(3, 1), D(3, 2), D(3, 3), D(3, 4), D(3, 5), D(3, 6), D(3, 7),
52 	D(4, 0), D(4, 1), D(4, 2), D(4, 3), D(4, 4), D(4, 5), D(4, 6), D(4, 7),
53 	D(5, 0), D(5, 1), D(5, 2), D(5, 3), D(5, 4), D(5, 5), D(5, 6), D(5, 7),
54 	D(6, 0), D(6, 1), D(6, 2), D(6, 3), D(6, 4), D(6, 5), D(6, 6), D(6, 7),
55 	D(7, 0), D(7, 1), D(7, 2), D(7, 3), D(7, 4), D(7, 5), D(7, 6), D(7, 7),
56 	D(8, 0), D(8, 1), D(8, 2), D(8, 3), D(8, 4), D(8, 5), D(8, 6), D(8, 7),
57 	D(9, 0), D(9, 1), D(9, 2), D(9, 3), D(9, 4), D(9, 5), D(9, 6), D(9, 7),
58 	D(10, 0), D(10, 1), D(10, 2), D(10, 3), D(10, 4), D(10, 5), D(10, 6), D(10, 7),
59 	D(11, 0), D(11, 1), D(11, 2), D(11, 3), D(11, 4), D(11, 5), D(11, 6), D(11, 7),
60 	D(12, 0), D(12, 1), D(12, 2),
61 };
62 
63 const struct pinctrl_pin_desc sppctl_pins_all[] = {
64 	/* gpio and iop only */
65 	P(0, 0), P(0, 1), P(0, 2), P(0, 3), P(0, 4), P(0, 5), P(0, 6), P(0, 7),
66 	/* gpio, iop, muxable */
67 	P(1, 0), P(1, 1), P(1, 2), P(1, 3), P(1, 4), P(1, 5), P(1, 6), P(1, 7),
68 	P(2, 0), P(2, 1), P(2, 2), P(2, 3), P(2, 4), P(2, 5), P(2, 6), P(2, 7),
69 	P(3, 0), P(3, 1), P(3, 2), P(3, 3), P(3, 4), P(3, 5), P(3, 6), P(3, 7),
70 	P(4, 0), P(4, 1), P(4, 2), P(4, 3), P(4, 4), P(4, 5), P(4, 6), P(4, 7),
71 	P(5, 0), P(5, 1), P(5, 2), P(5, 3), P(5, 4), P(5, 5), P(5, 6), P(5, 7),
72 	P(6, 0), P(6, 1), P(6, 2), P(6, 3), P(6, 4), P(6, 5), P(6, 6), P(6, 7),
73 	P(7, 0), P(7, 1), P(7, 2), P(7, 3), P(7, 4), P(7, 5), P(7, 6), P(7, 7),
74 	P(8, 0), P(8, 1), P(8, 2), P(8, 3), P(8, 4), P(8, 5), P(8, 6), P(8, 7),
75 	/* gpio and iop only */
76 	P(9, 0),  P(9, 1),  P(9, 2),  P(9, 3),  P(9, 4),  P(9, 5),  P(9, 6),  P(9, 7),
77 	P(10, 0), P(10, 1), P(10, 2), P(10, 3), P(10, 4), P(10, 5), P(10, 6), P(10, 7),
78 	P(11, 0), P(11, 1), P(11, 2), P(11, 3), P(11, 4), P(11, 5), P(11, 6), P(11, 7),
79 	P(12, 0), P(12, 1), P(12, 2),
80 };
81 
82 const size_t sppctl_pins_all_sz = ARRAY_SIZE(sppctl_pins_all);
83 
84 const char * const sppctl_pmux_list_s[] = {
85 	D_PIS(0, 0),
86 	D_PIS(1, 0), D_PIS(1, 1), D_PIS(1, 2), D_PIS(1, 3),
87 	D_PIS(1, 4), D_PIS(1, 5), D_PIS(1, 6), D_PIS(1, 7),
88 	D_PIS(2, 0), D_PIS(2, 1), D_PIS(2, 2), D_PIS(2, 3),
89 	D_PIS(2, 4), D_PIS(2, 5), D_PIS(2, 6), D_PIS(2, 7),
90 	D_PIS(3, 0), D_PIS(3, 1), D_PIS(3, 2), D_PIS(3, 3),
91 	D_PIS(3, 4), D_PIS(3, 5), D_PIS(3, 6), D_PIS(3, 7),
92 	D_PIS(4, 0), D_PIS(4, 1), D_PIS(4, 2), D_PIS(4, 3),
93 	D_PIS(4, 4), D_PIS(4, 5), D_PIS(4, 6), D_PIS(4, 7),
94 	D_PIS(5, 0), D_PIS(5, 1), D_PIS(5, 2), D_PIS(5, 3),
95 	D_PIS(5, 4), D_PIS(5, 5), D_PIS(5, 6), D_PIS(5, 7),
96 	D_PIS(6, 0), D_PIS(6, 1), D_PIS(6, 2), D_PIS(6, 3),
97 	D_PIS(6, 4), D_PIS(6, 5), D_PIS(6, 6), D_PIS(6, 7),
98 	D_PIS(7, 0), D_PIS(7, 1), D_PIS(7, 2), D_PIS(7, 3),
99 	D_PIS(7, 4), D_PIS(7, 5), D_PIS(7, 6), D_PIS(7, 7),
100 	D_PIS(8, 0), D_PIS(8, 1), D_PIS(8, 2), D_PIS(8, 3),
101 	D_PIS(8, 4), D_PIS(8, 5), D_PIS(8, 6), D_PIS(8, 7),
102 };
103 
104 const size_t sppctl_pmux_list_sz = ARRAY_SIZE(sppctl_pmux_list_s);
105 
106 static const unsigned int pins_spif1[] = {
107 	D(10, 3), D(10, 4), D(10, 6), D(10, 7),
108 };
109 
110 static const unsigned int pins_spif2[] = {
111 	D(9, 4), D(9, 6), D(9, 7), D(10, 1),
112 };
113 
114 static const struct sppctl_grp sp7021grps_spif[] = {
115 	EGRP("SPI_FLASH1", 1, pins_spif1),
116 	EGRP("SPI_FLASH2", 2, pins_spif2),
117 };
118 
119 static const unsigned int pins_spi41[] = {
120 	D(10, 2), D(10, 5),
121 };
122 
123 static const unsigned int pins_spi42[] = {
124 	D(9, 5), D(9, 8),
125 };
126 
127 static const struct sppctl_grp sp7021grps_spi4[] = {
128 	EGRP("SPI_FLASH_4BIT1", 1, pins_spi41),
129 	EGRP("SPI_FLASH_4BIT2", 2, pins_spi42),
130 };
131 
132 static const unsigned int pins_snan[] = {
133 	D(9, 4), D(9, 5), D(9, 6), D(9, 7), D(10, 0), D(10, 1),
134 };
135 
136 static const struct sppctl_grp sp7021grps_snan[] = {
137 	EGRP("SPI_NAND", 1, pins_snan),
138 };
139 
140 static const unsigned int pins_emmc[] = {
141 	D(9, 0), D(9, 1), D(9, 2), D(9, 3), D(9, 4), D(9, 5),
142 	D(9, 6), D(9, 7), D(10, 0), D(10, 1),
143 };
144 
145 static const struct sppctl_grp sp7021grps_emmc[] = {
146 	EGRP("CARD0_EMMC", 1, pins_emmc),
147 };
148 
149 static const unsigned int pins_sdsd[] = {
150 	D(8, 1), D(8, 2), D(8, 3), D(8, 4), D(8, 5), D(8, 6),
151 };
152 
153 static const struct sppctl_grp sp7021grps_sdsd[] = {
154 	EGRP("SD_CARD", 1, pins_sdsd),
155 };
156 
157 static const unsigned int pins_uar0[] = {
158 	D(11, 0), D(11, 1),
159 };
160 
161 static const struct sppctl_grp sp7021grps_uar0[] = {
162 	EGRP("UA0", 1, pins_uar0),
163 };
164 
165 static const unsigned int pins_adbg1[] = {
166 	D(10, 2), D(10, 3),
167 };
168 
169 static const unsigned int pins_adbg2[] = {
170 	D(7, 1), D(7, 2),
171 };
172 
173 static const struct sppctl_grp sp7021grps_adbg[] = {
174 	EGRP("ACHIP_DEBUG1", 1, pins_adbg1),
175 	EGRP("ACHIP_DEBUG2", 2, pins_adbg2),
176 };
177 
178 static const unsigned int pins_aua2axi1[] = {
179 	D(2, 0), D(2, 1), D(2, 2),
180 };
181 
182 static const unsigned int pins_aua2axi2[] = {
183 	D(1, 0), D(1, 1), D(1, 2),
184 };
185 
186 static const struct sppctl_grp sp7021grps_au2x[] = {
187 	EGRP("ACHIP_UA2AXI1", 1, pins_aua2axi1),
188 	EGRP("ACHIP_UA2AXI2", 2, pins_aua2axi2),
189 };
190 
191 static const unsigned int pins_fpga[] = {
192 	D(0, 2), D(0, 3), D(0, 4), D(0, 5), D(0, 6), D(0, 7),
193 	D(1, 0), D(1, 1), D(1, 2), D(1, 3), D(1, 4), D(1, 5),
194 	D(1, 6), D(1, 7), D(2, 0), D(2, 1), D(2, 2), D(2, 3),
195 	D(2, 4), D(2, 5), D(2, 6), D(2, 7), D(3, 0), D(3, 1),
196 	D(3, 2), D(3, 3), D(3, 4), D(3, 5), D(3, 6), D(3, 7),
197 	D(4, 0), D(4, 1), D(4, 2), D(4, 3), D(4, 4), D(4, 5),
198 	D(4, 6), D(4, 7), D(5, 0), D(5, 1), D(5, 2),
199 };
200 
201 static const struct sppctl_grp sp7021grps_fpga[] = {
202 	EGRP("FPGA_IFX", 1, pins_fpga),
203 };
204 
205 static const unsigned int pins_hdmi1[] = {
206 	D(10, 6), D(12, 2), D(12, 1),
207 };
208 
209 static const unsigned int pins_hdmi2[] = {
210 	D(8, 3), D(8, 5), D(8, 6),
211 };
212 
213 static const unsigned int pins_hdmi3[] = {
214 	D(7, 4), D(7, 6), D(7, 7),
215 };
216 
217 static const struct sppctl_grp sp7021grps_hdmi[] = {
218 	EGRP("HDMI_TX1", 1, pins_hdmi1),
219 	EGRP("HDMI_TX2", 2, pins_hdmi2),
220 	EGRP("HDMI_TX3", 3, pins_hdmi3),
221 };
222 
223 static const unsigned int pins_eadc[] = {
224 	D(1, 0), D(1, 1), D(1, 2), D(1, 3), D(1, 4), D(1, 5), D(1, 6),
225 };
226 
227 static const struct sppctl_grp sp7021grps_eadc[] = {
228 	EGRP("AUD_EXT_ADC_IFX0", 1, pins_eadc),
229 };
230 
231 static const unsigned int pins_edac[] = {
232 	D(2, 5), D(2, 6), D(2, 7), D(3, 0), D(3, 1), D(3, 2), D(3, 4),
233 };
234 
235 static const struct sppctl_grp sp7021grps_edac[] = {
236 	EGRP("AUD_EXT_DAC_IFX0", 1, pins_edac),
237 };
238 
239 static const unsigned int pins_spdi[] = {
240 	D(2, 4),
241 };
242 
243 static const struct sppctl_grp sp7021grps_spdi[] = {
244 	EGRP("AUD_IEC_RX0", 1, pins_spdi),
245 };
246 
247 static const unsigned int pins_spdo[] = {
248 	D(3, 6),
249 };
250 
251 static const struct sppctl_grp sp7021grps_spdo[] = {
252 	EGRP("AUD_IEC_TX0", 1, pins_spdo),
253 };
254 
255 static const unsigned int pins_tdmt[] = {
256 	D(2, 5), D(2, 6), D(2, 7), D(3, 0), D(3, 1), D(3, 2),
257 };
258 
259 static const struct sppctl_grp sp7021grps_tdmt[] = {
260 	EGRP("TDMTX_IFX0", 1, pins_tdmt),
261 };
262 
263 static const unsigned int pins_tdmr[] = {
264 	D(1, 7), D(2, 0), D(2, 1), D(2, 2),
265 };
266 
267 static const struct sppctl_grp sp7021grps_tdmr[] = {
268 	EGRP("TDMRX_IFX0", 1, pins_tdmr),
269 };
270 
271 static const unsigned int pins_pdmr[] = {
272 	D(1, 7), D(2, 0), D(2, 1), D(2, 2), D(2, 3),
273 };
274 
275 static const struct sppctl_grp sp7021grps_pdmr[] = {
276 	EGRP("PDMRX_IFX0", 1, pins_pdmr),
277 };
278 
279 static const unsigned int pins_pcmt[] = {
280 	D(3, 7), D(4, 0), D(4, 1), D(4, 2), D(4, 3), D(4, 4),
281 };
282 
283 static const struct sppctl_grp sp7021grps_pcmt[] = {
284 	EGRP("PCM_IEC_TX", 1, pins_pcmt),
285 };
286 
287 static const unsigned int pins_lcdi[] = {
288 	D(1, 4), D(1, 5), D(1, 6), D(1, 7), D(2, 0), D(2, 1), D(2, 2), D(2, 3),
289 	D(2, 4), D(2, 5), D(2, 6), D(2, 7), D(3, 0), D(3, 1), D(3, 2), D(3, 3),
290 	D(3, 4), D(3, 5), D(3, 6), D(3, 7), D(4, 0), D(4, 1), D(4, 2), D(4, 3),
291 	D(4, 4), D(4, 5), D(4, 6), D(4, 7),
292 };
293 
294 static const struct sppctl_grp sp7021grps_lcdi[] = {
295 	EGRP("LCDIF", 1, pins_lcdi),
296 };
297 
298 static const unsigned int pins_dvdd[] = {
299 	D(7, 0), D(7, 1), D(7, 2), D(7, 3), D(7, 4), D(7, 5), D(7, 6), D(7, 7),
300 	D(8, 0), D(8, 1), D(8, 2), D(8, 3), D(8, 4), D(8, 5),
301 };
302 
303 static const struct sppctl_grp sp7021grps_dvdd[] = {
304 	EGRP("DVD_DSP_DEBUG", 1, pins_dvdd),
305 };
306 
307 static const unsigned int pins_i2cd[] = {
308 	D(1, 0), D(1, 1),
309 };
310 
311 static const struct sppctl_grp sp7021grps_i2cd[] = {
312 	EGRP("I2C_DEBUG", 1, pins_i2cd),
313 };
314 
315 static const unsigned int pins_i2cs[] = {
316 	D(0, 0), D(0, 1),
317 };
318 
319 static const struct sppctl_grp sp7021grps_i2cs[] = {
320 	EGRP("I2C_SLAVE", 1, pins_i2cs),
321 };
322 
323 static const unsigned int pins_wakp[] = {
324 	D(10, 5),
325 };
326 
327 static const struct sppctl_grp sp7021grps_wakp[] = {
328 	EGRP("WAKEUP", 1, pins_wakp),
329 };
330 
331 static const unsigned int pins_u2ax[] = {
332 	D(2, 0), D(2, 1), D(3, 0), D(3, 1),
333 };
334 
335 static const struct sppctl_grp sp7021grps_u2ax[] = {
336 	EGRP("UART2AXI", 1, pins_u2ax),
337 };
338 
339 static const unsigned int pins_u0ic[] = {
340 	D(0, 0), D(0, 1), D(0, 4), D(0, 5), D(1, 0), D(1, 1),
341 };
342 
343 static const struct sppctl_grp sp7021grps_u0ic[] = {
344 	EGRP("USB0_I2C", 1, pins_u0ic),
345 };
346 
347 static const unsigned int pins_u1ic[] = {
348 	D(0, 2), D(0, 3), D(0, 6), D(0, 7), D(1, 2), D(1, 3),
349 };
350 
351 static const struct sppctl_grp sp7021grps_u1ic[] = {
352 	EGRP("USB1_I2C", 1, pins_u1ic),
353 };
354 
355 static const unsigned int pins_u0ot[] = {
356 	D(11, 2),
357 };
358 
359 static const struct sppctl_grp sp7021grps_u0ot[] = {
360 	EGRP("USB0_OTG", 1, pins_u0ot),
361 };
362 
363 static const unsigned int pins_u1ot[] = {
364 	D(11, 3),
365 };
366 
367 static const struct sppctl_grp sp7021grps_u1ot[] = {
368 	EGRP("USB1_OTG", 1, pins_u1ot),
369 };
370 
371 static const unsigned int pins_uphd[] = {
372 	D(0, 1), D(0, 2), D(0, 3), D(7, 4), D(7, 5), D(7, 6),
373 	D(7, 7), D(8, 0), D(8, 1), D(8, 2), D(8, 3),
374 	D(9, 7), D(10, 2), D(10, 3), D(10, 4),
375 };
376 
377 static const struct sppctl_grp sp7021grps_up0d[] = {
378 	EGRP("UPHY0_DEBUG", 1, pins_uphd),
379 };
380 
381 static const struct sppctl_grp sp7021grps_up1d[] = {
382 	EGRP("UPHY1_DEBUG", 1, pins_uphd),
383 };
384 
385 static const unsigned int pins_upex[] = {
386 	D(0, 0), D(0, 1), D(0, 2), D(0, 3), D(0, 4), D(0, 5), D(0, 6), D(0, 7),
387 	D(1, 0), D(1, 1), D(1, 2), D(1, 3), D(1, 4), D(1, 5), D(1, 6), D(1, 7),
388 	D(2, 0), D(2, 1), D(2, 2), D(2, 3), D(2, 4), D(2, 5), D(2, 6), D(2, 7),
389 	D(3, 0), D(3, 1), D(3, 2), D(3, 3), D(3, 4), D(3, 5), D(3, 6), D(3, 7),
390 	D(4, 0), D(4, 1), D(4, 2), D(4, 3), D(4, 4), D(4, 5), D(4, 6), D(4, 7),
391 	D(5, 0), D(5, 1), D(5, 2), D(5, 3), D(5, 4), D(5, 5), D(5, 6), D(5, 7),
392 	D(6, 0), D(6, 1), D(6, 2), D(6, 3), D(6, 4), D(6, 5), D(6, 6), D(6, 7),
393 	D(7, 0), D(7, 1), D(7, 2), D(7, 3), D(7, 4), D(7, 5), D(7, 6), D(7, 7),
394 	D(8, 0), D(8, 1), D(8, 2), D(8, 3), D(8, 4), D(8, 5), D(8, 6), D(8, 7),
395 	D(9, 0), D(9, 1), D(9, 2), D(9, 3), D(9, 4), D(9, 5), D(9, 6), D(9, 7),
396 	D(10, 0), D(10, 1), D(10, 2), D(10, 3), D(10, 4), D(10, 5), D(10, 6), D(10, 7),
397 };
398 
399 static const struct sppctl_grp sp7021grps_upex[] = {
400 	EGRP("UPHY0_EXT", 1, pins_upex),
401 };
402 
403 static const unsigned int pins_prp1[] = {
404 	D(0, 6), D(0, 7),
405 	D(1, 0), D(1, 1), D(1, 2), D(1, 3), D(1, 4), D(1, 5), D(1, 6), D(1, 7),
406 	D(2, 1), D(2, 2), D(2, 3), D(2, 4), D(2, 5), D(2, 6), D(2, 7),
407 	D(3, 0), D(3, 1), D(3, 2),
408 };
409 
410 static const unsigned int pins_prp2[] = {
411 	D(3, 4), D(3, 6), D(3, 7),
412 	D(4, 0), D(4, 1), D(4, 2), D(4, 3), D(4, 4), D(4, 5), D(4, 6), D(4, 7),
413 	D(5, 0), D(5, 1), D(5, 2), D(5, 3), D(5, 4), D(5, 5), D(5, 6), D(5, 7),
414 	D(6, 4),
415 };
416 
417 static const struct sppctl_grp sp7021grps_prbp[] = {
418 	EGRP("PROBE_PORT1", 1, pins_prp1),
419 	EGRP("PROBE_PORT2", 2, pins_prp2),
420 };
421 
422 /*
423  * Due to compatible reason, the first valid item should start at the third
424  * position of the array. Please keep the first two items of the table
425  * no use (dummy).
426  */
427 const struct sppctl_func sppctl_list_funcs[] = {
428 	FNCN("", pinmux_type_fpmx, 0x00, 0, 0),
429 	FNCN("", pinmux_type_fpmx, 0x00, 0, 0),
430 
431 	FNCN("L2SW_CLK_OUT",        pinmux_type_fpmx, 0x00, 0, 7),
432 	FNCN("L2SW_MAC_SMI_MDC",    pinmux_type_fpmx, 0x00, 8, 7),
433 	FNCN("L2SW_LED_FLASH0",     pinmux_type_fpmx, 0x01, 0, 7),
434 	FNCN("L2SW_LED_FLASH1",     pinmux_type_fpmx, 0x01, 8, 7),
435 	FNCN("L2SW_LED_ON0",        pinmux_type_fpmx, 0x02, 0, 7),
436 	FNCN("L2SW_LED_ON1",        pinmux_type_fpmx, 0x02, 8, 7),
437 	FNCN("L2SW_MAC_SMI_MDIO",   pinmux_type_fpmx, 0x03, 0, 7),
438 	FNCN("L2SW_P0_MAC_RMII_TXEN",   pinmux_type_fpmx, 0x03, 8, 7),
439 	FNCN("L2SW_P0_MAC_RMII_TXD0",   pinmux_type_fpmx, 0x04, 0, 7),
440 	FNCN("L2SW_P0_MAC_RMII_TXD1",   pinmux_type_fpmx, 0x04, 8, 7),
441 	FNCN("L2SW_P0_MAC_RMII_CRSDV",  pinmux_type_fpmx, 0x05, 0, 7),
442 	FNCN("L2SW_P0_MAC_RMII_RXD0",   pinmux_type_fpmx, 0x05, 8, 7),
443 	FNCN("L2SW_P0_MAC_RMII_RXD1",   pinmux_type_fpmx, 0x06, 0, 7),
444 	FNCN("L2SW_P0_MAC_RMII_RXER",   pinmux_type_fpmx, 0x06, 8, 7),
445 	FNCN("L2SW_P1_MAC_RMII_TXEN",   pinmux_type_fpmx, 0x07, 0, 7),
446 	FNCN("L2SW_P1_MAC_RMII_TXD0",   pinmux_type_fpmx, 0x07, 8, 7),
447 	FNCN("L2SW_P1_MAC_RMII_TXD1",   pinmux_type_fpmx, 0x08, 0, 7),
448 	FNCN("L2SW_P1_MAC_RMII_CRSDV",  pinmux_type_fpmx, 0x08, 8, 7),
449 	FNCN("L2SW_P1_MAC_RMII_RXD0",   pinmux_type_fpmx, 0x09, 0, 7),
450 	FNCN("L2SW_P1_MAC_RMII_RXD1",   pinmux_type_fpmx, 0x09, 8, 7),
451 	FNCN("L2SW_P1_MAC_RMII_RXER",   pinmux_type_fpmx, 0x0A, 0, 7),
452 	FNCN("DAISY_MODE",      pinmux_type_fpmx, 0x0A, 8, 7),
453 	FNCN("SDIO_CLK",        pinmux_type_fpmx, 0x0B, 0, 7),    /* 1x SDIO */
454 	FNCN("SDIO_CMD",        pinmux_type_fpmx, 0x0B, 8, 7),
455 	FNCN("SDIO_D0",         pinmux_type_fpmx, 0x0C, 0, 7),
456 	FNCN("SDIO_D1",         pinmux_type_fpmx, 0x0C, 8, 7),
457 	FNCN("SDIO_D2",         pinmux_type_fpmx, 0x0D, 0, 7),
458 	FNCN("SDIO_D3",         pinmux_type_fpmx, 0x0D, 8, 7),
459 	FNCN("PWM0",            pinmux_type_fpmx, 0x0E, 0, 7),    /* 8x PWM */
460 	FNCN("PWM1",            pinmux_type_fpmx, 0x0E, 8, 7),
461 	FNCN("PWM2",            pinmux_type_fpmx, 0x0F, 0, 7),
462 	FNCN("PWM3",            pinmux_type_fpmx, 0x0F, 8, 7),
463 
464 	FNCN("PWM4",            pinmux_type_fpmx, 0x10, 0, 7),
465 	FNCN("PWM5",            pinmux_type_fpmx, 0x10, 8, 7),
466 	FNCN("PWM6",            pinmux_type_fpmx, 0x11, 0, 7),
467 	FNCN("PWM7",            pinmux_type_fpmx, 0x11, 8, 7),
468 	FNCN("ICM0_D",          pinmux_type_fpmx, 0x12, 0, 7),    /* 4x Input captures */
469 	FNCN("ICM1_D",          pinmux_type_fpmx, 0x12, 8, 7),
470 	FNCN("ICM2_D",          pinmux_type_fpmx, 0x13, 0, 7),
471 	FNCN("ICM3_D",          pinmux_type_fpmx, 0x13, 8, 7),
472 	FNCN("ICM0_CLK",        pinmux_type_fpmx, 0x14, 0, 7),
473 	FNCN("ICM1_CLK",        pinmux_type_fpmx, 0x14, 8, 7),
474 	FNCN("ICM2_CLK",        pinmux_type_fpmx, 0x15, 0, 7),
475 	FNCN("ICM3_CLK",        pinmux_type_fpmx, 0x15, 8, 7),
476 	FNCN("SPIM0_INT",       pinmux_type_fpmx, 0x16, 0, 7),    /* 4x SPI masters */
477 	FNCN("SPIM0_CLK",       pinmux_type_fpmx, 0x16, 8, 7),
478 	FNCN("SPIM0_EN",        pinmux_type_fpmx, 0x17, 0, 7),
479 	FNCN("SPIM0_DO",        pinmux_type_fpmx, 0x17, 8, 7),
480 	FNCN("SPIM0_DI",        pinmux_type_fpmx, 0x18, 0, 7),
481 	FNCN("SPIM1_INT",       pinmux_type_fpmx, 0x18, 8, 7),
482 	FNCN("SPIM1_CLK",       pinmux_type_fpmx, 0x19, 0, 7),
483 	FNCN("SPIM1_EN",        pinmux_type_fpmx, 0x19, 8, 7),
484 	FNCN("SPIM1_DO",        pinmux_type_fpmx, 0x1A, 0, 7),
485 	FNCN("SPIM1_DI",        pinmux_type_fpmx, 0x1A, 8, 7),
486 	FNCN("SPIM2_INT",       pinmux_type_fpmx, 0x1B, 0, 7),
487 	FNCN("SPIM2_CLK",       pinmux_type_fpmx, 0x1B, 8, 7),
488 	FNCN("SPIM2_EN",        pinmux_type_fpmx, 0x1C, 0, 7),
489 	FNCN("SPIM2_DO",        pinmux_type_fpmx, 0x1C, 8, 7),
490 	FNCN("SPIM2_DI",        pinmux_type_fpmx, 0x1D, 0, 7),
491 	FNCN("SPIM3_INT",       pinmux_type_fpmx, 0x1D, 8, 7),
492 	FNCN("SPIM3_CLK",       pinmux_type_fpmx, 0x1E, 0, 7),
493 	FNCN("SPIM3_EN",        pinmux_type_fpmx, 0x1E, 8, 7),
494 	FNCN("SPIM3_DO",        pinmux_type_fpmx, 0x1F, 0, 7),
495 	FNCN("SPIM3_DI",        pinmux_type_fpmx, 0x1F, 8, 7),
496 
497 	FNCN("SPI0S_INT",       pinmux_type_fpmx, 0x20, 0, 7),    /* 4x SPI slaves */
498 	FNCN("SPI0S_CLK",       pinmux_type_fpmx, 0x20, 8, 7),
499 	FNCN("SPI0S_EN",        pinmux_type_fpmx, 0x21, 0, 7),
500 	FNCN("SPI0S_DO",        pinmux_type_fpmx, 0x21, 8, 7),
501 	FNCN("SPI0S_DI",        pinmux_type_fpmx, 0x22, 0, 7),
502 	FNCN("SPI1S_INT",       pinmux_type_fpmx, 0x22, 8, 7),
503 	FNCN("SPI1S_CLK",       pinmux_type_fpmx, 0x23, 0, 7),
504 	FNCN("SPI1S_EN",        pinmux_type_fpmx, 0x23, 8, 7),
505 	FNCN("SPI1S_DO",        pinmux_type_fpmx, 0x24, 0, 7),
506 	FNCN("SPI1S_DI",        pinmux_type_fpmx, 0x24, 8, 7),
507 	FNCN("SPI2S_INT",       pinmux_type_fpmx, 0x25, 0, 7),
508 	FNCN("SPI2S_CLK",       pinmux_type_fpmx, 0x25, 8, 7),
509 	FNCN("SPI2S_EN",        pinmux_type_fpmx, 0x26, 0, 7),
510 	FNCN("SPI2S_DO",        pinmux_type_fpmx, 0x26, 8, 7),
511 	FNCN("SPI2S_DI",        pinmux_type_fpmx, 0x27, 0, 7),
512 	FNCN("SPI3S_INT",       pinmux_type_fpmx, 0x27, 8, 7),
513 	FNCN("SPI3S_CLK",       pinmux_type_fpmx, 0x28, 0, 7),
514 	FNCN("SPI3S_EN",        pinmux_type_fpmx, 0x28, 8, 7),
515 	FNCN("SPI3S_DO",        pinmux_type_fpmx, 0x29, 0, 7),
516 	FNCN("SPI3S_DI",        pinmux_type_fpmx, 0x29, 8, 7),
517 	FNCN("I2CM0_CLK",       pinmux_type_fpmx, 0x2A, 0, 7),    /* 4x I2C masters */
518 	FNCN("I2CM0_DAT",       pinmux_type_fpmx, 0x2A, 8, 7),
519 	FNCN("I2CM1_CLK",       pinmux_type_fpmx, 0x2B, 0, 7),
520 	FNCN("I2CM1_DAT",       pinmux_type_fpmx, 0x2B, 8, 7),
521 	FNCN("I2CM2_CLK",       pinmux_type_fpmx, 0x2C, 0, 7),
522 	FNCN("I2CM2_DAT",       pinmux_type_fpmx, 0x2C, 8, 7),
523 	FNCN("I2CM3_CLK",       pinmux_type_fpmx, 0x2D, 0, 7),
524 	FNCN("I2CM3_DAT",       pinmux_type_fpmx, 0x2D, 8, 7),
525 	FNCN("UA1_TX",          pinmux_type_fpmx, 0x2E, 0, 7),    /* 4x UARTS */
526 	FNCN("UA1_RX",          pinmux_type_fpmx, 0x2E, 8, 7),
527 	FNCN("UA1_CTS",         pinmux_type_fpmx, 0x2F, 0, 7),
528 	FNCN("UA1_RTS",         pinmux_type_fpmx, 0x2F, 8, 7),
529 
530 	FNCN("UA2_TX",          pinmux_type_fpmx, 0x30, 0, 7),
531 	FNCN("UA2_RX",          pinmux_type_fpmx, 0x30, 8, 7),
532 	FNCN("UA2_CTS",         pinmux_type_fpmx, 0x31, 0, 7),
533 	FNCN("UA2_RTS",         pinmux_type_fpmx, 0x31, 8, 7),
534 	FNCN("UA3_TX",          pinmux_type_fpmx, 0x32, 0, 7),
535 	FNCN("UA3_RX",          pinmux_type_fpmx, 0x32, 8, 7),
536 	FNCN("UA3_CTS",         pinmux_type_fpmx, 0x33, 0, 7),
537 	FNCN("UA3_RTS",         pinmux_type_fpmx, 0x33, 8, 7),
538 	FNCN("UA4_TX",          pinmux_type_fpmx, 0x34, 0, 7),
539 	FNCN("UA4_RX",          pinmux_type_fpmx, 0x34, 8, 7),
540 	FNCN("UA4_CTS",         pinmux_type_fpmx, 0x35, 0, 7),
541 	FNCN("UA4_RTS",         pinmux_type_fpmx, 0x35, 8, 7),
542 	FNCN("TIMER0_INT",      pinmux_type_fpmx, 0x36, 0, 7),    /* 4x timer int. */
543 	FNCN("TIMER1_INT",      pinmux_type_fpmx, 0x36, 8, 7),
544 	FNCN("TIMER2_INT",      pinmux_type_fpmx, 0x37, 0, 7),
545 	FNCN("TIMER3_INT",      pinmux_type_fpmx, 0x37, 8, 7),
546 	FNCN("GPIO_INT0",       pinmux_type_fpmx, 0x38, 0, 7),    /* 8x GPIO int. */
547 	FNCN("GPIO_INT1",       pinmux_type_fpmx, 0x38, 8, 7),
548 	FNCN("GPIO_INT2",       pinmux_type_fpmx, 0x39, 0, 7),
549 	FNCN("GPIO_INT3",       pinmux_type_fpmx, 0x39, 8, 7),
550 	FNCN("GPIO_INT4",       pinmux_type_fpmx, 0x3A, 0, 7),
551 	FNCN("GPIO_INT5",       pinmux_type_fpmx, 0x3A, 8, 7),
552 	FNCN("GPIO_INT6",       pinmux_type_fpmx, 0x3B, 0, 7),
553 	FNCN("GPIO_INT7",       pinmux_type_fpmx, 0x3B, 8, 7),
554 
555 	/* MOON1 register */
556 	FNCE("SPI_FLASH",       pinmux_type_grp, 0x01,  0, 2, sp7021grps_spif),
557 	FNCE("SPI_FLASH_4BIT",  pinmux_type_grp, 0x01,  2, 2, sp7021grps_spi4),
558 	FNCE("SPI_NAND",        pinmux_type_grp, 0x01,  4, 1, sp7021grps_snan),
559 	FNCE("CARD0_EMMC",      pinmux_type_grp, 0x01,  5, 1, sp7021grps_emmc),
560 	FNCE("SD_CARD",         pinmux_type_grp, 0x01,  6, 1, sp7021grps_sdsd),
561 	FNCE("UA0",             pinmux_type_grp, 0x01,  7, 1, sp7021grps_uar0),
562 	FNCE("ACHIP_DEBUG",     pinmux_type_grp, 0x01,  8, 2, sp7021grps_adbg),
563 	FNCE("ACHIP_UA2AXI",    pinmux_type_grp, 0x01, 10, 2, sp7021grps_au2x),
564 	FNCE("FPGA_IFX",        pinmux_type_grp, 0x01, 12, 1, sp7021grps_fpga),
565 	FNCE("HDMI_TX",         pinmux_type_grp, 0x01, 13, 2, sp7021grps_hdmi),
566 
567 	FNCE("AUD_EXT_ADC_IFX0", pinmux_type_grp, 0x01, 15, 1, sp7021grps_eadc),
568 	FNCE("AUD_EXT_DAC_IFX0", pinmux_type_grp, 0x02,  0, 1, sp7021grps_edac),
569 	FNCE("SPDIF_RX",        pinmux_type_grp, 0x02,  2, 1, sp7021grps_spdi),
570 	FNCE("SPDIF_TX",        pinmux_type_grp, 0x02,  3, 1, sp7021grps_spdo),
571 	FNCE("TDMTX_IFX0",      pinmux_type_grp, 0x02,  4, 1, sp7021grps_tdmt),
572 	FNCE("TDMRX_IFX0",      pinmux_type_grp, 0x02,  5, 1, sp7021grps_tdmr),
573 	FNCE("PDMRX_IFX0",      pinmux_type_grp, 0x02,  6, 1, sp7021grps_pdmr),
574 	FNCE("PCM_IEC_TX",      pinmux_type_grp, 0x02,  7, 1, sp7021grps_pcmt),
575 	FNCE("LCDIF",           pinmux_type_grp, 0x04,  6, 1, sp7021grps_lcdi),
576 	FNCE("DVD_DSP_DEBUG",   pinmux_type_grp, 0x02,  8, 1, sp7021grps_dvdd),
577 	FNCE("I2C_DEBUG",       pinmux_type_grp, 0x02,  9, 1, sp7021grps_i2cd),
578 	FNCE("I2C_SLAVE",       pinmux_type_grp, 0x02, 10, 1, sp7021grps_i2cs),
579 	FNCE("WAKEUP",          pinmux_type_grp, 0x02, 11, 1, sp7021grps_wakp),
580 	FNCE("UART2AXI",        pinmux_type_grp, 0x02, 12, 2, sp7021grps_u2ax),
581 	FNCE("USB0_I2C",        pinmux_type_grp, 0x02, 14, 2, sp7021grps_u0ic),
582 	FNCE("USB1_I2C",        pinmux_type_grp, 0x03,  0, 2, sp7021grps_u1ic),
583 	FNCE("USB0_OTG",        pinmux_type_grp, 0x03,  2, 1, sp7021grps_u0ot),
584 	FNCE("USB1_OTG",        pinmux_type_grp, 0x03,  3, 1, sp7021grps_u1ot),
585 	FNCE("UPHY0_DEBUG",     pinmux_type_grp, 0x03,  4, 1, sp7021grps_up0d),
586 	FNCE("UPHY1_DEBUG",     pinmux_type_grp, 0x03,  5, 1, sp7021grps_up1d),
587 	FNCE("UPHY0_EXT",       pinmux_type_grp, 0x03,  6, 1, sp7021grps_upex),
588 	FNCE("PROBE_PORT",      pinmux_type_grp, 0x03,  7, 2, sp7021grps_prbp),
589 };
590 
591 const size_t sppctl_list_funcs_sz = ARRAY_SIZE(sppctl_list_funcs);
592