18b37e88cSNeil Armstrong /*
28b37e88cSNeil Armstrong  * Copyright (c) 2014, Sony Mobile Communications AB.
38b37e88cSNeil Armstrong  * Copyright (c) 2016 BayLibre, SAS.
48b37e88cSNeil Armstrong  * Author : Neil Armstrong <narmstrong@baylibre.com>
58b37e88cSNeil Armstrong  *
68b37e88cSNeil Armstrong  * This program is free software; you can redistribute it and/or modify
78b37e88cSNeil Armstrong  * it under the terms of the GNU General Public License version 2 and
88b37e88cSNeil Armstrong  * only version 2 as published by the Free Software Foundation.
98b37e88cSNeil Armstrong  *
108b37e88cSNeil Armstrong  * This program is distributed in the hope that it will be useful,
118b37e88cSNeil Armstrong  * but WITHOUT ANY WARRANTY; without even the implied warranty of
128b37e88cSNeil Armstrong  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
138b37e88cSNeil Armstrong  * GNU General Public License for more details.
148b37e88cSNeil Armstrong  */
158b37e88cSNeil Armstrong 
168b37e88cSNeil Armstrong #include <linux/module.h>
178b37e88cSNeil Armstrong #include <linux/of.h>
188b37e88cSNeil Armstrong #include <linux/platform_device.h>
198b37e88cSNeil Armstrong #include <linux/pinctrl/pinctrl.h>
208b37e88cSNeil Armstrong #include <linux/pinctrl/pinmux.h>
218b37e88cSNeil Armstrong 
228b37e88cSNeil Armstrong #include "pinctrl-msm.h"
238b37e88cSNeil Armstrong 
248b37e88cSNeil Armstrong static const struct pinctrl_pin_desc mdm9615_pins[] = {
258b37e88cSNeil Armstrong 	PINCTRL_PIN(0, "GPIO_0"),
268b37e88cSNeil Armstrong 	PINCTRL_PIN(1, "GPIO_1"),
278b37e88cSNeil Armstrong 	PINCTRL_PIN(2, "GPIO_2"),
288b37e88cSNeil Armstrong 	PINCTRL_PIN(3, "GPIO_3"),
298b37e88cSNeil Armstrong 	PINCTRL_PIN(4, "GPIO_4"),
308b37e88cSNeil Armstrong 	PINCTRL_PIN(5, "GPIO_5"),
318b37e88cSNeil Armstrong 	PINCTRL_PIN(6, "GPIO_6"),
328b37e88cSNeil Armstrong 	PINCTRL_PIN(7, "GPIO_7"),
338b37e88cSNeil Armstrong 	PINCTRL_PIN(8, "GPIO_8"),
348b37e88cSNeil Armstrong 	PINCTRL_PIN(9, "GPIO_9"),
358b37e88cSNeil Armstrong 	PINCTRL_PIN(10, "GPIO_10"),
368b37e88cSNeil Armstrong 	PINCTRL_PIN(11, "GPIO_11"),
378b37e88cSNeil Armstrong 	PINCTRL_PIN(12, "GPIO_12"),
388b37e88cSNeil Armstrong 	PINCTRL_PIN(13, "GPIO_13"),
398b37e88cSNeil Armstrong 	PINCTRL_PIN(14, "GPIO_14"),
408b37e88cSNeil Armstrong 	PINCTRL_PIN(15, "GPIO_15"),
418b37e88cSNeil Armstrong 	PINCTRL_PIN(16, "GPIO_16"),
428b37e88cSNeil Armstrong 	PINCTRL_PIN(17, "GPIO_17"),
438b37e88cSNeil Armstrong 	PINCTRL_PIN(18, "GPIO_18"),
448b37e88cSNeil Armstrong 	PINCTRL_PIN(19, "GPIO_19"),
458b37e88cSNeil Armstrong 	PINCTRL_PIN(20, "GPIO_20"),
468b37e88cSNeil Armstrong 	PINCTRL_PIN(21, "GPIO_21"),
478b37e88cSNeil Armstrong 	PINCTRL_PIN(22, "GPIO_22"),
488b37e88cSNeil Armstrong 	PINCTRL_PIN(23, "GPIO_23"),
498b37e88cSNeil Armstrong 	PINCTRL_PIN(24, "GPIO_24"),
508b37e88cSNeil Armstrong 	PINCTRL_PIN(25, "GPIO_25"),
518b37e88cSNeil Armstrong 	PINCTRL_PIN(26, "GPIO_26"),
528b37e88cSNeil Armstrong 	PINCTRL_PIN(27, "GPIO_27"),
538b37e88cSNeil Armstrong 	PINCTRL_PIN(28, "GPIO_28"),
548b37e88cSNeil Armstrong 	PINCTRL_PIN(29, "GPIO_29"),
558b37e88cSNeil Armstrong 	PINCTRL_PIN(30, "GPIO_30"),
568b37e88cSNeil Armstrong 	PINCTRL_PIN(31, "GPIO_31"),
578b37e88cSNeil Armstrong 	PINCTRL_PIN(32, "GPIO_32"),
588b37e88cSNeil Armstrong 	PINCTRL_PIN(33, "GPIO_33"),
598b37e88cSNeil Armstrong 	PINCTRL_PIN(34, "GPIO_34"),
608b37e88cSNeil Armstrong 	PINCTRL_PIN(35, "GPIO_35"),
618b37e88cSNeil Armstrong 	PINCTRL_PIN(36, "GPIO_36"),
628b37e88cSNeil Armstrong 	PINCTRL_PIN(37, "GPIO_37"),
638b37e88cSNeil Armstrong 	PINCTRL_PIN(38, "GPIO_38"),
648b37e88cSNeil Armstrong 	PINCTRL_PIN(39, "GPIO_39"),
658b37e88cSNeil Armstrong 	PINCTRL_PIN(40, "GPIO_40"),
668b37e88cSNeil Armstrong 	PINCTRL_PIN(41, "GPIO_41"),
678b37e88cSNeil Armstrong 	PINCTRL_PIN(42, "GPIO_42"),
688b37e88cSNeil Armstrong 	PINCTRL_PIN(43, "GPIO_43"),
698b37e88cSNeil Armstrong 	PINCTRL_PIN(44, "GPIO_44"),
708b37e88cSNeil Armstrong 	PINCTRL_PIN(45, "GPIO_45"),
718b37e88cSNeil Armstrong 	PINCTRL_PIN(46, "GPIO_46"),
728b37e88cSNeil Armstrong 	PINCTRL_PIN(47, "GPIO_47"),
738b37e88cSNeil Armstrong 	PINCTRL_PIN(48, "GPIO_48"),
748b37e88cSNeil Armstrong 	PINCTRL_PIN(49, "GPIO_49"),
758b37e88cSNeil Armstrong 	PINCTRL_PIN(50, "GPIO_50"),
768b37e88cSNeil Armstrong 	PINCTRL_PIN(51, "GPIO_51"),
778b37e88cSNeil Armstrong 	PINCTRL_PIN(52, "GPIO_52"),
788b37e88cSNeil Armstrong 	PINCTRL_PIN(53, "GPIO_53"),
798b37e88cSNeil Armstrong 	PINCTRL_PIN(54, "GPIO_54"),
808b37e88cSNeil Armstrong 	PINCTRL_PIN(55, "GPIO_55"),
818b37e88cSNeil Armstrong 	PINCTRL_PIN(56, "GPIO_56"),
828b37e88cSNeil Armstrong 	PINCTRL_PIN(57, "GPIO_57"),
838b37e88cSNeil Armstrong 	PINCTRL_PIN(58, "GPIO_58"),
848b37e88cSNeil Armstrong 	PINCTRL_PIN(59, "GPIO_59"),
858b37e88cSNeil Armstrong 	PINCTRL_PIN(60, "GPIO_60"),
868b37e88cSNeil Armstrong 	PINCTRL_PIN(61, "GPIO_61"),
878b37e88cSNeil Armstrong 	PINCTRL_PIN(62, "GPIO_62"),
888b37e88cSNeil Armstrong 	PINCTRL_PIN(63, "GPIO_63"),
898b37e88cSNeil Armstrong 	PINCTRL_PIN(64, "GPIO_64"),
908b37e88cSNeil Armstrong 	PINCTRL_PIN(65, "GPIO_65"),
918b37e88cSNeil Armstrong 	PINCTRL_PIN(66, "GPIO_66"),
928b37e88cSNeil Armstrong 	PINCTRL_PIN(67, "GPIO_67"),
938b37e88cSNeil Armstrong 	PINCTRL_PIN(68, "GPIO_68"),
948b37e88cSNeil Armstrong 	PINCTRL_PIN(69, "GPIO_69"),
958b37e88cSNeil Armstrong 	PINCTRL_PIN(70, "GPIO_70"),
968b37e88cSNeil Armstrong 	PINCTRL_PIN(71, "GPIO_71"),
978b37e88cSNeil Armstrong 	PINCTRL_PIN(72, "GPIO_72"),
988b37e88cSNeil Armstrong 	PINCTRL_PIN(73, "GPIO_73"),
998b37e88cSNeil Armstrong 	PINCTRL_PIN(74, "GPIO_74"),
1008b37e88cSNeil Armstrong 	PINCTRL_PIN(75, "GPIO_75"),
1018b37e88cSNeil Armstrong 	PINCTRL_PIN(76, "GPIO_76"),
1028b37e88cSNeil Armstrong 	PINCTRL_PIN(77, "GPIO_77"),
1038b37e88cSNeil Armstrong 	PINCTRL_PIN(78, "GPIO_78"),
1048b37e88cSNeil Armstrong 	PINCTRL_PIN(79, "GPIO_79"),
1058b37e88cSNeil Armstrong 	PINCTRL_PIN(80, "GPIO_80"),
1068b37e88cSNeil Armstrong 	PINCTRL_PIN(81, "GPIO_81"),
1078b37e88cSNeil Armstrong 	PINCTRL_PIN(82, "GPIO_82"),
1088b37e88cSNeil Armstrong 	PINCTRL_PIN(83, "GPIO_83"),
1098b37e88cSNeil Armstrong 	PINCTRL_PIN(84, "GPIO_84"),
1108b37e88cSNeil Armstrong 	PINCTRL_PIN(85, "GPIO_85"),
1118b37e88cSNeil Armstrong 	PINCTRL_PIN(86, "GPIO_86"),
1128b37e88cSNeil Armstrong 	PINCTRL_PIN(87, "GPIO_87"),
1138b37e88cSNeil Armstrong };
1148b37e88cSNeil Armstrong 
1158b37e88cSNeil Armstrong #define DECLARE_MSM_GPIO_PINS(pin) \
1168b37e88cSNeil Armstrong 	static const unsigned int gpio##pin##_pins[] = { pin }
1178b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(0);
1188b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(1);
1198b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(2);
1208b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(3);
1218b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(4);
1228b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(5);
1238b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(6);
1248b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(7);
1258b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(8);
1268b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(9);
1278b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(10);
1288b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(11);
1298b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(12);
1308b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(13);
1318b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(14);
1328b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(15);
1338b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(16);
1348b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(17);
1358b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(18);
1368b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(19);
1378b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(20);
1388b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(21);
1398b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(22);
1408b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(23);
1418b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(24);
1428b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(25);
1438b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(26);
1448b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(27);
1458b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(28);
1468b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(29);
1478b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(30);
1488b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(31);
1498b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(32);
1508b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(33);
1518b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(34);
1528b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(35);
1538b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(36);
1548b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(37);
1558b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(38);
1568b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(39);
1578b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(40);
1588b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(41);
1598b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(42);
1608b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(43);
1618b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(44);
1628b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(45);
1638b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(46);
1648b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(47);
1658b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(48);
1668b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(49);
1678b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(50);
1688b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(51);
1698b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(52);
1708b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(53);
1718b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(54);
1728b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(55);
1738b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(56);
1748b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(57);
1758b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(58);
1768b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(59);
1778b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(60);
1788b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(61);
1798b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(62);
1808b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(63);
1818b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(64);
1828b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(65);
1838b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(66);
1848b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(67);
1858b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(68);
1868b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(69);
1878b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(70);
1888b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(71);
1898b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(72);
1908b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(73);
1918b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(74);
1928b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(75);
1938b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(76);
1948b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(77);
1958b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(78);
1968b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(79);
1978b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(80);
1988b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(81);
1998b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(82);
2008b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(83);
2018b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(84);
2028b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(85);
2038b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(86);
2048b37e88cSNeil Armstrong DECLARE_MSM_GPIO_PINS(87);
2058b37e88cSNeil Armstrong 
2068b37e88cSNeil Armstrong #define FUNCTION(fname)					\
2078b37e88cSNeil Armstrong 	[MSM_MUX_##fname] = {				\
2088b37e88cSNeil Armstrong 		.name = #fname,				\
2098b37e88cSNeil Armstrong 		.groups = fname##_groups,		\
2108b37e88cSNeil Armstrong 		.ngroups = ARRAY_SIZE(fname##_groups),	\
2118b37e88cSNeil Armstrong 	}
2128b37e88cSNeil Armstrong 
2138b37e88cSNeil Armstrong #define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11) \
2148b37e88cSNeil Armstrong 	{						\
2158b37e88cSNeil Armstrong 		.name = "gpio" #id,			\
2168b37e88cSNeil Armstrong 		.pins = gpio##id##_pins,		\
2178b37e88cSNeil Armstrong 		.npins = ARRAY_SIZE(gpio##id##_pins),	\
2188b37e88cSNeil Armstrong 		.funcs = (int[]){			\
2198b37e88cSNeil Armstrong 			MSM_MUX_gpio,			\
2208b37e88cSNeil Armstrong 			MSM_MUX_##f1,			\
2218b37e88cSNeil Armstrong 			MSM_MUX_##f2,			\
2228b37e88cSNeil Armstrong 			MSM_MUX_##f3,			\
2238b37e88cSNeil Armstrong 			MSM_MUX_##f4,			\
2248b37e88cSNeil Armstrong 			MSM_MUX_##f5,			\
2258b37e88cSNeil Armstrong 			MSM_MUX_##f6,			\
2268b37e88cSNeil Armstrong 			MSM_MUX_##f7,			\
2278b37e88cSNeil Armstrong 			MSM_MUX_##f8,			\
2288b37e88cSNeil Armstrong 			MSM_MUX_##f9,			\
2298b37e88cSNeil Armstrong 			MSM_MUX_##f10,			\
2308b37e88cSNeil Armstrong 			MSM_MUX_##f11			\
2318b37e88cSNeil Armstrong 		},					\
2328b37e88cSNeil Armstrong 		.nfuncs = 12,				\
2338b37e88cSNeil Armstrong 		.ctl_reg = 0x1000 + 0x10 * id,		\
2348b37e88cSNeil Armstrong 		.io_reg = 0x1004 + 0x10 * id,		\
2358b37e88cSNeil Armstrong 		.intr_cfg_reg = 0x1008 + 0x10 * id,	\
2368b37e88cSNeil Armstrong 		.intr_status_reg = 0x100c + 0x10 * id,	\
2378b37e88cSNeil Armstrong 		.intr_target_reg = 0x400 + 0x4 * id,	\
2388b37e88cSNeil Armstrong 		.mux_bit = 2,				\
2398b37e88cSNeil Armstrong 		.pull_bit = 0,				\
2408b37e88cSNeil Armstrong 		.drv_bit = 6,				\
2418b37e88cSNeil Armstrong 		.oe_bit = 9,				\
2428b37e88cSNeil Armstrong 		.in_bit = 0,				\
2438b37e88cSNeil Armstrong 		.out_bit = 1,				\
2448b37e88cSNeil Armstrong 		.intr_enable_bit = 0,			\
2458b37e88cSNeil Armstrong 		.intr_status_bit = 0,			\
2468b37e88cSNeil Armstrong 		.intr_ack_high = 1,			\
2478b37e88cSNeil Armstrong 		.intr_target_bit = 0,			\
2488b37e88cSNeil Armstrong 		.intr_target_kpss_val = 4,		\
2498b37e88cSNeil Armstrong 		.intr_raw_status_bit = 3,		\
2508b37e88cSNeil Armstrong 		.intr_polarity_bit = 1,			\
2518b37e88cSNeil Armstrong 		.intr_detection_bit = 2,		\
2528b37e88cSNeil Armstrong 		.intr_detection_width = 1,		\
2538b37e88cSNeil Armstrong 	}
2548b37e88cSNeil Armstrong 
2558b37e88cSNeil Armstrong enum mdm9615_functions {
2568b37e88cSNeil Armstrong 	MSM_MUX_gpio,
2578b37e88cSNeil Armstrong 	MSM_MUX_gsbi2_i2c,
2588b37e88cSNeil Armstrong 	MSM_MUX_gsbi3,
2598b37e88cSNeil Armstrong 	MSM_MUX_gsbi4,
2608b37e88cSNeil Armstrong 	MSM_MUX_gsbi5_i2c,
2618b37e88cSNeil Armstrong 	MSM_MUX_gsbi5_uart,
2628b37e88cSNeil Armstrong 	MSM_MUX_sdc2,
2638b37e88cSNeil Armstrong 	MSM_MUX_ebi2_lcdc,
2648b37e88cSNeil Armstrong 	MSM_MUX_ps_hold,
2658b37e88cSNeil Armstrong 	MSM_MUX_prim_audio,
2668b37e88cSNeil Armstrong 	MSM_MUX_sec_audio,
2678b37e88cSNeil Armstrong 	MSM_MUX_cdc_mclk,
2688b37e88cSNeil Armstrong 	MSM_MUX_NA,
2698b37e88cSNeil Armstrong };
2708b37e88cSNeil Armstrong 
2718b37e88cSNeil Armstrong static const char * const gpio_groups[] = {
2728b37e88cSNeil Armstrong 	"gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
2738b37e88cSNeil Armstrong 	"gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
2748b37e88cSNeil Armstrong 	"gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
2758b37e88cSNeil Armstrong 	"gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
2768b37e88cSNeil Armstrong 	"gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
2778b37e88cSNeil Armstrong 	"gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
2788b37e88cSNeil Armstrong 	"gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
2798b37e88cSNeil Armstrong 	"gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
2808b37e88cSNeil Armstrong 	"gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
2818b37e88cSNeil Armstrong 	"gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
2828b37e88cSNeil Armstrong 	"gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
2838b37e88cSNeil Armstrong 	"gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
2848b37e88cSNeil Armstrong 	"gpio85", "gpio86", "gpio87"
2858b37e88cSNeil Armstrong };
2868b37e88cSNeil Armstrong 
2878b37e88cSNeil Armstrong static const char * const gsbi2_i2c_groups[] = {
2888b37e88cSNeil Armstrong 	"gpio4", "gpio5"
2898b37e88cSNeil Armstrong };
2908b37e88cSNeil Armstrong 
2918b37e88cSNeil Armstrong static const char * const gsbi3_groups[] = {
2928b37e88cSNeil Armstrong 	"gpio8", "gpio9", "gpio10", "gpio11"
2938b37e88cSNeil Armstrong };
2948b37e88cSNeil Armstrong 
2958b37e88cSNeil Armstrong static const char * const gsbi4_groups[] = {
2968b37e88cSNeil Armstrong 	"gpio12", "gpio13", "gpio14", "gpio15"
2978b37e88cSNeil Armstrong };
2988b37e88cSNeil Armstrong 
2998b37e88cSNeil Armstrong static const char * const gsbi5_i2c_groups[] = {
3008b37e88cSNeil Armstrong 	"gpio16", "gpio17"
3018b37e88cSNeil Armstrong };
3028b37e88cSNeil Armstrong 
3038b37e88cSNeil Armstrong static const char * const gsbi5_uart_groups[] = {
3048b37e88cSNeil Armstrong 	"gpio18", "gpio19"
3058b37e88cSNeil Armstrong };
3068b37e88cSNeil Armstrong 
3078b37e88cSNeil Armstrong static const char * const sdc2_groups[] = {
3088b37e88cSNeil Armstrong 	"gpio25", "gpio26", "gpio27", "gpio28", "gpio29", "gpio30",
3098b37e88cSNeil Armstrong };
3108b37e88cSNeil Armstrong 
3118b37e88cSNeil Armstrong static const char * const ebi2_lcdc_groups[] = {
3128b37e88cSNeil Armstrong 	"gpio21", "gpio22", "gpio24",
3138b37e88cSNeil Armstrong };
3148b37e88cSNeil Armstrong 
3158b37e88cSNeil Armstrong static const char * const ps_hold_groups[] = {
3168b37e88cSNeil Armstrong 	"gpio83",
3178b37e88cSNeil Armstrong };
3188b37e88cSNeil Armstrong 
3198b37e88cSNeil Armstrong static const char * const prim_audio_groups[] = {
3208b37e88cSNeil Armstrong 	"gpio20", "gpio21", "gpio22", "gpio23",
3218b37e88cSNeil Armstrong };
3228b37e88cSNeil Armstrong 
3238b37e88cSNeil Armstrong static const char * const sec_audio_groups[] = {
3248b37e88cSNeil Armstrong 	"gpio25", "gpio26", "gpio27", "gpio28",
3258b37e88cSNeil Armstrong };
3268b37e88cSNeil Armstrong 
3278b37e88cSNeil Armstrong static const char * const cdc_mclk_groups[] = {
3288b37e88cSNeil Armstrong 	"gpio24",
3298b37e88cSNeil Armstrong };
3308b37e88cSNeil Armstrong 
3318b37e88cSNeil Armstrong static const struct msm_function mdm9615_functions[] = {
3328b37e88cSNeil Armstrong 	FUNCTION(gpio),
3338b37e88cSNeil Armstrong 	FUNCTION(gsbi2_i2c),
3348b37e88cSNeil Armstrong 	FUNCTION(gsbi3),
3358b37e88cSNeil Armstrong 	FUNCTION(gsbi4),
3368b37e88cSNeil Armstrong 	FUNCTION(gsbi5_i2c),
3378b37e88cSNeil Armstrong 	FUNCTION(gsbi5_uart),
3388b37e88cSNeil Armstrong 	FUNCTION(sdc2),
3398b37e88cSNeil Armstrong 	FUNCTION(ebi2_lcdc),
3408b37e88cSNeil Armstrong 	FUNCTION(ps_hold),
3418b37e88cSNeil Armstrong 	FUNCTION(prim_audio),
3428b37e88cSNeil Armstrong 	FUNCTION(sec_audio),
3438b37e88cSNeil Armstrong 	FUNCTION(cdc_mclk),
3448b37e88cSNeil Armstrong };
3458b37e88cSNeil Armstrong 
3468b37e88cSNeil Armstrong static const struct msm_pingroup mdm9615_groups[] = {
3478b37e88cSNeil Armstrong 	PINGROUP(0, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3488b37e88cSNeil Armstrong 	PINGROUP(1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3498b37e88cSNeil Armstrong 	PINGROUP(2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3508b37e88cSNeil Armstrong 	PINGROUP(3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3518b37e88cSNeil Armstrong 	PINGROUP(4, gsbi2_i2c, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3528b37e88cSNeil Armstrong 	PINGROUP(5, gsbi2_i2c, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3538b37e88cSNeil Armstrong 	PINGROUP(6, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3548b37e88cSNeil Armstrong 	PINGROUP(7, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3558b37e88cSNeil Armstrong 	PINGROUP(8, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3568b37e88cSNeil Armstrong 	PINGROUP(9, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3578b37e88cSNeil Armstrong 	PINGROUP(10, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3588b37e88cSNeil Armstrong 	PINGROUP(11, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3598b37e88cSNeil Armstrong 	PINGROUP(12, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3608b37e88cSNeil Armstrong 	PINGROUP(13, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3618b37e88cSNeil Armstrong 	PINGROUP(14, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3628b37e88cSNeil Armstrong 	PINGROUP(15, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3638b37e88cSNeil Armstrong 	PINGROUP(16, gsbi5_i2c, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3648b37e88cSNeil Armstrong 	PINGROUP(17, gsbi5_i2c, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3658b37e88cSNeil Armstrong 	PINGROUP(18, gsbi5_uart, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3668b37e88cSNeil Armstrong 	PINGROUP(19, gsbi5_uart, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3678b37e88cSNeil Armstrong 	PINGROUP(20, prim_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3688b37e88cSNeil Armstrong 	PINGROUP(21, prim_audio, ebi2_lcdc, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3698b37e88cSNeil Armstrong 	PINGROUP(22, prim_audio, ebi2_lcdc, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3708b37e88cSNeil Armstrong 	PINGROUP(23, prim_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3718b37e88cSNeil Armstrong 	PINGROUP(24, cdc_mclk, NA, ebi2_lcdc, NA, NA, NA, NA, NA, NA, NA, NA),
3728b37e88cSNeil Armstrong 	PINGROUP(25, sdc2, sec_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3738b37e88cSNeil Armstrong 	PINGROUP(26, sdc2, sec_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3748b37e88cSNeil Armstrong 	PINGROUP(27, sdc2, sec_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3758b37e88cSNeil Armstrong 	PINGROUP(28, sdc2, sec_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3768b37e88cSNeil Armstrong 	PINGROUP(29, sdc2, sec_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3778b37e88cSNeil Armstrong 	PINGROUP(30, sdc2, sec_audio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3788b37e88cSNeil Armstrong 	PINGROUP(31, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3798b37e88cSNeil Armstrong 	PINGROUP(32, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3808b37e88cSNeil Armstrong 	PINGROUP(33, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3818b37e88cSNeil Armstrong 	PINGROUP(34, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3828b37e88cSNeil Armstrong 	PINGROUP(35, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3838b37e88cSNeil Armstrong 	PINGROUP(36, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3848b37e88cSNeil Armstrong 	PINGROUP(37, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3858b37e88cSNeil Armstrong 	PINGROUP(38, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3868b37e88cSNeil Armstrong 	PINGROUP(39, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3878b37e88cSNeil Armstrong 	PINGROUP(40, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3888b37e88cSNeil Armstrong 	PINGROUP(41, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3898b37e88cSNeil Armstrong 	PINGROUP(42, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3908b37e88cSNeil Armstrong 	PINGROUP(43, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3918b37e88cSNeil Armstrong 	PINGROUP(44, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3928b37e88cSNeil Armstrong 	PINGROUP(45, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3938b37e88cSNeil Armstrong 	PINGROUP(46, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3948b37e88cSNeil Armstrong 	PINGROUP(47, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3958b37e88cSNeil Armstrong 	PINGROUP(48, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3968b37e88cSNeil Armstrong 	PINGROUP(49, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3978b37e88cSNeil Armstrong 	PINGROUP(50, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3988b37e88cSNeil Armstrong 	PINGROUP(51, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
3998b37e88cSNeil Armstrong 	PINGROUP(52, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4008b37e88cSNeil Armstrong 	PINGROUP(53, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4018b37e88cSNeil Armstrong 	PINGROUP(54, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4028b37e88cSNeil Armstrong 	PINGROUP(55, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4038b37e88cSNeil Armstrong 	PINGROUP(56, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4048b37e88cSNeil Armstrong 	PINGROUP(57, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4058b37e88cSNeil Armstrong 	PINGROUP(58, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4068b37e88cSNeil Armstrong 	PINGROUP(59, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4078b37e88cSNeil Armstrong 	PINGROUP(60, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4088b37e88cSNeil Armstrong 	PINGROUP(61, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4098b37e88cSNeil Armstrong 	PINGROUP(62, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4108b37e88cSNeil Armstrong 	PINGROUP(63, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4118b37e88cSNeil Armstrong 	PINGROUP(64, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4128b37e88cSNeil Armstrong 	PINGROUP(65, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4138b37e88cSNeil Armstrong 	PINGROUP(66, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4148b37e88cSNeil Armstrong 	PINGROUP(67, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4158b37e88cSNeil Armstrong 	PINGROUP(68, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4168b37e88cSNeil Armstrong 	PINGROUP(69, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4178b37e88cSNeil Armstrong 	PINGROUP(70, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4188b37e88cSNeil Armstrong 	PINGROUP(71, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4198b37e88cSNeil Armstrong 	PINGROUP(72, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4208b37e88cSNeil Armstrong 	PINGROUP(73, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4218b37e88cSNeil Armstrong 	PINGROUP(74, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4228b37e88cSNeil Armstrong 	PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4238b37e88cSNeil Armstrong 	PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4248b37e88cSNeil Armstrong 	PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4258b37e88cSNeil Armstrong 	PINGROUP(78, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4268b37e88cSNeil Armstrong 	PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4278b37e88cSNeil Armstrong 	PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4288b37e88cSNeil Armstrong 	PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4298b37e88cSNeil Armstrong 	PINGROUP(82, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4308b37e88cSNeil Armstrong 	PINGROUP(83, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4318b37e88cSNeil Armstrong 	PINGROUP(84, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4328b37e88cSNeil Armstrong 	PINGROUP(85, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4338b37e88cSNeil Armstrong 	PINGROUP(86, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4348b37e88cSNeil Armstrong 	PINGROUP(87, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
4358b37e88cSNeil Armstrong };
4368b37e88cSNeil Armstrong 
4378b37e88cSNeil Armstrong #define NUM_GPIO_PINGROUPS 88
4388b37e88cSNeil Armstrong 
4398b37e88cSNeil Armstrong static const struct msm_pinctrl_soc_data mdm9615_pinctrl = {
4408b37e88cSNeil Armstrong 	.pins = mdm9615_pins,
4418b37e88cSNeil Armstrong 	.npins = ARRAY_SIZE(mdm9615_pins),
4428b37e88cSNeil Armstrong 	.functions = mdm9615_functions,
4438b37e88cSNeil Armstrong 	.nfunctions = ARRAY_SIZE(mdm9615_functions),
4448b37e88cSNeil Armstrong 	.groups = mdm9615_groups,
4458b37e88cSNeil Armstrong 	.ngroups = ARRAY_SIZE(mdm9615_groups),
4468b37e88cSNeil Armstrong 	.ngpios = NUM_GPIO_PINGROUPS,
4478b37e88cSNeil Armstrong };
4488b37e88cSNeil Armstrong 
4498b37e88cSNeil Armstrong static int mdm9615_pinctrl_probe(struct platform_device *pdev)
4508b37e88cSNeil Armstrong {
4518b37e88cSNeil Armstrong 	return msm_pinctrl_probe(pdev, &mdm9615_pinctrl);
4528b37e88cSNeil Armstrong }
4538b37e88cSNeil Armstrong 
4548b37e88cSNeil Armstrong static const struct of_device_id mdm9615_pinctrl_of_match[] = {
4558b37e88cSNeil Armstrong 	{ .compatible = "qcom,mdm9615-pinctrl", },
4568b37e88cSNeil Armstrong 	{ },
4578b37e88cSNeil Armstrong };
4588b37e88cSNeil Armstrong 
4598b37e88cSNeil Armstrong static struct platform_driver mdm9615_pinctrl_driver = {
4608b37e88cSNeil Armstrong 	.driver = {
4618b37e88cSNeil Armstrong 		.name = "mdm9615-pinctrl",
4628b37e88cSNeil Armstrong 		.of_match_table = mdm9615_pinctrl_of_match,
4638b37e88cSNeil Armstrong 	},
4648b37e88cSNeil Armstrong 	.probe = mdm9615_pinctrl_probe,
4658b37e88cSNeil Armstrong 	.remove = msm_pinctrl_remove,
4668b37e88cSNeil Armstrong };
4678b37e88cSNeil Armstrong 
4688b37e88cSNeil Armstrong static int __init mdm9615_pinctrl_init(void)
4698b37e88cSNeil Armstrong {
4708b37e88cSNeil Armstrong 	return platform_driver_register(&mdm9615_pinctrl_driver);
4718b37e88cSNeil Armstrong }
4728b37e88cSNeil Armstrong arch_initcall(mdm9615_pinctrl_init);
4738b37e88cSNeil Armstrong 
4748b37e88cSNeil Armstrong static void __exit mdm9615_pinctrl_exit(void)
4758b37e88cSNeil Armstrong {
4768b37e88cSNeil Armstrong 	platform_driver_unregister(&mdm9615_pinctrl_driver);
4778b37e88cSNeil Armstrong }
4788b37e88cSNeil Armstrong module_exit(mdm9615_pinctrl_exit);
4798b37e88cSNeil Armstrong 
4808b37e88cSNeil Armstrong MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
4818b37e88cSNeil Armstrong MODULE_DESCRIPTION("Qualcomm MDM9615 pinctrl driver");
4828b37e88cSNeil Armstrong MODULE_LICENSE("GPL v2");
4838b37e88cSNeil Armstrong MODULE_DEVICE_TABLE(of, mdm9615_pinctrl_of_match);
484