Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Marvell berlin4ct pinctrl driver
0004  *
0005  * Copyright (C) 2015 Marvell Technology Group Ltd.
0006  *
0007  * Author: Jisheng Zhang <jszhang@marvell.com>
0008  */
0009 
0010 #include <linux/init.h>
0011 #include <linux/of_device.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/regmap.h>
0014 
0015 #include "berlin.h"
0016 
0017 static const struct berlin_desc_group berlin4ct_soc_pinctrl_groups[] = {
0018     BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
0019             BERLIN_PINCTRL_FUNCTION(0x0, "emmc"), /* RSTn */
0020             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* GPIO47 */
0021     BERLIN_PINCTRL_GROUP("NAND_IO0", 0x0, 0x3, 0x03,
0022             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO0 */
0023             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD0 */
0024             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* CLK */
0025             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO0 */
0026     BERLIN_PINCTRL_GROUP("NAND_IO1", 0x0, 0x3, 0x06,
0027             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO1 */
0028             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD1 */
0029             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* CDn */
0030             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO1 */
0031     BERLIN_PINCTRL_GROUP("NAND_IO2", 0x0, 0x3, 0x09,
0032             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO2 */
0033             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD2 */
0034             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT0 */
0035             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO2 */
0036     BERLIN_PINCTRL_GROUP("NAND_IO3", 0x0, 0x3, 0x0c,
0037             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO3 */
0038             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD3 */
0039             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT1 */
0040             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO3 */
0041     BERLIN_PINCTRL_GROUP("NAND_IO4", 0x0, 0x3, 0x0f,
0042             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO4 */
0043             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXC */
0044             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT2 */
0045             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO4 */
0046     BERLIN_PINCTRL_GROUP("NAND_IO5", 0x0, 0x3, 0x12,
0047             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO5 */
0048             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXCTL */
0049             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT3 */
0050             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO5 */
0051     BERLIN_PINCTRL_GROUP("NAND_IO6", 0x0, 0x3, 0x15,
0052             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO6 */
0053             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* MDC */
0054             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* CMD */
0055             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO6 */
0056     BERLIN_PINCTRL_GROUP("NAND_IO7", 0x0, 0x3, 0x18,
0057             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO7 */
0058             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* MDIO */
0059             BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* WP */
0060             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO7 */
0061     BERLIN_PINCTRL_GROUP("NAND_ALE", 0x0, 0x3, 0x1b,
0062             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* ALE */
0063             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD0 */
0064             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO8 */
0065     BERLIN_PINCTRL_GROUP("NAND_CLE", 0x4, 0x3, 0x00,
0066             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* CLE */
0067             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD1 */
0068             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO9 */
0069     BERLIN_PINCTRL_GROUP("NAND_WEn", 0x4, 0x3, 0x03,
0070             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* WEn */
0071             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD2 */
0072             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO10 */
0073     BERLIN_PINCTRL_GROUP("NAND_REn", 0x4, 0x3, 0x06,
0074             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* REn */
0075             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD3 */
0076             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO11 */
0077     BERLIN_PINCTRL_GROUP("NAND_WPn", 0x4, 0x3, 0x09,
0078             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* WPn */
0079             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO12 */
0080     BERLIN_PINCTRL_GROUP("NAND_CEn", 0x4, 0x3, 0x0c,
0081             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* CEn */
0082             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXC */
0083             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO13 */
0084     BERLIN_PINCTRL_GROUP("NAND_RDY", 0x4, 0x3, 0x0f,
0085             BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* RDY */
0086             BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXCTL */
0087             BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO14 */
0088     BERLIN_PINCTRL_GROUP("SD0_CLK", 0x4, 0x3, 0x12,
0089             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO29 */
0090             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CLK*/
0091             BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* CLK */
0092             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG8 */
0093             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG8 */
0094     BERLIN_PINCTRL_GROUP("SD0_DAT0", 0x4, 0x3, 0x15,
0095             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO30 */
0096             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT0 */
0097             BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* SOP */
0098             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG9 */
0099             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG9 */
0100     BERLIN_PINCTRL_GROUP("SD0_DAT1", 0x4, 0x3, 0x18,
0101             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO31 */
0102             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT1 */
0103             BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* SD */
0104             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG10 */
0105             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG10 */
0106     BERLIN_PINCTRL_GROUP("SD0_DAT2", 0x4, 0x3, 0x1b,
0107             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO32 */
0108             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT2 */
0109             BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* VALD */
0110             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG11 */
0111             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG11 */
0112     BERLIN_PINCTRL_GROUP("SD0_DAT3", 0x8, 0x3, 0x00,
0113             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO33 */
0114             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT3 */
0115             BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* CLK */
0116             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG12 */
0117             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG12 */
0118     BERLIN_PINCTRL_GROUP("SD0_CDn", 0x8, 0x3, 0x03,
0119             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO34 */
0120             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CDn */
0121             BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* SOP */
0122             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG13 */
0123             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG13 */
0124     BERLIN_PINCTRL_GROUP("SD0_CMD", 0x8, 0x3, 0x06,
0125             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO35 */
0126             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CMD */
0127             BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* SD */
0128             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG14 */
0129             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG14 */
0130     BERLIN_PINCTRL_GROUP("SD0_WP", 0x8, 0x3, 0x09,
0131             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO36 */
0132             BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* WP */
0133             BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* VALD */
0134             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG15 */
0135             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG15 */
0136     BERLIN_PINCTRL_GROUP("STS0_CLK", 0x8, 0x3, 0x0c,
0137             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO21 */
0138             BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* CLK */
0139             BERLIN_PINCTRL_FUNCTION(0x2, "cpupll"), /* CLKO */
0140             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG0 */
0141             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG0 */
0142     BERLIN_PINCTRL_GROUP("STS0_SOP", 0x8, 0x3, 0x0f,
0143             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO22 */
0144             BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* SOP */
0145             BERLIN_PINCTRL_FUNCTION(0x2, "syspll"), /* CLKO */
0146             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG1 */
0147             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG1 */
0148     BERLIN_PINCTRL_GROUP("STS0_SD", 0x8, 0x3, 0x12,
0149             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO23 */
0150             BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* SD */
0151             BERLIN_PINCTRL_FUNCTION(0x2, "mempll"), /* CLKO */
0152             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG2 */
0153             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG2 */
0154     BERLIN_PINCTRL_GROUP("STS0_VALD", 0x8, 0x3, 0x15,
0155             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO24 */
0156             BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* VALD */
0157             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG3 */
0158             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG3 */
0159     BERLIN_PINCTRL_GROUP("STS1_CLK", 0x8, 0x3, 0x18,
0160             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO25 */
0161             BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* CLK */
0162             BERLIN_PINCTRL_FUNCTION(0x2, "pwm0"),
0163             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG4 */
0164             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG4 */
0165     BERLIN_PINCTRL_GROUP("STS1_SOP", 0x8, 0x3, 0x1b,
0166             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO26 */
0167             BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* SOP */
0168             BERLIN_PINCTRL_FUNCTION(0x2, "pwm1"),
0169             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG5 */
0170             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG5 */
0171     BERLIN_PINCTRL_GROUP("STS1_SD", 0xc, 0x3, 0x00,
0172             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO27 */
0173             BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* SD */
0174             BERLIN_PINCTRL_FUNCTION(0x2, "pwm2"),
0175             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG6 */
0176             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG6 */
0177     BERLIN_PINCTRL_GROUP("STS1_VALD", 0xc, 0x3, 0x03,
0178             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO28 */
0179             BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* VALD */
0180             BERLIN_PINCTRL_FUNCTION(0x2, "pwm3"),
0181             BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG7 */
0182             BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG7 */
0183     BERLIN_PINCTRL_GROUP("SCRD0_RST", 0xc, 0x3, 0x06,
0184             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO15 */
0185             BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* RST */
0186             BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* CLK */
0187     BERLIN_PINCTRL_GROUP("SCRD0_DCLK", 0xc, 0x3, 0x09,
0188             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO16 */
0189             BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* DCLK */
0190             BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* CMD */
0191     BERLIN_PINCTRL_GROUP("SCRD0_GPIO0", 0xc, 0x3, 0x0c,
0192             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO17 */
0193             BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* SCRD0 GPIO0 */
0194             BERLIN_PINCTRL_FUNCTION(0x2, "sif"), /* DIO */
0195             BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT0 */
0196     BERLIN_PINCTRL_GROUP("SCRD0_GPIO1", 0xc, 0x3, 0x0f,
0197             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO18 */
0198             BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* SCRD0 GPIO1 */
0199             BERLIN_PINCTRL_FUNCTION(0x2, "sif"), /* CLK */
0200             BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT1 */
0201     BERLIN_PINCTRL_GROUP("SCRD0_DIO", 0xc, 0x3, 0x12,
0202             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO19 */
0203             BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* DIO */
0204             BERLIN_PINCTRL_FUNCTION(0x2, "sif"), /* DEN */
0205             BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT2 */
0206     BERLIN_PINCTRL_GROUP("SCRD0_CRD_PRES", 0xc, 0x3, 0x15,
0207             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO20 */
0208             BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* crd pres */
0209             BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT3 */
0210     BERLIN_PINCTRL_GROUP("SPI1_SS0n", 0xc, 0x3, 0x18,
0211             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
0212             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO37 */
0213             BERLIN_PINCTRL_FUNCTION(0x2, "sts2")), /* CLK */
0214     BERLIN_PINCTRL_GROUP("SPI1_SS1n", 0xc, 0x3, 0x1b,
0215             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS1n */
0216             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO38 */
0217             BERLIN_PINCTRL_FUNCTION(0x2, "sts2"), /* SOP */
0218             BERLIN_PINCTRL_FUNCTION(0x4, "pwm1")),
0219     BERLIN_PINCTRL_GROUP("SPI1_SS2n", 0x10, 0x3, 0x00,
0220             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS2n */
0221             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO39 */
0222             BERLIN_PINCTRL_FUNCTION(0x2, "sts2"), /* SD */
0223             BERLIN_PINCTRL_FUNCTION(0x4, "pwm0")),
0224     BERLIN_PINCTRL_GROUP("SPI1_SS3n", 0x10, 0x3, 0x03,
0225             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS3n */
0226             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO40 */
0227             BERLIN_PINCTRL_FUNCTION(0x2, "sts2")), /* VALD */
0228     BERLIN_PINCTRL_GROUP("SPI1_SCLK", 0x10, 0x3, 0x06,
0229             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SCLK */
0230             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO41 */
0231             BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* CLK */
0232     BERLIN_PINCTRL_GROUP("SPI1_SDO", 0x10, 0x3, 0x09,
0233             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDO */
0234             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO42 */
0235             BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* SOP */
0236     BERLIN_PINCTRL_GROUP("SPI1_SDI", 0x10, 0x3, 0x0c,
0237             BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI */
0238             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO43 */
0239             BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* SD */
0240     BERLIN_PINCTRL_GROUP("USB0_DRV_VBUS", 0x10, 0x3, 0x0f,
0241             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO44 */
0242             BERLIN_PINCTRL_FUNCTION(0x1, "usb0"), /* VBUS */
0243             BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* VALD */
0244     BERLIN_PINCTRL_GROUP("TW0_SCL", 0x10, 0x3, 0x12,
0245             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO45 */
0246             BERLIN_PINCTRL_FUNCTION(0x1, "tw0")), /* SCL */
0247     BERLIN_PINCTRL_GROUP("TW0_SDA", 0x10, 0x3, 0x15,
0248             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO46 */
0249             BERLIN_PINCTRL_FUNCTION(0x1, "tw0")), /* SDA */
0250 };
0251 
0252 static const struct berlin_desc_group berlin4ct_avio_pinctrl_groups[] = {
0253     BERLIN_PINCTRL_GROUP("TX_EDDC_SCL", 0x0, 0x3, 0x00,
0254             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO0 */
0255             BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc"), /* SCL */
0256             BERLIN_PINCTRL_FUNCTION(0x2, "tw1")), /* SCL */
0257     BERLIN_PINCTRL_GROUP("TX_EDDC_SDA", 0x0, 0x3, 0x03,
0258             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO1 */
0259             BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc"), /* SDA */
0260             BERLIN_PINCTRL_FUNCTION(0x2, "tw1")), /* SDA */
0261     BERLIN_PINCTRL_GROUP("I2S1_LRCKO", 0x0, 0x3, 0x06,
0262             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO2 */
0263             BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* LRCKO */
0264             BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* CLK */
0265             BERLIN_PINCTRL_FUNCTION(0x4, "adac"), /* DBG0 */
0266             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* CLK */
0267             BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG0 */
0268     BERLIN_PINCTRL_GROUP("I2S1_BCLKO", 0x0, 0x3, 0x09,
0269             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO3 */
0270             BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* BCLKO */
0271             BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* SOP */
0272             BERLIN_PINCTRL_FUNCTION(0x4, "adac"), /* DBG1 */
0273             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* CMD */
0274             BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG1 */
0275     BERLIN_PINCTRL_GROUP("I2S1_DO", 0x0, 0x3, 0x0c,
0276             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO4 */
0277             BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* DO */
0278             BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* SD */
0279             BERLIN_PINCTRL_FUNCTION(0x4, "adac"), /* DBG2 */
0280             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* DAT0 */
0281             BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG2 */
0282     BERLIN_PINCTRL_GROUP("I2S1_MCLK", 0x0, 0x3, 0x0f,
0283             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO5 */
0284             BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* MCLK */
0285             BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* VALD */
0286             BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* MCLK */
0287             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* DAT1 */
0288             BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG3 */
0289     BERLIN_PINCTRL_GROUP("SPDIFO", 0x0, 0x3, 0x12,
0290             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO6 */
0291             BERLIN_PINCTRL_FUNCTION(0x1, "spdifo"),
0292             BERLIN_PINCTRL_FUNCTION(0x2, "avpll"), /* CLKO */
0293             BERLIN_PINCTRL_FUNCTION(0x4, "adac")), /* DBG3 */
0294     BERLIN_PINCTRL_GROUP("I2S2_MCLK", 0x0, 0x3, 0x15,
0295             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO7 */
0296             BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* MCLK */
0297             BERLIN_PINCTRL_FUNCTION(0x4, "hdmi"), /* FBCLK */
0298             BERLIN_PINCTRL_FUNCTION(0x5, "pdm")), /* CLKO */
0299     BERLIN_PINCTRL_GROUP("I2S2_LRCKI", 0x0, 0x3, 0x18,
0300             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO8 */
0301             BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* LRCKI */
0302             BERLIN_PINCTRL_FUNCTION(0x2, "pwm0"),
0303             BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* CLK */
0304             BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* LRCK */
0305             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* DAT2 */
0306     BERLIN_PINCTRL_GROUP("I2S2_BCLKI", 0x0, 0x3, 0x1b,
0307             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO9 */
0308             BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* BCLKI */
0309             BERLIN_PINCTRL_FUNCTION(0x2, "pwm1"),
0310             BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* SOP */
0311             BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* BCLK */
0312             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* DAT3 */
0313     BERLIN_PINCTRL_GROUP("I2S2_DI0", 0x4, 0x3, 0x00,
0314             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO10 */
0315             BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI0 */
0316             BERLIN_PINCTRL_FUNCTION(0x2, "pwm2"),
0317             BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* SD */
0318             BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* SDIN */
0319             BERLIN_PINCTRL_FUNCTION(0x5, "pdm"), /* DI0 */
0320             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* CDn */
0321     BERLIN_PINCTRL_GROUP("I2S2_DI1", 0x4, 0x3, 0x03,
0322             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO11 */
0323             BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI1 */
0324             BERLIN_PINCTRL_FUNCTION(0x2, "pwm3"),
0325             BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* VALD */
0326             BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* PWMCLK */
0327             BERLIN_PINCTRL_FUNCTION(0x5, "pdm"), /* DI1 */
0328             BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* WP */
0329 };
0330 
0331 static const struct berlin_desc_group berlin4ct_sysmgr_pinctrl_groups[] = {
0332     BERLIN_PINCTRL_GROUP("SM_TW2_SCL", 0x0, 0x3, 0x00,
0333             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO19 */
0334             BERLIN_PINCTRL_FUNCTION(0x1, "tw2")), /* SCL */
0335     BERLIN_PINCTRL_GROUP("SM_TW2_SDA", 0x0, 0x3, 0x03,
0336             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO20 */
0337             BERLIN_PINCTRL_FUNCTION(0x1, "tw2")), /* SDA */
0338     BERLIN_PINCTRL_GROUP("SM_TW3_SCL", 0x0, 0x3, 0x06,
0339             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO21 */
0340             BERLIN_PINCTRL_FUNCTION(0x1, "tw3")), /* SCL */
0341     BERLIN_PINCTRL_GROUP("SM_TW3_SDA", 0x0, 0x3, 0x09,
0342             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO22 */
0343             BERLIN_PINCTRL_FUNCTION(0x1, "tw3")), /* SDA */
0344     BERLIN_PINCTRL_GROUP("SM_TMS", 0x0, 0x3, 0x0c,
0345             BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TMS */
0346             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* SM GPIO0 */
0347             BERLIN_PINCTRL_FUNCTION(0x2, "pwm0")),
0348     BERLIN_PINCTRL_GROUP("SM_TDI", 0x0, 0x3, 0x0f,
0349             BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TDI */
0350             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* SM GPIO1 */
0351             BERLIN_PINCTRL_FUNCTION(0x2, "pwm1")),
0352     BERLIN_PINCTRL_GROUP("SM_TDO", 0x0, 0x3, 0x12,
0353             BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TDO */
0354             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO2 */
0355     BERLIN_PINCTRL_GROUP("SM_URT0_TXD", 0x0, 0x3, 0x15,
0356             BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* TXD */
0357             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO3 */
0358     BERLIN_PINCTRL_GROUP("SM_URT0_RXD", 0x0, 0x3, 0x18,
0359             BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RXD */
0360             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO4 */
0361     BERLIN_PINCTRL_GROUP("SM_URT1_TXD", 0x0, 0x3, 0x1b,
0362             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO5 */
0363             BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* TXD */
0364             BERLIN_PINCTRL_FUNCTION(0x2, "eth1"), /* RXCLK */
0365             BERLIN_PINCTRL_FUNCTION(0x3, "pwm2"),
0366             BERLIN_PINCTRL_FUNCTION(0x4, "timer0"),
0367             BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
0368     BERLIN_PINCTRL_GROUP("SM_URT1_RXD", 0x4, 0x3, 0x00,
0369             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO6 */
0370             BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RXD */
0371             BERLIN_PINCTRL_FUNCTION(0x3, "pwm3"),
0372             BERLIN_PINCTRL_FUNCTION(0x4, "timer1")),
0373     BERLIN_PINCTRL_GROUP("SM_SPI2_SS0n", 0x4, 0x3, 0x03,
0374             BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SS0 n*/
0375             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO7 */
0376     BERLIN_PINCTRL_GROUP("SM_SPI2_SS1n", 0x4, 0x3, 0x06,
0377             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO8 */
0378             BERLIN_PINCTRL_FUNCTION(0x1, "spi2")), /* SS1n */
0379     BERLIN_PINCTRL_GROUP("SM_SPI2_SS2n", 0x4, 0x3, 0x09,
0380             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO9 */
0381             BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS2n */
0382             BERLIN_PINCTRL_FUNCTION(0x2, "eth1"), /* MDC */
0383             BERLIN_PINCTRL_FUNCTION(0x3, "pwm0"),
0384             BERLIN_PINCTRL_FUNCTION(0x4, "timer0"),
0385             BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
0386     BERLIN_PINCTRL_GROUP("SM_SPI2_SS3n", 0x4, 0x3, 0x0c,
0387             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO10 */
0388             BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS3n */
0389             BERLIN_PINCTRL_FUNCTION(0x2, "eth1"), /* MDIO */
0390             BERLIN_PINCTRL_FUNCTION(0x3, "pwm1"),
0391             BERLIN_PINCTRL_FUNCTION(0x4, "timer1")),
0392     BERLIN_PINCTRL_GROUP("SM_SPI2_SDO", 0x4, 0x3, 0x0f,
0393             BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SDO */
0394             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO11 */
0395     BERLIN_PINCTRL_GROUP("SM_SPI2_SDI", 0x4, 0x3, 0x12,
0396             BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SDI */
0397             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO12 */
0398     BERLIN_PINCTRL_GROUP("SM_SPI2_SCLK", 0x4, 0x3, 0x15,
0399             BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SCLK */
0400             BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO13 */
0401     BERLIN_PINCTRL_GROUP("SM_FE_LED0", 0x4, 0x3, 0x18,
0402             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO14 */
0403             BERLIN_PINCTRL_FUNCTION(0x2, "led")), /* LED0 */
0404     BERLIN_PINCTRL_GROUP("SM_FE_LED1", 0x4, 0x3, 0x1b,
0405             BERLIN_PINCTRL_FUNCTION(0x0, "pwr"),
0406             BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* SM GPIO 15 */
0407             BERLIN_PINCTRL_FUNCTION(0x2, "led")), /* LED1 */
0408     BERLIN_PINCTRL_GROUP("SM_FE_LED2", 0x8, 0x3, 0x00,
0409             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO16 */
0410             BERLIN_PINCTRL_FUNCTION(0x2, "led")), /* LED2 */
0411     BERLIN_PINCTRL_GROUP("SM_HDMI_HPD", 0x8, 0x3, 0x03,
0412             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO17 */
0413             BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), /* HPD */
0414     BERLIN_PINCTRL_GROUP("SM_HDMI_CEC", 0x8, 0x3, 0x06,
0415             BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO18 */
0416             BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), /* CEC */
0417 };
0418 
0419 static const struct berlin_pinctrl_desc berlin4ct_soc_pinctrl_data = {
0420     .groups = berlin4ct_soc_pinctrl_groups,
0421     .ngroups = ARRAY_SIZE(berlin4ct_soc_pinctrl_groups),
0422 };
0423 
0424 static const struct berlin_pinctrl_desc berlin4ct_avio_pinctrl_data = {
0425     .groups = berlin4ct_avio_pinctrl_groups,
0426     .ngroups = ARRAY_SIZE(berlin4ct_avio_pinctrl_groups),
0427 };
0428 
0429 static const struct berlin_pinctrl_desc berlin4ct_sysmgr_pinctrl_data = {
0430     .groups = berlin4ct_sysmgr_pinctrl_groups,
0431     .ngroups = ARRAY_SIZE(berlin4ct_sysmgr_pinctrl_groups),
0432 };
0433 
0434 static const struct of_device_id berlin4ct_pinctrl_match[] = {
0435     {
0436         .compatible = "marvell,berlin4ct-soc-pinctrl",
0437         .data = &berlin4ct_soc_pinctrl_data,
0438     },
0439     {
0440         .compatible = "marvell,berlin4ct-avio-pinctrl",
0441         .data = &berlin4ct_avio_pinctrl_data,
0442     },
0443     {
0444         .compatible = "marvell,berlin4ct-system-pinctrl",
0445         .data = &berlin4ct_sysmgr_pinctrl_data,
0446     },
0447     {}
0448 };
0449 
0450 static int berlin4ct_pinctrl_probe(struct platform_device *pdev)
0451 {
0452     const struct of_device_id *match =
0453         of_match_device(berlin4ct_pinctrl_match, &pdev->dev);
0454     struct regmap_config *rmconfig;
0455     struct regmap *regmap;
0456     struct resource *res;
0457     void __iomem *base;
0458 
0459     rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL);
0460     if (!rmconfig)
0461         return -ENOMEM;
0462 
0463     base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
0464     if (IS_ERR(base))
0465         return PTR_ERR(base);
0466 
0467     rmconfig->reg_bits = 32,
0468     rmconfig->val_bits = 32,
0469     rmconfig->reg_stride = 4,
0470     rmconfig->max_register = resource_size(res);
0471 
0472     regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig);
0473     if (IS_ERR(regmap))
0474         return PTR_ERR(regmap);
0475 
0476     return berlin_pinctrl_probe_regmap(pdev, match->data, regmap);
0477 }
0478 
0479 static struct platform_driver berlin4ct_pinctrl_driver = {
0480     .probe  = berlin4ct_pinctrl_probe,
0481     .driver = {
0482         .name = "berlin4ct-pinctrl",
0483         .of_match_table = berlin4ct_pinctrl_match,
0484     },
0485 };
0486 builtin_platform_driver(berlin4ct_pinctrl_driver);