root/drivers/pinctrl/bcm/pinctrl-bcm281xx.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pin_type_get
  2. bcm281xx_pin_update
  3. bcm281xx_pinctrl_get_groups_count
  4. bcm281xx_pinctrl_get_group_name
  5. bcm281xx_pinctrl_get_group_pins
  6. bcm281xx_pinctrl_pin_dbg_show
  7. bcm281xx_pinctrl_get_fcns_count
  8. bcm281xx_pinctrl_get_fcn_name
  9. bcm281xx_pinctrl_get_fcn_groups
  10. bcm281xx_pinmux_set
  11. bcm281xx_pinctrl_pin_config_get
  12. bcm281xx_std_pin_update
  13. bcm281xx_i2c_pin_update
  14. bcm281xx_hdmi_pin_update
  15. bcm281xx_pinctrl_pin_config_set
  16. bcm281xx_pinctrl_probe

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

/* [<][>][^][v][top][bottom][index][help] */