xref: /linux/drivers/pinctrl/qcom/pinctrl-ipq5332.c (revision 34dc1baba215b826e454b8d19e4f24adbeb7d00d)
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2 /*
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  */
5 
6 #include <linux/module.h>
7 #include <linux/of.h>
8 #include <linux/platform_device.h>
9 
10 #include "pinctrl-msm.h"
11 
12 #define REG_SIZE 0x1000
13 #define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9)	\
14 	{					        \
15 		.grp = PINCTRL_PINGROUP("gpio" #id, 	\
16 			gpio##id##_pins, 		\
17 			ARRAY_SIZE(gpio##id##_pins)),	\
18 		.funcs = (int[]){			\
19 			msm_mux_gpio, /* gpio mode */	\
20 			msm_mux_##f1,			\
21 			msm_mux_##f2,			\
22 			msm_mux_##f3,			\
23 			msm_mux_##f4,			\
24 			msm_mux_##f5,			\
25 			msm_mux_##f6,			\
26 			msm_mux_##f7,			\
27 			msm_mux_##f8,			\
28 			msm_mux_##f9			\
29 		},				        \
30 		.nfuncs = 10,				\
31 		.ctl_reg = REG_SIZE * id,		\
32 		.io_reg = 0x4 + REG_SIZE * id,		\
33 		.intr_cfg_reg = 0x8 + REG_SIZE * id,		\
34 		.intr_status_reg = 0xc + REG_SIZE * id,	\
35 		.intr_target_reg = 0x8 + REG_SIZE * id,	\
36 		.mux_bit = 2,			\
37 		.pull_bit = 0,			\
38 		.drv_bit = 6,			\
39 		.oe_bit = 9,			\
40 		.in_bit = 0,			\
41 		.out_bit = 1,			\
42 		.intr_enable_bit = 0,		\
43 		.intr_status_bit = 0,		\
44 		.intr_target_bit = 5,		\
45 		.intr_target_kpss_val = 3,	\
46 		.intr_raw_status_bit = 4,	\
47 		.intr_polarity_bit = 1,		\
48 		.intr_detection_bit = 2,	\
49 		.intr_detection_width = 2,	\
50 	}
51 
52 static const struct pinctrl_pin_desc ipq5332_pins[] = {
53 	PINCTRL_PIN(0, "GPIO_0"),
54 	PINCTRL_PIN(1, "GPIO_1"),
55 	PINCTRL_PIN(2, "GPIO_2"),
56 	PINCTRL_PIN(3, "GPIO_3"),
57 	PINCTRL_PIN(4, "GPIO_4"),
58 	PINCTRL_PIN(5, "GPIO_5"),
59 	PINCTRL_PIN(6, "GPIO_6"),
60 	PINCTRL_PIN(7, "GPIO_7"),
61 	PINCTRL_PIN(8, "GPIO_8"),
62 	PINCTRL_PIN(9, "GPIO_9"),
63 	PINCTRL_PIN(10, "GPIO_10"),
64 	PINCTRL_PIN(11, "GPIO_11"),
65 	PINCTRL_PIN(12, "GPIO_12"),
66 	PINCTRL_PIN(13, "GPIO_13"),
67 	PINCTRL_PIN(14, "GPIO_14"),
68 	PINCTRL_PIN(15, "GPIO_15"),
69 	PINCTRL_PIN(16, "GPIO_16"),
70 	PINCTRL_PIN(17, "GPIO_17"),
71 	PINCTRL_PIN(18, "GPIO_18"),
72 	PINCTRL_PIN(19, "GPIO_19"),
73 	PINCTRL_PIN(20, "GPIO_20"),
74 	PINCTRL_PIN(21, "GPIO_21"),
75 	PINCTRL_PIN(22, "GPIO_22"),
76 	PINCTRL_PIN(23, "GPIO_23"),
77 	PINCTRL_PIN(24, "GPIO_24"),
78 	PINCTRL_PIN(25, "GPIO_25"),
79 	PINCTRL_PIN(26, "GPIO_26"),
80 	PINCTRL_PIN(27, "GPIO_27"),
81 	PINCTRL_PIN(28, "GPIO_28"),
82 	PINCTRL_PIN(29, "GPIO_29"),
83 	PINCTRL_PIN(30, "GPIO_30"),
84 	PINCTRL_PIN(31, "GPIO_31"),
85 	PINCTRL_PIN(32, "GPIO_32"),
86 	PINCTRL_PIN(33, "GPIO_33"),
87 	PINCTRL_PIN(34, "GPIO_34"),
88 	PINCTRL_PIN(35, "GPIO_35"),
89 	PINCTRL_PIN(36, "GPIO_36"),
90 	PINCTRL_PIN(37, "GPIO_37"),
91 	PINCTRL_PIN(38, "GPIO_38"),
92 	PINCTRL_PIN(39, "GPIO_39"),
93 	PINCTRL_PIN(40, "GPIO_40"),
94 	PINCTRL_PIN(41, "GPIO_41"),
95 	PINCTRL_PIN(42, "GPIO_42"),
96 	PINCTRL_PIN(43, "GPIO_43"),
97 	PINCTRL_PIN(44, "GPIO_44"),
98 	PINCTRL_PIN(45, "GPIO_45"),
99 	PINCTRL_PIN(46, "GPIO_46"),
100 	PINCTRL_PIN(47, "GPIO_47"),
101 	PINCTRL_PIN(48, "GPIO_48"),
102 	PINCTRL_PIN(49, "GPIO_49"),
103 	PINCTRL_PIN(50, "GPIO_50"),
104 	PINCTRL_PIN(51, "GPIO_51"),
105 	PINCTRL_PIN(52, "GPIO_52"),
106 };
107 
108 #define DECLARE_MSM_GPIO_PINS(pin) \
109 	static const unsigned int gpio##pin##_pins[] = { pin }
110 DECLARE_MSM_GPIO_PINS(0);
111 DECLARE_MSM_GPIO_PINS(1);
112 DECLARE_MSM_GPIO_PINS(2);
113 DECLARE_MSM_GPIO_PINS(3);
114 DECLARE_MSM_GPIO_PINS(4);
115 DECLARE_MSM_GPIO_PINS(5);
116 DECLARE_MSM_GPIO_PINS(6);
117 DECLARE_MSM_GPIO_PINS(7);
118 DECLARE_MSM_GPIO_PINS(8);
119 DECLARE_MSM_GPIO_PINS(9);
120 DECLARE_MSM_GPIO_PINS(10);
121 DECLARE_MSM_GPIO_PINS(11);
122 DECLARE_MSM_GPIO_PINS(12);
123 DECLARE_MSM_GPIO_PINS(13);
124 DECLARE_MSM_GPIO_PINS(14);
125 DECLARE_MSM_GPIO_PINS(15);
126 DECLARE_MSM_GPIO_PINS(16);
127 DECLARE_MSM_GPIO_PINS(17);
128 DECLARE_MSM_GPIO_PINS(18);
129 DECLARE_MSM_GPIO_PINS(19);
130 DECLARE_MSM_GPIO_PINS(20);
131 DECLARE_MSM_GPIO_PINS(21);
132 DECLARE_MSM_GPIO_PINS(22);
133 DECLARE_MSM_GPIO_PINS(23);
134 DECLARE_MSM_GPIO_PINS(24);
135 DECLARE_MSM_GPIO_PINS(25);
136 DECLARE_MSM_GPIO_PINS(26);
137 DECLARE_MSM_GPIO_PINS(27);
138 DECLARE_MSM_GPIO_PINS(28);
139 DECLARE_MSM_GPIO_PINS(29);
140 DECLARE_MSM_GPIO_PINS(30);
141 DECLARE_MSM_GPIO_PINS(31);
142 DECLARE_MSM_GPIO_PINS(32);
143 DECLARE_MSM_GPIO_PINS(33);
144 DECLARE_MSM_GPIO_PINS(34);
145 DECLARE_MSM_GPIO_PINS(35);
146 DECLARE_MSM_GPIO_PINS(36);
147 DECLARE_MSM_GPIO_PINS(37);
148 DECLARE_MSM_GPIO_PINS(38);
149 DECLARE_MSM_GPIO_PINS(39);
150 DECLARE_MSM_GPIO_PINS(40);
151 DECLARE_MSM_GPIO_PINS(41);
152 DECLARE_MSM_GPIO_PINS(42);
153 DECLARE_MSM_GPIO_PINS(43);
154 DECLARE_MSM_GPIO_PINS(44);
155 DECLARE_MSM_GPIO_PINS(45);
156 DECLARE_MSM_GPIO_PINS(46);
157 DECLARE_MSM_GPIO_PINS(47);
158 DECLARE_MSM_GPIO_PINS(48);
159 DECLARE_MSM_GPIO_PINS(49);
160 DECLARE_MSM_GPIO_PINS(50);
161 DECLARE_MSM_GPIO_PINS(51);
162 DECLARE_MSM_GPIO_PINS(52);
163 
164 enum ipq5332_functions {
165 	msm_mux_atest_char,
166 	msm_mux_atest_char0,
167 	msm_mux_atest_char1,
168 	msm_mux_atest_char2,
169 	msm_mux_atest_char3,
170 	msm_mux_atest_tic,
171 	msm_mux_audio_pri,
172 	msm_mux_audio_pri0,
173 	msm_mux_audio_pri1,
174 	msm_mux_audio_sec,
175 	msm_mux_audio_sec0,
176 	msm_mux_audio_sec1,
177 	msm_mux_blsp0_i2c,
178 	msm_mux_blsp0_spi,
179 	msm_mux_blsp0_uart0,
180 	msm_mux_blsp0_uart1,
181 	msm_mux_blsp1_i2c0,
182 	msm_mux_blsp1_i2c1,
183 	msm_mux_blsp1_spi0,
184 	msm_mux_blsp1_spi1,
185 	msm_mux_blsp1_uart0,
186 	msm_mux_blsp1_uart1,
187 	msm_mux_blsp1_uart2,
188 	msm_mux_blsp2_i2c0,
189 	msm_mux_blsp2_i2c1,
190 	msm_mux_blsp2_spi,
191 	msm_mux_blsp2_spi0,
192 	msm_mux_blsp2_spi1,
193 	msm_mux_core_voltage,
194 	msm_mux_cri_trng0,
195 	msm_mux_cri_trng1,
196 	msm_mux_cri_trng2,
197 	msm_mux_cri_trng3,
198 	msm_mux_cxc_clk,
199 	msm_mux_cxc_data,
200 	msm_mux_dbg_out,
201 	msm_mux_gcc_plltest,
202 	msm_mux_gcc_tlmm,
203 	msm_mux_gpio,
204 	msm_mux_lock_det,
205 	msm_mux_mac0,
206 	msm_mux_mac1,
207 	msm_mux_mdc0,
208 	msm_mux_mdc1,
209 	msm_mux_mdio0,
210 	msm_mux_mdio1,
211 	msm_mux_pc,
212 	msm_mux_pcie0_clk,
213 	msm_mux_pcie0_wake,
214 	msm_mux_pcie1_clk,
215 	msm_mux_pcie1_wake,
216 	msm_mux_pcie2_clk,
217 	msm_mux_pcie2_wake,
218 	msm_mux_pll_test,
219 	msm_mux_prng_rosc0,
220 	msm_mux_prng_rosc1,
221 	msm_mux_prng_rosc2,
222 	msm_mux_prng_rosc3,
223 	msm_mux_pta,
224 	msm_mux_pwm0,
225 	msm_mux_pwm1,
226 	msm_mux_pwm2,
227 	msm_mux_pwm3,
228 	msm_mux_qdss_cti_trig_in_a0,
229 	msm_mux_qdss_cti_trig_in_a1,
230 	msm_mux_qdss_cti_trig_in_b0,
231 	msm_mux_qdss_cti_trig_in_b1,
232 	msm_mux_qdss_cti_trig_out_a0,
233 	msm_mux_qdss_cti_trig_out_a1,
234 	msm_mux_qdss_cti_trig_out_b0,
235 	msm_mux_qdss_cti_trig_out_b1,
236 	msm_mux_qdss_traceclk_a,
237 	msm_mux_qdss_traceclk_b,
238 	msm_mux_qdss_tracectl_a,
239 	msm_mux_qdss_tracectl_b,
240 	msm_mux_qdss_tracedata_a,
241 	msm_mux_qdss_tracedata_b,
242 	msm_mux_qspi_data,
243 	msm_mux_qspi_clk,
244 	msm_mux_qspi_cs,
245 	msm_mux_resout,
246 	msm_mux_rx0,
247 	msm_mux_rx1,
248 	msm_mux_sdc_data,
249 	msm_mux_sdc_clk,
250 	msm_mux_sdc_cmd,
251 	msm_mux_tsens_max,
252 	msm_mux_wci_txd,
253 	msm_mux_wci_rxd,
254 	msm_mux_wsi_clk,
255 	msm_mux_wsi_clk3,
256 	msm_mux_wsi_data,
257 	msm_mux_wsi_data3,
258 	msm_mux_wsis_reset,
259 	msm_mux_xfem,
260 	msm_mux__,
261 };
262 
263 static const char * const gpio_groups[] = {
264 	"gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
265 	"gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
266 	"gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
267 	"gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
268 	"gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
269 	"gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
270 	"gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
271 	"gpio50", "gpio51", "gpio52",
272 };
273 
274 static const char * const atest_char_groups[] = {
275 	"gpio46",
276 };
277 
278 static const char * const atest_char0_groups[] = {
279 	"gpio0",
280 };
281 
282 static const char * const atest_char1_groups[] = {
283 	"gpio1",
284 };
285 
286 static const char * const atest_char2_groups[] = {
287 	"gpio2",
288 };
289 
290 static const char * const atest_char3_groups[] = {
291 	"gpio3",
292 };
293 
294 static const char * const atest_tic_groups[] = {
295 	"gpio9",
296 };
297 
298 static const char * const audio_pri_groups[] = {
299 	"gpio29", "gpio30", "gpio31", "gpio32",
300 };
301 
302 static const char * const audio_pri0_groups[] = {
303 	"gpio34", "gpio34",
304 };
305 
306 static const char * const audio_pri1_groups[] = {
307 	"gpio43", "gpio43",
308 };
309 
310 static const char * const audio_sec_groups[] = {
311 	"gpio33", "gpio34", "gpio35", "gpio36",
312 };
313 
314 static const char * const audio_sec0_groups[] = {
315 	"gpio30", "gpio30",
316 };
317 
318 static const char * const audio_sec1_groups[] = {
319 	"gpio45", "gpio45",
320 };
321 
322 static const char * const blsp0_i2c_groups[] = {
323 	"gpio16", "gpio17",
324 };
325 
326 static const char * const blsp0_spi_groups[] = {
327 	"gpio14", "gpio15", "gpio16", "gpio17",
328 };
329 
330 static const char * const blsp0_uart0_groups[] = {
331 	"gpio18", "gpio19",
332 };
333 
334 static const char * const blsp0_uart1_groups[] = {
335 	"gpio27", "gpio28",
336 };
337 
338 static const char * const blsp1_i2c0_groups[] = {
339 	"gpio29", "gpio30",
340 };
341 
342 static const char * const blsp1_i2c1_groups[] = {
343 	"gpio40", "gpio41",
344 };
345 
346 static const char * const blsp1_spi0_groups[] = {
347 	"gpio29", "gpio30", "gpio31", "gpio32",
348 };
349 
350 static const char * const blsp1_spi1_groups[] = {
351 	"gpio25", "gpio26", "gpio27", "gpio28",
352 };
353 
354 static const char * const blsp1_uart0_groups[] = {
355 	"gpio14", "gpio15", "gpio16", "gpio17",
356 };
357 
358 static const char * const blsp1_uart1_groups[] = {
359 	"gpio25", "gpio26", "gpio27", "gpio28",
360 };
361 
362 static const char * const blsp1_uart2_groups[] = {
363 	"gpio33", "gpio34", "gpio35", "gpio36",
364 };
365 
366 static const char * const blsp2_i2c0_groups[] = {
367 	"gpio43", "gpio45",
368 };
369 
370 static const char * const blsp2_i2c1_groups[] = {
371 	"gpio33", "gpio34",
372 };
373 
374 static const char * const blsp2_spi_groups[] = {
375 	"gpio37",
376 };
377 
378 static const char * const blsp2_spi0_groups[] = {
379 	"gpio33", "gpio34", "gpio35", "gpio36",
380 };
381 
382 static const char * const blsp2_spi1_groups[] = {
383 	"gpio40", "gpio41", "gpio42", "gpio52",
384 };
385 
386 static const char * const core_voltage_groups[] = {
387 	"gpio21", "gpio23",
388 };
389 
390 static const char * const cri_trng0_groups[] = {
391 	"gpio17",
392 };
393 
394 static const char * const cri_trng1_groups[] = {
395 	"gpio18",
396 };
397 
398 static const char * const cri_trng2_groups[] = {
399 	"gpio19",
400 };
401 
402 static const char * const cri_trng3_groups[] = {
403 	"gpio20",
404 };
405 
406 static const char * const cxc_clk_groups[] = {
407 	"gpio49",
408 };
409 
410 static const char * const cxc_data_groups[] = {
411 	"gpio50",
412 };
413 
414 static const char * const dbg_out_groups[] = {
415 	"gpio48",
416 };
417 
418 static const char * const gcc_plltest_groups[] = {
419 	"gpio43", "gpio45",
420 };
421 
422 static const char * const gcc_tlmm_groups[] = {
423 	"gpio44",
424 };
425 
426 static const char * const lock_det_groups[] = {
427 	"gpio51",
428 };
429 
430 static const char * const mac0_groups[] = {
431 	"gpio18",
432 };
433 
434 static const char * const mac1_groups[] = {
435 	"gpio19",
436 };
437 
438 static const char * const mdc0_groups[] = {
439 	"gpio25",
440 };
441 
442 static const char * const mdc1_groups[] = {
443 	"gpio27",
444 };
445 
446 static const char * const mdio0_groups[] = {
447 	"gpio26",
448 };
449 
450 static const char * const mdio1_groups[] = {
451 	"gpio28",
452 };
453 
454 static const char * const pc_groups[] = {
455 	"gpio35",
456 };
457 
458 static const char * const pcie0_clk_groups[] = {
459 	"gpio37",
460 };
461 
462 static const char * const pcie0_wake_groups[] = {
463 	"gpio39",
464 };
465 
466 static const char * const pcie1_clk_groups[] = {
467 	"gpio46",
468 };
469 
470 static const char * const pcie1_wake_groups[] = {
471 	"gpio48",
472 };
473 
474 static const char * const pcie2_clk_groups[] = {
475 	"gpio43",
476 };
477 
478 static const char * const pcie2_wake_groups[] = {
479 	"gpio45",
480 };
481 
482 static const char * const pll_test_groups[] = {
483 	"gpio49",
484 };
485 
486 static const char * const prng_rosc0_groups[] = {
487 	"gpio22",
488 };
489 
490 static const char * const prng_rosc1_groups[] = {
491 	"gpio24",
492 };
493 
494 static const char * const prng_rosc2_groups[] = {
495 	"gpio25",
496 };
497 
498 static const char * const prng_rosc3_groups[] = {
499 	"gpio26",
500 };
501 
502 static const char * const pta_groups[] = {
503 	"gpio49", "gpio50", "gpio51",
504 };
505 
506 static const char * const pwm0_groups[] = {
507 	"gpio43", "gpio44", "gpio45", "gpio46",
508 };
509 
510 static const char * const pwm1_groups[] = {
511 	"gpio29", "gpio30", "gpio31", "gpio32",
512 };
513 
514 static const char * const pwm2_groups[] = {
515 	"gpio25", "gpio26", "gpio27", "gpio28",
516 };
517 
518 static const char * const pwm3_groups[] = {
519 	"gpio8", "gpio9", "gpio10", "gpio11",
520 };
521 
522 static const char * const qdss_cti_trig_in_a0_groups[] = {
523 	"gpio5",
524 };
525 
526 static const char * const qdss_cti_trig_in_a1_groups[] = {
527 	"gpio7",
528 };
529 
530 static const char * const qdss_cti_trig_in_b0_groups[] = {
531 	"gpio47",
532 };
533 
534 static const char * const qdss_cti_trig_in_b1_groups[] = {
535 	"gpio49",
536 };
537 
538 static const char * const qdss_cti_trig_out_a0_groups[] = {
539 	"gpio4",
540 };
541 
542 static const char * const qdss_cti_trig_out_a1_groups[] = {
543 	"gpio6",
544 };
545 
546 static const char * const qdss_cti_trig_out_b0_groups[] = {
547 	"gpio46",
548 };
549 
550 static const char * const qdss_cti_trig_out_b1_groups[] = {
551 	"gpio48",
552 };
553 
554 static const char * const qdss_traceclk_a_groups[] = {
555 	"gpio8",
556 };
557 
558 static const char * const qdss_traceclk_b_groups[] = {
559 	"gpio45",
560 };
561 
562 static const char * const qdss_tracectl_a_groups[] = {
563 	"gpio9",
564 };
565 
566 static const char * const qdss_tracectl_b_groups[] = {
567 	"gpio44",
568 };
569 
570 static const char * const qdss_tracedata_a_groups[] = {
571 	"gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15", "gpio16",
572 	"gpio17", "gpio18", "gpio19", "gpio20", "gpio22", "gpio24", "gpio25",
573 	"gpio26", "gpio27",
574 };
575 
576 static const char * const qdss_tracedata_b_groups[] = {
577 	"gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
578 	"gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
579 	"gpio43", "gpio52",
580 };
581 
582 static const char * const qspi_clk_groups[] = {
583 	"gpio13",
584 };
585 
586 static const char * const qspi_cs_groups[] = {
587 	"gpio12",
588 };
589 
590 static const char * const qspi_data_groups[] = {
591 	"gpio8", "gpio9", "gpio10", "gpio11",
592 };
593 
594 static const char * const resout_groups[] = {
595 	"gpio20",
596 };
597 
598 static const char * const rx0_groups[] = {
599 	"gpio48",
600 };
601 
602 static const char * const rx1_groups[] = {
603 	"gpio45",
604 };
605 
606 static const char * const sdc_clk_groups[] = {
607 	"gpio13",
608 };
609 
610 static const char * const sdc_cmd_groups[] = {
611 	"gpio12",
612 };
613 
614 static const char * const sdc_data_groups[] = {
615 	"gpio8", "gpio9", "gpio10", "gpio11",
616 };
617 
618 static const char * const tsens_max_groups[] = {
619 	"gpio28",
620 };
621 
622 static const char * const wci_txd_groups[] = {
623 	"gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
624 	"gpio36", "gpio43", "gpio45",
625 };
626 
627 static const char * const wci_rxd_groups[] = {
628 	"gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
629 	"gpio35", "gpio36", "gpio43", "gpio45",
630 };
631 
632 static const char * const wsi_clk_groups[] = {
633 	"gpio40", "gpio42",
634 };
635 
636 static const char * const wsi_clk3_groups[] = {
637 	"gpio43",
638 };
639 
640 static const char * const wsi_data_groups[] = {
641 	"gpio41", "gpio52",
642 };
643 
644 static const char * const wsi_data3_groups[] = {
645 	"gpio44",
646 };
647 
648 static const char * const wsis_reset_groups[] = {
649 	"gpio41",
650 };
651 
652 static const char * const xfem_groups[] = {
653 	"gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
654 };
655 
656 static const struct pinfunction ipq5332_functions[] = {
657 	MSM_PIN_FUNCTION(atest_char),
658 	MSM_PIN_FUNCTION(atest_char0),
659 	MSM_PIN_FUNCTION(atest_char1),
660 	MSM_PIN_FUNCTION(atest_char2),
661 	MSM_PIN_FUNCTION(atest_char3),
662 	MSM_PIN_FUNCTION(atest_tic),
663 	MSM_PIN_FUNCTION(audio_pri),
664 	MSM_PIN_FUNCTION(audio_pri0),
665 	MSM_PIN_FUNCTION(audio_pri1),
666 	MSM_PIN_FUNCTION(audio_sec),
667 	MSM_PIN_FUNCTION(audio_sec0),
668 	MSM_PIN_FUNCTION(audio_sec1),
669 	MSM_PIN_FUNCTION(blsp0_i2c),
670 	MSM_PIN_FUNCTION(blsp0_spi),
671 	MSM_PIN_FUNCTION(blsp0_uart0),
672 	MSM_PIN_FUNCTION(blsp0_uart1),
673 	MSM_PIN_FUNCTION(blsp1_i2c0),
674 	MSM_PIN_FUNCTION(blsp1_i2c1),
675 	MSM_PIN_FUNCTION(blsp1_spi0),
676 	MSM_PIN_FUNCTION(blsp1_spi1),
677 	MSM_PIN_FUNCTION(blsp1_uart0),
678 	MSM_PIN_FUNCTION(blsp1_uart1),
679 	MSM_PIN_FUNCTION(blsp1_uart2),
680 	MSM_PIN_FUNCTION(blsp2_i2c0),
681 	MSM_PIN_FUNCTION(blsp2_i2c1),
682 	MSM_PIN_FUNCTION(blsp2_spi),
683 	MSM_PIN_FUNCTION(blsp2_spi0),
684 	MSM_PIN_FUNCTION(blsp2_spi1),
685 	MSM_PIN_FUNCTION(core_voltage),
686 	MSM_PIN_FUNCTION(cri_trng0),
687 	MSM_PIN_FUNCTION(cri_trng1),
688 	MSM_PIN_FUNCTION(cri_trng2),
689 	MSM_PIN_FUNCTION(cri_trng3),
690 	MSM_PIN_FUNCTION(cxc_clk),
691 	MSM_PIN_FUNCTION(cxc_data),
692 	MSM_PIN_FUNCTION(dbg_out),
693 	MSM_PIN_FUNCTION(gcc_plltest),
694 	MSM_PIN_FUNCTION(gcc_tlmm),
695 	MSM_PIN_FUNCTION(gpio),
696 	MSM_PIN_FUNCTION(lock_det),
697 	MSM_PIN_FUNCTION(mac0),
698 	MSM_PIN_FUNCTION(mac1),
699 	MSM_PIN_FUNCTION(mdc0),
700 	MSM_PIN_FUNCTION(mdc1),
701 	MSM_PIN_FUNCTION(mdio0),
702 	MSM_PIN_FUNCTION(mdio1),
703 	MSM_PIN_FUNCTION(pc),
704 	MSM_PIN_FUNCTION(pcie0_clk),
705 	MSM_PIN_FUNCTION(pcie0_wake),
706 	MSM_PIN_FUNCTION(pcie1_clk),
707 	MSM_PIN_FUNCTION(pcie1_wake),
708 	MSM_PIN_FUNCTION(pcie2_clk),
709 	MSM_PIN_FUNCTION(pcie2_wake),
710 	MSM_PIN_FUNCTION(pll_test),
711 	MSM_PIN_FUNCTION(prng_rosc0),
712 	MSM_PIN_FUNCTION(prng_rosc1),
713 	MSM_PIN_FUNCTION(prng_rosc2),
714 	MSM_PIN_FUNCTION(prng_rosc3),
715 	MSM_PIN_FUNCTION(pta),
716 	MSM_PIN_FUNCTION(pwm0),
717 	MSM_PIN_FUNCTION(pwm1),
718 	MSM_PIN_FUNCTION(pwm2),
719 	MSM_PIN_FUNCTION(pwm3),
720 	MSM_PIN_FUNCTION(qdss_cti_trig_in_a0),
721 	MSM_PIN_FUNCTION(qdss_cti_trig_in_a1),
722 	MSM_PIN_FUNCTION(qdss_cti_trig_in_b0),
723 	MSM_PIN_FUNCTION(qdss_cti_trig_in_b1),
724 	MSM_PIN_FUNCTION(qdss_cti_trig_out_a0),
725 	MSM_PIN_FUNCTION(qdss_cti_trig_out_a1),
726 	MSM_PIN_FUNCTION(qdss_cti_trig_out_b0),
727 	MSM_PIN_FUNCTION(qdss_cti_trig_out_b1),
728 	MSM_PIN_FUNCTION(qdss_traceclk_a),
729 	MSM_PIN_FUNCTION(qdss_traceclk_b),
730 	MSM_PIN_FUNCTION(qdss_tracectl_a),
731 	MSM_PIN_FUNCTION(qdss_tracectl_b),
732 	MSM_PIN_FUNCTION(qdss_tracedata_a),
733 	MSM_PIN_FUNCTION(qdss_tracedata_b),
734 	MSM_PIN_FUNCTION(qspi_data),
735 	MSM_PIN_FUNCTION(qspi_clk),
736 	MSM_PIN_FUNCTION(qspi_cs),
737 	MSM_PIN_FUNCTION(resout),
738 	MSM_PIN_FUNCTION(rx0),
739 	MSM_PIN_FUNCTION(rx1),
740 	MSM_PIN_FUNCTION(sdc_data),
741 	MSM_PIN_FUNCTION(sdc_clk),
742 	MSM_PIN_FUNCTION(sdc_cmd),
743 	MSM_PIN_FUNCTION(tsens_max),
744 	MSM_PIN_FUNCTION(wci_txd),
745 	MSM_PIN_FUNCTION(wci_rxd),
746 	MSM_PIN_FUNCTION(wsi_clk),
747 	MSM_PIN_FUNCTION(wsi_clk3),
748 	MSM_PIN_FUNCTION(wsi_data),
749 	MSM_PIN_FUNCTION(wsi_data3),
750 	MSM_PIN_FUNCTION(wsis_reset),
751 	MSM_PIN_FUNCTION(xfem),
752 };
753 
754 static const struct msm_pingroup ipq5332_groups[] = {
755 	PINGROUP(0, atest_char0, wci_txd, wci_rxd, xfem, _, _, _, _, _),
756 	PINGROUP(1, atest_char1, wci_txd, wci_rxd, xfem, _, _, _, _, _),
757 	PINGROUP(2, atest_char2, wci_txd, wci_rxd, xfem, _, _, _, _, _),
758 	PINGROUP(3, atest_char3, wci_txd, wci_rxd, xfem, _, _, _, _, _),
759 	PINGROUP(4, qdss_cti_trig_out_a0, wci_txd, wci_rxd, xfem, _, _, _, _,	 _),
760 	PINGROUP(5, qdss_cti_trig_in_a0, wci_txd, wci_rxd, xfem, _, _, _, _, _),
761 	PINGROUP(6, qdss_cti_trig_out_a1, wci_txd, wci_rxd, xfem, _, _, _, _, _),
762 	PINGROUP(7, qdss_cti_trig_in_a1, wci_txd, wci_rxd, xfem, _, _, _, _, _),
763 	PINGROUP(8, sdc_data, qspi_data, pwm3, qdss_traceclk_a, _, _, _, _, _),
764 	PINGROUP(9, sdc_data, qspi_data, pwm3, qdss_tracectl_a, _, atest_tic, _, _, _),
765 	PINGROUP(10, sdc_data, qspi_data, pwm3, qdss_tracedata_a, _, _, _, _, _),
766 	PINGROUP(11, sdc_data, qspi_data, pwm3, qdss_tracedata_a, _, _, _, _, _),
767 	PINGROUP(12, sdc_cmd, qspi_cs, qdss_tracedata_a, _, _, _, _, _, _),
768 	PINGROUP(13, sdc_clk, qspi_clk, qdss_tracedata_a, _, _, _, _, _, _),
769 	PINGROUP(14, blsp0_spi, blsp1_uart0, qdss_tracedata_a, _, _, _, _, _, _),
770 	PINGROUP(15, blsp0_spi, blsp1_uart0, qdss_tracedata_a, _, _, _, _, _, _),
771 	PINGROUP(16, blsp0_spi, blsp0_i2c, blsp1_uart0, _, qdss_tracedata_a, _, _, _, _),
772 	PINGROUP(17, blsp0_spi, blsp0_i2c, blsp1_uart0, _, cri_trng0, qdss_tracedata_a, _, _, _),
773 	PINGROUP(18, blsp0_uart0, mac0, _, cri_trng1, qdss_tracedata_a, _, _, _, _),
774 	PINGROUP(19, blsp0_uart0, mac1, _, cri_trng2, qdss_tracedata_a, _, _, _, _),
775 	PINGROUP(20, resout, _, cri_trng3, qdss_tracedata_a, _, _, _, _, _),
776 	PINGROUP(21, core_voltage, _, _, _, _, _, _, _, _),
777 	PINGROUP(22, _, prng_rosc0, qdss_tracedata_a, _, _, _, _, _, _),
778 	PINGROUP(23, core_voltage, _, _, _, _, _, _, _, _),
779 	PINGROUP(24, _, prng_rosc1, qdss_tracedata_a, _, _, _, _, _, _),
780 	PINGROUP(25, mdc0, blsp1_uart1, blsp1_spi1, pwm2, _, _, prng_rosc2, qdss_tracedata_a, _),
781 	PINGROUP(26, mdio0, blsp1_uart1, blsp1_spi1, pwm2, _, _, prng_rosc3, qdss_tracedata_a, _),
782 	PINGROUP(27, mdc1, blsp0_uart1, blsp1_uart1, blsp1_spi1, pwm2, _, _, qdss_tracedata_a, _),
783 	PINGROUP(28, mdio1, blsp0_uart1, blsp1_uart1, blsp1_spi1, pwm2, _, tsens_max, _, _),
784 	PINGROUP(29, audio_pri, blsp1_spi0, blsp1_i2c0, pwm1, _, qdss_tracedata_b, _, _, _),
785 	PINGROUP(30, audio_pri, blsp1_spi0, blsp1_i2c0, pwm1, audio_sec0, audio_sec0, _, qdss_tracedata_b, _),
786 	PINGROUP(31, audio_pri, blsp1_spi0, pwm1, _, qdss_tracedata_b, _, _, _, _),
787 	PINGROUP(32, audio_pri, blsp1_spi0, pwm1, _, qdss_tracedata_b, _, _, _, _),
788 	PINGROUP(33, audio_sec, blsp1_uart2, blsp2_i2c1, blsp2_spi0, _, qdss_tracedata_b, _, _, _),
789 	PINGROUP(34, audio_sec, blsp1_uart2, blsp2_i2c1, blsp2_spi0, audio_pri0, audio_pri0, _, qdss_tracedata_b, _),
790 	PINGROUP(35, audio_sec, blsp1_uart2, pc, wci_rxd, blsp2_spi0,  _, qdss_tracedata_b, _, _),
791 	PINGROUP(36, audio_sec, blsp1_uart2, wci_txd, wci_rxd, blsp2_spi0, _, qdss_tracedata_b, _, _),
792 	PINGROUP(37, pcie0_clk, blsp2_spi, _, qdss_tracedata_b, _, _, _, _, _),
793 	PINGROUP(38, _, qdss_tracedata_b, _, _, _, _, _, _, _),
794 	PINGROUP(39, pcie0_wake, _, qdss_tracedata_b, _, _, _, _, _, _),
795 	PINGROUP(40, wsi_clk, blsp1_i2c1, blsp2_spi1, _, _, qdss_tracedata_b, _, _, _),
796 	PINGROUP(41, wsi_data, blsp1_i2c1, blsp2_spi1, _, _, qdss_tracedata_b, _, wsis_reset, _),
797 	PINGROUP(42, wsi_clk, blsp2_spi1, _, qdss_tracedata_b, _, _, _, _, _),
798 	PINGROUP(43, pcie2_clk, wci_txd, wci_rxd, blsp2_i2c0, pwm0, audio_pri1, audio_pri1, _, gcc_plltest),
799 	PINGROUP(44, pwm0, _, gcc_tlmm, qdss_tracectl_b, _, wsi_data3, _, _, _),
800 	PINGROUP(45, pcie2_wake, wci_txd, wci_rxd, blsp2_i2c0, rx1, pwm0, audio_sec1, audio_sec1, _),
801 	PINGROUP(46, pcie1_clk, atest_char, pwm0, _, qdss_cti_trig_out_b0, _, _, _, _),
802 	PINGROUP(47, _, qdss_cti_trig_in_b0, _, _, _, _, _, _, _),
803 	PINGROUP(48, pcie1_wake, rx0, dbg_out, qdss_cti_trig_out_b1, _, _, _, _, _),
804 	PINGROUP(49, pta, cxc_clk, pll_test, _, qdss_cti_trig_in_b1, _, _, _, _),
805 	PINGROUP(50, pta, cxc_data, _, _, _, _, _, _, _),
806 	PINGROUP(51, pta, lock_det, _, _, _, _, _, _, _),
807 	PINGROUP(52, wsi_data, blsp2_spi1, _, qdss_tracedata_b, _, _, _, _, _),
808 };
809 
810 static const struct msm_pinctrl_soc_data ipq5332_pinctrl = {
811 	.pins = ipq5332_pins,
812 	.npins = ARRAY_SIZE(ipq5332_pins),
813 	.functions = ipq5332_functions,
814 	.nfunctions = ARRAY_SIZE(ipq5332_functions),
815 	.groups = ipq5332_groups,
816 	.ngroups = ARRAY_SIZE(ipq5332_groups),
817 	.ngpios = 53,
818 };
819 
820 static int ipq5332_pinctrl_probe(struct platform_device *pdev)
821 {
822 	return msm_pinctrl_probe(pdev, &ipq5332_pinctrl);
823 }
824 
825 static const struct of_device_id ipq5332_pinctrl_of_match[] = {
826 	{ .compatible = "qcom,ipq5332-tlmm", },
827 	{ },
828 };
829 MODULE_DEVICE_TABLE(of, ipq5332_pinctrl_of_match);
830 
831 static struct platform_driver ipq5332_pinctrl_driver = {
832 	.driver = {
833 		.name = "ipq5332-tlmm",
834 		.of_match_table = ipq5332_pinctrl_of_match,
835 	},
836 	.probe = ipq5332_pinctrl_probe,
837 	.remove = msm_pinctrl_remove,
838 };
839 
840 static int __init ipq5332_pinctrl_init(void)
841 {
842 	return platform_driver_register(&ipq5332_pinctrl_driver);
843 }
844 arch_initcall(ipq5332_pinctrl_init);
845 
846 static void __exit ipq5332_pinctrl_exit(void)
847 {
848 	platform_driver_unregister(&ipq5332_pinctrl_driver);
849 }
850 module_exit(ipq5332_pinctrl_exit);
851 
852 MODULE_DESCRIPTION("QTI IPQ5332 TLMM driver");
853 MODULE_LICENSE("GPL");
854