0001
0002
0003
0004 #include <linux/err.h>
0005 #include <linux/io.h>
0006 #include <linux/init.h>
0007 #include <linux/of.h>
0008 #include <linux/platform_device.h>
0009 #include <linux/pinctrl/pinctrl.h>
0010 #include <linux/pinctrl/pinmux.h>
0011 #include <linux/pinctrl/pinconf.h>
0012 #include <linux/pinctrl/pinconf-generic.h>
0013 #include <linux/regmap.h>
0014 #include <linux/slab.h>
0015 #include "../core.h"
0016 #include "../pinctrl-utils.h"
0017
0018
0019
0020
0021 #define BCM281XX_PIN_REG_F_SEL_MASK 0x0700
0022 #define BCM281XX_PIN_REG_F_SEL_SHIFT 8
0023
0024
0025 #define BCM281XX_STD_PIN_REG_DRV_STR_MASK 0x0007
0026 #define BCM281XX_STD_PIN_REG_DRV_STR_SHIFT 0
0027 #define BCM281XX_STD_PIN_REG_INPUT_DIS_MASK 0x0008
0028 #define BCM281XX_STD_PIN_REG_INPUT_DIS_SHIFT 3
0029 #define BCM281XX_STD_PIN_REG_SLEW_MASK 0x0010
0030 #define BCM281XX_STD_PIN_REG_SLEW_SHIFT 4
0031 #define BCM281XX_STD_PIN_REG_PULL_UP_MASK 0x0020
0032 #define BCM281XX_STD_PIN_REG_PULL_UP_SHIFT 5
0033 #define BCM281XX_STD_PIN_REG_PULL_DN_MASK 0x0040
0034 #define BCM281XX_STD_PIN_REG_PULL_DN_SHIFT 6
0035 #define BCM281XX_STD_PIN_REG_HYST_MASK 0x0080
0036 #define BCM281XX_STD_PIN_REG_HYST_SHIFT 7
0037
0038
0039 #define BCM281XX_I2C_PIN_REG_INPUT_DIS_MASK 0x0004
0040 #define BCM281XX_I2C_PIN_REG_INPUT_DIS_SHIFT 2
0041 #define BCM281XX_I2C_PIN_REG_SLEW_MASK 0x0008
0042 #define BCM281XX_I2C_PIN_REG_SLEW_SHIFT 3
0043 #define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK 0x0070
0044 #define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT 4
0045
0046
0047 #define BCM281XX_HDMI_PIN_REG_INPUT_DIS_MASK 0x0008
0048 #define BCM281XX_HDMI_PIN_REG_INPUT_DIS_SHIFT 3
0049 #define BCM281XX_HDMI_PIN_REG_MODE_MASK 0x0010
0050 #define BCM281XX_HDMI_PIN_REG_MODE_SHIFT 4
0051
0052
0053
0054
0055 enum bcm281xx_pin_type {
0056 BCM281XX_PIN_TYPE_UNKNOWN = 0,
0057 BCM281XX_PIN_TYPE_STD,
0058 BCM281XX_PIN_TYPE_I2C,
0059 BCM281XX_PIN_TYPE_HDMI,
0060 };
0061
0062 static enum bcm281xx_pin_type std_pin = BCM281XX_PIN_TYPE_STD;
0063 static enum bcm281xx_pin_type i2c_pin = BCM281XX_PIN_TYPE_I2C;
0064 static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI;
0065
0066
0067
0068
0069 struct bcm281xx_pin_function {
0070 const char *name;
0071 const char * const *groups;
0072 const unsigned ngroups;
0073 };
0074
0075
0076
0077
0078
0079 struct bcm281xx_pinctrl_data {
0080 void __iomem *reg_base;
0081
0082
0083 const struct pinctrl_pin_desc *pins;
0084 const unsigned npins;
0085
0086 const struct bcm281xx_pin_function *functions;
0087 const unsigned nfunctions;
0088
0089 struct regmap *regmap;
0090 };
0091
0092
0093
0094
0095
0096 #define BCM281XX_PIN_ADCSYNC 0
0097 #define BCM281XX_PIN_BAT_RM 1
0098 #define BCM281XX_PIN_BSC1_SCL 2
0099 #define BCM281XX_PIN_BSC1_SDA 3
0100 #define BCM281XX_PIN_BSC2_SCL 4
0101 #define BCM281XX_PIN_BSC2_SDA 5
0102 #define BCM281XX_PIN_CLASSGPWR 6
0103 #define BCM281XX_PIN_CLK_CX8 7
0104 #define BCM281XX_PIN_CLKOUT_0 8
0105 #define BCM281XX_PIN_CLKOUT_1 9
0106 #define BCM281XX_PIN_CLKOUT_2 10
0107 #define BCM281XX_PIN_CLKOUT_3 11
0108 #define BCM281XX_PIN_CLKREQ_IN_0 12
0109 #define BCM281XX_PIN_CLKREQ_IN_1 13
0110 #define BCM281XX_PIN_CWS_SYS_REQ1 14
0111 #define BCM281XX_PIN_CWS_SYS_REQ2 15
0112 #define BCM281XX_PIN_CWS_SYS_REQ3 16
0113 #define BCM281XX_PIN_DIGMIC1_CLK 17
0114 #define BCM281XX_PIN_DIGMIC1_DQ 18
0115 #define BCM281XX_PIN_DIGMIC2_CLK 19
0116 #define BCM281XX_PIN_DIGMIC2_DQ 20
0117 #define BCM281XX_PIN_GPEN13 21
0118 #define BCM281XX_PIN_GPEN14 22
0119 #define BCM281XX_PIN_GPEN15 23
0120 #define BCM281XX_PIN_GPIO00 24
0121 #define BCM281XX_PIN_GPIO01 25
0122 #define BCM281XX_PIN_GPIO02 26
0123 #define BCM281XX_PIN_GPIO03 27
0124 #define BCM281XX_PIN_GPIO04 28
0125 #define BCM281XX_PIN_GPIO05 29
0126 #define BCM281XX_PIN_GPIO06 30
0127 #define BCM281XX_PIN_GPIO07 31
0128 #define BCM281XX_PIN_GPIO08 32
0129 #define BCM281XX_PIN_GPIO09 33
0130 #define BCM281XX_PIN_GPIO10 34
0131 #define BCM281XX_PIN_GPIO11 35
0132 #define BCM281XX_PIN_GPIO12 36
0133 #define BCM281XX_PIN_GPIO13 37
0134 #define BCM281XX_PIN_GPIO14 38
0135 #define BCM281XX_PIN_GPS_PABLANK 39
0136 #define BCM281XX_PIN_GPS_TMARK 40
0137 #define BCM281XX_PIN_HDMI_SCL 41
0138 #define BCM281XX_PIN_HDMI_SDA 42
0139 #define BCM281XX_PIN_IC_DM 43
0140 #define BCM281XX_PIN_IC_DP 44
0141 #define BCM281XX_PIN_KP_COL_IP_0 45
0142 #define BCM281XX_PIN_KP_COL_IP_1 46
0143 #define BCM281XX_PIN_KP_COL_IP_2 47
0144 #define BCM281XX_PIN_KP_COL_IP_3 48
0145 #define BCM281XX_PIN_KP_ROW_OP_0 49
0146 #define BCM281XX_PIN_KP_ROW_OP_1 50
0147 #define BCM281XX_PIN_KP_ROW_OP_2 51
0148 #define BCM281XX_PIN_KP_ROW_OP_3 52
0149 #define BCM281XX_PIN_LCD_B_0 53
0150 #define BCM281XX_PIN_LCD_B_1 54
0151 #define BCM281XX_PIN_LCD_B_2 55
0152 #define BCM281XX_PIN_LCD_B_3 56
0153 #define BCM281XX_PIN_LCD_B_4 57
0154 #define BCM281XX_PIN_LCD_B_5 58
0155 #define BCM281XX_PIN_LCD_B_6 59
0156 #define BCM281XX_PIN_LCD_B_7 60
0157 #define BCM281XX_PIN_LCD_G_0 61
0158 #define BCM281XX_PIN_LCD_G_1 62
0159 #define BCM281XX_PIN_LCD_G_2 63
0160 #define BCM281XX_PIN_LCD_G_3 64
0161 #define BCM281XX_PIN_LCD_G_4 65
0162 #define BCM281XX_PIN_LCD_G_5 66
0163 #define BCM281XX_PIN_LCD_G_6 67
0164 #define BCM281XX_PIN_LCD_G_7 68
0165 #define BCM281XX_PIN_LCD_HSYNC 69
0166 #define BCM281XX_PIN_LCD_OE 70
0167 #define BCM281XX_PIN_LCD_PCLK 71
0168 #define BCM281XX_PIN_LCD_R_0 72
0169 #define BCM281XX_PIN_LCD_R_1 73
0170 #define BCM281XX_PIN_LCD_R_2 74
0171 #define BCM281XX_PIN_LCD_R_3 75
0172 #define BCM281XX_PIN_LCD_R_4 76
0173 #define BCM281XX_PIN_LCD_R_5 77
0174 #define BCM281XX_PIN_LCD_R_6 78
0175 #define BCM281XX_PIN_LCD_R_7 79
0176 #define BCM281XX_PIN_LCD_VSYNC 80
0177 #define BCM281XX_PIN_MDMGPIO0 81
0178 #define BCM281XX_PIN_MDMGPIO1 82
0179 #define BCM281XX_PIN_MDMGPIO2 83
0180 #define BCM281XX_PIN_MDMGPIO3 84
0181 #define BCM281XX_PIN_MDMGPIO4 85
0182 #define BCM281XX_PIN_MDMGPIO5 86
0183 #define BCM281XX_PIN_MDMGPIO6 87
0184 #define BCM281XX_PIN_MDMGPIO7 88
0185 #define BCM281XX_PIN_MDMGPIO8 89
0186 #define BCM281XX_PIN_MPHI_DATA_0 90
0187 #define BCM281XX_PIN_MPHI_DATA_1 91
0188 #define BCM281XX_PIN_MPHI_DATA_2 92
0189 #define BCM281XX_PIN_MPHI_DATA_3 93
0190 #define BCM281XX_PIN_MPHI_DATA_4 94
0191 #define BCM281XX_PIN_MPHI_DATA_5 95
0192 #define BCM281XX_PIN_MPHI_DATA_6 96
0193 #define BCM281XX_PIN_MPHI_DATA_7 97
0194 #define BCM281XX_PIN_MPHI_DATA_8 98
0195 #define BCM281XX_PIN_MPHI_DATA_9 99
0196 #define BCM281XX_PIN_MPHI_DATA_10 100
0197 #define BCM281XX_PIN_MPHI_DATA_11 101
0198 #define BCM281XX_PIN_MPHI_DATA_12 102
0199 #define BCM281XX_PIN_MPHI_DATA_13 103
0200 #define BCM281XX_PIN_MPHI_DATA_14 104
0201 #define BCM281XX_PIN_MPHI_DATA_15 105
0202 #define BCM281XX_PIN_MPHI_HA0 106
0203 #define BCM281XX_PIN_MPHI_HAT0 107
0204 #define BCM281XX_PIN_MPHI_HAT1 108
0205 #define BCM281XX_PIN_MPHI_HCE0_N 109
0206 #define BCM281XX_PIN_MPHI_HCE1_N 110
0207 #define BCM281XX_PIN_MPHI_HRD_N 111
0208 #define BCM281XX_PIN_MPHI_HWR_N 112
0209 #define BCM281XX_PIN_MPHI_RUN0 113
0210 #define BCM281XX_PIN_MPHI_RUN1 114
0211 #define BCM281XX_PIN_MTX_SCAN_CLK 115
0212 #define BCM281XX_PIN_MTX_SCAN_DATA 116
0213 #define BCM281XX_PIN_NAND_AD_0 117
0214 #define BCM281XX_PIN_NAND_AD_1 118
0215 #define BCM281XX_PIN_NAND_AD_2 119
0216 #define BCM281XX_PIN_NAND_AD_3 120
0217 #define BCM281XX_PIN_NAND_AD_4 121
0218 #define BCM281XX_PIN_NAND_AD_5 122
0219 #define BCM281XX_PIN_NAND_AD_6 123
0220 #define BCM281XX_PIN_NAND_AD_7 124
0221 #define BCM281XX_PIN_NAND_ALE 125
0222 #define BCM281XX_PIN_NAND_CEN_0 126
0223 #define BCM281XX_PIN_NAND_CEN_1 127
0224 #define BCM281XX_PIN_NAND_CLE 128
0225 #define BCM281XX_PIN_NAND_OEN 129
0226 #define BCM281XX_PIN_NAND_RDY_0 130
0227 #define BCM281XX_PIN_NAND_RDY_1 131
0228 #define BCM281XX_PIN_NAND_WEN 132
0229 #define BCM281XX_PIN_NAND_WP 133
0230 #define BCM281XX_PIN_PC1 134
0231 #define BCM281XX_PIN_PC2 135
0232 #define BCM281XX_PIN_PMU_INT 136
0233 #define BCM281XX_PIN_PMU_SCL 137
0234 #define BCM281XX_PIN_PMU_SDA 138
0235 #define BCM281XX_PIN_RFST2G_MTSLOTEN3G 139
0236 #define BCM281XX_PIN_RGMII_0_RX_CTL 140
0237 #define BCM281XX_PIN_RGMII_0_RXC 141
0238 #define BCM281XX_PIN_RGMII_0_RXD_0 142
0239 #define BCM281XX_PIN_RGMII_0_RXD_1 143
0240 #define BCM281XX_PIN_RGMII_0_RXD_2 144
0241 #define BCM281XX_PIN_RGMII_0_RXD_3 145
0242 #define BCM281XX_PIN_RGMII_0_TX_CTL 146
0243 #define BCM281XX_PIN_RGMII_0_TXC 147
0244 #define BCM281XX_PIN_RGMII_0_TXD_0 148
0245 #define BCM281XX_PIN_RGMII_0_TXD_1 149
0246 #define BCM281XX_PIN_RGMII_0_TXD_2 150
0247 #define BCM281XX_PIN_RGMII_0_TXD_3 151
0248 #define BCM281XX_PIN_RGMII_1_RX_CTL 152
0249 #define BCM281XX_PIN_RGMII_1_RXC 153
0250 #define BCM281XX_PIN_RGMII_1_RXD_0 154
0251 #define BCM281XX_PIN_RGMII_1_RXD_1 155
0252 #define BCM281XX_PIN_RGMII_1_RXD_2 156
0253 #define BCM281XX_PIN_RGMII_1_RXD_3 157
0254 #define BCM281XX_PIN_RGMII_1_TX_CTL 158
0255 #define BCM281XX_PIN_RGMII_1_TXC 159
0256 #define BCM281XX_PIN_RGMII_1_TXD_0 160
0257 #define BCM281XX_PIN_RGMII_1_TXD_1 161
0258 #define BCM281XX_PIN_RGMII_1_TXD_2 162
0259 #define BCM281XX_PIN_RGMII_1_TXD_3 163
0260 #define BCM281XX_PIN_RGMII_GPIO_0 164
0261 #define BCM281XX_PIN_RGMII_GPIO_1 165
0262 #define BCM281XX_PIN_RGMII_GPIO_2 166
0263 #define BCM281XX_PIN_RGMII_GPIO_3 167
0264 #define BCM281XX_PIN_RTXDATA2G_TXDATA3G1 168
0265 #define BCM281XX_PIN_RTXEN2G_TXDATA3G2 169
0266 #define BCM281XX_PIN_RXDATA3G0 170
0267 #define BCM281XX_PIN_RXDATA3G1 171
0268 #define BCM281XX_PIN_RXDATA3G2 172
0269 #define BCM281XX_PIN_SDIO1_CLK 173
0270 #define BCM281XX_PIN_SDIO1_CMD 174
0271 #define BCM281XX_PIN_SDIO1_DATA_0 175
0272 #define BCM281XX_PIN_SDIO1_DATA_1 176
0273 #define BCM281XX_PIN_SDIO1_DATA_2 177
0274 #define BCM281XX_PIN_SDIO1_DATA_3 178
0275 #define BCM281XX_PIN_SDIO4_CLK 179
0276 #define BCM281XX_PIN_SDIO4_CMD 180
0277 #define BCM281XX_PIN_SDIO4_DATA_0 181
0278 #define BCM281XX_PIN_SDIO4_DATA_1 182
0279 #define BCM281XX_PIN_SDIO4_DATA_2 183
0280 #define BCM281XX_PIN_SDIO4_DATA_3 184
0281 #define BCM281XX_PIN_SIM_CLK 185
0282 #define BCM281XX_PIN_SIM_DATA 186
0283 #define BCM281XX_PIN_SIM_DET 187
0284 #define BCM281XX_PIN_SIM_RESETN 188
0285 #define BCM281XX_PIN_SIM2_CLK 189
0286 #define BCM281XX_PIN_SIM2_DATA 190
0287 #define BCM281XX_PIN_SIM2_DET 191
0288 #define BCM281XX_PIN_SIM2_RESETN 192
0289 #define BCM281XX_PIN_SRI_C 193
0290 #define BCM281XX_PIN_SRI_D 194
0291 #define BCM281XX_PIN_SRI_E 195
0292 #define BCM281XX_PIN_SSP_EXTCLK 196
0293 #define BCM281XX_PIN_SSP0_CLK 197
0294 #define BCM281XX_PIN_SSP0_FS 198
0295 #define BCM281XX_PIN_SSP0_RXD 199
0296 #define BCM281XX_PIN_SSP0_TXD 200
0297 #define BCM281XX_PIN_SSP2_CLK 201
0298 #define BCM281XX_PIN_SSP2_FS_0 202
0299 #define BCM281XX_PIN_SSP2_FS_1 203
0300 #define BCM281XX_PIN_SSP2_FS_2 204
0301 #define BCM281XX_PIN_SSP2_FS_3 205
0302 #define BCM281XX_PIN_SSP2_RXD_0 206
0303 #define BCM281XX_PIN_SSP2_RXD_1 207
0304 #define BCM281XX_PIN_SSP2_TXD_0 208
0305 #define BCM281XX_PIN_SSP2_TXD_1 209
0306 #define BCM281XX_PIN_SSP3_CLK 210
0307 #define BCM281XX_PIN_SSP3_FS 211
0308 #define BCM281XX_PIN_SSP3_RXD 212
0309 #define BCM281XX_PIN_SSP3_TXD 213
0310 #define BCM281XX_PIN_SSP4_CLK 214
0311 #define BCM281XX_PIN_SSP4_FS 215
0312 #define BCM281XX_PIN_SSP4_RXD 216
0313 #define BCM281XX_PIN_SSP4_TXD 217
0314 #define BCM281XX_PIN_SSP5_CLK 218
0315 #define BCM281XX_PIN_SSP5_FS 219
0316 #define BCM281XX_PIN_SSP5_RXD 220
0317 #define BCM281XX_PIN_SSP5_TXD 221
0318 #define BCM281XX_PIN_SSP6_CLK 222
0319 #define BCM281XX_PIN_SSP6_FS 223
0320 #define BCM281XX_PIN_SSP6_RXD 224
0321 #define BCM281XX_PIN_SSP6_TXD 225
0322 #define BCM281XX_PIN_STAT_1 226
0323 #define BCM281XX_PIN_STAT_2 227
0324 #define BCM281XX_PIN_SYSCLKEN 228
0325 #define BCM281XX_PIN_TRACECLK 229
0326 #define BCM281XX_PIN_TRACEDT00 230
0327 #define BCM281XX_PIN_TRACEDT01 231
0328 #define BCM281XX_PIN_TRACEDT02 232
0329 #define BCM281XX_PIN_TRACEDT03 233
0330 #define BCM281XX_PIN_TRACEDT04 234
0331 #define BCM281XX_PIN_TRACEDT05 235
0332 #define BCM281XX_PIN_TRACEDT06 236
0333 #define BCM281XX_PIN_TRACEDT07 237
0334 #define BCM281XX_PIN_TRACEDT08 238
0335 #define BCM281XX_PIN_TRACEDT09 239
0336 #define BCM281XX_PIN_TRACEDT10 240
0337 #define BCM281XX_PIN_TRACEDT11 241
0338 #define BCM281XX_PIN_TRACEDT12 242
0339 #define BCM281XX_PIN_TRACEDT13 243
0340 #define BCM281XX_PIN_TRACEDT14 244
0341 #define BCM281XX_PIN_TRACEDT15 245
0342 #define BCM281XX_PIN_TXDATA3G0 246
0343 #define BCM281XX_PIN_TXPWRIND 247
0344 #define BCM281XX_PIN_UARTB1_UCTS 248
0345 #define BCM281XX_PIN_UARTB1_URTS 249
0346 #define BCM281XX_PIN_UARTB1_URXD 250
0347 #define BCM281XX_PIN_UARTB1_UTXD 251
0348 #define BCM281XX_PIN_UARTB2_URXD 252
0349 #define BCM281XX_PIN_UARTB2_UTXD 253
0350 #define BCM281XX_PIN_UARTB3_UCTS 254
0351 #define BCM281XX_PIN_UARTB3_URTS 255
0352 #define BCM281XX_PIN_UARTB3_URXD 256
0353 #define BCM281XX_PIN_UARTB3_UTXD 257
0354 #define BCM281XX_PIN_UARTB4_UCTS 258
0355 #define BCM281XX_PIN_UARTB4_URTS 259
0356 #define BCM281XX_PIN_UARTB4_URXD 260
0357 #define BCM281XX_PIN_UARTB4_UTXD 261
0358 #define BCM281XX_PIN_VC_CAM1_SCL 262
0359 #define BCM281XX_PIN_VC_CAM1_SDA 263
0360 #define BCM281XX_PIN_VC_CAM2_SCL 264
0361 #define BCM281XX_PIN_VC_CAM2_SDA 265
0362 #define BCM281XX_PIN_VC_CAM3_SCL 266
0363 #define BCM281XX_PIN_VC_CAM3_SDA 267
0364
0365 #define BCM281XX_PIN_DESC(a, b, c) \
0366 { .number = a, .name = b, .drv_data = &c##_pin }
0367
0368
0369
0370
0371
0372
0373 static const struct pinctrl_pin_desc bcm281xx_pinctrl_pins[] = {
0374 BCM281XX_PIN_DESC(BCM281XX_PIN_ADCSYNC, "adcsync", std),
0375 BCM281XX_PIN_DESC(BCM281XX_PIN_BAT_RM, "bat_rm", std),
0376 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SCL, "bsc1_scl", i2c),
0377 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SDA, "bsc1_sda", i2c),
0378 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SCL, "bsc2_scl", i2c),
0379 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SDA, "bsc2_sda", i2c),
0380 BCM281XX_PIN_DESC(BCM281XX_PIN_CLASSGPWR, "classgpwr", std),
0381 BCM281XX_PIN_DESC(BCM281XX_PIN_CLK_CX8, "clk_cx8", std),
0382 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_0, "clkout_0", std),
0383 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_1, "clkout_1", std),
0384 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_2, "clkout_2", std),
0385 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_3, "clkout_3", std),
0386 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_0, "clkreq_in_0", std),
0387 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_1, "clkreq_in_1", std),
0388 BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ1, "cws_sys_req1", std),
0389 BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ2, "cws_sys_req2", std),
0390 BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ3, "cws_sys_req3", std),
0391 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_CLK, "digmic1_clk", std),
0392 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_DQ, "digmic1_dq", std),
0393 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_CLK, "digmic2_clk", std),
0394 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_DQ, "digmic2_dq", std),
0395 BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN13, "gpen13", std),
0396 BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN14, "gpen14", std),
0397 BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN15, "gpen15", std),
0398 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO00, "gpio00", std),
0399 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO01, "gpio01", std),
0400 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO02, "gpio02", std),
0401 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO03, "gpio03", std),
0402 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO04, "gpio04", std),
0403 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO05, "gpio05", std),
0404 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO06, "gpio06", std),
0405 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO07, "gpio07", std),
0406 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO08, "gpio08", std),
0407 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO09, "gpio09", std),
0408 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO10, "gpio10", std),
0409 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO11, "gpio11", std),
0410 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO12, "gpio12", std),
0411 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO13, "gpio13", std),
0412 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO14, "gpio14", std),
0413 BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_PABLANK, "gps_pablank", std),
0414 BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_TMARK, "gps_tmark", std),
0415 BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SCL, "hdmi_scl", hdmi),
0416 BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SDA, "hdmi_sda", hdmi),
0417 BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DM, "ic_dm", std),
0418 BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DP, "ic_dp", std),
0419 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_0, "kp_col_ip_0", std),
0420 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_1, "kp_col_ip_1", std),
0421 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_2, "kp_col_ip_2", std),
0422 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_3, "kp_col_ip_3", std),
0423 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_0, "kp_row_op_0", std),
0424 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_1, "kp_row_op_1", std),
0425 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_2, "kp_row_op_2", std),
0426 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_3, "kp_row_op_3", std),
0427 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_0, "lcd_b_0", std),
0428 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_1, "lcd_b_1", std),
0429 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_2, "lcd_b_2", std),
0430 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_3, "lcd_b_3", std),
0431 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_4, "lcd_b_4", std),
0432 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_5, "lcd_b_5", std),
0433 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_6, "lcd_b_6", std),
0434 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_7, "lcd_b_7", std),
0435 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_0, "lcd_g_0", std),
0436 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_1, "lcd_g_1", std),
0437 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_2, "lcd_g_2", std),
0438 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_3, "lcd_g_3", std),
0439 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_4, "lcd_g_4", std),
0440 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_5, "lcd_g_5", std),
0441 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_6, "lcd_g_6", std),
0442 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_7, "lcd_g_7", std),
0443 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_HSYNC, "lcd_hsync", std),
0444 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_OE, "lcd_oe", std),
0445 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_PCLK, "lcd_pclk", std),
0446 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_0, "lcd_r_0", std),
0447 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_1, "lcd_r_1", std),
0448 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_2, "lcd_r_2", std),
0449 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_3, "lcd_r_3", std),
0450 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_4, "lcd_r_4", std),
0451 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_5, "lcd_r_5", std),
0452 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_6, "lcd_r_6", std),
0453 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_7, "lcd_r_7", std),
0454 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_VSYNC, "lcd_vsync", std),
0455 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO0, "mdmgpio0", std),
0456 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO1, "mdmgpio1", std),
0457 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO2, "mdmgpio2", std),
0458 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO3, "mdmgpio3", std),
0459 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO4, "mdmgpio4", std),
0460 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO5, "mdmgpio5", std),
0461 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO6, "mdmgpio6", std),
0462 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO7, "mdmgpio7", std),
0463 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO8, "mdmgpio8", std),
0464 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_0, "mphi_data_0", std),
0465 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_1, "mphi_data_1", std),
0466 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_2, "mphi_data_2", std),
0467 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_3, "mphi_data_3", std),
0468 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_4, "mphi_data_4", std),
0469 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_5, "mphi_data_5", std),
0470 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_6, "mphi_data_6", std),
0471 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_7, "mphi_data_7", std),
0472 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_8, "mphi_data_8", std),
0473 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_9, "mphi_data_9", std),
0474 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_10, "mphi_data_10", std),
0475 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_11, "mphi_data_11", std),
0476 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_12, "mphi_data_12", std),
0477 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_13, "mphi_data_13", std),
0478 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_14, "mphi_data_14", std),
0479 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_15, "mphi_data_15", std),
0480 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HA0, "mphi_ha0", std),
0481 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT0, "mphi_hat0", std),
0482 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT1, "mphi_hat1", std),
0483 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE0_N, "mphi_hce0_n", std),
0484 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE1_N, "mphi_hce1_n", std),
0485 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HRD_N, "mphi_hrd_n", std),
0486 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HWR_N, "mphi_hwr_n", std),
0487 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN0, "mphi_run0", std),
0488 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN1, "mphi_run1", std),
0489 BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_CLK, "mtx_scan_clk", std),
0490 BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_DATA, "mtx_scan_data", std),
0491 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_0, "nand_ad_0", std),
0492 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_1, "nand_ad_1", std),
0493 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_2, "nand_ad_2", std),
0494 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_3, "nand_ad_3", std),
0495 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_4, "nand_ad_4", std),
0496 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_5, "nand_ad_5", std),
0497 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_6, "nand_ad_6", std),
0498 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_7, "nand_ad_7", std),
0499 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_ALE, "nand_ale", std),
0500 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_0, "nand_cen_0", std),
0501 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_1, "nand_cen_1", std),
0502 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CLE, "nand_cle", std),
0503 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_OEN, "nand_oen", std),
0504 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_0, "nand_rdy_0", std),
0505 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_1, "nand_rdy_1", std),
0506 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WEN, "nand_wen", std),
0507 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WP, "nand_wp", std),
0508 BCM281XX_PIN_DESC(BCM281XX_PIN_PC1, "pc1", std),
0509 BCM281XX_PIN_DESC(BCM281XX_PIN_PC2, "pc2", std),
0510 BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_INT, "pmu_int", std),
0511 BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SCL, "pmu_scl", i2c),
0512 BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SDA, "pmu_sda", i2c),
0513 BCM281XX_PIN_DESC(BCM281XX_PIN_RFST2G_MTSLOTEN3G, "rfst2g_mtsloten3g",
0514 std),
0515 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RX_CTL, "rgmii_0_rx_ctl", std),
0516 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXC, "rgmii_0_rxc", std),
0517 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_0, "rgmii_0_rxd_0", std),
0518 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_1, "rgmii_0_rxd_1", std),
0519 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_2, "rgmii_0_rxd_2", std),
0520 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_3, "rgmii_0_rxd_3", std),
0521 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TX_CTL, "rgmii_0_tx_ctl", std),
0522 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXC, "rgmii_0_txc", std),
0523 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_0, "rgmii_0_txd_0", std),
0524 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_1, "rgmii_0_txd_1", std),
0525 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_2, "rgmii_0_txd_2", std),
0526 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_3, "rgmii_0_txd_3", std),
0527 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RX_CTL, "rgmii_1_rx_ctl", std),
0528 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXC, "rgmii_1_rxc", std),
0529 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_0, "rgmii_1_rxd_0", std),
0530 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_1, "rgmii_1_rxd_1", std),
0531 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_2, "rgmii_1_rxd_2", std),
0532 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_3, "rgmii_1_rxd_3", std),
0533 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TX_CTL, "rgmii_1_tx_ctl", std),
0534 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXC, "rgmii_1_txc", std),
0535 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_0, "rgmii_1_txd_0", std),
0536 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_1, "rgmii_1_txd_1", std),
0537 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_2, "rgmii_1_txd_2", std),
0538 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_3, "rgmii_1_txd_3", std),
0539 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_0, "rgmii_gpio_0", std),
0540 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_1, "rgmii_gpio_1", std),
0541 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_2, "rgmii_gpio_2", std),
0542 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_3, "rgmii_gpio_3", std),
0543 BCM281XX_PIN_DESC(BCM281XX_PIN_RTXDATA2G_TXDATA3G1,
0544 "rtxdata2g_txdata3g1", std),
0545 BCM281XX_PIN_DESC(BCM281XX_PIN_RTXEN2G_TXDATA3G2, "rtxen2g_txdata3g2",
0546 std),
0547 BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G0, "rxdata3g0", std),
0548 BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G1, "rxdata3g1", std),
0549 BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G2, "rxdata3g2", std),
0550 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CLK, "sdio1_clk", std),
0551 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CMD, "sdio1_cmd", std),
0552 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_0, "sdio1_data_0", std),
0553 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_1, "sdio1_data_1", std),
0554 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_2, "sdio1_data_2", std),
0555 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_3, "sdio1_data_3", std),
0556 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CLK, "sdio4_clk", std),
0557 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CMD, "sdio4_cmd", std),
0558 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_0, "sdio4_data_0", std),
0559 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_1, "sdio4_data_1", std),
0560 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_2, "sdio4_data_2", std),
0561 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_3, "sdio4_data_3", std),
0562 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_CLK, "sim_clk", std),
0563 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DATA, "sim_data", std),
0564 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DET, "sim_det", std),
0565 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_RESETN, "sim_resetn", std),
0566 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_CLK, "sim2_clk", std),
0567 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DATA, "sim2_data", std),
0568 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DET, "sim2_det", std),
0569 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_RESETN, "sim2_resetn", std),
0570 BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_C, "sri_c", std),
0571 BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_D, "sri_d", std),
0572 BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_E, "sri_e", std),
0573 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP_EXTCLK, "ssp_extclk", std),
0574 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_CLK, "ssp0_clk", std),
0575 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_FS, "ssp0_fs", std),
0576 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_RXD, "ssp0_rxd", std),
0577 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_TXD, "ssp0_txd", std),
0578 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_CLK, "ssp2_clk", std),
0579 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_0, "ssp2_fs_0", std),
0580 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_1, "ssp2_fs_1", std),
0581 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_2, "ssp2_fs_2", std),
0582 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_3, "ssp2_fs_3", std),
0583 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_0, "ssp2_rxd_0", std),
0584 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_1, "ssp2_rxd_1", std),
0585 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_0, "ssp2_txd_0", std),
0586 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_1, "ssp2_txd_1", std),
0587 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_CLK, "ssp3_clk", std),
0588 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_FS, "ssp3_fs", std),
0589 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_RXD, "ssp3_rxd", std),
0590 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_TXD, "ssp3_txd", std),
0591 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_CLK, "ssp4_clk", std),
0592 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_FS, "ssp4_fs", std),
0593 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_RXD, "ssp4_rxd", std),
0594 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_TXD, "ssp4_txd", std),
0595 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_CLK, "ssp5_clk", std),
0596 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_FS, "ssp5_fs", std),
0597 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_RXD, "ssp5_rxd", std),
0598 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_TXD, "ssp5_txd", std),
0599 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_CLK, "ssp6_clk", std),
0600 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_FS, "ssp6_fs", std),
0601 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_RXD, "ssp6_rxd", std),
0602 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_TXD, "ssp6_txd", std),
0603 BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_1, "stat_1", std),
0604 BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_2, "stat_2", std),
0605 BCM281XX_PIN_DESC(BCM281XX_PIN_SYSCLKEN, "sysclken", std),
0606 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACECLK, "traceclk", std),
0607 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT00, "tracedt00", std),
0608 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT01, "tracedt01", std),
0609 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT02, "tracedt02", std),
0610 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT03, "tracedt03", std),
0611 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT04, "tracedt04", std),
0612 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT05, "tracedt05", std),
0613 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT06, "tracedt06", std),
0614 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT07, "tracedt07", std),
0615 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT08, "tracedt08", std),
0616 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT09, "tracedt09", std),
0617 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT10, "tracedt10", std),
0618 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT11, "tracedt11", std),
0619 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT12, "tracedt12", std),
0620 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT13, "tracedt13", std),
0621 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT14, "tracedt14", std),
0622 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT15, "tracedt15", std),
0623 BCM281XX_PIN_DESC(BCM281XX_PIN_TXDATA3G0, "txdata3g0", std),
0624 BCM281XX_PIN_DESC(BCM281XX_PIN_TXPWRIND, "txpwrind", std),
0625 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UCTS, "uartb1_ucts", std),
0626 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URTS, "uartb1_urts", std),
0627 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URXD, "uartb1_urxd", std),
0628 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UTXD, "uartb1_utxd", std),
0629 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_URXD, "uartb2_urxd", std),
0630 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_UTXD, "uartb2_utxd", std),
0631 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UCTS, "uartb3_ucts", std),
0632 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URTS, "uartb3_urts", std),
0633 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URXD, "uartb3_urxd", std),
0634 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UTXD, "uartb3_utxd", std),
0635 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UCTS, "uartb4_ucts", std),
0636 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URTS, "uartb4_urts", std),
0637 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URXD, "uartb4_urxd", std),
0638 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UTXD, "uartb4_utxd", std),
0639 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SCL, "vc_cam1_scl", i2c),
0640 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SDA, "vc_cam1_sda", i2c),
0641 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SCL, "vc_cam2_scl", i2c),
0642 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SDA, "vc_cam2_sda", i2c),
0643 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SCL, "vc_cam3_scl", i2c),
0644 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SDA, "vc_cam3_sda", i2c),
0645 };
0646
0647 static const char * const bcm281xx_alt_groups[] = {
0648 "adcsync",
0649 "bat_rm",
0650 "bsc1_scl",
0651 "bsc1_sda",
0652 "bsc2_scl",
0653 "bsc2_sda",
0654 "classgpwr",
0655 "clk_cx8",
0656 "clkout_0",
0657 "clkout_1",
0658 "clkout_2",
0659 "clkout_3",
0660 "clkreq_in_0",
0661 "clkreq_in_1",
0662 "cws_sys_req1",
0663 "cws_sys_req2",
0664 "cws_sys_req3",
0665 "digmic1_clk",
0666 "digmic1_dq",
0667 "digmic2_clk",
0668 "digmic2_dq",
0669 "gpen13",
0670 "gpen14",
0671 "gpen15",
0672 "gpio00",
0673 "gpio01",
0674 "gpio02",
0675 "gpio03",
0676 "gpio04",
0677 "gpio05",
0678 "gpio06",
0679 "gpio07",
0680 "gpio08",
0681 "gpio09",
0682 "gpio10",
0683 "gpio11",
0684 "gpio12",
0685 "gpio13",
0686 "gpio14",
0687 "gps_pablank",
0688 "gps_tmark",
0689 "hdmi_scl",
0690 "hdmi_sda",
0691 "ic_dm",
0692 "ic_dp",
0693 "kp_col_ip_0",
0694 "kp_col_ip_1",
0695 "kp_col_ip_2",
0696 "kp_col_ip_3",
0697 "kp_row_op_0",
0698 "kp_row_op_1",
0699 "kp_row_op_2",
0700 "kp_row_op_3",
0701 "lcd_b_0",
0702 "lcd_b_1",
0703 "lcd_b_2",
0704 "lcd_b_3",
0705 "lcd_b_4",
0706 "lcd_b_5",
0707 "lcd_b_6",
0708 "lcd_b_7",
0709 "lcd_g_0",
0710 "lcd_g_1",
0711 "lcd_g_2",
0712 "lcd_g_3",
0713 "lcd_g_4",
0714 "lcd_g_5",
0715 "lcd_g_6",
0716 "lcd_g_7",
0717 "lcd_hsync",
0718 "lcd_oe",
0719 "lcd_pclk",
0720 "lcd_r_0",
0721 "lcd_r_1",
0722 "lcd_r_2",
0723 "lcd_r_3",
0724 "lcd_r_4",
0725 "lcd_r_5",
0726 "lcd_r_6",
0727 "lcd_r_7",
0728 "lcd_vsync",
0729 "mdmgpio0",
0730 "mdmgpio1",
0731 "mdmgpio2",
0732 "mdmgpio3",
0733 "mdmgpio4",
0734 "mdmgpio5",
0735 "mdmgpio6",
0736 "mdmgpio7",
0737 "mdmgpio8",
0738 "mphi_data_0",
0739 "mphi_data_1",
0740 "mphi_data_2",
0741 "mphi_data_3",
0742 "mphi_data_4",
0743 "mphi_data_5",
0744 "mphi_data_6",
0745 "mphi_data_7",
0746 "mphi_data_8",
0747 "mphi_data_9",
0748 "mphi_data_10",
0749 "mphi_data_11",
0750 "mphi_data_12",
0751 "mphi_data_13",
0752 "mphi_data_14",
0753 "mphi_data_15",
0754 "mphi_ha0",
0755 "mphi_hat0",
0756 "mphi_hat1",
0757 "mphi_hce0_n",
0758 "mphi_hce1_n",
0759 "mphi_hrd_n",
0760 "mphi_hwr_n",
0761 "mphi_run0",
0762 "mphi_run1",
0763 "mtx_scan_clk",
0764 "mtx_scan_data",
0765 "nand_ad_0",
0766 "nand_ad_1",
0767 "nand_ad_2",
0768 "nand_ad_3",
0769 "nand_ad_4",
0770 "nand_ad_5",
0771 "nand_ad_6",
0772 "nand_ad_7",
0773 "nand_ale",
0774 "nand_cen_0",
0775 "nand_cen_1",
0776 "nand_cle",
0777 "nand_oen",
0778 "nand_rdy_0",
0779 "nand_rdy_1",
0780 "nand_wen",
0781 "nand_wp",
0782 "pc1",
0783 "pc2",
0784 "pmu_int",
0785 "pmu_scl",
0786 "pmu_sda",
0787 "rfst2g_mtsloten3g",
0788 "rgmii_0_rx_ctl",
0789 "rgmii_0_rxc",
0790 "rgmii_0_rxd_0",
0791 "rgmii_0_rxd_1",
0792 "rgmii_0_rxd_2",
0793 "rgmii_0_rxd_3",
0794 "rgmii_0_tx_ctl",
0795 "rgmii_0_txc",
0796 "rgmii_0_txd_0",
0797 "rgmii_0_txd_1",
0798 "rgmii_0_txd_2",
0799 "rgmii_0_txd_3",
0800 "rgmii_1_rx_ctl",
0801 "rgmii_1_rxc",
0802 "rgmii_1_rxd_0",
0803 "rgmii_1_rxd_1",
0804 "rgmii_1_rxd_2",
0805 "rgmii_1_rxd_3",
0806 "rgmii_1_tx_ctl",
0807 "rgmii_1_txc",
0808 "rgmii_1_txd_0",
0809 "rgmii_1_txd_1",
0810 "rgmii_1_txd_2",
0811 "rgmii_1_txd_3",
0812 "rgmii_gpio_0",
0813 "rgmii_gpio_1",
0814 "rgmii_gpio_2",
0815 "rgmii_gpio_3",
0816 "rtxdata2g_txdata3g1",
0817 "rtxen2g_txdata3g2",
0818 "rxdata3g0",
0819 "rxdata3g1",
0820 "rxdata3g2",
0821 "sdio1_clk",
0822 "sdio1_cmd",
0823 "sdio1_data_0",
0824 "sdio1_data_1",
0825 "sdio1_data_2",
0826 "sdio1_data_3",
0827 "sdio4_clk",
0828 "sdio4_cmd",
0829 "sdio4_data_0",
0830 "sdio4_data_1",
0831 "sdio4_data_2",
0832 "sdio4_data_3",
0833 "sim_clk",
0834 "sim_data",
0835 "sim_det",
0836 "sim_resetn",
0837 "sim2_clk",
0838 "sim2_data",
0839 "sim2_det",
0840 "sim2_resetn",
0841 "sri_c",
0842 "sri_d",
0843 "sri_e",
0844 "ssp_extclk",
0845 "ssp0_clk",
0846 "ssp0_fs",
0847 "ssp0_rxd",
0848 "ssp0_txd",
0849 "ssp2_clk",
0850 "ssp2_fs_0",
0851 "ssp2_fs_1",
0852 "ssp2_fs_2",
0853 "ssp2_fs_3",
0854 "ssp2_rxd_0",
0855 "ssp2_rxd_1",
0856 "ssp2_txd_0",
0857 "ssp2_txd_1",
0858 "ssp3_clk",
0859 "ssp3_fs",
0860 "ssp3_rxd",
0861 "ssp3_txd",
0862 "ssp4_clk",
0863 "ssp4_fs",
0864 "ssp4_rxd",
0865 "ssp4_txd",
0866 "ssp5_clk",
0867 "ssp5_fs",
0868 "ssp5_rxd",
0869 "ssp5_txd",
0870 "ssp6_clk",
0871 "ssp6_fs",
0872 "ssp6_rxd",
0873 "ssp6_txd",
0874 "stat_1",
0875 "stat_2",
0876 "sysclken",
0877 "traceclk",
0878 "tracedt00",
0879 "tracedt01",
0880 "tracedt02",
0881 "tracedt03",
0882 "tracedt04",
0883 "tracedt05",
0884 "tracedt06",
0885 "tracedt07",
0886 "tracedt08",
0887 "tracedt09",
0888 "tracedt10",
0889 "tracedt11",
0890 "tracedt12",
0891 "tracedt13",
0892 "tracedt14",
0893 "tracedt15",
0894 "txdata3g0",
0895 "txpwrind",
0896 "uartb1_ucts",
0897 "uartb1_urts",
0898 "uartb1_urxd",
0899 "uartb1_utxd",
0900 "uartb2_urxd",
0901 "uartb2_utxd",
0902 "uartb3_ucts",
0903 "uartb3_urts",
0904 "uartb3_urxd",
0905 "uartb3_utxd",
0906 "uartb4_ucts",
0907 "uartb4_urts",
0908 "uartb4_urxd",
0909 "uartb4_utxd",
0910 "vc_cam1_scl",
0911 "vc_cam1_sda",
0912 "vc_cam2_scl",
0913 "vc_cam2_sda",
0914 "vc_cam3_scl",
0915 "vc_cam3_sda",
0916 };
0917
0918
0919 #define BCM281XX_PIN_FUNCTION(fcn_name) \
0920 { \
0921 .name = #fcn_name, \
0922 .groups = bcm281xx_alt_groups, \
0923 .ngroups = ARRAY_SIZE(bcm281xx_alt_groups), \
0924 }
0925
0926 static const struct bcm281xx_pin_function bcm281xx_functions[] = {
0927 BCM281XX_PIN_FUNCTION(alt1),
0928 BCM281XX_PIN_FUNCTION(alt2),
0929 BCM281XX_PIN_FUNCTION(alt3),
0930 BCM281XX_PIN_FUNCTION(alt4),
0931 };
0932
0933 static struct bcm281xx_pinctrl_data bcm281xx_pinctrl = {
0934 .pins = bcm281xx_pinctrl_pins,
0935 .npins = ARRAY_SIZE(bcm281xx_pinctrl_pins),
0936 .functions = bcm281xx_functions,
0937 .nfunctions = ARRAY_SIZE(bcm281xx_functions),
0938 };
0939
0940 static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev,
0941 unsigned pin)
0942 {
0943 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0944
0945 if (pin >= pdata->npins)
0946 return BCM281XX_PIN_TYPE_UNKNOWN;
0947
0948 return *(enum bcm281xx_pin_type *)(pdata->pins[pin].drv_data);
0949 }
0950
0951 #define BCM281XX_PIN_SHIFT(type, param) \
0952 (BCM281XX_ ## type ## _PIN_REG_ ## param ## _SHIFT)
0953
0954 #define BCM281XX_PIN_MASK(type, param) \
0955 (BCM281XX_ ## type ## _PIN_REG_ ## param ## _MASK)
0956
0957
0958
0959
0960
0961 static inline void bcm281xx_pin_update(u32 *reg_val, u32 *reg_mask,
0962 u32 param_val, u32 param_shift,
0963 u32 param_mask)
0964 {
0965 *reg_val &= ~param_mask;
0966 *reg_val |= (param_val << param_shift) & param_mask;
0967 *reg_mask |= param_mask;
0968 }
0969
0970 static const struct regmap_config bcm281xx_pinctrl_regmap_config = {
0971 .reg_bits = 32,
0972 .reg_stride = 4,
0973 .val_bits = 32,
0974 .max_register = BCM281XX_PIN_VC_CAM3_SDA,
0975 };
0976
0977 static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
0978 {
0979 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0980
0981 return pdata->npins;
0982 }
0983
0984 static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
0985 unsigned group)
0986 {
0987 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0988
0989 return pdata->pins[group].name;
0990 }
0991
0992 static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
0993 unsigned group,
0994 const unsigned **pins,
0995 unsigned *num_pins)
0996 {
0997 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
0998
0999 *pins = &pdata->pins[group].number;
1000 *num_pins = 1;
1001
1002 return 0;
1003 }
1004
1005 static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
1006 struct seq_file *s,
1007 unsigned offset)
1008 {
1009 seq_printf(s, " %s", dev_name(pctldev->dev));
1010 }
1011
1012 static const struct pinctrl_ops bcm281xx_pinctrl_ops = {
1013 .get_groups_count = bcm281xx_pinctrl_get_groups_count,
1014 .get_group_name = bcm281xx_pinctrl_get_group_name,
1015 .get_group_pins = bcm281xx_pinctrl_get_group_pins,
1016 .pin_dbg_show = bcm281xx_pinctrl_pin_dbg_show,
1017 .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
1018 .dt_free_map = pinctrl_utils_free_map,
1019 };
1020
1021 static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev)
1022 {
1023 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1024
1025 return pdata->nfunctions;
1026 }
1027
1028 static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev,
1029 unsigned function)
1030 {
1031 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1032
1033 return pdata->functions[function].name;
1034 }
1035
1036 static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
1037 unsigned function,
1038 const char * const **groups,
1039 unsigned * const num_groups)
1040 {
1041 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1042
1043 *groups = pdata->functions[function].groups;
1044 *num_groups = pdata->functions[function].ngroups;
1045
1046 return 0;
1047 }
1048
1049 static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev,
1050 unsigned function,
1051 unsigned group)
1052 {
1053 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1054 const struct bcm281xx_pin_function *f = &pdata->functions[function];
1055 u32 offset = 4 * pdata->pins[group].number;
1056 int rc = 0;
1057
1058 dev_dbg(pctldev->dev,
1059 "%s(): Enable function %s (%d) of pin %s (%d) @offset 0x%x.\n",
1060 __func__, f->name, function, pdata->pins[group].name,
1061 pdata->pins[group].number, offset);
1062
1063 rc = regmap_update_bits(pdata->regmap, offset,
1064 BCM281XX_PIN_REG_F_SEL_MASK,
1065 function << BCM281XX_PIN_REG_F_SEL_SHIFT);
1066 if (rc)
1067 dev_err(pctldev->dev,
1068 "Error updating register for pin %s (%d).\n",
1069 pdata->pins[group].name, pdata->pins[group].number);
1070
1071 return rc;
1072 }
1073
1074 static const struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = {
1075 .get_functions_count = bcm281xx_pinctrl_get_fcns_count,
1076 .get_function_name = bcm281xx_pinctrl_get_fcn_name,
1077 .get_function_groups = bcm281xx_pinctrl_get_fcn_groups,
1078 .set_mux = bcm281xx_pinmux_set,
1079 };
1080
1081 static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
1082 unsigned pin,
1083 unsigned long *config)
1084 {
1085 return -ENOTSUPP;
1086 }
1087
1088
1089
1090 static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev,
1091 unsigned pin,
1092 unsigned long *configs,
1093 unsigned num_configs,
1094 u32 *val,
1095 u32 *mask)
1096 {
1097 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1098 int i;
1099 enum pin_config_param param;
1100 u32 arg;
1101
1102 for (i = 0; i < num_configs; i++) {
1103 param = pinconf_to_config_param(configs[i]);
1104 arg = pinconf_to_config_argument(configs[i]);
1105
1106 switch (param) {
1107 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1108 arg = (arg >= 1 ? 1 : 0);
1109 bcm281xx_pin_update(val, mask, arg,
1110 BCM281XX_PIN_SHIFT(STD, HYST),
1111 BCM281XX_PIN_MASK(STD, HYST));
1112 break;
1113
1114
1115
1116
1117
1118
1119 case PIN_CONFIG_BIAS_DISABLE:
1120 bcm281xx_pin_update(val, mask, 0,
1121 BCM281XX_PIN_SHIFT(STD, PULL_UP),
1122 BCM281XX_PIN_MASK(STD, PULL_UP));
1123 bcm281xx_pin_update(val, mask, 0,
1124 BCM281XX_PIN_SHIFT(STD, PULL_DN),
1125 BCM281XX_PIN_MASK(STD, PULL_DN));
1126 break;
1127
1128 case PIN_CONFIG_BIAS_PULL_UP:
1129 bcm281xx_pin_update(val, mask, 1,
1130 BCM281XX_PIN_SHIFT(STD, PULL_UP),
1131 BCM281XX_PIN_MASK(STD, PULL_UP));
1132 bcm281xx_pin_update(val, mask, 0,
1133 BCM281XX_PIN_SHIFT(STD, PULL_DN),
1134 BCM281XX_PIN_MASK(STD, PULL_DN));
1135 break;
1136
1137 case PIN_CONFIG_BIAS_PULL_DOWN:
1138 bcm281xx_pin_update(val, mask, 0,
1139 BCM281XX_PIN_SHIFT(STD, PULL_UP),
1140 BCM281XX_PIN_MASK(STD, PULL_UP));
1141 bcm281xx_pin_update(val, mask, 1,
1142 BCM281XX_PIN_SHIFT(STD, PULL_DN),
1143 BCM281XX_PIN_MASK(STD, PULL_DN));
1144 break;
1145
1146 case PIN_CONFIG_SLEW_RATE:
1147 arg = (arg >= 1 ? 1 : 0);
1148 bcm281xx_pin_update(val, mask, arg,
1149 BCM281XX_PIN_SHIFT(STD, SLEW),
1150 BCM281XX_PIN_MASK(STD, SLEW));
1151 break;
1152
1153 case PIN_CONFIG_INPUT_ENABLE:
1154
1155 arg = (arg >= 1 ? 0 : 1);
1156 bcm281xx_pin_update(val, mask, arg,
1157 BCM281XX_PIN_SHIFT(STD, INPUT_DIS),
1158 BCM281XX_PIN_MASK(STD, INPUT_DIS));
1159 break;
1160
1161 case PIN_CONFIG_DRIVE_STRENGTH:
1162
1163 if ((arg < 2) || (arg > 16) || (arg % 2)) {
1164 dev_err(pctldev->dev,
1165 "Invalid Drive Strength value (%d) for "
1166 "pin %s (%d). Valid values are "
1167 "(2..16) mA, even numbers only.\n",
1168 arg, pdata->pins[pin].name, pin);
1169 return -EINVAL;
1170 }
1171 bcm281xx_pin_update(val, mask, (arg/2)-1,
1172 BCM281XX_PIN_SHIFT(STD, DRV_STR),
1173 BCM281XX_PIN_MASK(STD, DRV_STR));
1174 break;
1175
1176 default:
1177 dev_err(pctldev->dev,
1178 "Unrecognized pin config %d for pin %s (%d).\n",
1179 param, pdata->pins[pin].name, pin);
1180 return -EINVAL;
1181
1182 }
1183 }
1184
1185 return 0;
1186 }
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201 static const u16 bcm281xx_pullup_map[] = {
1202 1200, 1800, 720, 2700, 831, 1080, 568
1203 };
1204
1205
1206 static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev,
1207 unsigned pin,
1208 unsigned long *configs,
1209 unsigned num_configs,
1210 u32 *val,
1211 u32 *mask)
1212 {
1213 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1214 int i, j;
1215 enum pin_config_param param;
1216 u32 arg;
1217
1218 for (i = 0; i < num_configs; i++) {
1219 param = pinconf_to_config_param(configs[i]);
1220 arg = pinconf_to_config_argument(configs[i]);
1221
1222 switch (param) {
1223 case PIN_CONFIG_BIAS_PULL_UP:
1224 for (j = 0; j < ARRAY_SIZE(bcm281xx_pullup_map); j++)
1225 if (bcm281xx_pullup_map[j] == arg)
1226 break;
1227
1228 if (j == ARRAY_SIZE(bcm281xx_pullup_map)) {
1229 dev_err(pctldev->dev,
1230 "Invalid pull-up value (%d) for pin %s "
1231 "(%d). Valid values are 568, 720, 831, "
1232 "1080, 1200, 1800, 2700 Ohms.\n",
1233 arg, pdata->pins[pin].name, pin);
1234 return -EINVAL;
1235 }
1236
1237 bcm281xx_pin_update(val, mask, j+1,
1238 BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
1239 BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
1240 break;
1241
1242 case PIN_CONFIG_BIAS_DISABLE:
1243 bcm281xx_pin_update(val, mask, 0,
1244 BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
1245 BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
1246 break;
1247
1248 case PIN_CONFIG_SLEW_RATE:
1249 arg = (arg >= 1 ? 1 : 0);
1250 bcm281xx_pin_update(val, mask, arg,
1251 BCM281XX_PIN_SHIFT(I2C, SLEW),
1252 BCM281XX_PIN_MASK(I2C, SLEW));
1253 break;
1254
1255 case PIN_CONFIG_INPUT_ENABLE:
1256
1257 arg = (arg >= 1 ? 0 : 1);
1258 bcm281xx_pin_update(val, mask, arg,
1259 BCM281XX_PIN_SHIFT(I2C, INPUT_DIS),
1260 BCM281XX_PIN_MASK(I2C, INPUT_DIS));
1261 break;
1262
1263 default:
1264 dev_err(pctldev->dev,
1265 "Unrecognized pin config %d for pin %s (%d).\n",
1266 param, pdata->pins[pin].name, pin);
1267 return -EINVAL;
1268
1269 }
1270 }
1271
1272 return 0;
1273 }
1274
1275
1276 static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev,
1277 unsigned pin,
1278 unsigned long *configs,
1279 unsigned num_configs,
1280 u32 *val,
1281 u32 *mask)
1282 {
1283 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1284 int i;
1285 enum pin_config_param param;
1286 u32 arg;
1287
1288 for (i = 0; i < num_configs; i++) {
1289 param = pinconf_to_config_param(configs[i]);
1290 arg = pinconf_to_config_argument(configs[i]);
1291
1292 switch (param) {
1293 case PIN_CONFIG_SLEW_RATE:
1294 arg = (arg >= 1 ? 1 : 0);
1295 bcm281xx_pin_update(val, mask, arg,
1296 BCM281XX_PIN_SHIFT(HDMI, MODE),
1297 BCM281XX_PIN_MASK(HDMI, MODE));
1298 break;
1299
1300 case PIN_CONFIG_INPUT_ENABLE:
1301
1302 arg = (arg >= 1 ? 0 : 1);
1303 bcm281xx_pin_update(val, mask, arg,
1304 BCM281XX_PIN_SHIFT(HDMI, INPUT_DIS),
1305 BCM281XX_PIN_MASK(HDMI, INPUT_DIS));
1306 break;
1307
1308 default:
1309 dev_err(pctldev->dev,
1310 "Unrecognized pin config %d for pin %s (%d).\n",
1311 param, pdata->pins[pin].name, pin);
1312 return -EINVAL;
1313
1314 }
1315 }
1316
1317 return 0;
1318 }
1319
1320 static int bcm281xx_pinctrl_pin_config_set(struct pinctrl_dev *pctldev,
1321 unsigned pin,
1322 unsigned long *configs,
1323 unsigned num_configs)
1324 {
1325 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
1326 enum bcm281xx_pin_type pin_type;
1327 u32 offset = 4 * pin;
1328 u32 cfg_val, cfg_mask;
1329 int rc;
1330
1331 cfg_val = 0;
1332 cfg_mask = 0;
1333 pin_type = pin_type_get(pctldev, pin);
1334
1335
1336 switch (pin_type) {
1337 case BCM281XX_PIN_TYPE_STD:
1338 rc = bcm281xx_std_pin_update(pctldev, pin, configs,
1339 num_configs, &cfg_val, &cfg_mask);
1340 break;
1341
1342 case BCM281XX_PIN_TYPE_I2C:
1343 rc = bcm281xx_i2c_pin_update(pctldev, pin, configs,
1344 num_configs, &cfg_val, &cfg_mask);
1345 break;
1346
1347 case BCM281XX_PIN_TYPE_HDMI:
1348 rc = bcm281xx_hdmi_pin_update(pctldev, pin, configs,
1349 num_configs, &cfg_val, &cfg_mask);
1350 break;
1351
1352 default:
1353 dev_err(pctldev->dev, "Unknown pin type for pin %s (%d).\n",
1354 pdata->pins[pin].name, pin);
1355 return -EINVAL;
1356
1357 }
1358
1359 if (rc)
1360 return rc;
1361
1362 dev_dbg(pctldev->dev,
1363 "%s(): Set pin %s (%d) with config 0x%x, mask 0x%x\n",
1364 __func__, pdata->pins[pin].name, pin, cfg_val, cfg_mask);
1365
1366 rc = regmap_update_bits(pdata->regmap, offset, cfg_mask, cfg_val);
1367 if (rc) {
1368 dev_err(pctldev->dev,
1369 "Error updating register for pin %s (%d).\n",
1370 pdata->pins[pin].name, pin);
1371 return rc;
1372 }
1373
1374 return 0;
1375 }
1376
1377 static const struct pinconf_ops bcm281xx_pinctrl_pinconf_ops = {
1378 .pin_config_get = bcm281xx_pinctrl_pin_config_get,
1379 .pin_config_set = bcm281xx_pinctrl_pin_config_set,
1380 };
1381
1382 static struct pinctrl_desc bcm281xx_pinctrl_desc = {
1383
1384 .pctlops = &bcm281xx_pinctrl_ops,
1385 .pmxops = &bcm281xx_pinctrl_pinmux_ops,
1386 .confops = &bcm281xx_pinctrl_pinconf_ops,
1387 .owner = THIS_MODULE,
1388 };
1389
1390 static int __init bcm281xx_pinctrl_probe(struct platform_device *pdev)
1391 {
1392 struct bcm281xx_pinctrl_data *pdata = &bcm281xx_pinctrl;
1393 struct pinctrl_dev *pctl;
1394
1395
1396 pdata->reg_base = devm_platform_ioremap_resource(pdev, 0);
1397 if (IS_ERR(pdata->reg_base)) {
1398 dev_err(&pdev->dev, "Failed to ioremap MEM resource\n");
1399 return PTR_ERR(pdata->reg_base);
1400 }
1401
1402
1403 pdata->regmap = devm_regmap_init_mmio(&pdev->dev, pdata->reg_base,
1404 &bcm281xx_pinctrl_regmap_config);
1405 if (IS_ERR(pdata->regmap)) {
1406 dev_err(&pdev->dev, "Regmap MMIO init failed.\n");
1407 return -ENODEV;
1408 }
1409
1410 bcm281xx_pinctrl_desc.name = dev_name(&pdev->dev);
1411 bcm281xx_pinctrl_desc.pins = bcm281xx_pinctrl.pins;
1412 bcm281xx_pinctrl_desc.npins = bcm281xx_pinctrl.npins;
1413
1414 pctl = devm_pinctrl_register(&pdev->dev, &bcm281xx_pinctrl_desc, pdata);
1415 if (IS_ERR(pctl)) {
1416 dev_err(&pdev->dev, "Failed to register pinctrl\n");
1417 return PTR_ERR(pctl);
1418 }
1419
1420 platform_set_drvdata(pdev, pdata);
1421
1422 return 0;
1423 }
1424
1425 static const struct of_device_id bcm281xx_pinctrl_of_match[] = {
1426 { .compatible = "brcm,bcm11351-pinctrl", },
1427 { },
1428 };
1429
1430 static struct platform_driver bcm281xx_pinctrl_driver = {
1431 .driver = {
1432 .name = "bcm281xx-pinctrl",
1433 .of_match_table = bcm281xx_pinctrl_of_match,
1434 },
1435 };
1436 builtin_platform_driver_probe(bcm281xx_pinctrl_driver, bcm281xx_pinctrl_probe);