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