1b17f2f9bSRay Jui /*
2b17f2f9bSRay Jui  * Copyright (C) 2013 Broadcom Corporation
3b17f2f9bSRay Jui  *
4b17f2f9bSRay Jui  * This program is free software; you can redistribute it and/or
5b17f2f9bSRay Jui  * modify it under the terms of the GNU General Public License as
6b17f2f9bSRay Jui  * published by the Free Software Foundation version 2.
7b17f2f9bSRay Jui  *
8b17f2f9bSRay Jui  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9b17f2f9bSRay Jui  * kind, whether express or implied; without even the implied warranty
10b17f2f9bSRay Jui  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11b17f2f9bSRay Jui  * GNU General Public License for more details.
12b17f2f9bSRay Jui  */
13b17f2f9bSRay Jui #include <linux/err.h>
14b17f2f9bSRay Jui #include <linux/io.h>
15b17f2f9bSRay Jui #include <linux/module.h>
16b17f2f9bSRay Jui #include <linux/of.h>
17b17f2f9bSRay Jui #include <linux/platform_device.h>
18b17f2f9bSRay Jui #include <linux/pinctrl/pinctrl.h>
19b17f2f9bSRay Jui #include <linux/pinctrl/pinmux.h>
20b17f2f9bSRay Jui #include <linux/pinctrl/pinconf.h>
21b17f2f9bSRay Jui #include <linux/pinctrl/pinconf-generic.h>
22b17f2f9bSRay Jui #include <linux/regmap.h>
23b17f2f9bSRay Jui #include <linux/slab.h>
24b17f2f9bSRay Jui #include "../core.h"
25b17f2f9bSRay Jui #include "../pinctrl-utils.h"
26b17f2f9bSRay Jui 
27b17f2f9bSRay Jui /* BCM281XX Pin Control Registers Definitions */
28b17f2f9bSRay Jui 
29b17f2f9bSRay Jui /* Function Select bits are the same for all pin control registers */
30b17f2f9bSRay Jui #define BCM281XX_PIN_REG_F_SEL_MASK		0x0700
31b17f2f9bSRay Jui #define BCM281XX_PIN_REG_F_SEL_SHIFT		8
32b17f2f9bSRay Jui 
33b17f2f9bSRay Jui /* Standard pin register */
34b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_DRV_STR_MASK	0x0007
35b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_DRV_STR_SHIFT	0
36b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_INPUT_DIS_MASK	0x0008
37b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_INPUT_DIS_SHIFT	3
38b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_SLEW_MASK		0x0010
39b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_SLEW_SHIFT		4
40b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_PULL_UP_MASK	0x0020
41b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_PULL_UP_SHIFT	5
42b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_PULL_DN_MASK	0x0040
43b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_PULL_DN_SHIFT	6
44b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_HYST_MASK		0x0080
45b17f2f9bSRay Jui #define BCM281XX_STD_PIN_REG_HYST_SHIFT		7
46b17f2f9bSRay Jui 
47b17f2f9bSRay Jui /* I2C pin register */
48b17f2f9bSRay Jui #define BCM281XX_I2C_PIN_REG_INPUT_DIS_MASK	0x0004
49b17f2f9bSRay Jui #define BCM281XX_I2C_PIN_REG_INPUT_DIS_SHIFT	2
50b17f2f9bSRay Jui #define BCM281XX_I2C_PIN_REG_SLEW_MASK		0x0008
51b17f2f9bSRay Jui #define BCM281XX_I2C_PIN_REG_SLEW_SHIFT		3
52b17f2f9bSRay Jui #define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK	0x0070
53b17f2f9bSRay Jui #define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT	4
54b17f2f9bSRay Jui 
55b17f2f9bSRay Jui /* HDMI pin register */
56b17f2f9bSRay Jui #define BCM281XX_HDMI_PIN_REG_INPUT_DIS_MASK	0x0008
57b17f2f9bSRay Jui #define BCM281XX_HDMI_PIN_REG_INPUT_DIS_SHIFT	3
58b17f2f9bSRay Jui #define BCM281XX_HDMI_PIN_REG_MODE_MASK		0x0010
59b17f2f9bSRay Jui #define BCM281XX_HDMI_PIN_REG_MODE_SHIFT	4
60b17f2f9bSRay Jui 
61b17f2f9bSRay Jui /**
62b17f2f9bSRay Jui  * bcm281xx_pin_type - types of pin register
63b17f2f9bSRay Jui  */
64b17f2f9bSRay Jui enum bcm281xx_pin_type {
65b17f2f9bSRay Jui 	BCM281XX_PIN_TYPE_UNKNOWN = 0,
66b17f2f9bSRay Jui 	BCM281XX_PIN_TYPE_STD,
67b17f2f9bSRay Jui 	BCM281XX_PIN_TYPE_I2C,
68b17f2f9bSRay Jui 	BCM281XX_PIN_TYPE_HDMI,
69b17f2f9bSRay Jui };
70b17f2f9bSRay Jui 
71b17f2f9bSRay Jui static enum bcm281xx_pin_type std_pin = BCM281XX_PIN_TYPE_STD;
72b17f2f9bSRay Jui static enum bcm281xx_pin_type i2c_pin = BCM281XX_PIN_TYPE_I2C;
73b17f2f9bSRay Jui static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI;
74b17f2f9bSRay Jui 
75b17f2f9bSRay Jui /**
76b17f2f9bSRay Jui  * bcm281xx_pin_function- define pin function
77b17f2f9bSRay Jui  */
78b17f2f9bSRay Jui struct bcm281xx_pin_function {
79b17f2f9bSRay Jui 	const char *name;
80b17f2f9bSRay Jui 	const char * const *groups;
81b17f2f9bSRay Jui 	const unsigned ngroups;
82b17f2f9bSRay Jui };
83b17f2f9bSRay Jui 
84b17f2f9bSRay Jui /**
85b17f2f9bSRay Jui  * bcm281xx_pinctrl_data - Broadcom-specific pinctrl data
86b17f2f9bSRay Jui  * @reg_base - base of pinctrl registers
87b17f2f9bSRay Jui  */
88b17f2f9bSRay Jui struct bcm281xx_pinctrl_data {
89b17f2f9bSRay Jui 	void __iomem *reg_base;
90b17f2f9bSRay Jui 
91b17f2f9bSRay Jui 	/* List of all pins */
92b17f2f9bSRay Jui 	const struct pinctrl_pin_desc *pins;
93b17f2f9bSRay Jui 	const unsigned npins;
94b17f2f9bSRay Jui 
95b17f2f9bSRay Jui 	const struct bcm281xx_pin_function *functions;
96b17f2f9bSRay Jui 	const unsigned nfunctions;
97b17f2f9bSRay Jui 
98b17f2f9bSRay Jui 	struct regmap *regmap;
99b17f2f9bSRay Jui };
100b17f2f9bSRay Jui 
101b17f2f9bSRay Jui /*
102b17f2f9bSRay Jui  * Pin number definition.  The order here must be the same as defined in the
103b17f2f9bSRay Jui  * PADCTRLREG block in the RDB.
104b17f2f9bSRay Jui  */
105b17f2f9bSRay Jui #define BCM281XX_PIN_ADCSYNC		0
106b17f2f9bSRay Jui #define BCM281XX_PIN_BAT_RM		1
107b17f2f9bSRay Jui #define BCM281XX_PIN_BSC1_SCL		2
108b17f2f9bSRay Jui #define BCM281XX_PIN_BSC1_SDA		3
109b17f2f9bSRay Jui #define BCM281XX_PIN_BSC2_SCL		4
110b17f2f9bSRay Jui #define BCM281XX_PIN_BSC2_SDA		5
111b17f2f9bSRay Jui #define BCM281XX_PIN_CLASSGPWR		6
112b17f2f9bSRay Jui #define BCM281XX_PIN_CLK_CX8		7
113b17f2f9bSRay Jui #define BCM281XX_PIN_CLKOUT_0		8
114b17f2f9bSRay Jui #define BCM281XX_PIN_CLKOUT_1		9
115b17f2f9bSRay Jui #define BCM281XX_PIN_CLKOUT_2		10
116b17f2f9bSRay Jui #define BCM281XX_PIN_CLKOUT_3		11
117b17f2f9bSRay Jui #define BCM281XX_PIN_CLKREQ_IN_0	12
118b17f2f9bSRay Jui #define BCM281XX_PIN_CLKREQ_IN_1	13
119b17f2f9bSRay Jui #define BCM281XX_PIN_CWS_SYS_REQ1	14
120b17f2f9bSRay Jui #define BCM281XX_PIN_CWS_SYS_REQ2	15
121b17f2f9bSRay Jui #define BCM281XX_PIN_CWS_SYS_REQ3	16
122b17f2f9bSRay Jui #define BCM281XX_PIN_DIGMIC1_CLK	17
123b17f2f9bSRay Jui #define BCM281XX_PIN_DIGMIC1_DQ		18
124b17f2f9bSRay Jui #define BCM281XX_PIN_DIGMIC2_CLK	19
125b17f2f9bSRay Jui #define BCM281XX_PIN_DIGMIC2_DQ		20
126b17f2f9bSRay Jui #define BCM281XX_PIN_GPEN13		21
127b17f2f9bSRay Jui #define BCM281XX_PIN_GPEN14		22
128b17f2f9bSRay Jui #define BCM281XX_PIN_GPEN15		23
129b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO00		24
130b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO01		25
131b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO02		26
132b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO03		27
133b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO04		28
134b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO05		29
135b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO06		30
136b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO07		31
137b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO08		32
138b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO09		33
139b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO10		34
140b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO11		35
141b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO12		36
142b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO13		37
143b17f2f9bSRay Jui #define BCM281XX_PIN_GPIO14		38
144b17f2f9bSRay Jui #define BCM281XX_PIN_GPS_PABLANK	39
145b17f2f9bSRay Jui #define BCM281XX_PIN_GPS_TMARK		40
146b17f2f9bSRay Jui #define BCM281XX_PIN_HDMI_SCL		41
147b17f2f9bSRay Jui #define BCM281XX_PIN_HDMI_SDA		42
148b17f2f9bSRay Jui #define BCM281XX_PIN_IC_DM		43
149b17f2f9bSRay Jui #define BCM281XX_PIN_IC_DP		44
150b17f2f9bSRay Jui #define BCM281XX_PIN_KP_COL_IP_0	45
151b17f2f9bSRay Jui #define BCM281XX_PIN_KP_COL_IP_1	46
152b17f2f9bSRay Jui #define BCM281XX_PIN_KP_COL_IP_2	47
153b17f2f9bSRay Jui #define BCM281XX_PIN_KP_COL_IP_3	48
154b17f2f9bSRay Jui #define BCM281XX_PIN_KP_ROW_OP_0	49
155b17f2f9bSRay Jui #define BCM281XX_PIN_KP_ROW_OP_1	50
156b17f2f9bSRay Jui #define BCM281XX_PIN_KP_ROW_OP_2	51
157b17f2f9bSRay Jui #define BCM281XX_PIN_KP_ROW_OP_3	52
158b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_0		53
159b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_1		54
160b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_2		55
161b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_3		56
162b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_4		57
163b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_5		58
164b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_6		59
165b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_B_7		60
166b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_0		61
167b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_1		62
168b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_2		63
169b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_3		64
170b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_4		65
171b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_5		66
172b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_6		67
173b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_G_7		68
174b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_HSYNC		69
175b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_OE		70
176b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_PCLK		71
177b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_0		72
178b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_1		73
179b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_2		74
180b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_3		75
181b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_4		76
182b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_5		77
183b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_6		78
184b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_R_7		79
185b17f2f9bSRay Jui #define BCM281XX_PIN_LCD_VSYNC		80
186b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO0		81
187b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO1		82
188b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO2		83
189b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO3		84
190b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO4		85
191b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO5		86
192b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO6		87
193b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO7		88
194b17f2f9bSRay Jui #define BCM281XX_PIN_MDMGPIO8		89
195b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_0	90
196b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_1	91
197b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_2	92
198b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_3	93
199b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_4	94
200b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_5	95
201b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_6	96
202b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_7	97
203b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_8	98
204b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_9	99
205b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_10	100
206b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_11	101
207b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_12	102
208b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_13	103
209b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_14	104
210b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_DATA_15	105
211b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HA0		106
212b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HAT0		107
213b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HAT1		108
214b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HCE0_N	109
215b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HCE1_N	110
216b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HRD_N		111
217b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_HWR_N		112
218b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_RUN0		113
219b17f2f9bSRay Jui #define BCM281XX_PIN_MPHI_RUN1		114
220b17f2f9bSRay Jui #define BCM281XX_PIN_MTX_SCAN_CLK	115
221b17f2f9bSRay Jui #define BCM281XX_PIN_MTX_SCAN_DATA	116
222b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_0		117
223b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_1		118
224b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_2		119
225b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_3		120
226b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_4		121
227b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_5		122
228b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_6		123
229b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_AD_7		124
230b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_ALE		125
231b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_CEN_0		126
232b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_CEN_1		127
233b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_CLE		128
234b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_OEN		129
235b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_RDY_0		130
236b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_RDY_1		131
237b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_WEN		132
238b17f2f9bSRay Jui #define BCM281XX_PIN_NAND_WP		133
239b17f2f9bSRay Jui #define BCM281XX_PIN_PC1		134
240b17f2f9bSRay Jui #define BCM281XX_PIN_PC2		135
241b17f2f9bSRay Jui #define BCM281XX_PIN_PMU_INT		136
242b17f2f9bSRay Jui #define BCM281XX_PIN_PMU_SCL		137
243b17f2f9bSRay Jui #define BCM281XX_PIN_PMU_SDA		138
244b17f2f9bSRay Jui #define BCM281XX_PIN_RFST2G_MTSLOTEN3G	139
245b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_RX_CTL	140
246b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_RXC	141
247b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_RXD_0	142
248b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_RXD_1	143
249b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_RXD_2	144
250b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_RXD_3	145
251b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_TX_CTL	146
252b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_TXC	147
253b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_TXD_0	148
254b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_TXD_1	149
255b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_TXD_2	150
256b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_0_TXD_3	151
257b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_RX_CTL	152
258b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_RXC	153
259b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_RXD_0	154
260b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_RXD_1	155
261b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_RXD_2	156
262b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_RXD_3	157
263b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_TX_CTL	158
264b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_TXC	159
265b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_TXD_0	160
266b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_TXD_1	161
267b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_TXD_2	162
268b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_1_TXD_3	163
269b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_GPIO_0	164
270b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_GPIO_1	165
271b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_GPIO_2	166
272b17f2f9bSRay Jui #define BCM281XX_PIN_RGMII_GPIO_3	167
273b17f2f9bSRay Jui #define BCM281XX_PIN_RTXDATA2G_TXDATA3G1	168
274b17f2f9bSRay Jui #define BCM281XX_PIN_RTXEN2G_TXDATA3G2	169
275b17f2f9bSRay Jui #define BCM281XX_PIN_RXDATA3G0		170
276b17f2f9bSRay Jui #define BCM281XX_PIN_RXDATA3G1		171
277b17f2f9bSRay Jui #define BCM281XX_PIN_RXDATA3G2		172
278b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO1_CLK		173
279b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO1_CMD		174
280b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO1_DATA_0	175
281b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO1_DATA_1	176
282b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO1_DATA_2	177
283b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO1_DATA_3	178
284b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO4_CLK		179
285b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO4_CMD		180
286b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO4_DATA_0	181
287b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO4_DATA_1	182
288b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO4_DATA_2	183
289b17f2f9bSRay Jui #define BCM281XX_PIN_SDIO4_DATA_3	184
290b17f2f9bSRay Jui #define BCM281XX_PIN_SIM_CLK		185
291b17f2f9bSRay Jui #define BCM281XX_PIN_SIM_DATA		186
292b17f2f9bSRay Jui #define BCM281XX_PIN_SIM_DET		187
293b17f2f9bSRay Jui #define BCM281XX_PIN_SIM_RESETN		188
294b17f2f9bSRay Jui #define BCM281XX_PIN_SIM2_CLK		189
295b17f2f9bSRay Jui #define BCM281XX_PIN_SIM2_DATA		190
296b17f2f9bSRay Jui #define BCM281XX_PIN_SIM2_DET		191
297b17f2f9bSRay Jui #define BCM281XX_PIN_SIM2_RESETN	192
298b17f2f9bSRay Jui #define BCM281XX_PIN_SRI_C		193
299b17f2f9bSRay Jui #define BCM281XX_PIN_SRI_D		194
300b17f2f9bSRay Jui #define BCM281XX_PIN_SRI_E		195
301b17f2f9bSRay Jui #define BCM281XX_PIN_SSP_EXTCLK		196
302b17f2f9bSRay Jui #define BCM281XX_PIN_SSP0_CLK		197
303b17f2f9bSRay Jui #define BCM281XX_PIN_SSP0_FS		198
304b17f2f9bSRay Jui #define BCM281XX_PIN_SSP0_RXD		199
305b17f2f9bSRay Jui #define BCM281XX_PIN_SSP0_TXD		200
306b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_CLK		201
307b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_FS_0		202
308b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_FS_1		203
309b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_FS_2		204
310b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_FS_3		205
311b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_RXD_0		206
312b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_RXD_1		207
313b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_TXD_0		208
314b17f2f9bSRay Jui #define BCM281XX_PIN_SSP2_TXD_1		209
315b17f2f9bSRay Jui #define BCM281XX_PIN_SSP3_CLK		210
316b17f2f9bSRay Jui #define BCM281XX_PIN_SSP3_FS		211
317b17f2f9bSRay Jui #define BCM281XX_PIN_SSP3_RXD		212
318b17f2f9bSRay Jui #define BCM281XX_PIN_SSP3_TXD		213
319b17f2f9bSRay Jui #define BCM281XX_PIN_SSP4_CLK		214
320b17f2f9bSRay Jui #define BCM281XX_PIN_SSP4_FS		215
321b17f2f9bSRay Jui #define BCM281XX_PIN_SSP4_RXD		216
322b17f2f9bSRay Jui #define BCM281XX_PIN_SSP4_TXD		217
323b17f2f9bSRay Jui #define BCM281XX_PIN_SSP5_CLK		218
324b17f2f9bSRay Jui #define BCM281XX_PIN_SSP5_FS		219
325b17f2f9bSRay Jui #define BCM281XX_PIN_SSP5_RXD		220
326b17f2f9bSRay Jui #define BCM281XX_PIN_SSP5_TXD		221
327b17f2f9bSRay Jui #define BCM281XX_PIN_SSP6_CLK		222
328b17f2f9bSRay Jui #define BCM281XX_PIN_SSP6_FS		223
329b17f2f9bSRay Jui #define BCM281XX_PIN_SSP6_RXD		224
330b17f2f9bSRay Jui #define BCM281XX_PIN_SSP6_TXD		225
331b17f2f9bSRay Jui #define BCM281XX_PIN_STAT_1		226
332b17f2f9bSRay Jui #define BCM281XX_PIN_STAT_2		227
333b17f2f9bSRay Jui #define BCM281XX_PIN_SYSCLKEN		228
334b17f2f9bSRay Jui #define BCM281XX_PIN_TRACECLK		229
335b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT00		230
336b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT01		231
337b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT02		232
338b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT03		233
339b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT04		234
340b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT05		235
341b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT06		236
342b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT07		237
343b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT08		238
344b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT09		239
345b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT10		240
346b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT11		241
347b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT12		242
348b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT13		243
349b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT14		244
350b17f2f9bSRay Jui #define BCM281XX_PIN_TRACEDT15		245
351b17f2f9bSRay Jui #define BCM281XX_PIN_TXDATA3G0		246
352b17f2f9bSRay Jui #define BCM281XX_PIN_TXPWRIND		247
353b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB1_UCTS	248
354b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB1_URTS	249
355b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB1_URXD	250
356b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB1_UTXD	251
357b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB2_URXD	252
358b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB2_UTXD	253
359b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB3_UCTS	254
360b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB3_URTS	255
361b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB3_URXD	256
362b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB3_UTXD	257
363b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB4_UCTS	258
364b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB4_URTS	259
365b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB4_URXD	260
366b17f2f9bSRay Jui #define BCM281XX_PIN_UARTB4_UTXD	261
367b17f2f9bSRay Jui #define BCM281XX_PIN_VC_CAM1_SCL	262
368b17f2f9bSRay Jui #define BCM281XX_PIN_VC_CAM1_SDA	263
369b17f2f9bSRay Jui #define BCM281XX_PIN_VC_CAM2_SCL	264
370b17f2f9bSRay Jui #define BCM281XX_PIN_VC_CAM2_SDA	265
371b17f2f9bSRay Jui #define BCM281XX_PIN_VC_CAM3_SCL	266
372b17f2f9bSRay Jui #define BCM281XX_PIN_VC_CAM3_SDA	267
373b17f2f9bSRay Jui 
374b17f2f9bSRay Jui #define BCM281XX_PIN_DESC(a, b, c) \
375b17f2f9bSRay Jui 	{ .number = a, .name = b, .drv_data = &c##_pin }
376b17f2f9bSRay Jui 
377b17f2f9bSRay Jui /*
378b17f2f9bSRay Jui  * Pin description definition.  The order here must be the same as defined in
379b17f2f9bSRay Jui  * the PADCTRLREG block in the RDB, since the pin number is used as an index
380b17f2f9bSRay Jui  * into this array.
381b17f2f9bSRay Jui  */
382b17f2f9bSRay Jui static const struct pinctrl_pin_desc bcm281xx_pinctrl_pins[] = {
383b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_ADCSYNC, "adcsync", std),
384b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_BAT_RM, "bat_rm", std),
385b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SCL, "bsc1_scl", i2c),
386b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SDA, "bsc1_sda", i2c),
387b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SCL, "bsc2_scl", i2c),
388b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SDA, "bsc2_sda", i2c),
389b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLASSGPWR, "classgpwr", std),
390b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLK_CX8, "clk_cx8", std),
391b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_0, "clkout_0", std),
392b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_1, "clkout_1", std),
393b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_2, "clkout_2", std),
394b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_3, "clkout_3", std),
395b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_0, "clkreq_in_0", std),
396b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_1, "clkreq_in_1", std),
397b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ1, "cws_sys_req1", std),
398b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ2, "cws_sys_req2", std),
399b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ3, "cws_sys_req3", std),
400b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_CLK, "digmic1_clk", std),
401b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_DQ, "digmic1_dq", std),
402b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_CLK, "digmic2_clk", std),
403b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_DQ, "digmic2_dq", std),
404b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN13, "gpen13", std),
405b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN14, "gpen14", std),
406b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN15, "gpen15", std),
407b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO00, "gpio00", std),
408b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO01, "gpio01", std),
409b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO02, "gpio02", std),
410b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO03, "gpio03", std),
411b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO04, "gpio04", std),
412b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO05, "gpio05", std),
413b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO06, "gpio06", std),
414b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO07, "gpio07", std),
415b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO08, "gpio08", std),
416b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO09, "gpio09", std),
417b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO10, "gpio10", std),
418b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO11, "gpio11", std),
419b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO12, "gpio12", std),
420b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO13, "gpio13", std),
421b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO14, "gpio14", std),
422b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_PABLANK, "gps_pablank", std),
423b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_TMARK, "gps_tmark", std),
424b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SCL, "hdmi_scl", hdmi),
425b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SDA, "hdmi_sda", hdmi),
426b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DM, "ic_dm", std),
427b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DP, "ic_dp", std),
428b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_0, "kp_col_ip_0", std),
429b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_1, "kp_col_ip_1", std),
430b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_2, "kp_col_ip_2", std),
431b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_3, "kp_col_ip_3", std),
432b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_0, "kp_row_op_0", std),
433b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_1, "kp_row_op_1", std),
434b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_2, "kp_row_op_2", std),
435b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_3, "kp_row_op_3", std),
436b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_0, "lcd_b_0", std),
437b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_1, "lcd_b_1", std),
438b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_2, "lcd_b_2", std),
439b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_3, "lcd_b_3", std),
440b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_4, "lcd_b_4", std),
441b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_5, "lcd_b_5", std),
442b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_6, "lcd_b_6", std),
443b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_7, "lcd_b_7", std),
444b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_0, "lcd_g_0", std),
445b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_1, "lcd_g_1", std),
446b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_2, "lcd_g_2", std),
447b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_3, "lcd_g_3", std),
448b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_4, "lcd_g_4", std),
449b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_5, "lcd_g_5", std),
450b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_6, "lcd_g_6", std),
451b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_7, "lcd_g_7", std),
452b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_HSYNC, "lcd_hsync", std),
453b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_OE, "lcd_oe", std),
454b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_PCLK, "lcd_pclk", std),
455b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_0, "lcd_r_0", std),
456b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_1, "lcd_r_1", std),
457b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_2, "lcd_r_2", std),
458b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_3, "lcd_r_3", std),
459b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_4, "lcd_r_4", std),
460b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_5, "lcd_r_5", std),
461b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_6, "lcd_r_6", std),
462b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_7, "lcd_r_7", std),
463b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_VSYNC, "lcd_vsync", std),
464b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO0, "mdmgpio0", std),
465b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO1, "mdmgpio1", std),
466b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO2, "mdmgpio2", std),
467b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO3, "mdmgpio3", std),
468b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO4, "mdmgpio4", std),
469b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO5, "mdmgpio5", std),
470b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO6, "mdmgpio6", std),
471b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO7, "mdmgpio7", std),
472b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO8, "mdmgpio8", std),
473b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_0, "mphi_data_0", std),
474b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_1, "mphi_data_1", std),
475b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_2, "mphi_data_2", std),
476b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_3, "mphi_data_3", std),
477b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_4, "mphi_data_4", std),
478b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_5, "mphi_data_5", std),
479b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_6, "mphi_data_6", std),
480b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_7, "mphi_data_7", std),
481b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_8, "mphi_data_8", std),
482b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_9, "mphi_data_9", std),
483b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_10, "mphi_data_10", std),
484b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_11, "mphi_data_11", std),
485b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_12, "mphi_data_12", std),
486b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_13, "mphi_data_13", std),
487b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_14, "mphi_data_14", std),
488b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_15, "mphi_data_15", std),
489b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HA0, "mphi_ha0", std),
490b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT0, "mphi_hat0", std),
491b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT1, "mphi_hat1", std),
492b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE0_N, "mphi_hce0_n", std),
493b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE1_N, "mphi_hce1_n", std),
494b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HRD_N, "mphi_hrd_n", std),
495b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HWR_N, "mphi_hwr_n", std),
496b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN0, "mphi_run0", std),
497b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN1, "mphi_run1", std),
498b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_CLK, "mtx_scan_clk", std),
499b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_DATA, "mtx_scan_data", std),
500b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_0, "nand_ad_0", std),
501b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_1, "nand_ad_1", std),
502b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_2, "nand_ad_2", std),
503b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_3, "nand_ad_3", std),
504b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_4, "nand_ad_4", std),
505b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_5, "nand_ad_5", std),
506b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_6, "nand_ad_6", std),
507b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_7, "nand_ad_7", std),
508b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_ALE, "nand_ale", std),
509b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_0, "nand_cen_0", std),
510b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_1, "nand_cen_1", std),
511b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CLE, "nand_cle", std),
512b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_OEN, "nand_oen", std),
513b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_0, "nand_rdy_0", std),
514b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_1, "nand_rdy_1", std),
515b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WEN, "nand_wen", std),
516b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WP, "nand_wp", std),
517b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_PC1, "pc1", std),
518b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_PC2, "pc2", std),
519b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_INT, "pmu_int", std),
520b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SCL, "pmu_scl", i2c),
521b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SDA, "pmu_sda", i2c),
522b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RFST2G_MTSLOTEN3G, "rfst2g_mtsloten3g",
523b17f2f9bSRay Jui 		std),
524b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RX_CTL, "rgmii_0_rx_ctl", std),
525b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXC, "rgmii_0_rxc", std),
526b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_0, "rgmii_0_rxd_0", std),
527b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_1, "rgmii_0_rxd_1", std),
528b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_2, "rgmii_0_rxd_2", std),
529b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_3, "rgmii_0_rxd_3", std),
530b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TX_CTL, "rgmii_0_tx_ctl", std),
531b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXC, "rgmii_0_txc", std),
532b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_0, "rgmii_0_txd_0", std),
533b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_1, "rgmii_0_txd_1", std),
534b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_2, "rgmii_0_txd_2", std),
535b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_3, "rgmii_0_txd_3", std),
536b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RX_CTL, "rgmii_1_rx_ctl", std),
537b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXC, "rgmii_1_rxc", std),
538b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_0, "rgmii_1_rxd_0", std),
539b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_1, "rgmii_1_rxd_1", std),
540b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_2, "rgmii_1_rxd_2", std),
541b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_3, "rgmii_1_rxd_3", std),
542b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TX_CTL, "rgmii_1_tx_ctl", std),
543b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXC, "rgmii_1_txc", std),
544b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_0, "rgmii_1_txd_0", std),
545b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_1, "rgmii_1_txd_1", std),
546b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_2, "rgmii_1_txd_2", std),
547b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_3, "rgmii_1_txd_3", std),
548b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_0, "rgmii_gpio_0", std),
549b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_1, "rgmii_gpio_1", std),
550b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_2, "rgmii_gpio_2", std),
551b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_3, "rgmii_gpio_3", std),
552b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RTXDATA2G_TXDATA3G1,
553b17f2f9bSRay Jui 		"rtxdata2g_txdata3g1", std),
554b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RTXEN2G_TXDATA3G2, "rtxen2g_txdata3g2",
555b17f2f9bSRay Jui 		std),
556b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G0, "rxdata3g0", std),
557b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G1, "rxdata3g1", std),
558b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G2, "rxdata3g2", std),
559b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CLK, "sdio1_clk", std),
560b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CMD, "sdio1_cmd", std),
561b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_0, "sdio1_data_0", std),
562b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_1, "sdio1_data_1", std),
563b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_2, "sdio1_data_2", std),
564b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_3, "sdio1_data_3", std),
565b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CLK, "sdio4_clk", std),
566b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CMD, "sdio4_cmd", std),
567b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_0, "sdio4_data_0", std),
568b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_1, "sdio4_data_1", std),
569b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_2, "sdio4_data_2", std),
570b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_3, "sdio4_data_3", std),
571b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_CLK, "sim_clk", std),
572b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DATA, "sim_data", std),
573b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DET, "sim_det", std),
574b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_RESETN, "sim_resetn", std),
575b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_CLK, "sim2_clk", std),
576b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DATA, "sim2_data", std),
577b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DET, "sim2_det", std),
578b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_RESETN, "sim2_resetn", std),
579b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_C, "sri_c", std),
580b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_D, "sri_d", std),
581b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_E, "sri_e", std),
582b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP_EXTCLK, "ssp_extclk", std),
583b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_CLK, "ssp0_clk", std),
584b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_FS, "ssp0_fs", std),
585b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_RXD, "ssp0_rxd", std),
586b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_TXD, "ssp0_txd", std),
587b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_CLK, "ssp2_clk", std),
588b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_0, "ssp2_fs_0", std),
589b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_1, "ssp2_fs_1", std),
590b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_2, "ssp2_fs_2", std),
591b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_3, "ssp2_fs_3", std),
592b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_0, "ssp2_rxd_0", std),
593b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_1, "ssp2_rxd_1", std),
594b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_0, "ssp2_txd_0", std),
595b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_1, "ssp2_txd_1", std),
596b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_CLK, "ssp3_clk", std),
597b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_FS, "ssp3_fs", std),
598b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_RXD, "ssp3_rxd", std),
599b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_TXD, "ssp3_txd", std),
600b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_CLK, "ssp4_clk", std),
601b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_FS, "ssp4_fs", std),
602b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_RXD, "ssp4_rxd", std),
603b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_TXD, "ssp4_txd", std),
604b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_CLK, "ssp5_clk", std),
605b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_FS, "ssp5_fs", std),
606b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_RXD, "ssp5_rxd", std),
607b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_TXD, "ssp5_txd", std),
608b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_CLK, "ssp6_clk", std),
609b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_FS, "ssp6_fs", std),
610b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_RXD, "ssp6_rxd", std),
611b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_TXD, "ssp6_txd", std),
612b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_1, "stat_1", std),
613b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_2, "stat_2", std),
614b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_SYSCLKEN, "sysclken", std),
615b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACECLK, "traceclk", std),
616b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT00, "tracedt00", std),
617b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT01, "tracedt01", std),
618b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT02, "tracedt02", std),
619b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT03, "tracedt03", std),
620b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT04, "tracedt04", std),
621b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT05, "tracedt05", std),
622b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT06, "tracedt06", std),
623b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT07, "tracedt07", std),
624b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT08, "tracedt08", std),
625b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT09, "tracedt09", std),
626b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT10, "tracedt10", std),
627b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT11, "tracedt11", std),
628b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT12, "tracedt12", std),
629b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT13, "tracedt13", std),
630b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT14, "tracedt14", std),
631b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT15, "tracedt15", std),
632b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TXDATA3G0, "txdata3g0", std),
633b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_TXPWRIND, "txpwrind", std),
634b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UCTS, "uartb1_ucts", std),
635b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URTS, "uartb1_urts", std),
636b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URXD, "uartb1_urxd", std),
637b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UTXD, "uartb1_utxd", std),
638b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_URXD, "uartb2_urxd", std),
639b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_UTXD, "uartb2_utxd", std),
640b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UCTS, "uartb3_ucts", std),
641b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URTS, "uartb3_urts", std),
642b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URXD, "uartb3_urxd", std),
643b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UTXD, "uartb3_utxd", std),
644b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UCTS, "uartb4_ucts", std),
645b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URTS, "uartb4_urts", std),
646b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URXD, "uartb4_urxd", std),
647b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UTXD, "uartb4_utxd", std),
648b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SCL, "vc_cam1_scl", i2c),
649b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SDA, "vc_cam1_sda", i2c),
650b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SCL, "vc_cam2_scl", i2c),
651b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SDA, "vc_cam2_sda", i2c),
652b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SCL, "vc_cam3_scl", i2c),
653b17f2f9bSRay Jui 	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SDA, "vc_cam3_sda", i2c),
654b17f2f9bSRay Jui };
655b17f2f9bSRay Jui 
656b17f2f9bSRay Jui static const char * const bcm281xx_alt_groups[] = {
657b17f2f9bSRay Jui 	"adcsync",
658b17f2f9bSRay Jui 	"bat_rm",
659b17f2f9bSRay Jui 	"bsc1_scl",
660b17f2f9bSRay Jui 	"bsc1_sda",
661b17f2f9bSRay Jui 	"bsc2_scl",
662b17f2f9bSRay Jui 	"bsc2_sda",
663b17f2f9bSRay Jui 	"classgpwr",
664b17f2f9bSRay Jui 	"clk_cx8",
665b17f2f9bSRay Jui 	"clkout_0",
666b17f2f9bSRay Jui 	"clkout_1",
667b17f2f9bSRay Jui 	"clkout_2",
668b17f2f9bSRay Jui 	"clkout_3",
669b17f2f9bSRay Jui 	"clkreq_in_0",
670b17f2f9bSRay Jui 	"clkreq_in_1",
671b17f2f9bSRay Jui 	"cws_sys_req1",
672b17f2f9bSRay Jui 	"cws_sys_req2",
673b17f2f9bSRay Jui 	"cws_sys_req3",
674b17f2f9bSRay Jui 	"digmic1_clk",
675b17f2f9bSRay Jui 	"digmic1_dq",
676b17f2f9bSRay Jui 	"digmic2_clk",
677b17f2f9bSRay Jui 	"digmic2_dq",
678b17f2f9bSRay Jui 	"gpen13",
679b17f2f9bSRay Jui 	"gpen14",
680b17f2f9bSRay Jui 	"gpen15",
681b17f2f9bSRay Jui 	"gpio00",
682b17f2f9bSRay Jui 	"gpio01",
683b17f2f9bSRay Jui 	"gpio02",
684b17f2f9bSRay Jui 	"gpio03",
685b17f2f9bSRay Jui 	"gpio04",
686b17f2f9bSRay Jui 	"gpio05",
687b17f2f9bSRay Jui 	"gpio06",
688b17f2f9bSRay Jui 	"gpio07",
689b17f2f9bSRay Jui 	"gpio08",
690b17f2f9bSRay Jui 	"gpio09",
691b17f2f9bSRay Jui 	"gpio10",
692b17f2f9bSRay Jui 	"gpio11",
693b17f2f9bSRay Jui 	"gpio12",
694b17f2f9bSRay Jui 	"gpio13",
695b17f2f9bSRay Jui 	"gpio14",
696b17f2f9bSRay Jui 	"gps_pablank",
697b17f2f9bSRay Jui 	"gps_tmark",
698b17f2f9bSRay Jui 	"hdmi_scl",
699b17f2f9bSRay Jui 	"hdmi_sda",
700b17f2f9bSRay Jui 	"ic_dm",
701b17f2f9bSRay Jui 	"ic_dp",
702b17f2f9bSRay Jui 	"kp_col_ip_0",
703b17f2f9bSRay Jui 	"kp_col_ip_1",
704b17f2f9bSRay Jui 	"kp_col_ip_2",
705b17f2f9bSRay Jui 	"kp_col_ip_3",
706b17f2f9bSRay Jui 	"kp_row_op_0",
707b17f2f9bSRay Jui 	"kp_row_op_1",
708b17f2f9bSRay Jui 	"kp_row_op_2",
709b17f2f9bSRay Jui 	"kp_row_op_3",
710b17f2f9bSRay Jui 	"lcd_b_0",
711b17f2f9bSRay Jui 	"lcd_b_1",
712b17f2f9bSRay Jui 	"lcd_b_2",
713b17f2f9bSRay Jui 	"lcd_b_3",
714b17f2f9bSRay Jui 	"lcd_b_4",
715b17f2f9bSRay Jui 	"lcd_b_5",
716b17f2f9bSRay Jui 	"lcd_b_6",
717b17f2f9bSRay Jui 	"lcd_b_7",
718b17f2f9bSRay Jui 	"lcd_g_0",
719b17f2f9bSRay Jui 	"lcd_g_1",
720b17f2f9bSRay Jui 	"lcd_g_2",
721b17f2f9bSRay Jui 	"lcd_g_3",
722b17f2f9bSRay Jui 	"lcd_g_4",
723b17f2f9bSRay Jui 	"lcd_g_5",
724b17f2f9bSRay Jui 	"lcd_g_6",
725b17f2f9bSRay Jui 	"lcd_g_7",
726b17f2f9bSRay Jui 	"lcd_hsync",
727b17f2f9bSRay Jui 	"lcd_oe",
728b17f2f9bSRay Jui 	"lcd_pclk",
729b17f2f9bSRay Jui 	"lcd_r_0",
730b17f2f9bSRay Jui 	"lcd_r_1",
731b17f2f9bSRay Jui 	"lcd_r_2",
732b17f2f9bSRay Jui 	"lcd_r_3",
733b17f2f9bSRay Jui 	"lcd_r_4",
734b17f2f9bSRay Jui 	"lcd_r_5",
735b17f2f9bSRay Jui 	"lcd_r_6",
736b17f2f9bSRay Jui 	"lcd_r_7",
737b17f2f9bSRay Jui 	"lcd_vsync",
738b17f2f9bSRay Jui 	"mdmgpio0",
739b17f2f9bSRay Jui 	"mdmgpio1",
740b17f2f9bSRay Jui 	"mdmgpio2",
741b17f2f9bSRay Jui 	"mdmgpio3",
742b17f2f9bSRay Jui 	"mdmgpio4",
743b17f2f9bSRay Jui 	"mdmgpio5",
744b17f2f9bSRay Jui 	"mdmgpio6",
745b17f2f9bSRay Jui 	"mdmgpio7",
746b17f2f9bSRay Jui 	"mdmgpio8",
747b17f2f9bSRay Jui 	"mphi_data_0",
748b17f2f9bSRay Jui 	"mphi_data_1",
749b17f2f9bSRay Jui 	"mphi_data_2",
750b17f2f9bSRay Jui 	"mphi_data_3",
751b17f2f9bSRay Jui 	"mphi_data_4",
752b17f2f9bSRay Jui 	"mphi_data_5",
753b17f2f9bSRay Jui 	"mphi_data_6",
754b17f2f9bSRay Jui 	"mphi_data_7",
755b17f2f9bSRay Jui 	"mphi_data_8",
756b17f2f9bSRay Jui 	"mphi_data_9",
757b17f2f9bSRay Jui 	"mphi_data_10",
758b17f2f9bSRay Jui 	"mphi_data_11",
759b17f2f9bSRay Jui 	"mphi_data_12",
760b17f2f9bSRay Jui 	"mphi_data_13",
761b17f2f9bSRay Jui 	"mphi_data_14",
762b17f2f9bSRay Jui 	"mphi_data_15",
763b17f2f9bSRay Jui 	"mphi_ha0",
764b17f2f9bSRay Jui 	"mphi_hat0",
765b17f2f9bSRay Jui 	"mphi_hat1",
766b17f2f9bSRay Jui 	"mphi_hce0_n",
767b17f2f9bSRay Jui 	"mphi_hce1_n",
768b17f2f9bSRay Jui 	"mphi_hrd_n",
769b17f2f9bSRay Jui 	"mphi_hwr_n",
770b17f2f9bSRay Jui 	"mphi_run0",
771b17f2f9bSRay Jui 	"mphi_run1",
772b17f2f9bSRay Jui 	"mtx_scan_clk",
773b17f2f9bSRay Jui 	"mtx_scan_data",
774b17f2f9bSRay Jui 	"nand_ad_0",
775b17f2f9bSRay Jui 	"nand_ad_1",
776b17f2f9bSRay Jui 	"nand_ad_2",
777b17f2f9bSRay Jui 	"nand_ad_3",
778b17f2f9bSRay Jui 	"nand_ad_4",
779b17f2f9bSRay Jui 	"nand_ad_5",
780b17f2f9bSRay Jui 	"nand_ad_6",
781b17f2f9bSRay Jui 	"nand_ad_7",
782b17f2f9bSRay Jui 	"nand_ale",
783b17f2f9bSRay Jui 	"nand_cen_0",
784b17f2f9bSRay Jui 	"nand_cen_1",
785b17f2f9bSRay Jui 	"nand_cle",
786b17f2f9bSRay Jui 	"nand_oen",
787b17f2f9bSRay Jui 	"nand_rdy_0",
788b17f2f9bSRay Jui 	"nand_rdy_1",
789b17f2f9bSRay Jui 	"nand_wen",
790b17f2f9bSRay Jui 	"nand_wp",
791b17f2f9bSRay Jui 	"pc1",
792b17f2f9bSRay Jui 	"pc2",
793b17f2f9bSRay Jui 	"pmu_int",
794b17f2f9bSRay Jui 	"pmu_scl",
795b17f2f9bSRay Jui 	"pmu_sda",
796b17f2f9bSRay Jui 	"rfst2g_mtsloten3g",
797b17f2f9bSRay Jui 	"rgmii_0_rx_ctl",
798b17f2f9bSRay Jui 	"rgmii_0_rxc",
799b17f2f9bSRay Jui 	"rgmii_0_rxd_0",
800b17f2f9bSRay Jui 	"rgmii_0_rxd_1",
801b17f2f9bSRay Jui 	"rgmii_0_rxd_2",
802b17f2f9bSRay Jui 	"rgmii_0_rxd_3",
803b17f2f9bSRay Jui 	"rgmii_0_tx_ctl",
804b17f2f9bSRay Jui 	"rgmii_0_txc",
805b17f2f9bSRay Jui 	"rgmii_0_txd_0",
806b17f2f9bSRay Jui 	"rgmii_0_txd_1",
807b17f2f9bSRay Jui 	"rgmii_0_txd_2",
808b17f2f9bSRay Jui 	"rgmii_0_txd_3",
809b17f2f9bSRay Jui 	"rgmii_1_rx_ctl",
810b17f2f9bSRay Jui 	"rgmii_1_rxc",
811b17f2f9bSRay Jui 	"rgmii_1_rxd_0",
812b17f2f9bSRay Jui 	"rgmii_1_rxd_1",
813b17f2f9bSRay Jui 	"rgmii_1_rxd_2",
814b17f2f9bSRay Jui 	"rgmii_1_rxd_3",
815b17f2f9bSRay Jui 	"rgmii_1_tx_ctl",
816b17f2f9bSRay Jui 	"rgmii_1_txc",
817b17f2f9bSRay Jui 	"rgmii_1_txd_0",
818b17f2f9bSRay Jui 	"rgmii_1_txd_1",
819b17f2f9bSRay Jui 	"rgmii_1_txd_2",
820b17f2f9bSRay Jui 	"rgmii_1_txd_3",
821b17f2f9bSRay Jui 	"rgmii_gpio_0",
822b17f2f9bSRay Jui 	"rgmii_gpio_1",
823b17f2f9bSRay Jui 	"rgmii_gpio_2",
824b17f2f9bSRay Jui 	"rgmii_gpio_3",
825b17f2f9bSRay Jui 	"rtxdata2g_txdata3g1",
826b17f2f9bSRay Jui 	"rtxen2g_txdata3g2",
827b17f2f9bSRay Jui 	"rxdata3g0",
828b17f2f9bSRay Jui 	"rxdata3g1",
829b17f2f9bSRay Jui 	"rxdata3g2",
830b17f2f9bSRay Jui 	"sdio1_clk",
831b17f2f9bSRay Jui 	"sdio1_cmd",
832b17f2f9bSRay Jui 	"sdio1_data_0",
833b17f2f9bSRay Jui 	"sdio1_data_1",
834b17f2f9bSRay Jui 	"sdio1_data_2",
835b17f2f9bSRay Jui 	"sdio1_data_3",
836b17f2f9bSRay Jui 	"sdio4_clk",
837b17f2f9bSRay Jui 	"sdio4_cmd",
838b17f2f9bSRay Jui 	"sdio4_data_0",
839b17f2f9bSRay Jui 	"sdio4_data_1",
840b17f2f9bSRay Jui 	"sdio4_data_2",
841b17f2f9bSRay Jui 	"sdio4_data_3",
842b17f2f9bSRay Jui 	"sim_clk",
843b17f2f9bSRay Jui 	"sim_data",
844b17f2f9bSRay Jui 	"sim_det",
845b17f2f9bSRay Jui 	"sim_resetn",
846b17f2f9bSRay Jui 	"sim2_clk",
847b17f2f9bSRay Jui 	"sim2_data",
848b17f2f9bSRay Jui 	"sim2_det",
849b17f2f9bSRay Jui 	"sim2_resetn",
850b17f2f9bSRay Jui 	"sri_c",
851b17f2f9bSRay Jui 	"sri_d",
852b17f2f9bSRay Jui 	"sri_e",
853b17f2f9bSRay Jui 	"ssp_extclk",
854b17f2f9bSRay Jui 	"ssp0_clk",
855b17f2f9bSRay Jui 	"ssp0_fs",
856b17f2f9bSRay Jui 	"ssp0_rxd",
857b17f2f9bSRay Jui 	"ssp0_txd",
858b17f2f9bSRay Jui 	"ssp2_clk",
859b17f2f9bSRay Jui 	"ssp2_fs_0",
860b17f2f9bSRay Jui 	"ssp2_fs_1",
861b17f2f9bSRay Jui 	"ssp2_fs_2",
862b17f2f9bSRay Jui 	"ssp2_fs_3",
863b17f2f9bSRay Jui 	"ssp2_rxd_0",
864b17f2f9bSRay Jui 	"ssp2_rxd_1",
865b17f2f9bSRay Jui 	"ssp2_txd_0",
866b17f2f9bSRay Jui 	"ssp2_txd_1",
867b17f2f9bSRay Jui 	"ssp3_clk",
868b17f2f9bSRay Jui 	"ssp3_fs",
869b17f2f9bSRay Jui 	"ssp3_rxd",
870b17f2f9bSRay Jui 	"ssp3_txd",
871b17f2f9bSRay Jui 	"ssp4_clk",
872b17f2f9bSRay Jui 	"ssp4_fs",
873b17f2f9bSRay Jui 	"ssp4_rxd",
874b17f2f9bSRay Jui 	"ssp4_txd",
875b17f2f9bSRay Jui 	"ssp5_clk",
876b17f2f9bSRay Jui 	"ssp5_fs",
877b17f2f9bSRay Jui 	"ssp5_rxd",
878b17f2f9bSRay Jui 	"ssp5_txd",
879b17f2f9bSRay Jui 	"ssp6_clk",
880b17f2f9bSRay Jui 	"ssp6_fs",
881b17f2f9bSRay Jui 	"ssp6_rxd",
882b17f2f9bSRay Jui 	"ssp6_txd",
883b17f2f9bSRay Jui 	"stat_1",
884b17f2f9bSRay Jui 	"stat_2",
885b17f2f9bSRay Jui 	"sysclken",
886b17f2f9bSRay Jui 	"traceclk",
887b17f2f9bSRay Jui 	"tracedt00",
888b17f2f9bSRay Jui 	"tracedt01",
889b17f2f9bSRay Jui 	"tracedt02",
890b17f2f9bSRay Jui 	"tracedt03",
891b17f2f9bSRay Jui 	"tracedt04",
892b17f2f9bSRay Jui 	"tracedt05",
893b17f2f9bSRay Jui 	"tracedt06",
894b17f2f9bSRay Jui 	"tracedt07",
895b17f2f9bSRay Jui 	"tracedt08",
896b17f2f9bSRay Jui 	"tracedt09",
897b17f2f9bSRay Jui 	"tracedt10",
898b17f2f9bSRay Jui 	"tracedt11",
899b17f2f9bSRay Jui 	"tracedt12",
900b17f2f9bSRay Jui 	"tracedt13",
901b17f2f9bSRay Jui 	"tracedt14",
902b17f2f9bSRay Jui 	"tracedt15",
903b17f2f9bSRay Jui 	"txdata3g0",
904b17f2f9bSRay Jui 	"txpwrind",
905b17f2f9bSRay Jui 	"uartb1_ucts",
906b17f2f9bSRay Jui 	"uartb1_urts",
907b17f2f9bSRay Jui 	"uartb1_urxd",
908b17f2f9bSRay Jui 	"uartb1_utxd",
909b17f2f9bSRay Jui 	"uartb2_urxd",
910b17f2f9bSRay Jui 	"uartb2_utxd",
911b17f2f9bSRay Jui 	"uartb3_ucts",
912b17f2f9bSRay Jui 	"uartb3_urts",
913b17f2f9bSRay Jui 	"uartb3_urxd",
914b17f2f9bSRay Jui 	"uartb3_utxd",
915b17f2f9bSRay Jui 	"uartb4_ucts",
916b17f2f9bSRay Jui 	"uartb4_urts",
917b17f2f9bSRay Jui 	"uartb4_urxd",
918b17f2f9bSRay Jui 	"uartb4_utxd",
919b17f2f9bSRay Jui 	"vc_cam1_scl",
920b17f2f9bSRay Jui 	"vc_cam1_sda",
921b17f2f9bSRay Jui 	"vc_cam2_scl",
922b17f2f9bSRay Jui 	"vc_cam2_sda",
923b17f2f9bSRay Jui 	"vc_cam3_scl",
924b17f2f9bSRay Jui 	"vc_cam3_sda",
925b17f2f9bSRay Jui };
926b17f2f9bSRay Jui 
927b17f2f9bSRay Jui /* Every pin can implement all ALT1-ALT4 functions */
928b17f2f9bSRay Jui #define BCM281XX_PIN_FUNCTION(fcn_name)			\
929b17f2f9bSRay Jui {							\
930b17f2f9bSRay Jui 	.name = #fcn_name,				\
931b17f2f9bSRay Jui 	.groups = bcm281xx_alt_groups,			\
932b17f2f9bSRay Jui 	.ngroups = ARRAY_SIZE(bcm281xx_alt_groups),	\
933b17f2f9bSRay Jui }
934b17f2f9bSRay Jui 
935b17f2f9bSRay Jui static const struct bcm281xx_pin_function bcm281xx_functions[] = {
936b17f2f9bSRay Jui 	BCM281XX_PIN_FUNCTION(alt1),
937b17f2f9bSRay Jui 	BCM281XX_PIN_FUNCTION(alt2),
938b17f2f9bSRay Jui 	BCM281XX_PIN_FUNCTION(alt3),
939b17f2f9bSRay Jui 	BCM281XX_PIN_FUNCTION(alt4),
940b17f2f9bSRay Jui };
941b17f2f9bSRay Jui 
942b17f2f9bSRay Jui static struct bcm281xx_pinctrl_data bcm281xx_pinctrl = {
943b17f2f9bSRay Jui 	.pins = bcm281xx_pinctrl_pins,
944b17f2f9bSRay Jui 	.npins = ARRAY_SIZE(bcm281xx_pinctrl_pins),
945b17f2f9bSRay Jui 	.functions = bcm281xx_functions,
946b17f2f9bSRay Jui 	.nfunctions = ARRAY_SIZE(bcm281xx_functions),
947b17f2f9bSRay Jui };
948b17f2f9bSRay Jui 
949b17f2f9bSRay Jui static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev,
950b17f2f9bSRay Jui 						  unsigned pin)
951b17f2f9bSRay Jui {
952b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
953b17f2f9bSRay Jui 
954b17f2f9bSRay Jui 	if (pin >= pdata->npins)
955b17f2f9bSRay Jui 		return BCM281XX_PIN_TYPE_UNKNOWN;
956b17f2f9bSRay Jui 
957b17f2f9bSRay Jui 	return *(enum bcm281xx_pin_type *)(pdata->pins[pin].drv_data);
958b17f2f9bSRay Jui }
959b17f2f9bSRay Jui 
960b17f2f9bSRay Jui #define BCM281XX_PIN_SHIFT(type, param) \
961b17f2f9bSRay Jui 	(BCM281XX_ ## type ## _PIN_REG_ ## param ## _SHIFT)
962b17f2f9bSRay Jui 
963b17f2f9bSRay Jui #define BCM281XX_PIN_MASK(type, param) \
964b17f2f9bSRay Jui 	(BCM281XX_ ## type ## _PIN_REG_ ## param ## _MASK)
965b17f2f9bSRay Jui 
966b17f2f9bSRay Jui /*
967b17f2f9bSRay Jui  * This helper function is used to build up the value and mask used to write to
968b17f2f9bSRay Jui  * a pin register, but does not actually write to the register.
969b17f2f9bSRay Jui  */
970b17f2f9bSRay Jui static inline void bcm281xx_pin_update(u32 *reg_val, u32 *reg_mask,
971b17f2f9bSRay Jui 				       u32 param_val, u32 param_shift,
972b17f2f9bSRay Jui 				       u32 param_mask)
973b17f2f9bSRay Jui {
974b17f2f9bSRay Jui 	*reg_val &= ~param_mask;
975b17f2f9bSRay Jui 	*reg_val |= (param_val << param_shift) & param_mask;
976b17f2f9bSRay Jui 	*reg_mask |= param_mask;
977b17f2f9bSRay Jui }
978b17f2f9bSRay Jui 
979b17f2f9bSRay Jui static const struct regmap_config bcm281xx_pinctrl_regmap_config = {
980b17f2f9bSRay Jui 	.reg_bits = 32,
981b17f2f9bSRay Jui 	.reg_stride = 4,
982b17f2f9bSRay Jui 	.val_bits = 32,
983b17f2f9bSRay Jui 	.max_register = BCM281XX_PIN_VC_CAM3_SDA,
984b17f2f9bSRay Jui };
985b17f2f9bSRay Jui 
986b17f2f9bSRay Jui static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
987b17f2f9bSRay Jui {
988b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
989b17f2f9bSRay Jui 
990b17f2f9bSRay Jui 	return pdata->npins;
991b17f2f9bSRay Jui }
992b17f2f9bSRay Jui 
993b17f2f9bSRay Jui static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
994b17f2f9bSRay Jui 						   unsigned group)
995b17f2f9bSRay Jui {
996b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
997b17f2f9bSRay Jui 
998b17f2f9bSRay Jui 	return pdata->pins[group].name;
999b17f2f9bSRay Jui }
1000b17f2f9bSRay Jui 
1001b17f2f9bSRay Jui static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
1002b17f2f9bSRay Jui 					   unsigned group,
1003b17f2f9bSRay Jui 					   const unsigned **pins,
1004b17f2f9bSRay Jui 					   unsigned *num_pins)
1005b17f2f9bSRay Jui {
1006b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1007b17f2f9bSRay Jui 
1008b17f2f9bSRay Jui 	*pins = &pdata->pins[group].number;
1009b17f2f9bSRay Jui 	*num_pins = 1;
1010b17f2f9bSRay Jui 
1011b17f2f9bSRay Jui 	return 0;
1012b17f2f9bSRay Jui }
1013b17f2f9bSRay Jui 
1014b17f2f9bSRay Jui static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
1015b17f2f9bSRay Jui 					  struct seq_file *s,
1016b17f2f9bSRay Jui 					  unsigned offset)
1017b17f2f9bSRay Jui {
1018b17f2f9bSRay Jui 	seq_printf(s, " %s", dev_name(pctldev->dev));
1019b17f2f9bSRay Jui }
1020b17f2f9bSRay Jui 
10215fe2501fSJulia Lawall static const struct pinctrl_ops bcm281xx_pinctrl_ops = {
1022b17f2f9bSRay Jui 	.get_groups_count = bcm281xx_pinctrl_get_groups_count,
1023b17f2f9bSRay Jui 	.get_group_name = bcm281xx_pinctrl_get_group_name,
1024b17f2f9bSRay Jui 	.get_group_pins = bcm281xx_pinctrl_get_group_pins,
1025b17f2f9bSRay Jui 	.pin_dbg_show = bcm281xx_pinctrl_pin_dbg_show,
1026b17f2f9bSRay Jui 	.dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
1027d32f7fd3SIrina Tirdea 	.dt_free_map = pinctrl_utils_free_map,
1028b17f2f9bSRay Jui };
1029b17f2f9bSRay Jui 
1030b17f2f9bSRay Jui static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev)
1031b17f2f9bSRay Jui {
1032b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1033b17f2f9bSRay Jui 
1034b17f2f9bSRay Jui 	return pdata->nfunctions;
1035b17f2f9bSRay Jui }
1036b17f2f9bSRay Jui 
1037b17f2f9bSRay Jui static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev,
1038b17f2f9bSRay Jui 						 unsigned function)
1039b17f2f9bSRay Jui {
1040b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1041b17f2f9bSRay Jui 
1042b17f2f9bSRay Jui 	return pdata->functions[function].name;
1043b17f2f9bSRay Jui }
1044b17f2f9bSRay Jui 
1045b17f2f9bSRay Jui static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
1046b17f2f9bSRay Jui 					   unsigned function,
1047b17f2f9bSRay Jui 					   const char * const **groups,
1048b17f2f9bSRay Jui 					   unsigned * const num_groups)
1049b17f2f9bSRay Jui {
1050b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1051b17f2f9bSRay Jui 
1052b17f2f9bSRay Jui 	*groups = pdata->functions[function].groups;
1053b17f2f9bSRay Jui 	*num_groups = pdata->functions[function].ngroups;
1054b17f2f9bSRay Jui 
1055b17f2f9bSRay Jui 	return 0;
1056b17f2f9bSRay Jui }
1057b17f2f9bSRay Jui 
1058b17f2f9bSRay Jui static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev,
1059b17f2f9bSRay Jui 			       unsigned function,
1060b17f2f9bSRay Jui 			       unsigned group)
1061b17f2f9bSRay Jui {
1062b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1063b17f2f9bSRay Jui 	const struct bcm281xx_pin_function *f = &pdata->functions[function];
1064b17f2f9bSRay Jui 	u32 offset = 4 * pdata->pins[group].number;
1065b17f2f9bSRay Jui 	int rc = 0;
1066b17f2f9bSRay Jui 
1067b17f2f9bSRay Jui 	dev_dbg(pctldev->dev,
1068b17f2f9bSRay Jui 		"%s(): Enable function %s (%d) of pin %s (%d) @offset 0x%x.\n",
1069b17f2f9bSRay Jui 		__func__, f->name, function, pdata->pins[group].name,
1070b17f2f9bSRay Jui 		pdata->pins[group].number, offset);
1071b17f2f9bSRay Jui 
1072b17f2f9bSRay Jui 	rc = regmap_update_bits(pdata->regmap, offset,
1073b17f2f9bSRay Jui 		BCM281XX_PIN_REG_F_SEL_MASK,
1074b17f2f9bSRay Jui 		function << BCM281XX_PIN_REG_F_SEL_SHIFT);
1075b17f2f9bSRay Jui 	if (rc)
1076b17f2f9bSRay Jui 		dev_err(pctldev->dev,
1077b17f2f9bSRay Jui 			"Error updating register for pin %s (%d).\n",
1078b17f2f9bSRay Jui 			pdata->pins[group].name, pdata->pins[group].number);
1079b17f2f9bSRay Jui 
1080b17f2f9bSRay Jui 	return rc;
1081b17f2f9bSRay Jui }
1082b17f2f9bSRay Jui 
10835fe2501fSJulia Lawall static const struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = {
1084b17f2f9bSRay Jui 	.get_functions_count = bcm281xx_pinctrl_get_fcns_count,
1085b17f2f9bSRay Jui 	.get_function_name = bcm281xx_pinctrl_get_fcn_name,
1086b17f2f9bSRay Jui 	.get_function_groups = bcm281xx_pinctrl_get_fcn_groups,
1087b17f2f9bSRay Jui 	.set_mux = bcm281xx_pinmux_set,
1088b17f2f9bSRay Jui };
1089b17f2f9bSRay Jui 
1090b17f2f9bSRay Jui static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
1091b17f2f9bSRay Jui 					   unsigned pin,
1092b17f2f9bSRay Jui 					   unsigned long *config)
1093b17f2f9bSRay Jui {
1094b17f2f9bSRay Jui 	return -ENOTSUPP;
1095b17f2f9bSRay Jui }
1096b17f2f9bSRay Jui 
1097b17f2f9bSRay Jui 
1098b17f2f9bSRay Jui /* Goes through the configs and update register val/mask */
1099b17f2f9bSRay Jui static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev,
1100b17f2f9bSRay Jui 				   unsigned pin,
1101b17f2f9bSRay Jui 				   unsigned long *configs,
1102b17f2f9bSRay Jui 				   unsigned num_configs,
1103b17f2f9bSRay Jui 				   u32 *val,
1104b17f2f9bSRay Jui 				   u32 *mask)
1105b17f2f9bSRay Jui {
1106b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1107b17f2f9bSRay Jui 	int i;
1108b17f2f9bSRay Jui 	enum pin_config_param param;
110958957d2eSMika Westerberg 	u32 arg;
1110b17f2f9bSRay Jui 
1111b17f2f9bSRay Jui 	for (i = 0; i < num_configs; i++) {
1112b17f2f9bSRay Jui 		param = pinconf_to_config_param(configs[i]);
1113b17f2f9bSRay Jui 		arg = pinconf_to_config_argument(configs[i]);
1114b17f2f9bSRay Jui 
1115b17f2f9bSRay Jui 		switch (param) {
1116b17f2f9bSRay Jui 		case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1117b17f2f9bSRay Jui 			arg = (arg >= 1 ? 1 : 0);
1118b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1119b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, HYST),
1120b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, HYST));
1121b17f2f9bSRay Jui 			break;
1122b17f2f9bSRay Jui 		/*
1123b17f2f9bSRay Jui 		 * The pin bias can only be one of pull-up, pull-down, or
1124b17f2f9bSRay Jui 		 * disable.  The user does not need to specify a value for the
1125b17f2f9bSRay Jui 		 * property, and the default value from pinconf-generic is
1126b17f2f9bSRay Jui 		 * ignored.
1127b17f2f9bSRay Jui 		 */
1128b17f2f9bSRay Jui 		case PIN_CONFIG_BIAS_DISABLE:
1129b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 0,
1130b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, PULL_UP),
1131b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, PULL_UP));
1132b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 0,
1133b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, PULL_DN),
1134b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, PULL_DN));
1135b17f2f9bSRay Jui 			break;
1136b17f2f9bSRay Jui 
1137b17f2f9bSRay Jui 		case PIN_CONFIG_BIAS_PULL_UP:
1138b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 1,
1139b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, PULL_UP),
1140b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, PULL_UP));
1141b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 0,
1142b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, PULL_DN),
1143b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, PULL_DN));
1144b17f2f9bSRay Jui 			break;
1145b17f2f9bSRay Jui 
1146b17f2f9bSRay Jui 		case PIN_CONFIG_BIAS_PULL_DOWN:
1147b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 0,
1148b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, PULL_UP),
1149b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, PULL_UP));
1150b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 1,
1151b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, PULL_DN),
1152b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, PULL_DN));
1153b17f2f9bSRay Jui 			break;
1154b17f2f9bSRay Jui 
1155b17f2f9bSRay Jui 		case PIN_CONFIG_SLEW_RATE:
1156b17f2f9bSRay Jui 			arg = (arg >= 1 ? 1 : 0);
1157b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1158b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, SLEW),
1159b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, SLEW));
1160b17f2f9bSRay Jui 			break;
1161b17f2f9bSRay Jui 
1162b17f2f9bSRay Jui 		case PIN_CONFIG_INPUT_ENABLE:
1163b17f2f9bSRay Jui 			/* inversed since register is for input _disable_ */
1164b17f2f9bSRay Jui 			arg = (arg >= 1 ? 0 : 1);
1165b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1166b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, INPUT_DIS),
1167b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, INPUT_DIS));
1168b17f2f9bSRay Jui 			break;
1169b17f2f9bSRay Jui 
1170b17f2f9bSRay Jui 		case PIN_CONFIG_DRIVE_STRENGTH:
1171b17f2f9bSRay Jui 			/* Valid range is 2-16 mA, even numbers only */
1172b17f2f9bSRay Jui 			if ((arg < 2) || (arg > 16) || (arg % 2)) {
1173b17f2f9bSRay Jui 				dev_err(pctldev->dev,
1174b17f2f9bSRay Jui 					"Invalid Drive Strength value (%d) for "
1175b17f2f9bSRay Jui 					"pin %s (%d). Valid values are "
1176b17f2f9bSRay Jui 					"(2..16) mA, even numbers only.\n",
1177b17f2f9bSRay Jui 					arg, pdata->pins[pin].name, pin);
1178b17f2f9bSRay Jui 				return -EINVAL;
1179b17f2f9bSRay Jui 			}
1180b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, (arg/2)-1,
1181b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(STD, DRV_STR),
1182b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(STD, DRV_STR));
1183b17f2f9bSRay Jui 			break;
1184b17f2f9bSRay Jui 
1185b17f2f9bSRay Jui 		default:
1186b17f2f9bSRay Jui 			dev_err(pctldev->dev,
1187b17f2f9bSRay Jui 				"Unrecognized pin config %d for pin %s (%d).\n",
1188b17f2f9bSRay Jui 				param, pdata->pins[pin].name, pin);
1189b17f2f9bSRay Jui 			return -EINVAL;
1190b17f2f9bSRay Jui 
1191b17f2f9bSRay Jui 		} /* switch config */
1192b17f2f9bSRay Jui 	} /* for each config */
1193b17f2f9bSRay Jui 
1194b17f2f9bSRay Jui 	return 0;
1195b17f2f9bSRay Jui }
1196b17f2f9bSRay Jui 
1197b17f2f9bSRay Jui /*
1198b17f2f9bSRay Jui  * The pull-up strength for an I2C pin is represented by bits 4-6 in the
1199b17f2f9bSRay Jui  * register with the following mapping:
1200b17f2f9bSRay Jui  *   0b000: No pull-up
1201b17f2f9bSRay Jui  *   0b001: 1200 Ohm
1202b17f2f9bSRay Jui  *   0b010: 1800 Ohm
1203b17f2f9bSRay Jui  *   0b011: 720 Ohm
1204b17f2f9bSRay Jui  *   0b100: 2700 Ohm
1205b17f2f9bSRay Jui  *   0b101: 831 Ohm
1206b17f2f9bSRay Jui  *   0b110: 1080 Ohm
1207b17f2f9bSRay Jui  *   0b111: 568 Ohm
1208b17f2f9bSRay Jui  * This array maps pull-up strength in Ohms to register values (1+index).
1209b17f2f9bSRay Jui  */
1210b17f2f9bSRay Jui static const u16 bcm281xx_pullup_map[] = {
1211b17f2f9bSRay Jui 	1200, 1800, 720, 2700, 831, 1080, 568
1212b17f2f9bSRay Jui };
1213b17f2f9bSRay Jui 
1214b17f2f9bSRay Jui /* Goes through the configs and update register val/mask */
1215b17f2f9bSRay Jui static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev,
1216b17f2f9bSRay Jui 				   unsigned pin,
1217b17f2f9bSRay Jui 				   unsigned long *configs,
1218b17f2f9bSRay Jui 				   unsigned num_configs,
1219b17f2f9bSRay Jui 				   u32 *val,
1220b17f2f9bSRay Jui 				   u32 *mask)
1221b17f2f9bSRay Jui {
1222b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1223b17f2f9bSRay Jui 	int i, j;
1224b17f2f9bSRay Jui 	enum pin_config_param param;
122558957d2eSMika Westerberg 	u32 arg;
1226b17f2f9bSRay Jui 
1227b17f2f9bSRay Jui 	for (i = 0; i < num_configs; i++) {
1228b17f2f9bSRay Jui 		param = pinconf_to_config_param(configs[i]);
1229b17f2f9bSRay Jui 		arg = pinconf_to_config_argument(configs[i]);
1230b17f2f9bSRay Jui 
1231b17f2f9bSRay Jui 		switch (param) {
1232b17f2f9bSRay Jui 		case PIN_CONFIG_BIAS_PULL_UP:
1233b17f2f9bSRay Jui 			for (j = 0; j < ARRAY_SIZE(bcm281xx_pullup_map); j++)
1234b17f2f9bSRay Jui 				if (bcm281xx_pullup_map[j] == arg)
1235b17f2f9bSRay Jui 					break;
1236b17f2f9bSRay Jui 
1237b17f2f9bSRay Jui 			if (j == ARRAY_SIZE(bcm281xx_pullup_map)) {
1238b17f2f9bSRay Jui 				dev_err(pctldev->dev,
1239b17f2f9bSRay Jui 					"Invalid pull-up value (%d) for pin %s "
1240b17f2f9bSRay Jui 					"(%d). Valid values are 568, 720, 831, "
1241b17f2f9bSRay Jui 					"1080, 1200, 1800, 2700 Ohms.\n",
1242b17f2f9bSRay Jui 					arg, pdata->pins[pin].name, pin);
1243b17f2f9bSRay Jui 				return -EINVAL;
1244b17f2f9bSRay Jui 			}
1245b17f2f9bSRay Jui 
1246b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, j+1,
1247b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
1248b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
1249b17f2f9bSRay Jui 			break;
1250b17f2f9bSRay Jui 
1251b17f2f9bSRay Jui 		case PIN_CONFIG_BIAS_DISABLE:
1252b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, 0,
1253b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
1254b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
1255b17f2f9bSRay Jui 			break;
1256b17f2f9bSRay Jui 
1257b17f2f9bSRay Jui 		case PIN_CONFIG_SLEW_RATE:
1258b17f2f9bSRay Jui 			arg = (arg >= 1 ? 1 : 0);
1259b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1260b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(I2C, SLEW),
1261b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(I2C, SLEW));
1262b17f2f9bSRay Jui 			break;
1263b17f2f9bSRay Jui 
1264b17f2f9bSRay Jui 		case PIN_CONFIG_INPUT_ENABLE:
1265b17f2f9bSRay Jui 			/* inversed since register is for input _disable_ */
1266b17f2f9bSRay Jui 			arg = (arg >= 1 ? 0 : 1);
1267b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1268b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(I2C, INPUT_DIS),
1269b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(I2C, INPUT_DIS));
1270b17f2f9bSRay Jui 			break;
1271b17f2f9bSRay Jui 
1272b17f2f9bSRay Jui 		default:
1273b17f2f9bSRay Jui 			dev_err(pctldev->dev,
1274b17f2f9bSRay Jui 				"Unrecognized pin config %d for pin %s (%d).\n",
1275b17f2f9bSRay Jui 				param, pdata->pins[pin].name, pin);
1276b17f2f9bSRay Jui 			return -EINVAL;
1277b17f2f9bSRay Jui 
1278b17f2f9bSRay Jui 		} /* switch config */
1279b17f2f9bSRay Jui 	} /* for each config */
1280b17f2f9bSRay Jui 
1281b17f2f9bSRay Jui 	return 0;
1282b17f2f9bSRay Jui }
1283b17f2f9bSRay Jui 
1284b17f2f9bSRay Jui /* Goes through the configs and update register val/mask */
1285b17f2f9bSRay Jui static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev,
1286b17f2f9bSRay Jui 				    unsigned pin,
1287b17f2f9bSRay Jui 				    unsigned long *configs,
1288b17f2f9bSRay Jui 				    unsigned num_configs,
1289b17f2f9bSRay Jui 				    u32 *val,
1290b17f2f9bSRay Jui 				    u32 *mask)
1291b17f2f9bSRay Jui {
1292b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1293b17f2f9bSRay Jui 	int i;
1294b17f2f9bSRay Jui 	enum pin_config_param param;
129558957d2eSMika Westerberg 	u32 arg;
1296b17f2f9bSRay Jui 
1297b17f2f9bSRay Jui 	for (i = 0; i < num_configs; i++) {
1298b17f2f9bSRay Jui 		param = pinconf_to_config_param(configs[i]);
1299b17f2f9bSRay Jui 		arg = pinconf_to_config_argument(configs[i]);
1300b17f2f9bSRay Jui 
1301b17f2f9bSRay Jui 		switch (param) {
1302b17f2f9bSRay Jui 		case PIN_CONFIG_SLEW_RATE:
1303b17f2f9bSRay Jui 			arg = (arg >= 1 ? 1 : 0);
1304b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1305b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(HDMI, MODE),
1306b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(HDMI, MODE));
1307b17f2f9bSRay Jui 			break;
1308b17f2f9bSRay Jui 
1309b17f2f9bSRay Jui 		case PIN_CONFIG_INPUT_ENABLE:
1310b17f2f9bSRay Jui 			/* inversed since register is for input _disable_ */
1311b17f2f9bSRay Jui 			arg = (arg >= 1 ? 0 : 1);
1312b17f2f9bSRay Jui 			bcm281xx_pin_update(val, mask, arg,
1313b17f2f9bSRay Jui 				BCM281XX_PIN_SHIFT(HDMI, INPUT_DIS),
1314b17f2f9bSRay Jui 				BCM281XX_PIN_MASK(HDMI, INPUT_DIS));
1315b17f2f9bSRay Jui 			break;
1316b17f2f9bSRay Jui 
1317b17f2f9bSRay Jui 		default:
1318b17f2f9bSRay Jui 			dev_err(pctldev->dev,
1319b17f2f9bSRay Jui 				"Unrecognized pin config %d for pin %s (%d).\n",
1320b17f2f9bSRay Jui 				param, pdata->pins[pin].name, pin);
1321b17f2f9bSRay Jui 			return -EINVAL;
1322b17f2f9bSRay Jui 
1323b17f2f9bSRay Jui 		} /* switch config */
1324b17f2f9bSRay Jui 	} /* for each config */
1325b17f2f9bSRay Jui 
1326b17f2f9bSRay Jui 	return 0;
1327b17f2f9bSRay Jui }
1328b17f2f9bSRay Jui 
1329b17f2f9bSRay Jui static int bcm281xx_pinctrl_pin_config_set(struct pinctrl_dev *pctldev,
1330b17f2f9bSRay Jui 					   unsigned pin,
1331b17f2f9bSRay Jui 					   unsigned long *configs,
1332b17f2f9bSRay Jui 					   unsigned num_configs)
1333b17f2f9bSRay Jui {
1334b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1335b17f2f9bSRay Jui 	enum bcm281xx_pin_type pin_type;
1336b17f2f9bSRay Jui 	u32 offset = 4 * pin;
1337b17f2f9bSRay Jui 	u32 cfg_val, cfg_mask;
1338b17f2f9bSRay Jui 	int rc;
1339b17f2f9bSRay Jui 
1340b17f2f9bSRay Jui 	cfg_val = 0;
1341b17f2f9bSRay Jui 	cfg_mask = 0;
1342b17f2f9bSRay Jui 	pin_type = pin_type_get(pctldev, pin);
1343b17f2f9bSRay Jui 
1344b17f2f9bSRay Jui 	/* Different pins have different configuration options */
1345b17f2f9bSRay Jui 	switch (pin_type) {
1346b17f2f9bSRay Jui 	case BCM281XX_PIN_TYPE_STD:
1347b17f2f9bSRay Jui 		rc = bcm281xx_std_pin_update(pctldev, pin, configs,
1348b17f2f9bSRay Jui 			num_configs, &cfg_val, &cfg_mask);
1349b17f2f9bSRay Jui 		break;
1350b17f2f9bSRay Jui 
1351b17f2f9bSRay Jui 	case BCM281XX_PIN_TYPE_I2C:
1352b17f2f9bSRay Jui 		rc = bcm281xx_i2c_pin_update(pctldev, pin, configs,
1353b17f2f9bSRay Jui 			num_configs, &cfg_val, &cfg_mask);
1354b17f2f9bSRay Jui 		break;
1355b17f2f9bSRay Jui 
1356b17f2f9bSRay Jui 	case BCM281XX_PIN_TYPE_HDMI:
1357b17f2f9bSRay Jui 		rc = bcm281xx_hdmi_pin_update(pctldev, pin, configs,
1358b17f2f9bSRay Jui 			num_configs, &cfg_val, &cfg_mask);
1359b17f2f9bSRay Jui 		break;
1360b17f2f9bSRay Jui 
1361b17f2f9bSRay Jui 	default:
1362b17f2f9bSRay Jui 		dev_err(pctldev->dev, "Unknown pin type for pin %s (%d).\n",
1363b17f2f9bSRay Jui 			pdata->pins[pin].name, pin);
1364b17f2f9bSRay Jui 		return -EINVAL;
1365b17f2f9bSRay Jui 
1366b17f2f9bSRay Jui 	} /* switch pin type */
1367b17f2f9bSRay Jui 
1368b17f2f9bSRay Jui 	if (rc)
1369b17f2f9bSRay Jui 		return rc;
1370b17f2f9bSRay Jui 
1371b17f2f9bSRay Jui 	dev_dbg(pctldev->dev,
1372b17f2f9bSRay Jui 		"%s(): Set pin %s (%d) with config 0x%x, mask 0x%x\n",
1373b17f2f9bSRay Jui 		__func__, pdata->pins[pin].name, pin, cfg_val, cfg_mask);
1374b17f2f9bSRay Jui 
1375b17f2f9bSRay Jui 	rc = regmap_update_bits(pdata->regmap, offset, cfg_mask, cfg_val);
1376b17f2f9bSRay Jui 	if (rc) {
1377b17f2f9bSRay Jui 		dev_err(pctldev->dev,
1378b17f2f9bSRay Jui 			"Error updating register for pin %s (%d).\n",
1379b17f2f9bSRay Jui 			pdata->pins[pin].name, pin);
1380b17f2f9bSRay Jui 		return rc;
1381b17f2f9bSRay Jui 	}
1382b17f2f9bSRay Jui 
1383b17f2f9bSRay Jui 	return 0;
1384b17f2f9bSRay Jui }
1385b17f2f9bSRay Jui 
1386b17f2f9bSRay Jui static struct pinconf_ops bcm281xx_pinctrl_pinconf_ops = {
1387b17f2f9bSRay Jui 	.pin_config_get = bcm281xx_pinctrl_pin_config_get,
1388b17f2f9bSRay Jui 	.pin_config_set = bcm281xx_pinctrl_pin_config_set,
1389b17f2f9bSRay Jui };
1390b17f2f9bSRay Jui 
1391b17f2f9bSRay Jui static struct pinctrl_desc bcm281xx_pinctrl_desc = {
1392b17f2f9bSRay Jui 	/* name, pins, npins members initialized in probe function */
1393b17f2f9bSRay Jui 	.pctlops = &bcm281xx_pinctrl_ops,
1394b17f2f9bSRay Jui 	.pmxops = &bcm281xx_pinctrl_pinmux_ops,
1395b17f2f9bSRay Jui 	.confops = &bcm281xx_pinctrl_pinconf_ops,
1396b17f2f9bSRay Jui 	.owner = THIS_MODULE,
1397b17f2f9bSRay Jui };
1398b17f2f9bSRay Jui 
1399b17f2f9bSRay Jui static int __init bcm281xx_pinctrl_probe(struct platform_device *pdev)
1400b17f2f9bSRay Jui {
1401b17f2f9bSRay Jui 	struct bcm281xx_pinctrl_data *pdata = &bcm281xx_pinctrl;
1402b17f2f9bSRay Jui 	struct resource *res;
1403b17f2f9bSRay Jui 	struct pinctrl_dev *pctl;
1404b17f2f9bSRay Jui 
1405b17f2f9bSRay Jui 	/* So far We can assume there is only 1 bank of registers */
1406b17f2f9bSRay Jui 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1407b17f2f9bSRay Jui 	pdata->reg_base = devm_ioremap_resource(&pdev->dev, res);
1408b17f2f9bSRay Jui 	if (IS_ERR(pdata->reg_base)) {
1409b17f2f9bSRay Jui 		dev_err(&pdev->dev, "Failed to ioremap MEM resource\n");
1410b17f2f9bSRay Jui 		return -ENODEV;
1411b17f2f9bSRay Jui 	}
1412b17f2f9bSRay Jui 
1413b17f2f9bSRay Jui 	/* Initialize the dynamic part of pinctrl_desc */
1414b17f2f9bSRay Jui 	pdata->regmap = devm_regmap_init_mmio(&pdev->dev, pdata->reg_base,
1415b17f2f9bSRay Jui 		&bcm281xx_pinctrl_regmap_config);
1416b17f2f9bSRay Jui 	if (IS_ERR(pdata->regmap)) {
1417b17f2f9bSRay Jui 		dev_err(&pdev->dev, "Regmap MMIO init failed.\n");
1418b17f2f9bSRay Jui 		return -ENODEV;
1419b17f2f9bSRay Jui 	}
1420b17f2f9bSRay Jui 
1421b17f2f9bSRay Jui 	bcm281xx_pinctrl_desc.name = dev_name(&pdev->dev);
1422b17f2f9bSRay Jui 	bcm281xx_pinctrl_desc.pins = bcm281xx_pinctrl.pins;
1423b17f2f9bSRay Jui 	bcm281xx_pinctrl_desc.npins = bcm281xx_pinctrl.npins;
1424b17f2f9bSRay Jui 
14257f5567aaSLaxman Dewangan 	pctl = devm_pinctrl_register(&pdev->dev, &bcm281xx_pinctrl_desc, pdata);
1426323de9efSMasahiro Yamada 	if (IS_ERR(pctl)) {
1427b17f2f9bSRay Jui 		dev_err(&pdev->dev, "Failed to register pinctrl\n");
1428323de9efSMasahiro Yamada 		return PTR_ERR(pctl);
1429b17f2f9bSRay Jui 	}
1430b17f2f9bSRay Jui 
1431b17f2f9bSRay Jui 	platform_set_drvdata(pdev, pdata);
1432b17f2f9bSRay Jui 
1433b17f2f9bSRay Jui 	return 0;
1434b17f2f9bSRay Jui }
1435b17f2f9bSRay Jui 
1436b17f2f9bSRay Jui static const struct of_device_id bcm281xx_pinctrl_of_match[] = {
1437b17f2f9bSRay Jui 	{ .compatible = "brcm,bcm11351-pinctrl", },
1438b17f2f9bSRay Jui 	{ },
1439b17f2f9bSRay Jui };
1440b17f2f9bSRay Jui 
1441b17f2f9bSRay Jui static struct platform_driver bcm281xx_pinctrl_driver = {
1442b17f2f9bSRay Jui 	.driver = {
1443b17f2f9bSRay Jui 		.name = "bcm281xx-pinctrl",
1444b17f2f9bSRay Jui 		.of_match_table = bcm281xx_pinctrl_of_match,
1445b17f2f9bSRay Jui 	},
1446b17f2f9bSRay Jui };
1447b17f2f9bSRay Jui 
1448b17f2f9bSRay Jui module_platform_driver_probe(bcm281xx_pinctrl_driver, bcm281xx_pinctrl_probe);
1449b17f2f9bSRay Jui 
1450b17f2f9bSRay Jui MODULE_AUTHOR("Broadcom Corporation <bcm-kernel-feedback-list@broadcom.com>");
1451b17f2f9bSRay Jui MODULE_AUTHOR("Sherman Yin <syin@broadcom.com>");
1452b17f2f9bSRay Jui MODULE_DESCRIPTION("Broadcom BCM281xx pinctrl driver");
1453b17f2f9bSRay Jui MODULE_LICENSE("GPL v2");
1454