summaryrefslogblamecommitdiff
path: root/drivers/pinctrl/meson/pinctrl-meson-s4.c
blob: cea77864b88088b07d8a802e8f153079ff70f282 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
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
































































































































































































































































































































































































































































































































































































                                                                       
                                           








































































































































































































































































































































































                                                                               
                                                                                   




































































































































































































































































































                                                                               
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
 * Pin controller and GPIO driver for Amlogic Meson S4 SoC.
 *
 * Copyright (c) 2021 Amlogic, Inc. All rights reserved.
 * Author: Qianggui Song <qianggui.song@amlogic.com>
 */

#include <dt-bindings/gpio/meson-s4-gpio.h>
#include "pinctrl-meson.h"
#include "pinctrl-meson-axg-pmx.h"

static const struct pinctrl_pin_desc meson_s4_periphs_pins[] = {
	MESON_PIN(GPIOE_0),
	MESON_PIN(GPIOE_1),

	MESON_PIN(GPIOB_0),
	MESON_PIN(GPIOB_1),
	MESON_PIN(GPIOB_2),
	MESON_PIN(GPIOB_3),
	MESON_PIN(GPIOB_4),
	MESON_PIN(GPIOB_5),
	MESON_PIN(GPIOB_6),
	MESON_PIN(GPIOB_7),
	MESON_PIN(GPIOB_8),
	MESON_PIN(GPIOB_9),
	MESON_PIN(GPIOB_10),
	MESON_PIN(GPIOB_11),
	MESON_PIN(GPIOB_12),
	MESON_PIN(GPIOB_13),

	MESON_PIN(GPIOC_0),
	MESON_PIN(GPIOC_1),
	MESON_PIN(GPIOC_2),
	MESON_PIN(GPIOC_3),
	MESON_PIN(GPIOC_4),
	MESON_PIN(GPIOC_5),
	MESON_PIN(GPIOC_6),
	MESON_PIN(GPIOC_7),

	MESON_PIN(GPIOD_0),
	MESON_PIN(GPIOD_1),
	MESON_PIN(GPIOD_2),
	MESON_PIN(GPIOD_3),
	MESON_PIN(GPIOD_4),
	MESON_PIN(GPIOD_5),
	MESON_PIN(GPIOD_6),
	MESON_PIN(GPIOD_7),
	MESON_PIN(GPIOD_8),
	MESON_PIN(GPIOD_9),
	MESON_PIN(GPIOD_10),
	MESON_PIN(GPIOD_11),

	MESON_PIN(GPIOH_0),
	MESON_PIN(GPIOH_1),
	MESON_PIN(GPIOH_2),
	MESON_PIN(GPIOH_3),
	MESON_PIN(GPIOH_4),
	MESON_PIN(GPIOH_5),
	MESON_PIN(GPIOH_6),
	MESON_PIN(GPIOH_7),
	MESON_PIN(GPIOH_8),
	MESON_PIN(GPIOH_9),
	MESON_PIN(GPIOH_10),
	MESON_PIN(GPIOH_11),

	MESON_PIN(GPIOX_0),
	MESON_PIN(GPIOX_1),
	MESON_PIN(GPIOX_2),
	MESON_PIN(GPIOX_3),
	MESON_PIN(GPIOX_4),
	MESON_PIN(GPIOX_5),
	MESON_PIN(GPIOX_6),
	MESON_PIN(GPIOX_7),
	MESON_PIN(GPIOX_8),
	MESON_PIN(GPIOX_9),
	MESON_PIN(GPIOX_10),
	MESON_PIN(GPIOX_11),
	MESON_PIN(GPIOX_12),
	MESON_PIN(GPIOX_13),
	MESON_PIN(GPIOX_14),
	MESON_PIN(GPIOX_15),
	MESON_PIN(GPIOX_16),
	MESON_PIN(GPIOX_17),
	MESON_PIN(GPIOX_18),
	MESON_PIN(GPIOX_19),

	MESON_PIN(GPIOZ_0),
	MESON_PIN(GPIOZ_1),
	MESON_PIN(GPIOZ_2),
	MESON_PIN(GPIOZ_3),
	MESON_PIN(GPIOZ_4),
	MESON_PIN(GPIOZ_5),
	MESON_PIN(GPIOZ_6),
	MESON_PIN(GPIOZ_7),
	MESON_PIN(GPIOZ_8),
	MESON_PIN(GPIOZ_9),
	MESON_PIN(GPIOZ_10),
	MESON_PIN(GPIOZ_11),
	MESON_PIN(GPIOZ_12),

	MESON_PIN(GPIO_TEST_N),
};

/* BANK E func1 */
static const unsigned int i2c0_sda_pins[]		= { GPIOE_0 };
static const unsigned int i2c0_scl_pins[]		= { GPIOE_1 };

/* BANK E func2 */
static const unsigned int uart_b_tx_e_pins[]		= { GPIOE_0 };
static const unsigned int uart_b_rx_e_pins[]		= { GPIOE_1 };

/* BANK E func3 */
static const unsigned int pwm_h_pins[]			= { GPIOE_0 };
static const unsigned int pwm_j_pins[]			= { GPIOE_1 };

/* BANK B func1 */
static const unsigned int emmc_nand_d0_pins[]		= { GPIOB_0 };
static const unsigned int emmc_nand_d1_pins[]		= { GPIOB_1 };
static const unsigned int emmc_nand_d2_pins[]		= { GPIOB_2 };
static const unsigned int emmc_nand_d3_pins[]		= { GPIOB_3 };
static const unsigned int emmc_nand_d4_pins[]		= { GPIOB_4 };
static const unsigned int emmc_nand_d5_pins[]		= { GPIOB_5 };
static const unsigned int emmc_nand_d6_pins[]		= { GPIOB_6 };
static const unsigned int emmc_nand_d7_pins[]		= { GPIOB_7 };
static const unsigned int emmc_clk_pins[]		= { GPIOB_8 };
static const unsigned int emmc_rst_pins[]		= { GPIOB_9 };
static const unsigned int emmc_cmd_pins[]		= { GPIOB_10 };
static const unsigned int emmc_nand_ds_pins[]		= { GPIOB_11 };

/* Bank B func2 */
static const unsigned int nand_wen_clk_pins[]		= { GPIOB_8 };
static const unsigned int nand_ale_pins[]		= { GPIOB_9 };
static const unsigned int nand_ren_wr_pins[]		= { GPIOB_10 };
static const unsigned int nand_cle_pins[]		= { GPIOB_11 };
static const unsigned int nand_ce0_pins[]		= { GPIOB_12 };

/* Bank B func3 */
static const unsigned int spif_hold_pins[]		= { GPIOB_3 };
static const unsigned int spif_mo_pins[]		= { GPIOB_4 };
static const unsigned int spif_mi_pins[]		= { GPIOB_5 };
static const unsigned int spif_clk_pins[]		= { GPIOB_6 };
static const unsigned int spif_wp_pins[]		= { GPIOB_7 };
static const unsigned int spif_cs_pins[]		= { GPIOB_13 };

/* Bank C func1 */
static const unsigned int sdcard_d0_c_pins[]		= { GPIOC_0 };
static const unsigned int sdcard_d1_c_pins[]		= { GPIOC_1 };
static const unsigned int sdcard_d2_c_pins[]		= { GPIOC_2 };
static const unsigned int sdcard_d3_c_pins[]		= { GPIOC_3 };
static const unsigned int sdcard_clk_c_pins[]		= { GPIOC_4 };
static const unsigned int sdcard_cmd_c_pins[]		= { GPIOC_5 };
static const unsigned int sdcard_cd_pins[]		= { GPIOC_6 };

/* Bank C func2 */
static const unsigned int jtag_2_tdo_pins[]		= { GPIOC_0 };
static const unsigned int jtag_2_tdi_pins[]		= { GPIOC_1 };
static const unsigned int uart_b_rx_c_pins[]		= { GPIOC_2 };
static const unsigned int uart_b_tx_c_pins[]		= { GPIOC_3 };
static const unsigned int jtag_2_clk_pins[]		= { GPIOC_4 };
static const unsigned int jtag_2_tms_pins[]		= { GPIOC_5 };
static const unsigned int i2c1_sda_c_pins[]		= { GPIOC_6 };
static const unsigned int i2c1_scl_c_pins[]		= { GPIOC_7 };

/* Bank C func3 */
static const unsigned int pdm_din1_c_pins[]		= { GPIOC_0 };
static const unsigned int pdm_din0_c_pins[]		= { GPIOC_1 };
static const unsigned int i2c4_sda_c_pins[]		= { GPIOC_2 };
static const unsigned int i2c4_scl_c_pins[]		= { GPIOC_3 };
static const unsigned int pdm_dclk_c_pins[]		= { GPIOC_4 };
static const unsigned int iso7816_clk_c_pins[]		= { GPIOC_5 };
static const unsigned int iso7816_data_c_pins[]		= { GPIOC_6 };

/* Bank C func4 */
static const unsigned int tdm_d2_c_pins[]		= { GPIOC_0 };
static const unsigned int tdm_d3_c_pins[]		= { GPIOC_1 };
static const unsigned int tdm_fs1_c_pins[]		= { GPIOC_2 };
static const unsigned int tdm_sclk1_c_pins[]		= { GPIOC_3 };
static const unsigned int mclk_1_c_pins[]		= { GPIOC_4 };
static const unsigned int tdm_d4_c_pins[]		= { GPIOC_5 };
static const unsigned int tdm_d5_c_pins[]		= { GPIOC_6 };

/* Bank D func1 */
static const unsigned int uart_b_tx_d_pins[]		= { GPIOD_0 };
static const unsigned int uart_b_rx_d_pins[]		= { GPIOD_1 };
static const unsigned int uart_b_cts_d_pins[]		= { GPIOD_2 };
static const unsigned int uart_b_rts_d_pins[]		= { GPIOD_3 };
static const unsigned int remote_out_pins[]		= { GPIOD_4 };
static const unsigned int remote_in_pins[]		= { GPIOD_5 };
static const unsigned int jtag_1_clk_pins[]		= { GPIOD_6 };
static const unsigned int jtag_1_tms_pins[]		= { GPIOD_7 };
static const unsigned int jtag_1_tdi_pins[]		= { GPIOD_8 };
static const unsigned int jtag_1_tdo_pins[]		= { GPIOD_9 };
static const unsigned int clk12_24_pins[]		= { GPIOD_10 };
static const unsigned int pwm_g_hiz_pins[]		= { GPIOD_11 };

/* Bank D func2 */
static const unsigned int i2c4_sda_d_pins[]		= { GPIOD_2 };
static const unsigned int i2c4_scl_d_pins[]		= { GPIOD_3 };
static const unsigned int mclk_1_d_pins[]		= { GPIOD_4 };
static const unsigned int tdm_sclk1_d_pins[]		= { GPIOD_6 };
static const unsigned int tdm_fs1_d_pins[]		= { GPIOD_7 };
static const unsigned int tdm_d4_d_pins[]		= { GPIOD_8 };
static const unsigned int tdm_d3_d_pins[]		= { GPIOD_9 };
static const unsigned int tdm_d2_d_pins[]		= { GPIOD_10 };
static const unsigned int pwm_g_d_pins[]		= { GPIOD_11 };

/* Bank D func3 */
static const unsigned int uart_c_tx_pins[]		= { GPIOD_2 };
static const unsigned int uart_c_rx_pins[]		= { GPIOD_3 };
static const unsigned int pwm_b_d_pins[]		= { GPIOD_4 };
static const unsigned int pwm_a_d_pins[]		= { GPIOD_6 };
static const unsigned int pwm_c_d_pins[]		= { GPIOD_7 };
static const unsigned int pwm_d_d_pins[]		= { GPIOD_8 };
static const unsigned int pwm_i_d_pins[]		= { GPIOD_9 };

/* Bank D func4 */
static const unsigned int clk_32k_in_pins[]		= { GPIOD_2 };
static const unsigned int pwm_b_hiz_pins[]		= { GPIOD_4 };
static const unsigned int pwm_a_hiz_pins[]		= { GPIOD_6 };
static const unsigned int pwm_c_hiz_pins[]		= { GPIOD_7 };
static const unsigned int pdm_dclk_d_pins[]		= { GPIOD_8 };
static const unsigned int pdm_din0_d_pins[]		= { GPIOD_9 };
static const unsigned int pdm_din1_d_pins[]		= { GPIOD_10 };

/* Bank D func5 */
static const unsigned int mic_mute_en_pins[]		= { GPIOD_2 };
static const unsigned int mic_mute_key_pins[]		= { GPIOD_3 };
static const unsigned int i2c1_sda_d_pins[]		= { GPIOD_6 };
static const unsigned int i2c1_scl_d_pins[]		= { GPIOD_7 };
static const unsigned int i2c2_sda_d_pins[]		= { GPIOD_10 };
static const unsigned int i2c2_scl_d_pins[]		= { GPIOD_11 };

/* Bank D func6 */
static const unsigned int gen_clk_d_pins[]		= { GPIOD_10 };
static const unsigned int tsin_b_clk_c_pins[]		= { GPIOD_6 };
static const unsigned int tsin_b_sop_c_pins[]		= { GPIOD_7 };
static const unsigned int tsin_b_valid_c_pins[]		= { GPIOD_8 };
static const unsigned int tsin_b_d0_c_pins[]		= { GPIOD_9 };

/* Bank H func1 */
static const unsigned int hdmitx_sda_pins[]		= { GPIOH_0 };
static const unsigned int hdmitx_sck_pins[]		= { GPIOH_1 };
static const unsigned int hdmitx_hpd_in_pins[]		= { GPIOH_2 };
static const unsigned int ao_cec_a_pins[]		= { GPIOH_3 };
static const unsigned int spdif_out_h_pins[]		= { GPIOH_4 };
static const unsigned int spdif_in_pins[]		= { GPIOH_5 };
static const unsigned int i2c1_sda_h_pins[]		= { GPIOH_6 };
static const unsigned int i2c1_scl_h_pins[]		= { GPIOH_7 };
static const unsigned int i2c2_sda_h8_pins[]		= { GPIOH_8 };
static const unsigned int i2c2_scl_h9_pins[]		= { GPIOH_9 };
static const unsigned int eth_link_led_pins[]		= { GPIOH_10 };
static const unsigned int eth_act_led_pins[]		= { GPIOH_11 };

/* Bank H func2 */
static const unsigned int i2c2_sda_h0_pins[]		= { GPIOH_0 };
static const unsigned int i2c2_scl_h1_pins[]		= { GPIOH_1 };
static const unsigned int ao_cec_b_pins[]		= { GPIOH_3 };
static const unsigned int uart_d_tx_h_pins[]		= { GPIOH_4 };
static const unsigned int uart_d_rx_h_pins[]		= { GPIOH_5 };
static const unsigned int uart_d_cts_h_pins[]		= { GPIOH_6 };
static const unsigned int uart_d_rts_h_pins[]		= { GPIOH_7 };
static const unsigned int iso7816_clk_h_pins[]		= { GPIOH_8 };
static const unsigned int iso7816_data_h_pins[]		= { GPIOH_9 };
static const unsigned int uart_e_tx_h_pins[]		= { GPIOH_10 };
static const unsigned int uart_e_rx_h_pins[]		= { GPIOH_11 };

/* Bank H func3 */
static const unsigned int pwm_d_h_pins[]		= { GPIOH_6 };
static const unsigned int pwm_i_h_pins[]		= { GPIOH_7 };
static const unsigned int pdm_dclk_h_pins[]		= { GPIOH_8 };
static const unsigned int pdm_din0_h_pins[]		= { GPIOH_9 };
static const unsigned int pdm_din1_h_pins[]		= { GPIOH_10 };

/* Bank H func4 */
static const unsigned int mclk_1_h_pins[]		= { GPIOH_4 };
static const unsigned int tdm_sclk1_h_pins[]		= { GPIOH_5 };
static const unsigned int tdm_fs1_h_pins[]		= { GPIOH_6 };
static const unsigned int tdm_d2_h_pins[]		= { GPIOH_7 };
static const unsigned int tdm_d3_h_pins[]		= { GPIOH_8 };
static const unsigned int tdm_d4_h_pins[]		= { GPIOH_9 };

/* Bank H func5 */
static const unsigned int spi_a_miso_h_pins[]		= { GPIOH_4 };
static const unsigned int spi_a_mosi_h_pins[]		= { GPIOH_5 };
static const unsigned int spi_a_clk_h_pins[]		= { GPIOH_6 };
static const unsigned int spi_a_ss0_h_pins[]		= { GPIOH_7 };

/* Bank H func6 */
static const unsigned int gen_clk_h_pins[]		= { GPIOH_11 };
static const unsigned int tsin_b1_clk_pins[]		= { GPIOH_4 };
static const unsigned int tsin_b1_sop_pins[]		= { GPIOH_5 };
static const unsigned int tsin_b1_valid_pins[]		= { GPIOH_6 };
static const unsigned int tsin_b1_d0_pins[]		= { GPIOH_7 };

/* Bank X func1 */
static const unsigned int sdio_d0_pins[]		= { GPIOX_0 };
static const unsigned int sdio_d1_pins[]		= { GPIOX_1 };
static const unsigned int sdio_d2_pins[]		= { GPIOX_2 };
static const unsigned int sdio_d3_pins[]		= { GPIOX_3 };
static const unsigned int sdio_clk_pins[]		= { GPIOX_4 };
static const unsigned int sdio_cmd_pins[]		= { GPIOX_5 };
static const unsigned int pwm_a_x_pins[]		= { GPIOX_6 };
static const unsigned int pwm_f_x_pins[]		= { GPIOX_7 };
static const unsigned int tdm_d1_pins[]			= { GPIOX_8 };
static const unsigned int tdm_d0_pins[]			= { GPIOX_9 };
static const unsigned int tdm_fs0_pins[]		= { GPIOX_10 };
static const unsigned int tdm_sclk0_pins[]		= { GPIOX_11 };
static const unsigned int uart_a_tx_pins[]		= { GPIOX_12 };
static const unsigned int uart_a_rx_pins[]		= { GPIOX_13 };
static const unsigned int uart_a_cts_pins[]		= { GPIOX_14 };
static const unsigned int uart_a_rts_pins[]		= { GPIOX_15 };
static const unsigned int pwm_e_x_pins[]		= { GPIOX_16 };
static const unsigned int i2c1_sda_x_pins[]		= { GPIOX_17 };
static const unsigned int i2c1_scl_x_pins[]		= { GPIOX_18 };
static const unsigned int pwm_b_x_pins[]		= { GPIOX_19 };

/* Bank X func2 */
static const unsigned int pdm_din0_x_pins[]		= { GPIOX_8 };
static const unsigned int pdm_din1_x_pins[]		= { GPIOX_9 };
static const unsigned int pdm_dclk_x_pins[]		= { GPIOX_11 };

/* Bank X func3 */
static const unsigned int spi_a_mosi_x_pins[]		= { GPIOX_8 };
static const unsigned int spi_a_miso_x_pins[]		= { GPIOX_9 };
static const unsigned int spi_a_ss0_x_pins[]		= { GPIOX_10 };
static const unsigned int spi_a_clk_x_pins[]		= { GPIOX_11 };

/* Bank X func4 */
static const unsigned int pwm_c_x_pins[]		= { GPIOX_8 };
static const unsigned int i2c_slave_scl_pins[]		= { GPIOX_10 };
static const unsigned int i2c_slave_sda_pins[]		= { GPIOX_11 };

/* Bank X func5 */
static const unsigned int i2c3_sda_x_pins[]		= { GPIOX_10 };
static const unsigned int i2c3_scl_x_pins[]		= { GPIOX_11 };

/* Bank Z func1 */
static const unsigned int tdm_fs2_pins[]		= { GPIOZ_0 };
static const unsigned int tdm_sclk2_pins[]		= { GPIOZ_1 };
static const unsigned int tdm_d4_z_pins[]		= { GPIOZ_2 };
static const unsigned int tdm_d5_z_pins[]		= { GPIOZ_3 };
static const unsigned int tdm_d6_pins[]			= { GPIOZ_4 };
static const unsigned int tdm_d7_pins[]			= { GPIOZ_5 };
static const unsigned int mclk_2_pins[]			= { GPIOZ_6 };
static const unsigned int spdif_out_z_pins[]		= { GPIOZ_9 };
static const unsigned int dtv_a_if_agc_z10_pins[]	= { GPIOZ_10 };
static const unsigned int uart_e_tx_z11_pins[]		= { GPIOZ_11 };
static const unsigned int uart_e_rx_z12_pins[]		= { GPIOZ_12 };

/* Bank Z func2 */
static const unsigned int tsin_a_clk_pins[]		= { GPIOZ_0 };
static const unsigned int tsin_a_sop_pins[]		= { GPIOZ_1 };
static const unsigned int tsin_a_valid_pins[]		= { GPIOZ_2 };
static const unsigned int tsin_a_din0_pins[]		= { GPIOZ_3 };
static const unsigned int dtv_a_if_agc_z6_pins[]	= { GPIOZ_6 };
static const unsigned int dtv_b_if_agc_pins[]		= { GPIOZ_7 };
static const unsigned int i2c3_sda_z_pins[]		= { GPIOZ_8 };
static const unsigned int i2c3_scl_z_pins[]		= { GPIOZ_9 };
static const unsigned int dtv_a_rf_agc_pins[]		= { GPIOZ_10 };
static const unsigned int dtv_b_rf_agc_pins[]		= { GPIOZ_11 };

/* Bank Z func3 */
static const unsigned int sdcard_d0_z_pins[]		= { GPIOZ_0 };
static const unsigned int sdcard_d1_z_pins[]		= { GPIOZ_1 };
static const unsigned int sdcard_d2_z_pins[]		= { GPIOZ_2 };
static const unsigned int sdcard_d3_z_pins[]		= { GPIOZ_3 };
static const unsigned int sdcard_clk_z_pins[]		= { GPIOZ_4 };
static const unsigned int sdcard_cmd_z_pins[]		= { GPIOZ_5 };
static const unsigned int uart_e_tx_z8_pins[]		= { GPIOZ_8 };
static const unsigned int uart_e_rx_z9_pins[]		= { GPIOZ_9 };
static const unsigned int pdm_din1_z_pins[]		= { GPIOZ_10 };
static const unsigned int pdm_din0_z_pins[]		= { GPIOZ_11 };
static const unsigned int pdm_dclk_z_pins[]		= { GPIOZ_12 };

/* Bank Z func4 */
static const unsigned int spi_a_miso_z_pins[]		= { GPIOZ_0 };
static const unsigned int spi_a_mosi_z_pins[]		= { GPIOZ_1 };
static const unsigned int spi_a_clk_z_pins[]		= { GPIOZ_2 };
static const unsigned int spi_a_ss0_z_pins[]		= { GPIOZ_3 };
static const unsigned int spi_a_ss1_z_pins[]		= { GPIOZ_4 };
static const unsigned int spi_a_ss2_z_pins[]		= { GPIOZ_5 };
static const unsigned int i2c4_scl_z_pins[]		= { GPIOZ_11 };
static const unsigned int i2c4_sda_z_pins[]		= { GPIOZ_12 };

/* Bank Z func5 */
static const unsigned int uart_d_tx_z_pins[]		= { GPIOZ_0 };
static const unsigned int uart_d_rx_z_pins[]		= { GPIOZ_1 };
static const unsigned int uart_d_cts_z_pins[]		= { GPIOZ_2 };
static const unsigned int uart_d_rts_z_pins[]		= { GPIOZ_3 };
static const unsigned int pwm_g_z_pins[]		= { GPIOZ_4 };
static const unsigned int pwm_f_z_pins[]		= { GPIOZ_5 };
static const unsigned int pwm_e_z_pins[]		= { GPIOZ_6 };
static const unsigned int tsin_b_clk_z_pins[]		= { GPIOZ_7 };
static const unsigned int tsin_b_sop_z_pins[]		= { GPIOZ_10 };
static const unsigned int tsin_b_valid_z_pins[]		= { GPIOZ_11 };
static const unsigned int tsin_b_d0_z_pins[]		= { GPIOZ_12 };

/* Bank Z func6 */
static const unsigned int s2_demod_gpio7_pins[]		= { GPIOZ_0 };
static const unsigned int s2_demod_gpio6_pins[]		= { GPIOZ_1 };
static const unsigned int s2_demod_gpio5_pins[]		= { GPIOZ_2 };
static const unsigned int s2_demod_gpio4_pins[]		= { GPIOZ_3 };
static const unsigned int s2_demod_gpio3_pins[]		= { GPIOZ_4 };
static const unsigned int s2_demod_gpio2_pins[]		= { GPIOZ_5 };
static const unsigned int diseqc_out_pins[]		= { GPIOZ_7 };
static const unsigned int s2_demod_gpio1_pins[]		= { GPIOZ_8 };
static const unsigned int s2_demod_gpio0_pins[]		= { GPIOZ_12 };

/* Bank Z func7 */
static const unsigned int gen_clk_z9_pins[]		= { GPIOZ_9 };
static const unsigned int gen_clk_z12_pins[]		= { GPIOZ_12 };

static struct meson_pmx_group meson_s4_periphs_groups[] = {
	GPIO_GROUP(GPIOE_0),
	GPIO_GROUP(GPIOE_1),

	GPIO_GROUP(GPIOB_0),
	GPIO_GROUP(GPIOB_1),
	GPIO_GROUP(GPIOB_2),
	GPIO_GROUP(GPIOB_3),
	GPIO_GROUP(GPIOB_4),
	GPIO_GROUP(GPIOB_5),
	GPIO_GROUP(GPIOB_6),
	GPIO_GROUP(GPIOB_7),
	GPIO_GROUP(GPIOB_8),
	GPIO_GROUP(GPIOB_9),
	GPIO_GROUP(GPIOB_10),
	GPIO_GROUP(GPIOB_11),
	GPIO_GROUP(GPIOB_12),
	GPIO_GROUP(GPIOB_13),

	GPIO_GROUP(GPIOC_0),
	GPIO_GROUP(GPIOC_1),
	GPIO_GROUP(GPIOC_2),
	GPIO_GROUP(GPIOC_3),
	GPIO_GROUP(GPIOC_4),
	GPIO_GROUP(GPIOC_5),
	GPIO_GROUP(GPIOC_6),
	GPIO_GROUP(GPIOC_7),

	GPIO_GROUP(GPIOD_0),
	GPIO_GROUP(GPIOD_1),
	GPIO_GROUP(GPIOD_2),
	GPIO_GROUP(GPIOD_3),
	GPIO_GROUP(GPIOD_4),
	GPIO_GROUP(GPIOD_5),
	GPIO_GROUP(GPIOD_6),
	GPIO_GROUP(GPIOD_7),
	GPIO_GROUP(GPIOD_8),
	GPIO_GROUP(GPIOD_9),
	GPIO_GROUP(GPIOD_10),
	GPIO_GROUP(GPIOD_11),

	GPIO_GROUP(GPIOH_0),
	GPIO_GROUP(GPIOH_1),
	GPIO_GROUP(GPIOH_2),
	GPIO_GROUP(GPIOH_3),
	GPIO_GROUP(GPIOH_4),
	GPIO_GROUP(GPIOH_5),
	GPIO_GROUP(GPIOH_6),
	GPIO_GROUP(GPIOH_7),
	GPIO_GROUP(GPIOH_8),
	GPIO_GROUP(GPIOH_9),
	GPIO_GROUP(GPIOH_10),
	GPIO_GROUP(GPIOH_11),

	GPIO_GROUP(GPIOX_0),
	GPIO_GROUP(GPIOX_1),
	GPIO_GROUP(GPIOX_2),
	GPIO_GROUP(GPIOX_3),
	GPIO_GROUP(GPIOX_4),
	GPIO_GROUP(GPIOX_5),
	GPIO_GROUP(GPIOX_6),
	GPIO_GROUP(GPIOX_7),
	GPIO_GROUP(GPIOX_8),
	GPIO_GROUP(GPIOX_9),
	GPIO_GROUP(GPIOX_10),
	GPIO_GROUP(GPIOX_11),
	GPIO_GROUP(GPIOX_12),
	GPIO_GROUP(GPIOX_13),
	GPIO_GROUP(GPIOX_14),
	GPIO_GROUP(GPIOX_15),
	GPIO_GROUP(GPIOX_16),
	GPIO_GROUP(GPIOX_17),
	GPIO_GROUP(GPIOX_18),
	GPIO_GROUP(GPIOX_19),

	GPIO_GROUP(GPIOZ_0),
	GPIO_GROUP(GPIOZ_1),
	GPIO_GROUP(GPIOZ_2),
	GPIO_GROUP(GPIOZ_3),
	GPIO_GROUP(GPIOZ_4),
	GPIO_GROUP(GPIOZ_5),
	GPIO_GROUP(GPIOZ_6),
	GPIO_GROUP(GPIOZ_7),
	GPIO_GROUP(GPIOZ_8),
	GPIO_GROUP(GPIOZ_9),
	GPIO_GROUP(GPIOZ_10),
	GPIO_GROUP(GPIOZ_11),
	GPIO_GROUP(GPIOZ_12),

	GPIO_GROUP(GPIO_TEST_N),

	/* BANK E func1 */
	GROUP(i2c0_sda,			1),
	GROUP(i2c0_scl,			1),

	/* BANK E func2 */
	GROUP(uart_b_tx_e,		2),
	GROUP(uart_b_rx_e,		2),

	/* BANK E func3 */
	GROUP(pwm_h,			3),
	GROUP(pwm_j,			3),

	/* BANK B func1 */
	GROUP(emmc_nand_d0,		1),
	GROUP(emmc_nand_d1,		1),
	GROUP(emmc_nand_d2,		1),
	GROUP(emmc_nand_d3,		1),
	GROUP(emmc_nand_d4,		1),
	GROUP(emmc_nand_d5,		1),
	GROUP(emmc_nand_d6,		1),
	GROUP(emmc_nand_d7,		1),
	GROUP(emmc_clk,			1),
	GROUP(emmc_rst,			1),
	GROUP(emmc_cmd,			1),
	GROUP(emmc_nand_ds,		1),

	/* Bank B func2 */
	GROUP(nand_wen_clk,		2),
	GROUP(nand_ale,			2),
	GROUP(nand_ren_wr,		2),
	GROUP(nand_cle,			2),
	GROUP(nand_ce0,			2),

	/* Bank B func3 */
	GROUP(spif_hold,		3),
	GROUP(spif_mo,			3),
	GROUP(spif_mi,			3),
	GROUP(spif_clk,			3),
	GROUP(spif_wp,			3),
	GROUP(spif_cs,			3),

	/* Bank C func1 */
	GROUP(sdcard_d0_c,		1),
	GROUP(sdcard_d1_c,		1),
	GROUP(sdcard_d2_c,		1),
	GROUP(sdcard_d3_c,		1),
	GROUP(sdcard_clk_c,		1),
	GROUP(sdcard_cmd_c,		1),
	GROUP(sdcard_cd,		1),

	/* Bank C func2 */
	GROUP(jtag_2_tdo,		2),
	GROUP(jtag_2_tdi,		2),
	GROUP(uart_b_rx_c,		2),
	GROUP(uart_b_tx_c,		2),
	GROUP(jtag_2_clk,		2),
	GROUP(jtag_2_tms,		2),
	GROUP(i2c1_sda_c,		2),
	GROUP(i2c1_scl_c,		2),

	/* Bank C func3 */
	GROUP(pdm_din1_c,		3),
	GROUP(pdm_din0_c,		3),
	GROUP(i2c4_sda_c,		3),
	GROUP(i2c4_scl_c,		3),
	GROUP(pdm_dclk_c,		3),
	GROUP(iso7816_clk_c,		3),
	GROUP(iso7816_data_c,		3),

	/* Bank C func4 */
	GROUP(tdm_d2_c,			4),
	GROUP(tdm_d3_c,			4),
	GROUP(tdm_fs1_c,		4),
	GROUP(tdm_sclk1_c,		4),
	GROUP(mclk_1_c,			4),
	GROUP(tdm_d4_c,			4),
	GROUP(tdm_d5_c,			4),

	/* Bank D func1 */
	GROUP(uart_b_tx_d,		1),
	GROUP(uart_b_rx_d,		1),
	GROUP(uart_b_cts_d,		1),
	GROUP(uart_b_rts_d,		1),
	GROUP(remote_out,		1),
	GROUP(remote_in,		1),
	GROUP(jtag_1_clk,		1),
	GROUP(jtag_1_tms,		1),
	GROUP(jtag_1_tdi,		1),
	GROUP(jtag_1_tdo,		1),
	GROUP(clk12_24,			1),
	GROUP(pwm_g_hiz,		1),

	/* Bank D func2 */
	GROUP(i2c4_sda_d,		2),
	GROUP(i2c4_scl_d,		2),
	GROUP(mclk_1_d,			2),
	GROUP(tdm_sclk1_d,		2),
	GROUP(tdm_fs1_d,		2),
	GROUP(tdm_d4_d,			2),
	GROUP(tdm_d3_d,			2),
	GROUP(tdm_d2_d,			2),
	GROUP(pwm_g_d,			2),

	/* Bank D func3 */
	GROUP(uart_c_tx,		3),
	GROUP(uart_c_rx,		3),
	GROUP(pwm_b_d,			3),
	GROUP(pwm_a_d,			3),
	GROUP(pwm_c_d,			3),
	GROUP(pwm_d_d,			3),
	GROUP(pwm_i_d,			3),

	/* Bank D func4 */
	GROUP(clk_32k_in,		4),
	GROUP(pwm_b_hiz,		4),
	GROUP(pwm_a_hiz,		4),
	GROUP(pwm_c_hiz,		4),
	GROUP(pdm_dclk_d,		4),
	GROUP(pdm_din0_d,		4),
	GROUP(pdm_din1_d,		4),

	/* Bank D func5 */
	GROUP(mic_mute_en,		5),
	GROUP(mic_mute_key,		5),
	GROUP(i2c1_sda_d,		5),
	GROUP(i2c1_scl_d,		5),
	GROUP(i2c2_sda_d,		5),
	GROUP(i2c2_scl_d,		5),

	/* Bank D func6 */
	GROUP(gen_clk_d,		6),
	GROUP(tsin_b_clk_c,		6),
	GROUP(tsin_b_sop_c,		6),
	GROUP(tsin_b_valid_c,		6),
	GROUP(tsin_b_d0_c,		6),

	/* Bank H func1 */
	GROUP(hdmitx_sda,		1),
	GROUP(hdmitx_sck,		1),
	GROUP(hdmitx_hpd_in,		1),
	GROUP(ao_cec_a,			1),
	GROUP(spdif_out_h,		1),
	GROUP(spdif_in,			1),
	GROUP(i2c1_sda_h,		1),
	GROUP(i2c1_scl_h,		1),
	GROUP(i2c2_sda_h8,		1),
	GROUP(i2c2_scl_h9,		1),
	GROUP(eth_link_led,		1),
	GROUP(eth_act_led,		1),

	/* Bank H func2 */
	GROUP(i2c2_sda_h0,		2),
	GROUP(i2c2_scl_h1,		2),
	GROUP(ao_cec_b,			2),
	GROUP(uart_d_tx_h,		2),
	GROUP(uart_d_rx_h,		2),
	GROUP(uart_d_cts_h,		2),
	GROUP(uart_d_rts_h,		2),
	GROUP(iso7816_clk_h,		2),
	GROUP(iso7816_data_h,		2),
	GROUP(uart_e_tx_h,		2),
	GROUP(uart_e_rx_h,		2),

	/* Bank H func3 */
	GROUP(pwm_d_h,			3),
	GROUP(pwm_i_h,			3),
	GROUP(pdm_dclk_h,		3),
	GROUP(pdm_din0_h,		3),
	GROUP(pdm_din1_h,		3),

	/* Bank H func4 */
	GROUP(mclk_1_h,			4),
	GROUP(tdm_sclk1_h,		4),
	GROUP(tdm_fs1_h,		4),
	GROUP(tdm_d2_h,			4),
	GROUP(tdm_d3_h,			4),
	GROUP(tdm_d4_h,			4),

	/* Bank H func5 */
	GROUP(spi_a_miso_h,		5),
	GROUP(spi_a_mosi_h,		5),
	GROUP(spi_a_clk_h,		5),
	GROUP(spi_a_ss0_h,		5),

	/* Bank H func6 */
	GROUP(gen_clk_h,		6),
	GROUP(tsin_b1_clk,		6),
	GROUP(tsin_b1_sop,		6),
	GROUP(tsin_b1_valid,		6),
	GROUP(tsin_b1_d0,		6),

	/* Bank X func1 */
	GROUP(sdio_d0,			1),
	GROUP(sdio_d1,			1),
	GROUP(sdio_d2,			1),
	GROUP(sdio_d3,			1),
	GROUP(sdio_clk,			1),
	GROUP(sdio_cmd,			1),
	GROUP(pwm_a_x,			1),
	GROUP(pwm_f_x,			1),
	GROUP(tdm_d1,			1),
	GROUP(tdm_d0,			1),
	GROUP(tdm_fs0,			1),
	GROUP(tdm_sclk0,		1),
	GROUP(uart_a_tx,		1),
	GROUP(uart_a_rx,		1),
	GROUP(uart_a_cts,		1),
	GROUP(uart_a_rts,		1),
	GROUP(pwm_e_x,			1),
	GROUP(i2c1_sda_x,		1),
	GROUP(i2c1_scl_x,		1),
	GROUP(pwm_b_x,			1),

	/* Bank X func2 */
	GROUP(pdm_din0_x,		2),
	GROUP(pdm_din1_x,		2),
	GROUP(pdm_dclk_x,		2),

	/* Bank X func3 */
	GROUP(spi_a_mosi_x,		3),
	GROUP(spi_a_miso_x,		3),
	GROUP(spi_a_ss0_x,		3),
	GROUP(spi_a_clk_x,		3),

	/* Bank X func4 */
	GROUP(pwm_c_x,			4),
	GROUP(i2c_slave_scl,		4),
	GROUP(i2c_slave_sda,		4),

	/* Bank X func5 */
	GROUP(i2c3_sda_x,		5),
	GROUP(i2c3_scl_x,		5),

	/* Bank Z func1 */
	GROUP(tdm_fs2,			1),
	GROUP(tdm_sclk2,		1),
	GROUP(tdm_d4_z,			1),
	GROUP(tdm_d5_z,			1),
	GROUP(tdm_d6,			1),
	GROUP(tdm_d7,			1),
	GROUP(mclk_2,			1),
	GROUP(spdif_out_z,		1),
	GROUP(dtv_a_if_agc_z10,		1),
	GROUP(uart_e_tx_z11,		1),
	GROUP(uart_e_rx_z12,		1),

	/* Bank Z func2 */
	GROUP(tsin_a_clk,		2),
	GROUP(tsin_a_sop,		2),
	GROUP(tsin_a_valid,		2),
	GROUP(tsin_a_din0,		2),
	GROUP(dtv_a_if_agc_z6,		2),
	GROUP(dtv_b_if_agc,		2),
	GROUP(i2c3_sda_z,		2),
	GROUP(i2c3_scl_z,		2),
	GROUP(dtv_a_rf_agc,		2),
	GROUP(dtv_b_rf_agc,		2),

	/* Bank Z func3 */
	GROUP(sdcard_d0_z,		3),
	GROUP(sdcard_d1_z,		3),
	GROUP(sdcard_d2_z,		3),
	GROUP(sdcard_d3_z,		3),
	GROUP(sdcard_clk_z,		3),
	GROUP(sdcard_cmd_z,		3),
	GROUP(uart_e_tx_z8,		3),
	GROUP(uart_e_rx_z9,		3),
	GROUP(pdm_din1_z,		3),
	GROUP(pdm_din0_z,		3),
	GROUP(pdm_dclk_z,		3),

	/* Bank Z func4 */
	GROUP(spi_a_miso_z,		4),
	GROUP(spi_a_mosi_z,		4),
	GROUP(spi_a_clk_z,		4),
	GROUP(spi_a_ss0_z,		4),
	GROUP(spi_a_ss1_z,		4),
	GROUP(spi_a_ss2_z,		4),
	GROUP(i2c4_scl_z,		4),
	GROUP(i2c4_sda_z,		4),

	/* Bank Z func5 */
	GROUP(uart_d_tx_z,		5),
	GROUP(uart_d_rx_z,		5),
	GROUP(uart_d_cts_z,		5),
	GROUP(uart_d_rts_z,		5),
	GROUP(pwm_g_z,			5),
	GROUP(pwm_f_z,			5),
	GROUP(pwm_e_z,			5),
	GROUP(tsin_b_clk_z,		5),
	GROUP(tsin_b_sop_z,		5),
	GROUP(tsin_b_valid_z,		5),
	GROUP(tsin_b_d0_z,		5),

	/* Bank Z func6 */
	GROUP(s2_demod_gpio7,		6),
	GROUP(s2_demod_gpio6,		6),
	GROUP(s2_demod_gpio5,		6),
	GROUP(s2_demod_gpio4,		6),
	GROUP(s2_demod_gpio3,		6),
	GROUP(s2_demod_gpio2,		6),
	GROUP(diseqc_out,		6),
	GROUP(s2_demod_gpio1,		6),
	GROUP(s2_demod_gpio0,		6),

	/* Bank Z func7 */
	GROUP(gen_clk_z9,		7),
	GROUP(gen_clk_z12,		7),
};

static const char * const gpio_periphs_groups[] = {
	"GPIOE_0", "GPIOE_1",

	"GPIOB_0", "GPIOB_1", "GPIOB_2", "GPIOB_3", "GPIOB_4", "GPIOB_5",
	"GPIOB_6", "GPIOB_7", "GPIOB_8", "GPIOB_9", "GPIOB_10", "GPIOB_11",
	"GPIOB_12", "GPIOB_13",

	"GPIOC_0", "GPIOC_1", "GPIOC_2", "GPIOC_3", "GPIOC_4", "GPIOC_5",
	"GPIOC_6", "GPIOC_7",

	"GPIOD_0", "GPIOD_1", "GPIOD_2", "GPIOD_3", "GPIOD_4", "GPIOD_5",
	"GPIOD_6", "GPIOD_7", "GPIOD_8", "GPIOD_9", "GPIOD_10", "GPIOD_11",

	"GPIOH_0", "GPIOH_1", "GPIOH_2", "GPIOH_3", "GPIOH_4", "GPIOH_5",
	"GPIOH_6", "GPIOH_7", "GPIOH_8", "GPIOH_9", "GPIOH_10", "GPIOH_11",

	"GPIOX_0", "GPIOX_1", "GPIOX_2", "GPIOX_3", "GPIOX_4", "GPIOX_5",
	"GPIOX_6", "GPIOX_7", "GPIOX_8", "GPIOX_9", "GPIOX_10", "GPIOX_11",
	"GPIOX_12", "GPIOX_13", "GPIOX_14", "GPIOX_15", "GPIOX_16", "GPIOX_17",
	"GPIOX_18", "GPIOX_19",

	"GPIOZ_0", "GPIOZ_1", "GPIOZ_2", "GPIOZ_3", "GPIOZ_4", "GPIOZ_5",
	"GPIOZ_6", "GPIOZ_7", "GPIOZ_8", "GPIOZ_9", "GPIOZ_10",
	"GPIOZ_11", "GPIOZ_12",

	"GPIO_TEST_N",
};

static const char * const i2c0_groups[] = {
	"i2c0_sda", "i2c0_scl",
};

static const char * const i2c1_groups[] = {
	"i2c1_sda_c", "i2c1_scl_c",
	"i2c1_sda_d", "i2c1_scl_d",
	"i2c1_sda_h", "i2c1_scl_h",
	"i2c1_sda_x", "i2c1_scl_x",
};

static const char * const i2c2_groups[] = {
	"i2c2_sda_d", "i2c2_scl_d",
	"i2c2_sda_h8", "i2c2_scl_h9",
	"i2c2_sda_h0", "i2c2_scl_h1l,"
};

static const char * const i2c3_groups[] = {
	"i2c3_sda_x", "i2c3_scl_x",
	"i2c3_sda_z", "i2c3_scl_z",
};

static const char * const i2c4_groups[] = {
	"i2c4_sda_c", "i2c4_scl_c",
	"i2c4_sda_d", "i2c4_scl_d",
	"i2c4_scl_z", "i2c4_sda_z",
};

static const char * const uart_a_groups[] = {
	"uart_a_tx", "uart_a_rx", "uart_a_cts", "uart_a_rts",
};

static const char * const uart_b_groups[] = {
	"uart_b_tx_e", "uart_b_rx_e", "uart_b_rx_c", "uart_b_tx_c",
	"uart_b_tx_d", "uart_b_rx_d", "uart_b_cts_d", "uart_b_rts_d",
};

static const char * const uart_c_groups[] = {
	"uart_c_tx", "uart_c_rx",
};

static const char * const uart_d_groups[] = {
	"uart_d_tx_h", "uart_d_rx_h", "uart_d_cts_h", "uart_d_rts_h",
	"uart_d_tx_z", "uart_d_rx_z", "uart_d_cts_z", "uart_d_rts_z",
};

static const char * const uart_e_groups[] = {
	"uart_e_tx_h", "uart_e_rx_h", "uart_e_tx_z11", "uart_e_rx_z12",
	"uart_e_tx_z8", "uart_e_rx_z9",
};

static const char * const emmc_groups[] = {
	"emmc_nand_d0", "emmc_nand_d1", "emmc_nand_d2", "emmc_nand_d3",
	"emmc_nand_d4", "emmc_nand_d5", "emmc_nand_d6", "emmc_nand_d7",
	"emmc_clk", "emmc_rst", "emmc_cmd", "emmc_nand_ds",
};

static const char * const nand_groups[] = {
	"emmc_nand_d0", "emmc_nand_d1", "emmc_nand_d2", "emmc_nand_d3",
	"emmc_nand_d4", "emmc_nand_d5", "emmc_nand_d6", "emmc_nand_d7",
	"nand_wen_clk", "nand_ale", "nand_ren_wr", "nand_cle", "nand_ce0",
};

static const char * const spif_groups[] = {
	"spif_hold", "spif_mo", "spif_mi", "spif_clk", "spif_wp",
	"spif_cs",
};

static const char * const sdcard_groups[] = {
	"sdcard_d0_c", "sdcard_d1_c", "sdcard_d2_c", "sdcard_d3_c",
	"sdcard_clk_c", "sdcard_cmd_c", "sdcard_cd",
	"sdcard_d0_z", "sdcard_d1_z", "sdcard_d2_z", "sdcard_d3_z",
	"sdcard_clk_z", "sdcard_cmd_z",
};

static const char * const jtag_1_groups[] = {
	"jtag_1_clk", "jtag_1_tms", "jtag_1_tdi", "jtag_1_tdo",
};

static const char * const jtag_2_groups[] = {
	"jtag_2_tdo", "jtag_2_tdi", "jtag_2_clk", "jtag_2_tms",
};

static const char * const pdm_groups[] = {
	"pdm_din1_c", "pdm_din0_c", "pdm_dclk_c",
	"pdm_dclk_d", "pdm_din0_d", "pdm_din1_d",
	"pdm_dclk_h", "pdm_din0_h", "pdm_din1_h",
	"pdm_din0_x", "pdm_din1_x", "pdm_dclk_x",
	"pdm_din1_z", "pdm_din0_z", "pdm_dclk_z",
};

static const char * const iso7816_groups[] = {
	"iso7816_clk_c", "iso7816_data_c",
	"iso7816_clk_h", "iso7816_data_h",
};

static const char * const tdm_groups[] = {
	"tdm_d2_c", "tdm_d3_c", "tdm_fs1_c", "tdm_d4_c", "tdm_d5_c", "tdm_sclk1_c",
	"tdm_fs1_d", "tdm_d4_d", "tdm_d3_d", "tdm_d2_d", "tdm_sclk1_d",
	"tdm_sclk1_h", "tdm_fs1_h", "tdm_d2_h", "tdm_d3_h", "tdm_d4_h",
	"tdm_d1", "tdm_d0", "tdm_fs0", "tdm_sclk0", "tdm_fs2", "tdm_sclk2",
	"tdm_d4_z", "tdm_d5_z", "tdm_d6", "tdm_d7",
};

static const char * const mclk_1_groups[] = {
	"mclk_1_c", "mclk_1_d", "mclk_1_h", "mclk_2",
};

static const char * const mclk_2_groups[] = {
	"mclk_2",
};

static const char * const remote_out_groups[] = {
	"remote_out",
};

static const char * const remote_in_groups[] = {
	"remote_in",
};

static const char * const clk12_24_groups[] = {
	"clk12_24",
};

static const char * const clk_32k_in_groups[] = {
	"clk_32k_in",
};

static const char * const pwm_a_hiz_groups[] = {
	"pwm_a_hiz",
};

static const char * const pwm_b_hiz_groups[] = {
	"pwm_b_hiz",
};

static const char * const pwm_c_hiz_groups[] = {
	"pwm_c_hiz",
};

static const char * const pwm_g_hiz_groups[] = {
	"pwm_g_hiz",
};

static const char * const pwm_a_groups[] = {
	"pwm_a_d",
};

static const char * const pwm_b_groups[] = {
	"pwm_b_d", "pwm_b_x",
};

static const char * const pwm_c_groups[] = {
	"pwm_c_d", "pwm_c_x",
};

static const char * const pwm_d_groups[] = {
	"pwm_d_d", "pwm_d_h",
};

static const char * const pwm_e_groups[] = {
	"pwm_e_x", "pwm_e_z",
};

static const char * const pwm_f_groups[] = {
	"pwm_f_x", "pwm_f_z",
};

static const char * const pwm_g_groups[] = {
	"pwm_g_d", "pwm_g_z",
};

static const char * const pwm_h_groups[] = {
	"pwm_h",
};

static const char * const pwm_i_groups[] = {
	"pwm_i_d", "pwm_i_h"
};

static const char * const pwm_j_groups[] = {
	"pwm_j",
};

static const char * const mic_mute_groups[] = {
	"mic_mute_en", "mic_mute_key",
};

static const char * const hdmitx_groups[] = {
	"hdmitx_sda", "hdmitx_sck", "hdmitx_hpd_in",
};

static const char * const ao_cec_a_groups[] = {
	"ao_cec_a",
};

static const char * const ao_cec_b_groups[] = {
	"ao_cec_b",
};

static const char * const spdif_out_groups[] = {
	"spdif_out_h", "spdif_out_z",
};

static const char * const spdif_in_groups[] = {
	"spdif_in",
};

static const char * const eth_groups[] = {
	"eth_link_led", "eth_act_led",
};

static const char * const spi_a_groups[] = {
	"spi_a_miso_h", "spi_a_mosi_h", "spi_a_clk_h", "spi_a_ss0_h",

	"spi_a_mosi_x", "spi_a_miso_x", "spi_a_ss0_x", "spi_a_clk_x",

	"spi_a_miso_z", "spi_a_mosi_z", "spi_a_clk_z", "spi_a_ss0_z",
	"spi_a_ss1_z", "spi_a_ss2_z",
};

static const char * const gen_clk_groups[] = {
	"gen_clk_h", "gen_clk_z9", "gen_clk_z12",
};

static const char * const sdio_groups[] = {
	"sdio_d0", "sdio_d1", "sdio_d2", "sdio_d3", "sdio_clk", "sdio_cmd",
};

static const char * const i2c_slave_groups[] = {
	"i2c_slave_scl", "i2c_slave_sda",
};

static const char * const dtv_groups[] = {
	"dtv_a_if_agc_z10", "dtv_a_if_agc_z6", "dtv_b_if_agc",
	"dtv_a_rf_agc", "dtv_b_rf_agc",
};

static const char * const tsin_a_groups[] = {
	"tsin_a_clk", "tsin_a_sop", "tsin_a_valid", "tsin_a_din0",
};

static const char * const tsin_b_groups[] = {
	"tsin_b_clk_c", "tsin_b_sop_c", "tsin_b_valid_c", "tsin_b_d0_c",
	"tsin_b_clk_z", "tsin_b_sop_z", "tsin_b_valid_z", "tsin_b_d0_z",
};

static const char * const tsin_b1_groups[] = {
	"tsin_b1_clk", "tsin_b1_sop", "tsin_b1_valid", "tsin_b1_d0",
};

static const char * const diseqc_out_groups[] = {
	"diseqc_out",
};

static const char * const s2_demod_groups[] = {
	"s2_demod_gpio7", "s2_demod_gpio6", "s2_demod_gpio5", "s2_demod_gpio4",
	"s2_demod_gpio3", "s2_demod_gpio2", "s2_demod_gpio1", "s2_demod_gpio0",
};

static struct meson_pmx_func meson_s4_periphs_functions[] = {
	FUNCTION(gpio_periphs),
	FUNCTION(i2c0),
	FUNCTION(i2c1),
	FUNCTION(i2c2),
	FUNCTION(i2c3),
	FUNCTION(i2c4),
	FUNCTION(uart_a),
	FUNCTION(uart_b),
	FUNCTION(uart_c),
	FUNCTION(uart_d),
	FUNCTION(uart_e),
	FUNCTION(emmc),
	FUNCTION(nand),
	FUNCTION(spif),
	FUNCTION(sdcard),
	FUNCTION(jtag_1),
	FUNCTION(jtag_2),
	FUNCTION(pdm),
	FUNCTION(iso7816),
	FUNCTION(tdm),
	FUNCTION(mclk_1),
	FUNCTION(mclk_2),
	FUNCTION(remote_out),
	FUNCTION(remote_in),
	FUNCTION(clk12_24),
	FUNCTION(clk_32k_in),
	FUNCTION(pwm_a_hiz),
	FUNCTION(pwm_b_hiz),
	FUNCTION(pwm_c_hiz),
	FUNCTION(pwm_g_hiz),
	FUNCTION(pwm_a),
	FUNCTION(pwm_b),
	FUNCTION(pwm_c),
	FUNCTION(pwm_d),
	FUNCTION(pwm_e),
	FUNCTION(pwm_f),
	FUNCTION(pwm_g),
	FUNCTION(pwm_h),
	FUNCTION(pwm_i),
	FUNCTION(pwm_j),
	FUNCTION(mic_mute),
	FUNCTION(hdmitx),
	FUNCTION(ao_cec_a),
	FUNCTION(ao_cec_b),
	FUNCTION(spdif_out),
	FUNCTION(spdif_in),
	FUNCTION(eth),
	FUNCTION(spi_a),
	FUNCTION(gen_clk),
	FUNCTION(sdio),
	FUNCTION(i2c_slave),
	FUNCTION(dtv),
	FUNCTION(tsin_a),
	FUNCTION(tsin_b),
	FUNCTION(tsin_b1),
	FUNCTION(diseqc_out),
	FUNCTION(s2_demod),
};

static struct meson_bank meson_s4_periphs_banks[] = {
	/* name  first  last  irq  pullen  pull  dir  out  in */
	BANK_DS("B", GPIOB_0,    GPIOB_13,  0, 13,
		0x63,  0,  0x64,  0,  0x62, 0,  0x61, 0,  0x60, 0, 0x67, 0),
	BANK_DS("C", GPIOC_0,    GPIOC_7,   14, 21,
		0x53,  0,  0x54,  0,  0x52, 0,  0x51, 0,  0x50, 0, 0x57, 0),
	BANK_DS("E", GPIOE_0,    GPIOE_1,   22, 23,
		0x43,  0,  0x44,  0,  0x42, 0,  0x41, 0,  0x40, 0, 0x47, 0),
	BANK_DS("D", GPIOD_0,    GPIOD_11,  24, 35,
		0x33,  0,  0x34,  0,  0x32, 0,  0x31, 0,  0x30, 0, 0x37, 0),
	BANK_DS("H", GPIOH_0,    GPIOH_11,  36, 47,
		0x23,  0,  0x24,  0,  0x22, 0,  0x21, 0,  0x20, 0, 0x27, 0),
	BANK_DS("X", GPIOX_0,    GPIOX_19,   48, 67,
		0x13,  0,  0x14,  0,  0x12, 0,  0x11, 0,  0x10, 0, 0x17, 0),
	BANK_DS("Z", GPIOZ_0,    GPIOZ_12,  68, 80,
		0x03,  0,  0x04,  0,  0x02, 0,  0x01, 0,  0x00, 0, 0x07, 0),
	BANK_DS("TEST_N", GPIO_TEST_N,    GPIO_TEST_N,   -1, -1,
		0x83,  0,  0x84,  0,  0x82, 0,  0x81,  0, 0x80, 0, 0x87, 0),
};

static struct meson_pmx_bank meson_s4_periphs_pmx_banks[] = {
	/*name	            first	 lask        reg offset*/
	BANK_PMX("B",      GPIOB_0,     GPIOB_13,    0x00, 0),
	BANK_PMX("C",      GPIOC_0,     GPIOC_7,     0x9,  0),
	BANK_PMX("E",      GPIOE_0,     GPIOE_1,     0x12, 0),
	BANK_PMX("D",      GPIOD_0,     GPIOD_11,    0x10, 0),
	BANK_PMX("H",      GPIOH_0,     GPIOH_11,    0xb,  0),
	BANK_PMX("X",      GPIOX_0,     GPIOX_19,    0x3,  0),
	BANK_PMX("Z",      GPIOZ_0,     GPIOZ_12,    0x6,  0),
	BANK_PMX("TEST_N", GPIO_TEST_N, GPIO_TEST_N, 0xf,  0)
};

static struct meson_axg_pmx_data meson_s4_periphs_pmx_banks_data = {
	.pmx_banks	= meson_s4_periphs_pmx_banks,
	.num_pmx_banks	= ARRAY_SIZE(meson_s4_periphs_pmx_banks),
};

static struct meson_pinctrl_data meson_s4_periphs_pinctrl_data = {
	.name		= "periphs-banks",
	.pins		= meson_s4_periphs_pins,
	.groups		= meson_s4_periphs_groups,
	.funcs		= meson_s4_periphs_functions,
	.banks		= meson_s4_periphs_banks,
	.num_pins	= ARRAY_SIZE(meson_s4_periphs_pins),
	.num_groups	= ARRAY_SIZE(meson_s4_periphs_groups),
	.num_funcs	= ARRAY_SIZE(meson_s4_periphs_functions),
	.num_banks	= ARRAY_SIZE(meson_s4_periphs_banks),
	.pmx_ops	= &meson_axg_pmx_ops,
	.pmx_data	= &meson_s4_periphs_pmx_banks_data,
	.parse_dt	= &meson_a1_parse_dt_extra,
};

static const struct of_device_id meson_s4_pinctrl_dt_match[] = {
	{
		.compatible = "amlogic,meson-s4-periphs-pinctrl",
		.data = &meson_s4_periphs_pinctrl_data,
	},
	{ }
};
MODULE_DEVICE_TABLE(of, meson_s4_pinctrl_dt_match);

static struct platform_driver meson_s4_pinctrl_driver = {
	.probe  = meson_pinctrl_probe,
	.driver = {
		.name	= "meson-s4-pinctrl",
		.of_match_table = meson_s4_pinctrl_dt_match,
	},
};
module_platform_driver(meson_s4_pinctrl_driver);

MODULE_LICENSE("Dual BSD/GPL");