Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Marvell Berlin BG2 pinctrl driver.
0004  *
0005  * Copyright (C) 2014 Marvell Technology Group Ltd.
0006  *
0007  * Antoine Ténart <antoine.tenart@free-electrons.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 berlin2_soc_pinctrl_groups[] = {
0018     /* G */
0019     BERLIN_PINCTRL_GROUP("G0", 0x00, 0x1, 0x00,
0020         BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
0021         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0022     BERLIN_PINCTRL_GROUP("G1", 0x00, 0x2, 0x01,
0023         BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS1n */
0024         BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
0025         BERLIN_PINCTRL_FUNCTION(0x2, "usb1")),
0026     BERLIN_PINCTRL_GROUP("G2", 0x00, 0x2, 0x02,
0027         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0028         BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS2n */
0029         BERLIN_PINCTRL_FUNCTION(0x2, "pwm"),
0030         BERLIN_PINCTRL_FUNCTION(0x3, "i2s0")),
0031     BERLIN_PINCTRL_GROUP("G3", 0x00, 0x2, 0x04,
0032         BERLIN_PINCTRL_FUNCTION(0x0, "soc"),
0033         BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS3n */
0034         BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
0035         BERLIN_PINCTRL_FUNCTION(0x3, "i2s1")),
0036     BERLIN_PINCTRL_GROUP("G4", 0x00, 0x2, 0x06,
0037         BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK/SDI/SDO */
0038         BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
0039         BERLIN_PINCTRL_FUNCTION(0x2, "pwm")),
0040     BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x08,
0041         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0042         BERLIN_PINCTRL_FUNCTION(0x1, "sts1"),
0043         BERLIN_PINCTRL_FUNCTION(0x2, "et"),
0044         /*
0045          * Mode 0x3 mux i2s2 mclk *and* i2s3 mclk:
0046          * add two functions so it can be used with other groups
0047          * within the same subnode in the device tree
0048          */
0049         BERLIN_PINCTRL_FUNCTION(0x3, "i2s2"),
0050         BERLIN_PINCTRL_FUNCTION(0x3, "i2s3")),
0051     BERLIN_PINCTRL_GROUP("G6", 0x00, 0x2, 0x0b,
0052         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0053         BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
0054         BERLIN_PINCTRL_FUNCTION(0x2, "et")),
0055     BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x0d,
0056         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0057         BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
0058         BERLIN_PINCTRL_FUNCTION(0x2, "et"),
0059         BERLIN_PINCTRL_FUNCTION(0x3, "vdac")),
0060     BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x10,
0061         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0062         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0063         BERLIN_PINCTRL_FUNCTION(0x2, "et"),
0064         BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
0065         BERLIN_PINCTRL_FUNCTION(0x4, "sata_dbg"),
0066         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0067     BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x13,
0068         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0069         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0070         BERLIN_PINCTRL_FUNCTION(0x2, "et"),
0071         BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
0072         BERLIN_PINCTRL_FUNCTION(0x4, "sata_dbg"),
0073         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0074     BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x16,
0075         BERLIN_PINCTRL_FUNCTION(0x0, "soc"),
0076         BERLIN_PINCTRL_FUNCTION(0x1, "twsi0"),
0077         BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
0078         BERLIN_PINCTRL_FUNCTION(0x3, "ptp")),
0079     BERLIN_PINCTRL_GROUP("G11", 0x00, 0x2, 0x18,
0080         BERLIN_PINCTRL_FUNCTION(0x0, "soc"),
0081         BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
0082         BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
0083         BERLIN_PINCTRL_FUNCTION(0x3, "eddc")),
0084     BERLIN_PINCTRL_GROUP("G12", 0x00, 0x3, 0x1a,
0085         BERLIN_PINCTRL_FUNCTION(0x0, "sts2"),
0086         BERLIN_PINCTRL_FUNCTION(0x1, "sata"),
0087         BERLIN_PINCTRL_FUNCTION(0x2, "sd1"),
0088         BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
0089         BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
0090         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0091     BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x00,
0092         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0093         BERLIN_PINCTRL_FUNCTION(0x1, "sata"),
0094         BERLIN_PINCTRL_FUNCTION(0x2, "sd1"),
0095         BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
0096         BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
0097         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0098     BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x03,
0099         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0100     BERLIN_PINCTRL_GROUP("G15", 0x04, 0x2, 0x04,
0101         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0102         BERLIN_PINCTRL_FUNCTION(0x2, "et"),
0103         BERLIN_PINCTRL_FUNCTION(0x3, "osco")),
0104     BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x06,
0105         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0106         BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
0107         BERLIN_PINCTRL_FUNCTION(0x2, "fp")),
0108     BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x09,
0109         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0110         BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
0111         BERLIN_PINCTRL_FUNCTION(0x2, "fp")),
0112     BERLIN_PINCTRL_GROUP("G18", 0x04, 0x1, 0x0c,
0113         BERLIN_PINCTRL_FUNCTION(0x0, "pll"),
0114         BERLIN_PINCTRL_FUNCTION(0x1, "i2s0")),
0115     BERLIN_PINCTRL_GROUP("G19", 0x04, 0x1, 0x0d,
0116         BERLIN_PINCTRL_FUNCTION(0x0, "i2s0"),
0117         BERLIN_PINCTRL_FUNCTION(0x1, "pwm")),
0118     BERLIN_PINCTRL_GROUP("G20", 0x04, 0x1, 0x0e,
0119         BERLIN_PINCTRL_FUNCTION(0x0, "spdif"),
0120         BERLIN_PINCTRL_FUNCTION(0x1, "arc")),
0121     BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x0f,
0122         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0123         BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
0124         BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
0125         BERLIN_PINCTRL_FUNCTION(0x3, "adac_dbg"),
0126         BERLIN_PINCTRL_FUNCTION(0x4, "pdm_a"),  /* gpio17..19,pdm */
0127         BERLIN_PINCTRL_FUNCTION(0x7, "pdm_b")), /* gpio12..14,pdm */
0128     BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x12,
0129         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0130         BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
0131         BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
0132         BERLIN_PINCTRL_FUNCTION(0x3, "twsi0"),
0133         BERLIN_PINCTRL_FUNCTION(0x4, "pwm")),
0134     BERLIN_PINCTRL_GROUP("G23", 0x04, 0x3, 0x15,
0135         BERLIN_PINCTRL_FUNCTION(0x0, "vclki"),
0136         BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
0137         BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
0138         BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"),
0139         BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
0140         BERLIN_PINCTRL_FUNCTION(0x7, "pdm")),
0141     BERLIN_PINCTRL_GROUP("G24", 0x04, 0x2, 0x18,
0142         BERLIN_PINCTRL_FUNCTION(0x0, "i2s2"),
0143         BERLIN_PINCTRL_FUNCTION(0x1, "i2s1")),
0144     BERLIN_PINCTRL_GROUP("G25", 0x04, 0x2, 0x1a,
0145         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0146         BERLIN_PINCTRL_FUNCTION(0x1, "nand"),
0147         BERLIN_PINCTRL_FUNCTION(0x2, "i2s2")),
0148     BERLIN_PINCTRL_GROUP("G26", 0x04, 0x1, 0x1c,
0149         BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
0150         BERLIN_PINCTRL_FUNCTION(0x1, "emmc")),
0151     BERLIN_PINCTRL_GROUP("G27", 0x04, 0x1, 0x1d,
0152         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0153         BERLIN_PINCTRL_FUNCTION(0x1, "nand")),
0154     BERLIN_PINCTRL_GROUP("G28", 0x04, 0x2, 0x1e,
0155         BERLIN_PINCTRL_FUNCTION(0x0, "dvo"),
0156         BERLIN_PINCTRL_FUNCTION(0x2, "sp")),
0157 };
0158 
0159 static const struct berlin_desc_group berlin2_sysmgr_pinctrl_groups[] = {
0160     /* GSM */
0161     BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00,
0162         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0163         BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS0n */
0164         BERLIN_PINCTRL_FUNCTION(0x2, "eth1")),
0165     BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02,
0166         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0167         BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS1n */
0168         BERLIN_PINCTRL_FUNCTION(0x2, "eth1")),
0169     BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04,
0170         BERLIN_PINCTRL_FUNCTION(0x0, "twsi2"),
0171         BERLIN_PINCTRL_FUNCTION(0x1, "spi2")), /* SS2n/SS3n */
0172     BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06,
0173         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0174         BERLIN_PINCTRL_FUNCTION(0x1, "uart0"),  /* CTS/RTS */
0175         BERLIN_PINCTRL_FUNCTION(0x2, "uart2"),  /* RX/TX */
0176         BERLIN_PINCTRL_FUNCTION(0x3, "twsi2")),
0177     BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08,
0178         BERLIN_PINCTRL_FUNCTION(0x0, "uart0"),  /* RX/TX */
0179         BERLIN_PINCTRL_FUNCTION(0x1, "irda0")),
0180     BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a,
0181         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0182         BERLIN_PINCTRL_FUNCTION(0x1, "uart1"),  /* RX/TX */
0183         BERLIN_PINCTRL_FUNCTION(0x2, "irda1"),
0184         BERLIN_PINCTRL_FUNCTION(0x3, "twsi3")),
0185     BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c,
0186         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0187         BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* CLK/SDO */
0188         BERLIN_PINCTRL_FUNCTION(0x1, "clki")),
0189     BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e,
0190         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0191         BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
0192     BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f,
0193         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0194         BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
0195     BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10,
0196         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0197         BERLIN_PINCTRL_FUNCTION(0x1, "led")),
0198     BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11,
0199         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0200         BERLIN_PINCTRL_FUNCTION(0x1, "led")),
0201     BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12,
0202         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0203         BERLIN_PINCTRL_FUNCTION(0x1, "led")),
0204 };
0205 
0206 static const struct berlin_pinctrl_desc berlin2_soc_pinctrl_data = {
0207     .groups = berlin2_soc_pinctrl_groups,
0208     .ngroups = ARRAY_SIZE(berlin2_soc_pinctrl_groups),
0209 };
0210 
0211 static const struct berlin_pinctrl_desc berlin2_sysmgr_pinctrl_data = {
0212     .groups = berlin2_sysmgr_pinctrl_groups,
0213     .ngroups = ARRAY_SIZE(berlin2_sysmgr_pinctrl_groups),
0214 };
0215 
0216 static const struct of_device_id berlin2_pinctrl_match[] = {
0217     {
0218         .compatible = "marvell,berlin2-soc-pinctrl",
0219         .data = &berlin2_soc_pinctrl_data
0220     },
0221     {
0222         .compatible = "marvell,berlin2-system-pinctrl",
0223         .data = &berlin2_sysmgr_pinctrl_data
0224     },
0225     {}
0226 };
0227 
0228 static int berlin2_pinctrl_probe(struct platform_device *pdev)
0229 {
0230     const struct of_device_id *match =
0231         of_match_device(berlin2_pinctrl_match, &pdev->dev);
0232 
0233     return berlin_pinctrl_probe(pdev, match->data);
0234 }
0235 
0236 static struct platform_driver berlin2_pinctrl_driver = {
0237     .probe  = berlin2_pinctrl_probe,
0238     .driver = {
0239         .name = "berlin-bg2-pinctrl",
0240         .of_match_table = berlin2_pinctrl_match,
0241     },
0242 };
0243 builtin_platform_driver(berlin2_pinctrl_driver);