Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/pinctrl/bcm/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 69 kB image not shown  

Quelle  pinctrl-bcm281xx.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
// Copyright (C) 2013-2017 Broadcom

#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/seq_file.h>
#include <linux/slab.h>

#include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinconf.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>

#include "../core.h"
#include "../pinctrl-utils.h"

/* BCM281XX Pin Control Registers Definitions */

/* Function Select bits are the same for all pin control registers */
#define BCM281XX_PIN_REG_F_SEL_MASK  0x0700
#define BCM281XX_PIN_REG_F_SEL_SHIFT  8

/* Standard pin register */
#define BCM281XX_STD_PIN_REG_DRV_STR_MASK 0x0007
#define BCM281XX_STD_PIN_REG_DRV_STR_SHIFT 0
#define BCM281XX_STD_PIN_REG_INPUT_DIS_MASK 0x0008
#define BCM281XX_STD_PIN_REG_INPUT_DIS_SHIFT 3
#define BCM281XX_STD_PIN_REG_SLEW_MASK  0x0010
#define BCM281XX_STD_PIN_REG_SLEW_SHIFT  4
#define BCM281XX_STD_PIN_REG_PULL_UP_MASK 0x0020
#define BCM281XX_STD_PIN_REG_PULL_UP_SHIFT 5
#define BCM281XX_STD_PIN_REG_PULL_DN_MASK 0x0040
#define BCM281XX_STD_PIN_REG_PULL_DN_SHIFT 6
#define BCM281XX_STD_PIN_REG_HYST_MASK  0x0080
#define BCM281XX_STD_PIN_REG_HYST_SHIFT  7

/* I2C pin register */
#define BCM281XX_I2C_PIN_REG_INPUT_DIS_MASK 0x0004
#define BCM281XX_I2C_PIN_REG_INPUT_DIS_SHIFT 2
#define BCM281XX_I2C_PIN_REG_SLEW_MASK  0x0008
#define BCM281XX_I2C_PIN_REG_SLEW_SHIFT  3
#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK 0x0070
#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT 4

/* HDMI pin register */
#define BCM281XX_HDMI_PIN_REG_INPUT_DIS_MASK 0x0008
#define BCM281XX_HDMI_PIN_REG_INPUT_DIS_SHIFT 3
#define BCM281XX_HDMI_PIN_REG_MODE_MASK  0x0010
#define BCM281XX_HDMI_PIN_REG_MODE_SHIFT 4

/* BCM21664 access lock registers */
#define BCM21664_WR_ACCESS_OFFSET  0x07F0
#define BCM21664_WR_ACCESS_PASSWORD  0xA5A501
#define BCM21664_ACCESS_LOCK_OFFSET(lock) (0x0780 + (lock * 4))
#define BCM21664_ACCESS_LOCK_COUNT  5

/*
 * bcm281xx_pin_type - types of pin register
 */

enum bcm281xx_pin_type {
 BCM281XX_PIN_TYPE_UNKNOWN = 0,
 BCM281XX_PIN_TYPE_STD,
 BCM281XX_PIN_TYPE_I2C,
 BCM281XX_PIN_TYPE_HDMI,
};

static enum bcm281xx_pin_type std_pin = BCM281XX_PIN_TYPE_STD;
static enum bcm281xx_pin_type i2c_pin = BCM281XX_PIN_TYPE_I2C;
static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI;

/*
 * bcm281xx_pin_function- define pin function
 */

struct bcm281xx_pin_function {
 const char *name;
 const char * const *groups;
 const unsigned int ngroups;
};

/*
 * Device types (used in bcm281xx_pinctrl_desc to differentiate
 * the two device types from each other)
 */

enum bcm281xx_pinctrl_type {
 BCM281XX_PINCTRL_TYPE,
 BCM21664_PINCTRL_TYPE,
};

/*
 * bcm281xx_pinctrl_info - description of a pinctrl device supported
 * by this driver, intended to be used as a provider of OF match data.
 */

struct bcm281xx_pinctrl_info {
 enum bcm281xx_pinctrl_type device_type;

 /* List of all pins */
 const struct pinctrl_pin_desc *pins;
 unsigned int npins;

 const struct bcm281xx_pin_function *functions;
 unsigned int nfunctions;

 const struct regmap_config *regmap_config;
};

/*
 * bcm281xx_pinctrl_data - Broadcom-specific pinctrl data
 * @reg_base - base of pinctrl registers
 */

struct bcm281xx_pinctrl_data {
 struct device *dev;
 void __iomem *reg_base;

 struct regmap *regmap;
 const struct bcm281xx_pinctrl_info *info;
};

/*
 * Pin number definition.  The order here must be the same as defined in the
 * PADCTRLREG block in the RDB.
 */

#define BCM281XX_PIN_ADCSYNC  0
#define BCM281XX_PIN_BAT_RM  1
#define BCM281XX_PIN_BSC1_SCL  2
#define BCM281XX_PIN_BSC1_SDA  3
#define BCM281XX_PIN_BSC2_SCL  4
#define BCM281XX_PIN_BSC2_SDA  5
#define BCM281XX_PIN_CLASSGPWR  6
#define BCM281XX_PIN_CLK_CX8  7
#define BCM281XX_PIN_CLKOUT_0  8
#define BCM281XX_PIN_CLKOUT_1  9
#define BCM281XX_PIN_CLKOUT_2  10
#define BCM281XX_PIN_CLKOUT_3  11
#define BCM281XX_PIN_CLKREQ_IN_0 12
#define BCM281XX_PIN_CLKREQ_IN_1 13
#define BCM281XX_PIN_CWS_SYS_REQ1 14
#define BCM281XX_PIN_CWS_SYS_REQ2 15
#define BCM281XX_PIN_CWS_SYS_REQ3 16
#define BCM281XX_PIN_DIGMIC1_CLK 17
#define BCM281XX_PIN_DIGMIC1_DQ  18
#define BCM281XX_PIN_DIGMIC2_CLK 19
#define BCM281XX_PIN_DIGMIC2_DQ  20
#define BCM281XX_PIN_GPEN13  21
#define BCM281XX_PIN_GPEN14  22
#define BCM281XX_PIN_GPEN15  23
#define BCM281XX_PIN_GPIO00  24
#define BCM281XX_PIN_GPIO01  25
#define BCM281XX_PIN_GPIO02  26
#define BCM281XX_PIN_GPIO03  27
#define BCM281XX_PIN_GPIO04  28
#define BCM281XX_PIN_GPIO05  29
#define BCM281XX_PIN_GPIO06  30
#define BCM281XX_PIN_GPIO07  31
#define BCM281XX_PIN_GPIO08  32
#define BCM281XX_PIN_GPIO09  33
#define BCM281XX_PIN_GPIO10  34
#define BCM281XX_PIN_GPIO11  35
#define BCM281XX_PIN_GPIO12  36
#define BCM281XX_PIN_GPIO13  37
#define BCM281XX_PIN_GPIO14  38
#define BCM281XX_PIN_GPS_PABLANK 39
#define BCM281XX_PIN_GPS_TMARK  40
#define BCM281XX_PIN_HDMI_SCL  41
#define BCM281XX_PIN_HDMI_SDA  42
#define BCM281XX_PIN_IC_DM  43
#define BCM281XX_PIN_IC_DP  44
#define BCM281XX_PIN_KP_COL_IP_0 45
#define BCM281XX_PIN_KP_COL_IP_1 46
#define BCM281XX_PIN_KP_COL_IP_2 47
#define BCM281XX_PIN_KP_COL_IP_3 48
#define BCM281XX_PIN_KP_ROW_OP_0 49
#define BCM281XX_PIN_KP_ROW_OP_1 50
#define BCM281XX_PIN_KP_ROW_OP_2 51
#define BCM281XX_PIN_KP_ROW_OP_3 52
#define BCM281XX_PIN_LCD_B_0  53
#define BCM281XX_PIN_LCD_B_1  54
#define BCM281XX_PIN_LCD_B_2  55
#define BCM281XX_PIN_LCD_B_3  56
#define BCM281XX_PIN_LCD_B_4  57
#define BCM281XX_PIN_LCD_B_5  58
#define BCM281XX_PIN_LCD_B_6  59
#define BCM281XX_PIN_LCD_B_7  60
#define BCM281XX_PIN_LCD_G_0  61
#define BCM281XX_PIN_LCD_G_1  62
#define BCM281XX_PIN_LCD_G_2  63
#define BCM281XX_PIN_LCD_G_3  64
#define BCM281XX_PIN_LCD_G_4  65
#define BCM281XX_PIN_LCD_G_5  66
#define BCM281XX_PIN_LCD_G_6  67
#define BCM281XX_PIN_LCD_G_7  68
#define BCM281XX_PIN_LCD_HSYNC  69
#define BCM281XX_PIN_LCD_OE  70
#define BCM281XX_PIN_LCD_PCLK  71
#define BCM281XX_PIN_LCD_R_0  72
#define BCM281XX_PIN_LCD_R_1  73
#define BCM281XX_PIN_LCD_R_2  74
#define BCM281XX_PIN_LCD_R_3  75
#define BCM281XX_PIN_LCD_R_4  76
#define BCM281XX_PIN_LCD_R_5  77
#define BCM281XX_PIN_LCD_R_6  78
#define BCM281XX_PIN_LCD_R_7  79
#define BCM281XX_PIN_LCD_VSYNC  80
#define BCM281XX_PIN_MDMGPIO0  81
#define BCM281XX_PIN_MDMGPIO1  82
#define BCM281XX_PIN_MDMGPIO2  83
#define BCM281XX_PIN_MDMGPIO3  84
#define BCM281XX_PIN_MDMGPIO4  85
#define BCM281XX_PIN_MDMGPIO5  86
#define BCM281XX_PIN_MDMGPIO6  87
#define BCM281XX_PIN_MDMGPIO7  88
#define BCM281XX_PIN_MDMGPIO8  89
#define BCM281XX_PIN_MPHI_DATA_0 90
#define BCM281XX_PIN_MPHI_DATA_1 91
#define BCM281XX_PIN_MPHI_DATA_2 92
#define BCM281XX_PIN_MPHI_DATA_3 93
#define BCM281XX_PIN_MPHI_DATA_4 94
#define BCM281XX_PIN_MPHI_DATA_5 95
#define BCM281XX_PIN_MPHI_DATA_6 96
#define BCM281XX_PIN_MPHI_DATA_7 97
#define BCM281XX_PIN_MPHI_DATA_8 98
#define BCM281XX_PIN_MPHI_DATA_9 99
#define BCM281XX_PIN_MPHI_DATA_10 100
#define BCM281XX_PIN_MPHI_DATA_11 101
#define BCM281XX_PIN_MPHI_DATA_12 102
#define BCM281XX_PIN_MPHI_DATA_13 103
#define BCM281XX_PIN_MPHI_DATA_14 104
#define BCM281XX_PIN_MPHI_DATA_15 105
#define BCM281XX_PIN_MPHI_HA0  106
#define BCM281XX_PIN_MPHI_HAT0  107
#define BCM281XX_PIN_MPHI_HAT1  108
#define BCM281XX_PIN_MPHI_HCE0_N 109
#define BCM281XX_PIN_MPHI_HCE1_N 110
#define BCM281XX_PIN_MPHI_HRD_N  111
#define BCM281XX_PIN_MPHI_HWR_N  112
#define BCM281XX_PIN_MPHI_RUN0  113
#define BCM281XX_PIN_MPHI_RUN1  114
#define BCM281XX_PIN_MTX_SCAN_CLK 115
#define BCM281XX_PIN_MTX_SCAN_DATA 116
#define BCM281XX_PIN_NAND_AD_0  117
#define BCM281XX_PIN_NAND_AD_1  118
#define BCM281XX_PIN_NAND_AD_2  119
#define BCM281XX_PIN_NAND_AD_3  120
#define BCM281XX_PIN_NAND_AD_4  121
#define BCM281XX_PIN_NAND_AD_5  122
#define BCM281XX_PIN_NAND_AD_6  123
#define BCM281XX_PIN_NAND_AD_7  124
#define BCM281XX_PIN_NAND_ALE  125
#define BCM281XX_PIN_NAND_CEN_0  126
#define BCM281XX_PIN_NAND_CEN_1  127
#define BCM281XX_PIN_NAND_CLE  128
#define BCM281XX_PIN_NAND_OEN  129
#define BCM281XX_PIN_NAND_RDY_0  130
#define BCM281XX_PIN_NAND_RDY_1  131
#define BCM281XX_PIN_NAND_WEN  132
#define BCM281XX_PIN_NAND_WP  133
#define BCM281XX_PIN_PC1  134
#define BCM281XX_PIN_PC2  135
#define BCM281XX_PIN_PMU_INT  136
#define BCM281XX_PIN_PMU_SCL  137
#define BCM281XX_PIN_PMU_SDA  138
#define BCM281XX_PIN_RFST2G_MTSLOTEN3G 139
#define BCM281XX_PIN_RGMII_0_RX_CTL 140
#define BCM281XX_PIN_RGMII_0_RXC 141
#define BCM281XX_PIN_RGMII_0_RXD_0 142
#define BCM281XX_PIN_RGMII_0_RXD_1 143
#define BCM281XX_PIN_RGMII_0_RXD_2 144
#define BCM281XX_PIN_RGMII_0_RXD_3 145
#define BCM281XX_PIN_RGMII_0_TX_CTL 146
#define BCM281XX_PIN_RGMII_0_TXC 147
#define BCM281XX_PIN_RGMII_0_TXD_0 148
#define BCM281XX_PIN_RGMII_0_TXD_1 149
#define BCM281XX_PIN_RGMII_0_TXD_2 150
#define BCM281XX_PIN_RGMII_0_TXD_3 151
#define BCM281XX_PIN_RGMII_1_RX_CTL 152
#define BCM281XX_PIN_RGMII_1_RXC 153
#define BCM281XX_PIN_RGMII_1_RXD_0 154
#define BCM281XX_PIN_RGMII_1_RXD_1 155
#define BCM281XX_PIN_RGMII_1_RXD_2 156
#define BCM281XX_PIN_RGMII_1_RXD_3 157
#define BCM281XX_PIN_RGMII_1_TX_CTL 158
#define BCM281XX_PIN_RGMII_1_TXC 159
#define BCM281XX_PIN_RGMII_1_TXD_0 160
#define BCM281XX_PIN_RGMII_1_TXD_1 161
#define BCM281XX_PIN_RGMII_1_TXD_2 162
#define BCM281XX_PIN_RGMII_1_TXD_3 163
#define BCM281XX_PIN_RGMII_GPIO_0 164
#define BCM281XX_PIN_RGMII_GPIO_1 165
#define BCM281XX_PIN_RGMII_GPIO_2 166
#define BCM281XX_PIN_RGMII_GPIO_3 167
#define BCM281XX_PIN_RTXDATA2G_TXDATA3G1 168
#define BCM281XX_PIN_RTXEN2G_TXDATA3G2 169
#define BCM281XX_PIN_RXDATA3G0  170
#define BCM281XX_PIN_RXDATA3G1  171
#define BCM281XX_PIN_RXDATA3G2  172
#define BCM281XX_PIN_SDIO1_CLK  173
#define BCM281XX_PIN_SDIO1_CMD  174
#define BCM281XX_PIN_SDIO1_DATA_0 175
#define BCM281XX_PIN_SDIO1_DATA_1 176
#define BCM281XX_PIN_SDIO1_DATA_2 177
#define BCM281XX_PIN_SDIO1_DATA_3 178
#define BCM281XX_PIN_SDIO4_CLK  179
#define BCM281XX_PIN_SDIO4_CMD  180
#define BCM281XX_PIN_SDIO4_DATA_0 181
#define BCM281XX_PIN_SDIO4_DATA_1 182
#define BCM281XX_PIN_SDIO4_DATA_2 183
#define BCM281XX_PIN_SDIO4_DATA_3 184
#define BCM281XX_PIN_SIM_CLK  185
#define BCM281XX_PIN_SIM_DATA  186
#define BCM281XX_PIN_SIM_DET  187
#define BCM281XX_PIN_SIM_RESETN  188
#define BCM281XX_PIN_SIM2_CLK  189
#define BCM281XX_PIN_SIM2_DATA  190
#define BCM281XX_PIN_SIM2_DET  191
#define BCM281XX_PIN_SIM2_RESETN 192
#define BCM281XX_PIN_SRI_C  193
#define BCM281XX_PIN_SRI_D  194
#define BCM281XX_PIN_SRI_E  195
#define BCM281XX_PIN_SSP_EXTCLK  196
#define BCM281XX_PIN_SSP0_CLK  197
#define BCM281XX_PIN_SSP0_FS  198
#define BCM281XX_PIN_SSP0_RXD  199
#define BCM281XX_PIN_SSP0_TXD  200
#define BCM281XX_PIN_SSP2_CLK  201
#define BCM281XX_PIN_SSP2_FS_0  202
#define BCM281XX_PIN_SSP2_FS_1  203
#define BCM281XX_PIN_SSP2_FS_2  204
#define BCM281XX_PIN_SSP2_FS_3  205
#define BCM281XX_PIN_SSP2_RXD_0  206
#define BCM281XX_PIN_SSP2_RXD_1  207
#define BCM281XX_PIN_SSP2_TXD_0  208
#define BCM281XX_PIN_SSP2_TXD_1  209
#define BCM281XX_PIN_SSP3_CLK  210
#define BCM281XX_PIN_SSP3_FS  211
#define BCM281XX_PIN_SSP3_RXD  212
#define BCM281XX_PIN_SSP3_TXD  213
#define BCM281XX_PIN_SSP4_CLK  214
#define BCM281XX_PIN_SSP4_FS  215
#define BCM281XX_PIN_SSP4_RXD  216
#define BCM281XX_PIN_SSP4_TXD  217
#define BCM281XX_PIN_SSP5_CLK  218
#define BCM281XX_PIN_SSP5_FS  219
#define BCM281XX_PIN_SSP5_RXD  220
#define BCM281XX_PIN_SSP5_TXD  221
#define BCM281XX_PIN_SSP6_CLK  222
#define BCM281XX_PIN_SSP6_FS  223
#define BCM281XX_PIN_SSP6_RXD  224
#define BCM281XX_PIN_SSP6_TXD  225
#define BCM281XX_PIN_STAT_1  226
#define BCM281XX_PIN_STAT_2  227
#define BCM281XX_PIN_SYSCLKEN  228
#define BCM281XX_PIN_TRACECLK  229
#define BCM281XX_PIN_TRACEDT00  230
#define BCM281XX_PIN_TRACEDT01  231
#define BCM281XX_PIN_TRACEDT02  232
#define BCM281XX_PIN_TRACEDT03  233
#define BCM281XX_PIN_TRACEDT04  234
#define BCM281XX_PIN_TRACEDT05  235
#define BCM281XX_PIN_TRACEDT06  236
#define BCM281XX_PIN_TRACEDT07  237
#define BCM281XX_PIN_TRACEDT08  238
#define BCM281XX_PIN_TRACEDT09  239
#define BCM281XX_PIN_TRACEDT10  240
#define BCM281XX_PIN_TRACEDT11  241
#define BCM281XX_PIN_TRACEDT12  242
#define BCM281XX_PIN_TRACEDT13  243
#define BCM281XX_PIN_TRACEDT14  244
#define BCM281XX_PIN_TRACEDT15  245
#define BCM281XX_PIN_TXDATA3G0  246
#define BCM281XX_PIN_TXPWRIND  247
#define BCM281XX_PIN_UARTB1_UCTS 248
#define BCM281XX_PIN_UARTB1_URTS 249
#define BCM281XX_PIN_UARTB1_URXD 250
#define BCM281XX_PIN_UARTB1_UTXD 251
#define BCM281XX_PIN_UARTB2_URXD 252
#define BCM281XX_PIN_UARTB2_UTXD 253
#define BCM281XX_PIN_UARTB3_UCTS 254
#define BCM281XX_PIN_UARTB3_URTS 255
#define BCM281XX_PIN_UARTB3_URXD 256
#define BCM281XX_PIN_UARTB3_UTXD 257
#define BCM281XX_PIN_UARTB4_UCTS 258
#define BCM281XX_PIN_UARTB4_URTS 259
#define BCM281XX_PIN_UARTB4_URXD 260
#define BCM281XX_PIN_UARTB4_UTXD 261
#define BCM281XX_PIN_VC_CAM1_SCL 262
#define BCM281XX_PIN_VC_CAM1_SDA 263
#define BCM281XX_PIN_VC_CAM2_SCL 264
#define BCM281XX_PIN_VC_CAM2_SDA 265
#define BCM281XX_PIN_VC_CAM3_SCL 266
#define BCM281XX_PIN_VC_CAM3_SDA 267

#define BCM281XX_PIN_DESC(a, b, c) \
 { .number = a, .name = b, .drv_data = &c##_pin }

/*
 * Pin description definition.  The order here must be the same as defined in
 * the PADCTRLREG block in the RDB, since the pin number is used as an index
 * into this array.
 */

static const struct pinctrl_pin_desc bcm281xx_pinctrl_pins[] = {
 BCM281XX_PIN_DESC(BCM281XX_PIN_ADCSYNC, "adcsync", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_BAT_RM, "bat_rm", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SCL, "bsc1_scl", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SDA, "bsc1_sda", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SCL, "bsc2_scl", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SDA, "bsc2_sda", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLASSGPWR, "classgpwr", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLK_CX8, "clk_cx8", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_0, "clkout_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_1, "clkout_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_2, "clkout_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_3, "clkout_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_0, "clkreq_in_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_1, "clkreq_in_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ1, "cws_sys_req1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ2, "cws_sys_req2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ3, "cws_sys_req3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_CLK, "digmic1_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_DQ, "digmic1_dq", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_CLK, "digmic2_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_DQ, "digmic2_dq", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN13, "gpen13", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN14, "gpen14", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN15, "gpen15", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO00, "gpio00", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO01, "gpio01", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO02, "gpio02", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO03, "gpio03", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO04, "gpio04", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO05, "gpio05", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO06, "gpio06", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO07, "gpio07", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO08, "gpio08", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO09, "gpio09", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO10, "gpio10", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO11, "gpio11", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO12, "gpio12", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO13, "gpio13", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO14, "gpio14", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_PABLANK, "gps_pablank", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_TMARK, "gps_tmark", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SCL, "hdmi_scl", hdmi),
 BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SDA, "hdmi_sda", hdmi),
 BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DM, "ic_dm", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DP, "ic_dp", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_0, "kp_col_ip_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_1, "kp_col_ip_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_2, "kp_col_ip_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_3, "kp_col_ip_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_0, "kp_row_op_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_1, "kp_row_op_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_2, "kp_row_op_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_3, "kp_row_op_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_0, "lcd_b_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_1, "lcd_b_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_2, "lcd_b_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_3, "lcd_b_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_4, "lcd_b_4", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_5, "lcd_b_5", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_6, "lcd_b_6", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_7, "lcd_b_7", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_0, "lcd_g_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_1, "lcd_g_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_2, "lcd_g_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_3, "lcd_g_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_4, "lcd_g_4", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_5, "lcd_g_5", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_6, "lcd_g_6", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_7, "lcd_g_7", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_HSYNC, "lcd_hsync", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_OE, "lcd_oe", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_PCLK, "lcd_pclk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_0, "lcd_r_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_1, "lcd_r_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_2, "lcd_r_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_3, "lcd_r_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_4, "lcd_r_4", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_5, "lcd_r_5", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_6, "lcd_r_6", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_7, "lcd_r_7", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_VSYNC, "lcd_vsync", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO0, "mdmgpio0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO1, "mdmgpio1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO2, "mdmgpio2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO3, "mdmgpio3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO4, "mdmgpio4", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO5, "mdmgpio5", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO6, "mdmgpio6", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO7, "mdmgpio7", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO8, "mdmgpio8", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_0, "mphi_data_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_1, "mphi_data_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_2, "mphi_data_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_3, "mphi_data_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_4, "mphi_data_4", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_5, "mphi_data_5", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_6, "mphi_data_6", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_7, "mphi_data_7", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_8, "mphi_data_8", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_9, "mphi_data_9", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_10, "mphi_data_10", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_11, "mphi_data_11", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_12, "mphi_data_12", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_13, "mphi_data_13", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_14, "mphi_data_14", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_15, "mphi_data_15", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HA0, "mphi_ha0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT0, "mphi_hat0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT1, "mphi_hat1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE0_N, "mphi_hce0_n", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE1_N, "mphi_hce1_n", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HRD_N, "mphi_hrd_n", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HWR_N, "mphi_hwr_n", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN0, "mphi_run0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN1, "mphi_run1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_CLK, "mtx_scan_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_DATA, "mtx_scan_data", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_0, "nand_ad_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_1, "nand_ad_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_2, "nand_ad_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_3, "nand_ad_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_4, "nand_ad_4", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_5, "nand_ad_5", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_6, "nand_ad_6", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_7, "nand_ad_7", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_ALE, "nand_ale", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_0, "nand_cen_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_1, "nand_cen_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CLE, "nand_cle", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_OEN, "nand_oen", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_0, "nand_rdy_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_1, "nand_rdy_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WEN, "nand_wen", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WP, "nand_wp", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_PC1, "pc1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_PC2, "pc2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_INT, "pmu_int", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SCL, "pmu_scl", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SDA, "pmu_sda", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RFST2G_MTSLOTEN3G, "rfst2g_mtsloten3g",
  std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RX_CTL, "rgmii_0_rx_ctl", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXC, "rgmii_0_rxc", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_0, "rgmii_0_rxd_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_1, "rgmii_0_rxd_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_2, "rgmii_0_rxd_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_3, "rgmii_0_rxd_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TX_CTL, "rgmii_0_tx_ctl", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXC, "rgmii_0_txc", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_0, "rgmii_0_txd_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_1, "rgmii_0_txd_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_2, "rgmii_0_txd_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_3, "rgmii_0_txd_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RX_CTL, "rgmii_1_rx_ctl", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXC, "rgmii_1_rxc", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_0, "rgmii_1_rxd_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_1, "rgmii_1_rxd_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_2, "rgmii_1_rxd_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_3, "rgmii_1_rxd_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TX_CTL, "rgmii_1_tx_ctl", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXC, "rgmii_1_txc", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_0, "rgmii_1_txd_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_1, "rgmii_1_txd_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_2, "rgmii_1_txd_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_3, "rgmii_1_txd_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_0, "rgmii_gpio_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_1, "rgmii_gpio_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_2, "rgmii_gpio_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_3, "rgmii_gpio_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RTXDATA2G_TXDATA3G1,
  "rtxdata2g_txdata3g1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RTXEN2G_TXDATA3G2, "rtxen2g_txdata3g2",
  std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G0, "rxdata3g0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G1, "rxdata3g1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G2, "rxdata3g2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CLK, "sdio1_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CMD, "sdio1_cmd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_0, "sdio1_data_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_1, "sdio1_data_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_2, "sdio1_data_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_3, "sdio1_data_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CLK, "sdio4_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CMD, "sdio4_cmd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_0, "sdio4_data_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_1, "sdio4_data_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_2, "sdio4_data_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_3, "sdio4_data_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_CLK, "sim_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DATA, "sim_data", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DET, "sim_det", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_RESETN, "sim_resetn", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_CLK, "sim2_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DATA, "sim2_data", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DET, "sim2_det", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_RESETN, "sim2_resetn", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_C, "sri_c", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_D, "sri_d", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_E, "sri_e", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP_EXTCLK, "ssp_extclk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_CLK, "ssp0_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_FS, "ssp0_fs", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_RXD, "ssp0_rxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_TXD, "ssp0_txd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_CLK, "ssp2_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_0, "ssp2_fs_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_1, "ssp2_fs_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_2, "ssp2_fs_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_3, "ssp2_fs_3", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_0, "ssp2_rxd_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_1, "ssp2_rxd_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_0, "ssp2_txd_0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_1, "ssp2_txd_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_CLK, "ssp3_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_FS, "ssp3_fs", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_RXD, "ssp3_rxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_TXD, "ssp3_txd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_CLK, "ssp4_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_FS, "ssp4_fs", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_RXD, "ssp4_rxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_TXD, "ssp4_txd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_CLK, "ssp5_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_FS, "ssp5_fs", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_RXD, "ssp5_rxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_TXD, "ssp5_txd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_CLK, "ssp6_clk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_FS, "ssp6_fs", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_RXD, "ssp6_rxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_TXD, "ssp6_txd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_1, "stat_1", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_2, "stat_2", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_SYSCLKEN, "sysclken", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACECLK, "traceclk", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT00, "tracedt00", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT01, "tracedt01", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT02, "tracedt02", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT03, "tracedt03", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT04, "tracedt04", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT05, "tracedt05", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT06, "tracedt06", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT07, "tracedt07", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT08, "tracedt08", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT09, "tracedt09", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT10, "tracedt10", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT11, "tracedt11", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT12, "tracedt12", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT13, "tracedt13", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT14, "tracedt14", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT15, "tracedt15", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TXDATA3G0, "txdata3g0", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_TXPWRIND, "txpwrind", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UCTS, "uartb1_ucts", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URTS, "uartb1_urts", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URXD, "uartb1_urxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UTXD, "uartb1_utxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_URXD, "uartb2_urxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_UTXD, "uartb2_utxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UCTS, "uartb3_ucts", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URTS, "uartb3_urts", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URXD, "uartb3_urxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UTXD, "uartb3_utxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UCTS, "uartb4_ucts", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URTS, "uartb4_urts", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URXD, "uartb4_urxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UTXD, "uartb4_utxd", std),
 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SCL, "vc_cam1_scl", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SDA, "vc_cam1_sda", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SCL, "vc_cam2_scl", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SDA, "vc_cam2_sda", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SCL, "vc_cam3_scl", i2c),
 BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SDA, "vc_cam3_sda", i2c),
};

static const char * const bcm281xx_alt_groups[] = {
 "adcsync",
 "bat_rm",
 "bsc1_scl",
 "bsc1_sda",
 "bsc2_scl",
 "bsc2_sda",
 "classgpwr",
 "clk_cx8",
 "clkout_0",
 "clkout_1",
 "clkout_2",
 "clkout_3",
 "clkreq_in_0",
 "clkreq_in_1",
 "cws_sys_req1",
 "cws_sys_req2",
 "cws_sys_req3",
 "digmic1_clk",
 "digmic1_dq",
 "digmic2_clk",
 "digmic2_dq",
 "gpen13",
 "gpen14",
 "gpen15",
 "gpio00",
 "gpio01",
 "gpio02",
 "gpio03",
 "gpio04",
 "gpio05",
 "gpio06",
 "gpio07",
 "gpio08",
 "gpio09",
 "gpio10",
 "gpio11",
 "gpio12",
 "gpio13",
 "gpio14",
 "gps_pablank",
 "gps_tmark",
 "hdmi_scl",
 "hdmi_sda",
 "ic_dm",
 "ic_dp",
 "kp_col_ip_0",
 "kp_col_ip_1",
 "kp_col_ip_2",
 "kp_col_ip_3",
 "kp_row_op_0",
 "kp_row_op_1",
 "kp_row_op_2",
 "kp_row_op_3",
 "lcd_b_0",
 "lcd_b_1",
 "lcd_b_2",
 "lcd_b_3",
 "lcd_b_4",
 "lcd_b_5",
 "lcd_b_6",
 "lcd_b_7",
 "lcd_g_0",
 "lcd_g_1",
 "lcd_g_2",
 "lcd_g_3",
 "lcd_g_4",
 "lcd_g_5",
 "lcd_g_6",
 "lcd_g_7",
 "lcd_hsync",
 "lcd_oe",
 "lcd_pclk",
 "lcd_r_0",
 "lcd_r_1",
 "lcd_r_2",
 "lcd_r_3",
 "lcd_r_4",
 "lcd_r_5",
 "lcd_r_6",
 "lcd_r_7",
 "lcd_vsync",
 "mdmgpio0",
 "mdmgpio1",
 "mdmgpio2",
 "mdmgpio3",
 "mdmgpio4",
 "mdmgpio5",
 "mdmgpio6",
 "mdmgpio7",
 "mdmgpio8",
 "mphi_data_0",
 "mphi_data_1",
 "mphi_data_2",
 "mphi_data_3",
 "mphi_data_4",
 "mphi_data_5",
 "mphi_data_6",
 "mphi_data_7",
 "mphi_data_8",
 "mphi_data_9",
 "mphi_data_10",
 "mphi_data_11",
 "mphi_data_12",
 "mphi_data_13",
 "mphi_data_14",
 "mphi_data_15",
 "mphi_ha0",
 "mphi_hat0",
 "mphi_hat1",
 "mphi_hce0_n",
 "mphi_hce1_n",
 "mphi_hrd_n",
 "mphi_hwr_n",
 "mphi_run0",
 "mphi_run1",
 "mtx_scan_clk",
 "mtx_scan_data",
 "nand_ad_0",
 "nand_ad_1",
 "nand_ad_2",
 "nand_ad_3",
 "nand_ad_4",
 "nand_ad_5",
 "nand_ad_6",
 "nand_ad_7",
 "nand_ale",
 "nand_cen_0",
 "nand_cen_1",
 "nand_cle",
 "nand_oen",
 "nand_rdy_0",
 "nand_rdy_1",
 "nand_wen",
 "nand_wp",
 "pc1",
 "pc2",
 "pmu_int",
 "pmu_scl",
 "pmu_sda",
 "rfst2g_mtsloten3g",
 "rgmii_0_rx_ctl",
 "rgmii_0_rxc",
 "rgmii_0_rxd_0",
 "rgmii_0_rxd_1",
 "rgmii_0_rxd_2",
 "rgmii_0_rxd_3",
 "rgmii_0_tx_ctl",
 "rgmii_0_txc",
 "rgmii_0_txd_0",
 "rgmii_0_txd_1",
 "rgmii_0_txd_2",
 "rgmii_0_txd_3",
 "rgmii_1_rx_ctl",
 "rgmii_1_rxc",
 "rgmii_1_rxd_0",
 "rgmii_1_rxd_1",
 "rgmii_1_rxd_2",
 "rgmii_1_rxd_3",
 "rgmii_1_tx_ctl",
 "rgmii_1_txc",
 "rgmii_1_txd_0",
 "rgmii_1_txd_1",
 "rgmii_1_txd_2",
 "rgmii_1_txd_3",
 "rgmii_gpio_0",
 "rgmii_gpio_1",
 "rgmii_gpio_2",
 "rgmii_gpio_3",
 "rtxdata2g_txdata3g1",
 "rtxen2g_txdata3g2",
 "rxdata3g0",
 "rxdata3g1",
 "rxdata3g2",
 "sdio1_clk",
 "sdio1_cmd",
 "sdio1_data_0",
 "sdio1_data_1",
 "sdio1_data_2",
 "sdio1_data_3",
 "sdio4_clk",
 "sdio4_cmd",
 "sdio4_data_0",
 "sdio4_data_1",
 "sdio4_data_2",
 "sdio4_data_3",
 "sim_clk",
 "sim_data",
 "sim_det",
 "sim_resetn",
 "sim2_clk",
 "sim2_data",
 "sim2_det",
 "sim2_resetn",
 "sri_c",
 "sri_d",
 "sri_e",
 "ssp_extclk",
 "ssp0_clk",
 "ssp0_fs",
 "ssp0_rxd",
 "ssp0_txd",
 "ssp2_clk",
 "ssp2_fs_0",
 "ssp2_fs_1",
 "ssp2_fs_2",
 "ssp2_fs_3",
 "ssp2_rxd_0",
 "ssp2_rxd_1",
 "ssp2_txd_0",
 "ssp2_txd_1",
 "ssp3_clk",
 "ssp3_fs",
 "ssp3_rxd",
 "ssp3_txd",
 "ssp4_clk",
 "ssp4_fs",
 "ssp4_rxd",
 "ssp4_txd",
 "ssp5_clk",
 "ssp5_fs",
 "ssp5_rxd",
 "ssp5_txd",
 "ssp6_clk",
 "ssp6_fs",
 "ssp6_rxd",
 "ssp6_txd",
 "stat_1",
 "stat_2",
 "sysclken",
 "traceclk",
 "tracedt00",
 "tracedt01",
 "tracedt02",
 "tracedt03",
 "tracedt04",
 "tracedt05",
 "tracedt06",
 "tracedt07",
 "tracedt08",
 "tracedt09",
 "tracedt10",
 "tracedt11",
 "tracedt12",
 "tracedt13",
 "tracedt14",
 "tracedt15",
 "txdata3g0",
 "txpwrind",
 "uartb1_ucts",
 "uartb1_urts",
 "uartb1_urxd",
 "uartb1_utxd",
 "uartb2_urxd",
 "uartb2_utxd",
 "uartb3_ucts",
 "uartb3_urts",
 "uartb3_urxd",
 "uartb3_utxd",
 "uartb4_ucts",
 "uartb4_urts",
 "uartb4_urxd",
 "uartb4_utxd",
 "vc_cam1_scl",
 "vc_cam1_sda",
 "vc_cam2_scl",
 "vc_cam2_sda",
 "vc_cam3_scl",
 "vc_cam3_sda",
};

/* Every pin can implement all ALT1-ALT4 functions */
#define BCM281XX_PIN_FUNCTION(fcn_name)   \
{       \
 .name = #fcn_name,    \
 .groups = bcm281xx_alt_groups,   \
 .ngroups = ARRAY_SIZE(bcm281xx_alt_groups), \
}

static const struct bcm281xx_pin_function bcm281xx_functions[] = {
 BCM281XX_PIN_FUNCTION(alt1),
 BCM281XX_PIN_FUNCTION(alt2),
 BCM281XX_PIN_FUNCTION(alt3),
 BCM281XX_PIN_FUNCTION(alt4),
};

static const struct regmap_config bcm281xx_pinctrl_regmap_config = {
 .reg_bits = 32,
 .reg_stride = 4,
 .val_bits = 32,
 .max_register = BCM281XX_PIN_VC_CAM3_SDA * 4,
};

static const struct bcm281xx_pinctrl_info bcm281xx_pinctrl = {
 .device_type = BCM281XX_PINCTRL_TYPE,

 .pins = bcm281xx_pinctrl_pins,
 .npins = ARRAY_SIZE(bcm281xx_pinctrl_pins),
 .functions = bcm281xx_functions,
 .nfunctions = ARRAY_SIZE(bcm281xx_functions),

 .regmap_config = &bcm281xx_pinctrl_regmap_config,
};

/* BCM21664 data */
#define BCM21664_PIN_ADCSYN  0
#define BCM21664_PIN_BATRM  1
#define BCM21664_PIN_BSC1CLK  2
#define BCM21664_PIN_BSC1DAT  3
#define BCM21664_PIN_CAMCS0  4
#define BCM21664_PIN_CAMCS1  5
#define BCM21664_PIN_CLK32K  6
#define BCM21664_PIN_CLK_CX8  7
#define BCM21664_PIN_DCLK1  8
#define BCM21664_PIN_DCLK4  9
#define BCM21664_PIN_DCLKREQ1  10
#define BCM21664_PIN_DCLKREQ4  11
#define BCM21664_PIN_DMIC0CLK  12
#define BCM21664_PIN_DMIC0DQ  13
#define BCM21664_PIN_DSI0TE  14
#define BCM21664_PIN_GPIO00  15
#define BCM21664_PIN_GPIO01  16
#define BCM21664_PIN_GPIO02  17
#define BCM21664_PIN_GPIO03  18
#define BCM21664_PIN_GPIO04  19
#define BCM21664_PIN_GPIO05  20
#define BCM21664_PIN_GPIO06  21
#define BCM21664_PIN_GPIO07  22
#define BCM21664_PIN_GPIO08  23
#define BCM21664_PIN_GPIO09  24
#define BCM21664_PIN_GPIO10  25
#define BCM21664_PIN_GPIO11  26
#define BCM21664_PIN_GPIO12  27
#define BCM21664_PIN_GPIO13  28
#define BCM21664_PIN_GPIO14  29
#define BCM21664_PIN_GPIO15  30
#define BCM21664_PIN_GPIO16  31
#define BCM21664_PIN_GPIO17  32
#define BCM21664_PIN_GPIO18  33
#define BCM21664_PIN_GPIO19  34
#define BCM21664_PIN_GPIO20  35
#define BCM21664_PIN_GPIO21  36
#define BCM21664_PIN_GPIO22  37
#define BCM21664_PIN_GPIO23  38
#define BCM21664_PIN_GPIO24  39
#define BCM21664_PIN_GPIO25  40
#define BCM21664_PIN_GPIO26  41
#define BCM21664_PIN_GPIO27  42
#define BCM21664_PIN_GPIO28  43
#define BCM21664_PIN_GPIO32  44
#define BCM21664_PIN_GPIO33  45
#define BCM21664_PIN_GPIO34  46
#define BCM21664_PIN_GPS_CALREQ  47
#define BCM21664_PIN_GPS_HOSTREQ 48
#define BCM21664_PIN_GPS_PABLANK 49
#define BCM21664_PIN_GPS_TMARK  50
#define BCM21664_PIN_ICUSBDM  51
#define BCM21664_PIN_ICUSBDP  52
#define BCM21664_PIN_LCDCS0  53
#define BCM21664_PIN_LCDRES  54
#define BCM21664_PIN_LCDSCL  55
#define BCM21664_PIN_LCDSDA  56
#define BCM21664_PIN_LCDTE  57
#define BCM21664_PIN_MDMGPIO00  58
#define BCM21664_PIN_MDMGPIO01  59
#define BCM21664_PIN_MDMGPIO02  60
#define BCM21664_PIN_MDMGPIO03  61
#define BCM21664_PIN_MDMGPIO04  62
#define BCM21664_PIN_MDMGPIO05  63
#define BCM21664_PIN_MDMGPIO06  64
#define BCM21664_PIN_MDMGPIO07  65
#define BCM21664_PIN_MDMGPIO08  66
#define BCM21664_PIN_MMC0CK  67
#define BCM21664_PIN_MMC0CMD  68
#define BCM21664_PIN_MMC0DAT0  69
#define BCM21664_PIN_MMC0DAT1  70
#define BCM21664_PIN_MMC0DAT2  71
#define BCM21664_PIN_MMC0DAT3  72
#define BCM21664_PIN_MMC0DAT4  73
#define BCM21664_PIN_MMC0DAT5  74
#define BCM21664_PIN_MMC0DAT6  75
#define BCM21664_PIN_MMC0DAT7  76
#define BCM21664_PIN_MMC0RST  77
#define BCM21664_PIN_MMC1CK  78
#define BCM21664_PIN_MMC1CMD  79
#define BCM21664_PIN_MMC1DAT0  80
#define BCM21664_PIN_MMC1DAT1  81
#define BCM21664_PIN_MMC1DAT2  82
#define BCM21664_PIN_MMC1DAT3  83
#define BCM21664_PIN_MMC1DAT4  84
#define BCM21664_PIN_MMC1DAT5  85
#define BCM21664_PIN_MMC1DAT6  86
#define BCM21664_PIN_MMC1DAT7  87
#define BCM21664_PIN_MMC1RST  88
#define BCM21664_PIN_PC1  89
#define BCM21664_PIN_PC2  90
#define BCM21664_PIN_PMBSCCLK  91
#define BCM21664_PIN_PMBSCDAT  92
#define BCM21664_PIN_PMUINT  93
#define BCM21664_PIN_RESETN  94
#define BCM21664_PIN_RFST2G_MTSLOTEN3G 95
#define BCM21664_PIN_RTXDATA2G_TXDATA3G1 96
#define BCM21664_PIN_RTXEN2G_TXDATA3G2 97
#define BCM21664_PIN_RXDATA3G0  98
#define BCM21664_PIN_RXDATA3G1  99
#define BCM21664_PIN_RXDATA3G2  100
#define BCM21664_PIN_SDCK  101
#define BCM21664_PIN_SDCMD  102
#define BCM21664_PIN_SDDAT0  103
#define BCM21664_PIN_SDDAT1  104
#define BCM21664_PIN_SDDAT2  105
#define BCM21664_PIN_SDDAT3  106
#define BCM21664_PIN_SIMCLK  107
#define BCM21664_PIN_SIMDAT  108
#define BCM21664_PIN_SIMDET  109
#define BCM21664_PIN_SIMRST  110
#define BCM21664_PIN_GPIO93  111
#define BCM21664_PIN_GPIO94  112
#define BCM21664_PIN_SPI0CLK  113
#define BCM21664_PIN_SPI0FSS  114
#define BCM21664_PIN_SPI0RXD  115
#define BCM21664_PIN_SPI0TXD  116
#define BCM21664_PIN_SRI_C  117
#define BCM21664_PIN_SRI_D  118
#define BCM21664_PIN_SRI_E  119
#define BCM21664_PIN_SSPCK  120
#define BCM21664_PIN_SSPDI  121
#define BCM21664_PIN_SSPDO  122
#define BCM21664_PIN_SSPSYN  123
#define BCM21664_PIN_STAT1  124
#define BCM21664_PIN_STAT2  125
#define BCM21664_PIN_SWCLKTCK  126
#define BCM21664_PIN_SWDIOTMS  127
#define BCM21664_PIN_SYSCLKEN  128
#define BCM21664_PIN_TDI  129
#define BCM21664_PIN_TDO  130
#define BCM21664_PIN_TESTMODE  131
#define BCM21664_PIN_TRACECLK  132
#define BCM21664_PIN_TRACEDT00  133
#define BCM21664_PIN_TRACEDT01  134
#define BCM21664_PIN_TRACEDT02  135
#define BCM21664_PIN_TRACEDT03  136
#define BCM21664_PIN_TRACEDT04  137
#define BCM21664_PIN_TRACEDT05  138
#define BCM21664_PIN_TRACEDT06  139
#define BCM21664_PIN_TRACEDT07  140
#define BCM21664_PIN_TRSTB  141
#define BCM21664_PIN_TXDATA3G0  142
#define BCM21664_PIN_UBCTSN  143
#define BCM21664_PIN_UBRTSN  144
#define BCM21664_PIN_UBRX  145
#define BCM21664_PIN_UBTX  146
#define BCM21664_PIN_TRACEDT08  147
#define BCM21664_PIN_TRACEDT09  148
#define BCM21664_PIN_TRACEDT10  149
#define BCM21664_PIN_TRACEDT11  150
#define BCM21664_PIN_TRACEDT12  151
#define BCM21664_PIN_TRACEDT13  152
#define BCM21664_PIN_TRACEDT14  153
#define BCM21664_PIN_TRACEDT15  154

static const struct pinctrl_pin_desc bcm21664_pinctrl_pins[] = {
 BCM281XX_PIN_DESC(BCM21664_PIN_ADCSYN, "adcsyn", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_BATRM, "batrm", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_BSC1CLK, "bsc1clk", i2c),
 BCM281XX_PIN_DESC(BCM21664_PIN_BSC1DAT, "bsc1dat", i2c),
 BCM281XX_PIN_DESC(BCM21664_PIN_CAMCS0, "camcs0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_CAMCS1, "camcs1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_CLK32K, "clk32k", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_CLK_CX8, "clk_cx8", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DCLK1, "dclk1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DCLK4, "dclk4", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DCLKREQ1, "dclkreq1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DCLKREQ4, "dclkreq4", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DMIC0CLK, "dmic0clk", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DMIC0DQ, "dmic0dq", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_DSI0TE, "dsi0te", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO00, "gpio00", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO01, "gpio01", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO02, "gpio02", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO03, "gpio03", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO04, "gpio04", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO05, "gpio05", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO06, "gpio06", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO07, "gpio07", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO08, "gpio08", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO09, "gpio09", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO10, "gpio10", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO11, "gpio11", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO12, "gpio12", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO13, "gpio13", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO14, "gpio14", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO15, "gpio15", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO16, "gpio16", i2c),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO17, "gpio17", i2c),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO18, "gpio18", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO19, "gpio19", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO20, "gpio20", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO21, "gpio21", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO22, "gpio22", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO23, "gpio23", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO24, "gpio24", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO25, "gpio25", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO26, "gpio26", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO27, "gpio27", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO28, "gpio28", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO32, "gpio32", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO33, "gpio33", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO34, "gpio34", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPS_CALREQ, "gps_calreq", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPS_HOSTREQ, "gps_hostreq", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPS_PABLANK, "gps_pablank", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPS_TMARK, "gps_tmark", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_ICUSBDM, "icusbdm", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_ICUSBDP, "icusbdp", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_LCDCS0, "lcdcs0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_LCDRES, "lcdres", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_LCDSCL, "lcdscl", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_LCDSDA, "lcdsda", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_LCDTE, "lcdte", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO00, "mdmgpio00", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO01, "mdmgpio01", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO02, "mdmgpio02", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO03, "mdmgpio03", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO04, "mdmgpio04", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO05, "mdmgpio05", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO06, "mdmgpio06", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO07, "mdmgpio07", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MDMGPIO08, "mdmgpio08", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0CK, "mmc0ck", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0CMD, "mmc0cmd", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT0, "mmc0dat0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT1, "mmc0dat1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT2, "mmc0dat2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT3, "mmc0dat3", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT4, "mmc0dat4", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT5, "mmc0dat5", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT6, "mmc0dat6", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0DAT7, "mmc0dat7", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC0RST, "mmc0rst", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1CK, "mmc1ck", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1CMD, "mmc1cmd", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT0, "mmc1dat0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT1, "mmc1dat1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT2, "mmc1dat2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT3, "mmc1dat3", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT4, "mmc1dat4", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT5, "mmc1dat5", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT6, "mmc1dat6", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1DAT7, "mmc1dat7", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_MMC1RST, "mmc1rst", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_PC1, "pc1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_PC2, "pc2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_PMBSCCLK, "pmbscclk", i2c),
 BCM281XX_PIN_DESC(BCM21664_PIN_PMBSCDAT, "pmbscdat", i2c),
 BCM281XX_PIN_DESC(BCM21664_PIN_PMUINT, "pmuint", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RESETN, "resetn", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RFST2G_MTSLOTEN3G, "rfst2g_mtsloten3g", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RTXDATA2G_TXDATA3G1, "rtxdata2g_txdata3g1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RTXEN2G_TXDATA3G2, "rtxen2g_txdata3g2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RXDATA3G0, "rxdata3g0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RXDATA3G1, "rxdata3g1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_RXDATA3G2, "rxdata3g2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SDCK, "sdck", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SDCMD, "sdcmd", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SDDAT0, "sddat0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SDDAT1, "sddat1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SDDAT2, "sddat2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SDDAT3, "sddat3", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SIMCLK, "simclk", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SIMDAT, "simdat", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SIMDET, "simdet", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SIMRST, "simrst", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO93, "gpio93", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_GPIO94, "gpio94", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SPI0CLK, "spi0clk", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SPI0FSS, "spi0fss", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SPI0RXD, "spi0rxd", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SPI0TXD, "spi0txd", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SRI_C, "sri_c", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SRI_D, "sri_d", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SRI_E, "sri_e", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SSPCK, "sspck", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SSPDI, "sspdi", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SSPDO, "sspdo", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SSPSYN, "sspsyn", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_STAT1, "stat1", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_STAT2, "stat2", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SWCLKTCK, "swclktck", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SWDIOTMS, "swdiotms", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_SYSCLKEN, "sysclken", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TDI, "tdi", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TDO, "tdo", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TESTMODE, "testmode", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACECLK, "traceclk", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT00, "tracedt00", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT01, "tracedt01", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT02, "tracedt02", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT03, "tracedt03", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT04, "tracedt04", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT05, "tracedt05", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT06, "tracedt06", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT07, "tracedt07", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRSTB, "trstb", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TXDATA3G0, "txdata3g0", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_UBCTSN, "ubctsn", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_UBRTSN, "ubrtsn", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_UBRX, "ubrx", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_UBTX, "ubtx", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT08, "tracedt08", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT09, "tracedt09", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT10, "tracedt10", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT11, "tracedt11", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT12, "tracedt12", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT13, "tracedt13", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT14, "tracedt14", std),
 BCM281XX_PIN_DESC(BCM21664_PIN_TRACEDT15, "tracedt15", std),
};

static const char * const bcm21664_alt_groups[] = {
 "adcsyn",
 "batrm",
 "bsc1clk",
 "bsc1dat",
 "camcs0",
 "camcs1",
 "clk32k",
 "clk_cx8",
 "dclk1",
 "dclk4",
 "dclkreq1",
 "dclkreq4",
 "dmic0clk",
 "dmic0dq",
 "dsi0te",
 "gpio00",
 "gpio01",
 "gpio02",
 "gpio03",
 "gpio04",
 "gpio05",
 "gpio06",
 "gpio07",
 "gpio08",
 "gpio09",
 "gpio10",
 "gpio11",
 "gpio12",
 "gpio13",
 "gpio14",
 "gpio15",
 "gpio16",
 "gpio17",
 "gpio18",
 "gpio19",
 "gpio20",
 "gpio21",
 "gpio22",
 "gpio23",
 "gpio24",
 "gpio25",
 "gpio26",
 "gpio27",
 "gpio28",
 "gpio32",
 "gpio33",
 "gpio34",
 "gps_calreq",
 "gps_hostreq",
 "gps_pablank",
 "gps_tmark",
 "icusbdm",
 "icusbdp",
 "lcdcs0",
 "lcdres",
 "lcdscl",
 "lcdsda",
 "lcdte",
 "mdmgpio00",
 "mdmgpio01",
 "mdmgpio02",
 "mdmgpio03",
 "mdmgpio04",
 "mdmgpio05",
 "mdmgpio06",
 "mdmgpio07",
 "mdmgpio08",
 "mmc0ck",
 "mmc0cmd",
 "mmc0dat0",
 "mmc0dat1",
 "mmc0dat2",
 "mmc0dat3",
 "mmc0dat4",
 "mmc0dat5",
 "mmc0dat6",
 "mmc0dat7",
 "mmc0rst",
 "mmc1ck",
 "mmc1cmd",
 "mmc1dat0",
 "mmc1dat1",
 "mmc1dat2",
 "mmc1dat3",
 "mmc1dat4",
 "mmc1dat5",
 "mmc1dat6",
 "mmc1dat7",
 "mmc1rst",
 "pc1",
 "pc2",
 "pmbscclk",
 "pmbscdat",
 "pmuint",
 "resetn",
 "rfst2g_mtsloten3g",
 "rtxdata2g_txdata3g1",
 "rtxen2g_txdata3g2",
 "rxdata3g0",
 "rxdata3g1",
 "rxdata3g2",
 "sdck",
 "sdcmd",
 "sddat0",
 "sddat1",
 "sddat2",
 "sddat3",
 "simclk",
 "simdat",
 "simdet",
 "simrst",
 "gpio93",
 "gpio94",
 "spi0clk",
 "spi0fss",
 "spi0rxd",
 "spi0txd",
 "sri_c",
 "sri_d",
 "sri_e",
 "sspck",
 "sspdi",
 "sspdo",
 "sspsyn",
 "stat1",
 "stat2",
 "swclktck",
 "swdiotms",
 "sysclken",
 "tdi",
 "tdo",
 "testmode",
 "traceclk",
 "tracedt00",
 "tracedt01",
 "tracedt02",
 "tracedt03",
 "tracedt04",
 "tracedt05",
 "tracedt06",
 "tracedt07",
 "trstb",
 "txdata3g0",
 "ubctsn",
 "ubrtsn",
 "ubrx",
 "ubtx",
 "tracedt08",
 "tracedt09",
 "tracedt10",
 "tracedt11",
 "tracedt12",
 "tracedt13",
 "tracedt14",
 "tracedt15",
};

#define BCM21664_PIN_FUNCTION(fcn_name)   \
{       \
 .name = #fcn_name,    \
 .groups = bcm21664_alt_groups,   \
 .ngroups = ARRAY_SIZE(bcm21664_alt_groups), \
}

static const struct bcm281xx_pin_function bcm21664_functions[] = {
 BCM21664_PIN_FUNCTION(alt1),
 BCM21664_PIN_FUNCTION(alt2),
 BCM21664_PIN_FUNCTION(alt3),
 BCM21664_PIN_FUNCTION(alt4),
 BCM21664_PIN_FUNCTION(alt5),
 BCM21664_PIN_FUNCTION(alt6),
};

static const struct regmap_config bcm21664_pinctrl_regmap_config = {
 .reg_bits = 32,
 .reg_stride = 4,
 .val_bits = 32,
 .max_register = BCM21664_WR_ACCESS_OFFSET,
};

static const struct bcm281xx_pinctrl_info bcm21664_pinctrl = {
 .device_type = BCM21664_PINCTRL_TYPE,

 .pins = bcm21664_pinctrl_pins,
 .npins = ARRAY_SIZE(bcm21664_pinctrl_pins),
 .functions = bcm21664_functions,
 .nfunctions = ARRAY_SIZE(bcm21664_functions),

 .regmap_config = &bcm21664_pinctrl_regmap_config,
};

/* BCM21664 pinctrl access lock handlers */
static int bcm21664_pinctrl_lock_all(struct bcm281xx_pinctrl_data *pdata)
{
 int i, rc;

 for (i = 0; i < BCM21664_ACCESS_LOCK_COUNT; i++) {
  rc = regmap_write(pdata->regmap, BCM21664_WR_ACCESS_OFFSET,
       BCM21664_WR_ACCESS_PASSWORD);
  if (rc) {
   dev_err(pdata->dev, "Failed to enable write access: %d\n",
    rc);
   return rc;
  }
  rc = regmap_write(pdata->regmap, BCM21664_ACCESS_LOCK_OFFSET(i),
      0xffffffff);
  if (rc) {
   dev_err(pdata->dev, "Failed to write access lock: %d\n",
    rc);
   return rc;
  }
 }

 return 0;
}

static int bcm21664_pinctrl_set_pin_lock(struct bcm281xx_pinctrl_data *pdata,
      unsigned int pin, bool lock)
{
 unsigned int access_lock = pin / 32;
 int rc;

 dev_dbg(pdata->dev,
  "%s(): %s pin %s (%d)\n",
  __func__, lock ? "Lock" : "Unlock", pdata->info->pins[pin].name,
  pin);

 rc = regmap_write(pdata->regmap, BCM21664_WR_ACCESS_OFFSET,
      BCM21664_WR_ACCESS_PASSWORD);
 if (rc) {
  dev_err(pdata->dev, "Failed to enable write access: %d\n",
   rc);
  return rc;
 }

 rc = regmap_update_bits(pdata->regmap,
    BCM21664_ACCESS_LOCK_OFFSET(access_lock),
    BIT(pin % 32),
    (int)lock << (pin % 32));

 if (rc) {
  dev_err(pdata->dev, "Failed to %s pin: %d\n",
   lock ? "lock" : "unlock", rc);
  return rc;
 }

 return 0;
}

static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev,
        unsigned int pin)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 if (pin >= pdata->info->npins)
  return BCM281XX_PIN_TYPE_UNKNOWN;

 return *(enum bcm281xx_pin_type *)(pdata->info->pins[pin].drv_data);
}

#define BCM281XX_PIN_SHIFT(type, param) \
 (BCM281XX_ ## type ## _PIN_REG_ ## param ## _SHIFT)

#define BCM281XX_PIN_MASK(type, param) \
 (BCM281XX_ ## type ## _PIN_REG_ ## param ## _MASK)

/*
 * This helper function is used to build up the value and mask used to write to
 * a pin register, but does not actually write to the register.
 */

static inline void bcm281xx_pin_update(u32 *reg_val, u32 *reg_mask,
           u32 param_val, u32 param_shift,
           u32 param_mask)
{
 *reg_val &= ~param_mask;
 *reg_val |= (param_val << param_shift) & param_mask;
 *reg_mask |= param_mask;
}

static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 return pdata->info->npins;
}

static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
         unsigned int group)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 return pdata->info->pins[group].name;
}

static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
        unsigned int group,
        const unsigned **pins,
        unsigned int *num_pins)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 *pins = &pdata->info->pins[group].number;
 *num_pins = 1;

 return 0;
}

static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
       struct seq_file *s,
       unsigned int offset)
{
 seq_printf(s, " %s", dev_name(pctldev->dev));
}

static const struct pinctrl_ops bcm281xx_pinctrl_ops = {
 .get_groups_count = bcm281xx_pinctrl_get_groups_count,
 .get_group_name = bcm281xx_pinctrl_get_group_name,
 .get_group_pins = bcm281xx_pinctrl_get_group_pins,
 .pin_dbg_show = bcm281xx_pinctrl_pin_dbg_show,
 .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
 .dt_free_map = pinctrl_utils_free_map,
};

static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 return pdata->info->nfunctions;
}

static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev,
       unsigned int function)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 return pdata->info->functions[function].name;
}

static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
        unsigned int function,
        const char * const **groups,
        unsigned int * const num_groups)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);

 *groups = pdata->info->functions[function].groups;
 *num_groups = pdata->info->functions[function].ngroups;

 return 0;
}

static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev,
          unsigned int function,
          unsigned int group)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
 const struct bcm281xx_pin_function *f = &pdata->info->functions[function];
 enum bcm281xx_pinctrl_type device_type = pdata->info->device_type;
 unsigned int pin = pdata->info->pins[group].number;
 u32 offset = 4 * pin;
 int rc = 0;

 dev_dbg(pctldev->dev,
  "%s(): Enable function %s (%d) of pin %s (%d) @offset 0x%x.\n",
  __func__, f->name, function, pdata->info->pins[group].name,
  pin, offset);

 if (device_type == BCM21664_PINCTRL_TYPE) {
  rc = bcm21664_pinctrl_set_pin_lock(pdata, pin, false);
  if (rc) {
   /* Error is printed in bcm21664_pinctrl_set_pin_lock */
   return rc;
  }
 }

 rc = regmap_update_bits(pdata->regmap, offset,
  BCM281XX_PIN_REG_F_SEL_MASK,
  function << BCM281XX_PIN_REG_F_SEL_SHIFT);
 if (rc)
  dev_err(pctldev->dev,
   "Error updating register for pin %s (%d).\n",
   pdata->info->pins[group].name, pin);

 if (device_type == BCM21664_PINCTRL_TYPE) {
  rc = bcm21664_pinctrl_set_pin_lock(pdata, pin, true);
  if (rc) {
   /* Error is printed in bcm21664_pinctrl_set_pin_lock */
   return rc;
  }
 }

 return rc;
}

static const struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = {
 .get_functions_count = bcm281xx_pinctrl_get_fcns_count,
 .get_function_name = bcm281xx_pinctrl_get_fcn_name,
 .get_function_groups = bcm281xx_pinctrl_get_fcn_groups,
 .set_mux = bcm281xx_pinmux_set,
};

static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
        unsigned int pin,
        unsigned long *config)
{
 return -ENOTSUPP;
}


/* Goes through the configs and update register val/mask */
static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev,
       unsigned int pin,
       unsigned long *configs,
       unsigned int num_configs,
       u32 *val,
       u32 *mask)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
 int i;
 enum pin_config_param param;
 u32 arg;

 for (i = 0; i < num_configs; i++) {
  param = pinconf_to_config_param(configs[i]);
  arg = pinconf_to_config_argument(configs[i]);

  switch (param) {
  case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
   arg = (arg >= 1 ? 1 : 0);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(STD, HYST),
    BCM281XX_PIN_MASK(STD, HYST));
   break;
  /*
 * The pin bias can only be one of pull-up, pull-down, or
 * disable.  The user does not need to specify a value for the
 * property, and the default value from pinconf-generic is
 * ignored.
 */

  case PIN_CONFIG_BIAS_DISABLE:
   bcm281xx_pin_update(val, mask, 0,
    BCM281XX_PIN_SHIFT(STD, PULL_UP),
    BCM281XX_PIN_MASK(STD, PULL_UP));
   bcm281xx_pin_update(val, mask, 0,
    BCM281XX_PIN_SHIFT(STD, PULL_DN),
    BCM281XX_PIN_MASK(STD, PULL_DN));
   break;

  case PIN_CONFIG_BIAS_PULL_UP:
   bcm281xx_pin_update(val, mask, 1,
    BCM281XX_PIN_SHIFT(STD, PULL_UP),
    BCM281XX_PIN_MASK(STD, PULL_UP));
   bcm281xx_pin_update(val, mask, 0,
    BCM281XX_PIN_SHIFT(STD, PULL_DN),
    BCM281XX_PIN_MASK(STD, PULL_DN));
   break;

  case PIN_CONFIG_BIAS_PULL_DOWN:
   bcm281xx_pin_update(val, mask, 0,
    BCM281XX_PIN_SHIFT(STD, PULL_UP),
    BCM281XX_PIN_MASK(STD, PULL_UP));
   bcm281xx_pin_update(val, mask, 1,
    BCM281XX_PIN_SHIFT(STD, PULL_DN),
    BCM281XX_PIN_MASK(STD, PULL_DN));
   break;

  case PIN_CONFIG_SLEW_RATE:
   arg = (arg >= 1 ? 1 : 0);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(STD, SLEW),
    BCM281XX_PIN_MASK(STD, SLEW));
   break;

  case PIN_CONFIG_INPUT_ENABLE:
   /* inversed since register is for input _disable_ */
   arg = (arg >= 1 ? 0 : 1);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(STD, INPUT_DIS),
    BCM281XX_PIN_MASK(STD, INPUT_DIS));
   break;

  case PIN_CONFIG_DRIVE_STRENGTH:
   /* Valid range is 2-16 mA, even numbers only */
   if ((arg < 2) || (arg > 16) || (arg % 2)) {
    dev_err(pctldev->dev,
     "Invalid Drive Strength value (%d) for "
     "pin %s (%d). Valid values are "
     "(2..16) mA, even numbers only.\n",
     arg, pdata->info->pins[pin].name, pin);
    return -EINVAL;
   }
   bcm281xx_pin_update(val, mask, (arg/2)-1,
    BCM281XX_PIN_SHIFT(STD, DRV_STR),
    BCM281XX_PIN_MASK(STD, DRV_STR));
   break;

  default:
   dev_err(pctldev->dev,
    "Unrecognized pin config %d for pin %s (%d).\n",
    param, pdata->info->pins[pin].name, pin);
   return -EINVAL;

  } /* switch config */
 } /* for each config */

 return 0;
}

/*
 * The pull-up strength for an I2C pin is represented by bits 4-6 in the
 * register with the following mapping:
 *   0b000: No pull-up
 *   0b001: 1200 Ohm
 *   0b010: 1800 Ohm
 *   0b011: 720 Ohm
 *   0b100: 2700 Ohm
 *   0b101: 831 Ohm
 *   0b110: 1080 Ohm
 *   0b111: 568 Ohm
 * This array maps pull-up strength in Ohms to register values (1+index).
 */

static const u16 bcm281xx_pullup_map[] = {
 1200, 1800, 720, 2700, 831, 1080, 568
};

/* Goes through the configs and update register val/mask */
static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev,
       unsigned int pin,
       unsigned long *configs,
       unsigned int num_configs,
       u32 *val,
       u32 *mask)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
 int i, j;
 enum pin_config_param param;
 u32 arg;

 for (i = 0; i < num_configs; i++) {
  param = pinconf_to_config_param(configs[i]);
  arg = pinconf_to_config_argument(configs[i]);

  switch (param) {
  case PIN_CONFIG_BIAS_PULL_UP:
   for (j = 0; j < ARRAY_SIZE(bcm281xx_pullup_map); j++)
    if (bcm281xx_pullup_map[j] == arg)
     break;

   if (j == ARRAY_SIZE(bcm281xx_pullup_map)) {
    dev_err(pctldev->dev,
     "Invalid pull-up value (%d) for pin %s "
     "(%d). Valid values are 568, 720, 831, "
     "1080, 1200, 1800, 2700 Ohms.\n",
     arg, pdata->info->pins[pin].name, pin);
    return -EINVAL;
   }

   bcm281xx_pin_update(val, mask, j+1,
    BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
    BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
   break;

  case PIN_CONFIG_BIAS_DISABLE:
   bcm281xx_pin_update(val, mask, 0,
    BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
    BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
   break;

  case PIN_CONFIG_SLEW_RATE:
   arg = (arg >= 1 ? 1 : 0);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(I2C, SLEW),
    BCM281XX_PIN_MASK(I2C, SLEW));
   break;

  case PIN_CONFIG_INPUT_ENABLE:
   /* inversed since register is for input _disable_ */
   arg = (arg >= 1 ? 0 : 1);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(I2C, INPUT_DIS),
    BCM281XX_PIN_MASK(I2C, INPUT_DIS));
   break;

  default:
   dev_err(pctldev->dev,
    "Unrecognized pin config %d for pin %s (%d).\n",
    param, pdata->info->pins[pin].name, pin);
   return -EINVAL;

  } /* switch config */
 } /* for each config */

 return 0;
}

/* Goes through the configs and update register val/mask */
static int bcm21664_i2c_pin_update(struct pinctrl_dev *pctldev,
       unsigned int pin,
       unsigned long *configs,
       unsigned int num_configs,
       u32 *val,
       u32 *mask)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
 int i;
 enum pin_config_param param;
 u32 arg;

 for (i = 0; i < num_configs; i++) {
  param = pinconf_to_config_param(configs[i]);
  arg = pinconf_to_config_argument(configs[i]);

  /*
 * BCM21664 I2C pins use the same config bits as standard pins,
 * but only pull up/none, slew rate and input enable/disable
 * options are supported.
 */

  switch (param) {
  case PIN_CONFIG_BIAS_PULL_UP:
   bcm281xx_pin_update(val, mask, 1,
    BCM281XX_PIN_SHIFT(STD, PULL_UP),
    BCM281XX_PIN_MASK(STD, PULL_UP));
  break;

  case PIN_CONFIG_BIAS_DISABLE:
   bcm281xx_pin_update(val, mask, 0,
    BCM281XX_PIN_SHIFT(STD, PULL_UP),
    BCM281XX_PIN_MASK(STD, PULL_UP));
   break;

  case PIN_CONFIG_SLEW_RATE:
   arg = (arg >= 1 ? 1 : 0);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(STD, SLEW),
    BCM281XX_PIN_MASK(STD, SLEW));
   break;

  case PIN_CONFIG_INPUT_ENABLE:
   /* inversed since register is for input _disable_ */
   arg = (arg >= 1 ? 0 : 1);
   bcm281xx_pin_update(val, mask, arg,
    BCM281XX_PIN_SHIFT(STD, INPUT_DIS),
    BCM281XX_PIN_MASK(STD, INPUT_DIS));
   break;

  default:
   dev_err(pctldev->dev,
    "Unrecognized pin config %d for pin %s (%d).\n",
    param, pdata->info->pins[pin].name, pin);
   return -EINVAL;

  } /* switch config */
 } /* for each config */

 return 0;
}

/* Goes through the configs and update register val/mask */
static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev,
        unsigned int pin,
        unsigned long *configs,
        unsigned int num_configs,
        u32 *val,
        u32 *mask)
{
 struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
 int i;
 enum pin_config_param param;
 u32 arg;

 for (i = 0; i < num_configs; i++) {
  param = pinconf_to_config_param(configs[i]);
  arg = pinconf_to_config_argument(configs[i]);

  switch (param) {
  case PIN_CONFIG_SLEW_RATE:
   arg = (arg >= 1 ? 1 : 0);
--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=95 H=93 G=93

¤ Dauer der Verarbeitung: 0.20 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.