Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Marvell Berlin BG2CD 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 berlin2cd_soc_pinctrl_groups[] = {
0018     /* G */
0019     BERLIN_PINCTRL_GROUP("G0", 0x00, 0x3, 0x00,
0020         BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
0021         BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
0022         BERLIN_PINCTRL_FUNCTION(0x2, "led"),
0023         BERLIN_PINCTRL_FUNCTION(0x3, "pwm")),
0024     BERLIN_PINCTRL_GROUP("G1", 0x00, 0x3, 0x03,
0025         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0026         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0027         BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
0028         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0029     BERLIN_PINCTRL_GROUP("G2", 0x00, 0x3, 0x06,
0030         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0031         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0032         BERLIN_PINCTRL_FUNCTION(0x2, "fe"),
0033         BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
0034         BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
0035         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0036     BERLIN_PINCTRL_GROUP("G3", 0x00, 0x3, 0x09,
0037         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0038         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0039         BERLIN_PINCTRL_FUNCTION(0x2, "twsi2"),
0040         BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
0041         BERLIN_PINCTRL_FUNCTION(0x4, "fe"),
0042         BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
0043         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0044     BERLIN_PINCTRL_GROUP("G4", 0x00, 0x3, 0x0c,
0045         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0046         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0047         BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
0048         BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
0049         BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
0050         BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
0051         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0052     BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x0f,
0053         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0054         BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
0055         BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
0056         BERLIN_PINCTRL_FUNCTION(0x3, "arc"),
0057         BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
0058         BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
0059         BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
0060     BERLIN_PINCTRL_GROUP("G6", 0x00, 0x3, 0x12,
0061         BERLIN_PINCTRL_FUNCTION(0x0, "uart0"),  /* RX/TX */
0062         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0063     BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x15,
0064         BERLIN_PINCTRL_FUNCTION(0x0, "eddc"),
0065         BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
0066         BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
0067     BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x18,
0068         BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
0069         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0070     BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x1b,
0071         BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
0072         BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS1n/SS2n */
0073         BERLIN_PINCTRL_FUNCTION(0x3, "twsi0")),
0074     BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x1e,
0075         BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK */
0076         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0077     BERLIN_PINCTRL_GROUP("G11", 0x04, 0x2, 0x00,
0078         BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI/SDO */
0079         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0080     BERLIN_PINCTRL_GROUP("G12", 0x04, 0x3, 0x02,
0081         BERLIN_PINCTRL_FUNCTION(0x0, "usb1"),
0082         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0083     BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x05,
0084         BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
0085         BERLIN_PINCTRL_FUNCTION(0x1, "usb0_dbg"),
0086         BERLIN_PINCTRL_FUNCTION(0x2, "usb1_dbg")),
0087     BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x08,
0088         BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
0089         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0090     BERLIN_PINCTRL_GROUP("G15", 0x04, 0x3, 0x09,
0091         BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
0092         BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
0093     BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x0c,
0094         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0095     BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x0f,
0096         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0097     BERLIN_PINCTRL_GROUP("G18", 0x04, 0x2, 0x12,
0098         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0099     BERLIN_PINCTRL_GROUP("G19", 0x04, 0x2, 0x14,
0100         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0101     BERLIN_PINCTRL_GROUP("G20", 0x04, 0x2, 0x16,
0102         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0103     BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x18,
0104         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0105     BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x1b,
0106         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0107     BERLIN_PINCTRL_GROUP("G23", 0x08, 0x3, 0x00,
0108         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0109     BERLIN_PINCTRL_GROUP("G24", 0x08, 0x2, 0x03,
0110         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0111     BERLIN_PINCTRL_GROUP("G25", 0x08, 0x2, 0x05,
0112         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0113     BERLIN_PINCTRL_GROUP("G26", 0x08, 0x1, 0x07,
0114         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0115     BERLIN_PINCTRL_GROUP("G27", 0x08, 0x2, 0x08,
0116         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0117     BERLIN_PINCTRL_GROUP("G28", 0x08, 0x3, 0x0a,
0118         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0119     BERLIN_PINCTRL_GROUP("G29", 0x08, 0x3, 0x0d,
0120         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0121 };
0122 
0123 static const struct berlin_desc_group berlin2cd_sysmgr_pinctrl_groups[] = {
0124     /* GSM */
0125     BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00,
0126         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0127     BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02,
0128         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0129     BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04,
0130         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0131     BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06,
0132         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0133     BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08,
0134         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0135     BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a,
0136         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0137     BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c,
0138         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0139     BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e,
0140         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0141     BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f,
0142         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0143     BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10,
0144         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0145     BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11,
0146         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0147     BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12,
0148         BERLIN_PINCTRL_FUNCTION_UNKNOWN),
0149 };
0150 
0151 static const struct berlin_pinctrl_desc berlin2cd_soc_pinctrl_data = {
0152     .groups = berlin2cd_soc_pinctrl_groups,
0153     .ngroups = ARRAY_SIZE(berlin2cd_soc_pinctrl_groups),
0154 };
0155 
0156 static const struct berlin_pinctrl_desc berlin2cd_sysmgr_pinctrl_data = {
0157     .groups = berlin2cd_sysmgr_pinctrl_groups,
0158     .ngroups = ARRAY_SIZE(berlin2cd_sysmgr_pinctrl_groups),
0159 };
0160 
0161 static const struct of_device_id berlin2cd_pinctrl_match[] = {
0162     {
0163         .compatible = "marvell,berlin2cd-soc-pinctrl",
0164         .data = &berlin2cd_soc_pinctrl_data
0165     },
0166     {
0167         .compatible = "marvell,berlin2cd-system-pinctrl",
0168         .data = &berlin2cd_sysmgr_pinctrl_data
0169     },
0170     {}
0171 };
0172 
0173 static int berlin2cd_pinctrl_probe(struct platform_device *pdev)
0174 {
0175     const struct of_device_id *match =
0176         of_match_device(berlin2cd_pinctrl_match, &pdev->dev);
0177 
0178     return berlin_pinctrl_probe(pdev, match->data);
0179 }
0180 
0181 static struct platform_driver berlin2cd_pinctrl_driver = {
0182     .probe  = berlin2cd_pinctrl_probe,
0183     .driver = {
0184         .name = "berlin-bg2cd-pinctrl",
0185         .of_match_table = berlin2cd_pinctrl_match,
0186     },
0187 };
0188 builtin_platform_driver(berlin2cd_pinctrl_driver);