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