Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Marvell Armada CP110 pinctrl driver based on mvebu pinctrl core
0004  *
0005  * Copyright (C) 2017 Marvell
0006  *
0007  * Hanna Hawa <hannah@marvell.com>
0008  */
0009 
0010 #include <linux/err.h>
0011 #include <linux/init.h>
0012 #include <linux/io.h>
0013 #include <linux/mfd/syscon.h>
0014 #include <linux/of.h>
0015 #include <linux/of_device.h>
0016 #include <linux/pinctrl/pinctrl.h>
0017 #include <linux/platform_device.h>
0018 
0019 #include "pinctrl-mvebu.h"
0020 
0021 /*
0022  * Even if the pin controller is the same the MMP available depend on the SoC
0023  * integration.
0024  *  - In Armada7K (single CP) almost all the MPPs are available (except the
0025  *    MMP 39 to 43)
0026  *  - In Armada8K (dual CP) the MPPs are split into 2 parts, MPPs 0-31 from
0027  *    CPS, and MPPs 32-62 from CPM, the below flags (V_ARMADA_8K_CPM,
0028  *    V_ARMADA_8K_CPS) set which MPP is available to the CPx.
0029  * The x_PLUS enum mean that the MPP available for CPx and for Armada70x0
0030  */
0031 enum {
0032     V_ARMADA_7K = BIT(0),
0033     V_ARMADA_8K_CPM = BIT(1),
0034     V_ARMADA_8K_CPS = BIT(2),
0035     V_CP115_STANDALONE = BIT(3),
0036     V_ARMADA_7K_8K_CPM = (V_ARMADA_7K | V_ARMADA_8K_CPM),
0037     V_ARMADA_7K_8K_CPS = (V_ARMADA_7K | V_ARMADA_8K_CPS),
0038 };
0039 
0040 static struct mvebu_mpp_mode armada_cp110_mpp_modes[] = {
0041     MPP_MODE(0,
0042          MPP_FUNCTION(0,    "gpio",     NULL),
0043          MPP_FUNCTION(1,    "dev",      "ale1"),
0044          MPP_FUNCTION(2,    "au",       "i2smclk"),
0045          MPP_FUNCTION(3,    "ge0",      "rxd3"),
0046          MPP_FUNCTION(4,    "tdm",      "pclk"),
0047          MPP_FUNCTION(6,    "ptp",      "pulse"),
0048          MPP_FUNCTION(7,    "mss_i2c",  "sda"),
0049          MPP_FUNCTION(8,    "uart0",    "rxd"),
0050          MPP_FUNCTION(9,    "sata0",    "present_act"),
0051          MPP_FUNCTION(10,   "ge",       "mdio")),
0052     MPP_MODE(1,
0053          MPP_FUNCTION(0,    "gpio",     NULL),
0054          MPP_FUNCTION(1,    "dev",      "ale0"),
0055          MPP_FUNCTION(2,    "au",       "i2sdo_spdifo"),
0056          MPP_FUNCTION(3,    "ge0",      "rxd2"),
0057          MPP_FUNCTION(4,    "tdm",      "drx"),
0058          MPP_FUNCTION(6,    "ptp",      "clk"),
0059          MPP_FUNCTION(7,    "mss_i2c",  "sck"),
0060          MPP_FUNCTION(8,    "uart0",    "txd"),
0061          MPP_FUNCTION(9,    "sata1",    "present_act"),
0062          MPP_FUNCTION(10,   "ge",       "mdc")),
0063     MPP_MODE(2,
0064          MPP_FUNCTION(0,    "gpio",     NULL),
0065          MPP_FUNCTION(1,    "dev",      "ad15"),
0066          MPP_FUNCTION(2,    "au",       "i2sextclk"),
0067          MPP_FUNCTION(3,    "ge0",      "rxd1"),
0068          MPP_FUNCTION(4,    "tdm",      "dtx"),
0069          MPP_FUNCTION(5,    "mss_uart", "rxd"),
0070          MPP_FUNCTION(6,    "ptp",      "pclk_out"),
0071          MPP_FUNCTION(7,    "i2c1",     "sck"),
0072          MPP_FUNCTION(8,    "uart1",    "rxd"),
0073          MPP_FUNCTION(9,    "sata0",    "present_act"),
0074          MPP_FUNCTION(10,   "xg",       "mdc")),
0075     MPP_MODE(3,
0076          MPP_FUNCTION(0,    "gpio",     NULL),
0077          MPP_FUNCTION(1,    "dev",      "ad14"),
0078          MPP_FUNCTION(2,    "au",       "i2slrclk"),
0079          MPP_FUNCTION(3,    "ge0",      "rxd0"),
0080          MPP_FUNCTION(4,    "tdm",      "fsync"),
0081          MPP_FUNCTION(5,    "mss_uart", "txd"),
0082          MPP_FUNCTION(6,    "pcie",     "rstoutn"),
0083          MPP_FUNCTION(7,    "i2c1",     "sda"),
0084          MPP_FUNCTION(8,    "uart1",    "txd"),
0085          MPP_FUNCTION(9,    "sata1",    "present_act"),
0086          MPP_FUNCTION(10,   "xg",       "mdio")),
0087     MPP_MODE(4,
0088          MPP_FUNCTION(0,    "gpio",     NULL),
0089          MPP_FUNCTION(1,    "dev",      "ad13"),
0090          MPP_FUNCTION(2,    "au",       "i2sbclk"),
0091          MPP_FUNCTION(3,    "ge0",      "rxctl"),
0092          MPP_FUNCTION(4,    "tdm",      "rstn"),
0093          MPP_FUNCTION(5,    "mss_uart", "rxd"),
0094          MPP_FUNCTION(6,    "uart1",    "cts"),
0095          MPP_FUNCTION(7,    "pcie0",    "clkreq"),
0096          MPP_FUNCTION(8,    "uart3",    "rxd"),
0097          MPP_FUNCTION(10,   "ge",       "mdc")),
0098     MPP_MODE(5,
0099          MPP_FUNCTION(0,    "gpio",     NULL),
0100          MPP_FUNCTION(1,    "dev",      "ad12"),
0101          MPP_FUNCTION(2,    "au",       "i2sdi"),
0102          MPP_FUNCTION(3,    "ge0",      "rxclk"),
0103          MPP_FUNCTION(4,    "tdm",      "intn"),
0104          MPP_FUNCTION(5,    "mss_uart", "txd"),
0105          MPP_FUNCTION(6,    "uart1",    "rts"),
0106          MPP_FUNCTION(7,    "pcie1",    "clkreq"),
0107          MPP_FUNCTION(8,    "uart3",    "txd"),
0108          MPP_FUNCTION(10,   "ge",       "mdio")),
0109     MPP_MODE(6,
0110          MPP_FUNCTION(0,    "gpio",     NULL),
0111          MPP_FUNCTION(1,    "dev",      "ad11"),
0112          MPP_FUNCTION(3,    "ge0",      "txd3"),
0113          MPP_FUNCTION(4,    "spi0",     "csn2"),
0114          MPP_FUNCTION(5,    "au",       "i2sextclk"),
0115          MPP_FUNCTION(6,    "sata1",    "present_act"),
0116          MPP_FUNCTION(7,    "pcie2",    "clkreq"),
0117          MPP_FUNCTION(8,    "uart0",    "rxd"),
0118          MPP_FUNCTION(9,    "ptp",      "pulse")),
0119     MPP_MODE(7,
0120          MPP_FUNCTION(0,    "gpio",     NULL),
0121          MPP_FUNCTION(1,    "dev",      "ad10"),
0122          MPP_FUNCTION(3,    "ge0",      "txd2"),
0123          MPP_FUNCTION(4,    "spi0",     "csn1"),
0124          MPP_FUNCTION(5,    "spi1",     "csn1"),
0125          MPP_FUNCTION(6,    "sata0",    "present_act"),
0126          MPP_FUNCTION(7,    "led",      "data"),
0127          MPP_FUNCTION(8,    "uart0",    "txd"),
0128          MPP_FUNCTION(9,    "ptp",      "clk")),
0129     MPP_MODE(8,
0130          MPP_FUNCTION(0,    "gpio",     NULL),
0131          MPP_FUNCTION(1,    "dev",      "ad9"),
0132          MPP_FUNCTION(3,    "ge0",      "txd1"),
0133          MPP_FUNCTION(4,    "spi0",     "csn0"),
0134          MPP_FUNCTION(5,    "spi1",     "csn0"),
0135          MPP_FUNCTION(6,    "uart0",    "cts"),
0136          MPP_FUNCTION(7,    "led",      "stb"),
0137          MPP_FUNCTION(8,    "uart2",    "rxd"),
0138          MPP_FUNCTION(9,    "ptp",      "pclk_out"),
0139          MPP_FUNCTION(10,   "synce1",   "clk")),
0140     MPP_MODE(9,
0141          MPP_FUNCTION(0,    "gpio",     NULL),
0142          MPP_FUNCTION(1,    "dev",      "ad8"),
0143          MPP_FUNCTION(3,    "ge0",      "txd0"),
0144          MPP_FUNCTION(4,    "spi0",     "mosi"),
0145          MPP_FUNCTION(5,    "spi1",     "mosi"),
0146          MPP_FUNCTION(7,    "pcie",     "rstoutn"),
0147          MPP_FUNCTION(10,   "synce2",   "clk")),
0148     MPP_MODE(10,
0149          MPP_FUNCTION(0,    "gpio",     NULL),
0150          MPP_FUNCTION(1,    "dev",      "readyn"),
0151          MPP_FUNCTION(3,    "ge0",      "txctl"),
0152          MPP_FUNCTION(4,    "spi0",     "miso"),
0153          MPP_FUNCTION(5,    "spi1",     "miso"),
0154          MPP_FUNCTION(6,    "uart0",    "cts"),
0155          MPP_FUNCTION(7,    "sata1",    "present_act")),
0156     MPP_MODE(11,
0157          MPP_FUNCTION(0,    "gpio",     NULL),
0158          MPP_FUNCTION(1,    "dev",      "wen1"),
0159          MPP_FUNCTION(3,    "ge0",      "txclkout"),
0160          MPP_FUNCTION(4,    "spi0",     "clk"),
0161          MPP_FUNCTION(5,    "spi1",     "clk"),
0162          MPP_FUNCTION(6,    "uart0",    "rts"),
0163          MPP_FUNCTION(7,    "led",      "clk"),
0164          MPP_FUNCTION(8,    "uart2",    "txd"),
0165          MPP_FUNCTION(9,    "sata0",    "present_act")),
0166     MPP_MODE(12,
0167          MPP_FUNCTION(0,    "gpio",     NULL),
0168          MPP_FUNCTION(1,    "dev",      "clk_out"),
0169          MPP_FUNCTION(2,    "nf",       "rbn1"),
0170          MPP_FUNCTION(3,    "spi1",     "csn1"),
0171          MPP_FUNCTION(4,    "ge0",      "rxclk")),
0172     MPP_MODE(13,
0173          MPP_FUNCTION(0,    "gpio",     NULL),
0174          MPP_FUNCTION(1,    "dev",      "burstn"),
0175          MPP_FUNCTION(2,    "nf",       "rbn0"),
0176          MPP_FUNCTION(3,    "spi1",     "miso"),
0177          MPP_FUNCTION(4,    "ge0",      "rxctl"),
0178          MPP_FUNCTION(8,    "mss_spi",  "miso")),
0179     MPP_MODE(14,
0180          MPP_FUNCTION(0,    "gpio",     NULL),
0181          MPP_FUNCTION(1,    "dev",      "bootcsn"),
0182          MPP_FUNCTION(2,    "dev",      "csn0"),
0183          MPP_FUNCTION(3,    "spi1",     "csn0"),
0184          MPP_FUNCTION(4,    "spi0",     "csn3"),
0185          MPP_FUNCTION(5,    "au",       "i2sextclk"),
0186          MPP_FUNCTION(6,    "spi0",     "miso"),
0187          MPP_FUNCTION(7,    "sata0",    "present_act"),
0188          MPP_FUNCTION(8,    "mss_spi",  "csn")),
0189     MPP_MODE(15,
0190          MPP_FUNCTION(0,    "gpio",     NULL),
0191          MPP_FUNCTION(1,    "dev",      "ad7"),
0192          MPP_FUNCTION(3,    "spi1",     "mosi"),
0193          MPP_FUNCTION(6,    "spi0",     "mosi"),
0194          MPP_FUNCTION(8,    "mss_spi",  "mosi"),
0195          MPP_FUNCTION(11,   "ptp",      "pulse_cp2cp")),
0196     MPP_MODE(16,
0197          MPP_FUNCTION(0,    "gpio",     NULL),
0198          MPP_FUNCTION(1,    "dev",      "ad6"),
0199          MPP_FUNCTION(3,    "spi1",     "clk"),
0200          MPP_FUNCTION(8,    "mss_spi",  "clk")),
0201     MPP_MODE(17,
0202          MPP_FUNCTION(0,    "gpio",     NULL),
0203          MPP_FUNCTION(1,    "dev",      "ad5"),
0204          MPP_FUNCTION(4,    "ge0",      "txd3")),
0205     MPP_MODE(18,
0206          MPP_FUNCTION(0,    "gpio",     NULL),
0207          MPP_FUNCTION(1,    "dev",      "ad4"),
0208          MPP_FUNCTION(4,    "ge0",      "txd2"),
0209          MPP_FUNCTION(11,   "ptp",      "clk_cp2cp")),
0210     MPP_MODE(19,
0211          MPP_FUNCTION(0,    "gpio",     NULL),
0212          MPP_FUNCTION(1,    "dev",      "ad3"),
0213          MPP_FUNCTION(4,    "ge0",      "txd1"),
0214          MPP_FUNCTION(11,   "wakeup",   "out_cp2cp")),
0215     MPP_MODE(20,
0216          MPP_FUNCTION(0,    "gpio",     NULL),
0217          MPP_FUNCTION(1,    "dev",      "ad2"),
0218          MPP_FUNCTION(4,    "ge0",      "txd0")),
0219     MPP_MODE(21,
0220          MPP_FUNCTION(0,    "gpio",     NULL),
0221          MPP_FUNCTION(1,    "dev",      "ad1"),
0222          MPP_FUNCTION(4,    "ge0",      "txctl"),
0223          MPP_FUNCTION(11,   "sei",      "in_cp2cp")),
0224     MPP_MODE(22,
0225          MPP_FUNCTION(0,    "gpio",     NULL),
0226          MPP_FUNCTION(1,    "dev",      "ad0"),
0227          MPP_FUNCTION(4,    "ge0",      "txclkout"),
0228          MPP_FUNCTION(11,   "wakeup",   "in_cp2cp")),
0229     MPP_MODE(23,
0230          MPP_FUNCTION(0,    "gpio",     NULL),
0231          MPP_FUNCTION(1,    "dev",      "a1"),
0232          MPP_FUNCTION(5,    "au",       "i2smclk"),
0233          MPP_FUNCTION(11,   "link",     "rd_in_cp2cp")),
0234     MPP_MODE(24,
0235          MPP_FUNCTION(0,    "gpio",     NULL),
0236          MPP_FUNCTION(1,    "dev",      "a0"),
0237          MPP_FUNCTION(5,    "au",       "i2slrclk")),
0238     MPP_MODE(25,
0239          MPP_FUNCTION(0,    "gpio",     NULL),
0240          MPP_FUNCTION(1,    "dev",      "oen"),
0241          MPP_FUNCTION(5,    "au",       "i2sdo_spdifo")),
0242     MPP_MODE(26,
0243          MPP_FUNCTION(0,    "gpio",     NULL),
0244          MPP_FUNCTION(1,    "dev",      "wen0"),
0245          MPP_FUNCTION(5,    "au",       "i2sbclk")),
0246     MPP_MODE(27,
0247          MPP_FUNCTION(0,    "gpio",     NULL),
0248          MPP_FUNCTION(1,    "dev",      "csn0"),
0249          MPP_FUNCTION(2,    "spi1",     "miso"),
0250          MPP_FUNCTION(3,    "mss_gpio4",    NULL),
0251          MPP_FUNCTION(4,    "ge0",      "rxd3"),
0252          MPP_FUNCTION(5,    "spi0",     "csn4"),
0253          MPP_FUNCTION(8,    "ge",       "mdio"),
0254          MPP_FUNCTION(9,    "sata0",    "present_act"),
0255          MPP_FUNCTION(10,   "uart0",    "rts"),
0256          MPP_FUNCTION(11,   "rei",      "in_cp2cp")),
0257     MPP_MODE(28,
0258          MPP_FUNCTION(0,    "gpio",     NULL),
0259          MPP_FUNCTION(1,    "dev",      "csn1"),
0260          MPP_FUNCTION(2,    "spi1",     "csn0"),
0261          MPP_FUNCTION(3,    "mss_gpio5",    NULL),
0262          MPP_FUNCTION(4,    "ge0",      "rxd2"),
0263          MPP_FUNCTION(5,    "spi0",     "csn5"),
0264          MPP_FUNCTION(6,    "pcie2",    "clkreq"),
0265          MPP_FUNCTION(7,    "ptp",      "pulse"),
0266          MPP_FUNCTION(8,    "ge",       "mdc"),
0267          MPP_FUNCTION(9,    "sata1",    "present_act"),
0268          MPP_FUNCTION(10,   "uart0",    "cts"),
0269          MPP_FUNCTION(11,   "led",      "data")),
0270     MPP_MODE(29,
0271          MPP_FUNCTION(0,    "gpio",     NULL),
0272          MPP_FUNCTION(1,    "dev",      "csn2"),
0273          MPP_FUNCTION(2,    "spi1",     "mosi"),
0274          MPP_FUNCTION(3,    "mss_gpio6",    NULL),
0275          MPP_FUNCTION(4,    "ge0",      "rxd1"),
0276          MPP_FUNCTION(5,    "spi0",     "csn6"),
0277          MPP_FUNCTION(6,    "pcie1",    "clkreq"),
0278          MPP_FUNCTION(7,    "ptp",      "clk"),
0279          MPP_FUNCTION(8,    "mss_i2c",  "sda"),
0280          MPP_FUNCTION(9,    "sata0",    "present_act"),
0281          MPP_FUNCTION(10,   "uart0",    "rxd"),
0282          MPP_FUNCTION(11,   "led",      "stb")),
0283     MPP_MODE(30,
0284          MPP_FUNCTION(0,    "gpio",     NULL),
0285          MPP_FUNCTION(1,    "dev",      "csn3"),
0286          MPP_FUNCTION(2,    "spi1",     "clk"),
0287          MPP_FUNCTION(3,    "mss_gpio7",    NULL),
0288          MPP_FUNCTION(4,    "ge0",      "rxd0"),
0289          MPP_FUNCTION(5,    "spi0",     "csn7"),
0290          MPP_FUNCTION(6,    "pcie0",    "clkreq"),
0291          MPP_FUNCTION(7,    "ptp",      "pclk_out"),
0292          MPP_FUNCTION(8,    "mss_i2c",  "sck"),
0293          MPP_FUNCTION(9,    "sata1",    "present_act"),
0294          MPP_FUNCTION(10,   "uart0",    "txd"),
0295          MPP_FUNCTION(11,   "led",      "clk")),
0296     MPP_MODE(31,
0297          MPP_FUNCTION(0,    "gpio",     NULL),
0298          MPP_FUNCTION(1,    "dev",      "a2"),
0299          MPP_FUNCTION(3,    "mss_gpio4",    NULL),
0300          MPP_FUNCTION(6,    "pcie",     "rstoutn"),
0301          MPP_FUNCTION(8,    "ge",       "mdc")),
0302     MPP_MODE(32,
0303          MPP_FUNCTION(0,    "gpio",     NULL),
0304          MPP_FUNCTION(1,    "mii",      "col"),
0305          MPP_FUNCTION(2,    "mii",      "txerr"),
0306          MPP_FUNCTION(3,    "mss_spi",  "miso"),
0307          MPP_FUNCTION(4,    "tdm",      "drx"),
0308          MPP_FUNCTION(5,    "au",       "i2sextclk"),
0309          MPP_FUNCTION(6,    "au",       "i2sdi"),
0310          MPP_FUNCTION(7,    "ge",       "mdio"),
0311          MPP_FUNCTION(8,    "sdio",     "v18_en"),
0312          MPP_FUNCTION(9,    "pcie1",    "clkreq"),
0313          MPP_FUNCTION(10,   "mss_gpio0",    NULL)),
0314     MPP_MODE(33,
0315          MPP_FUNCTION(0,    "gpio",     NULL),
0316          MPP_FUNCTION(1,    "mii",      "txclk"),
0317          MPP_FUNCTION(2,    "sdio",     "pwr10"),
0318          MPP_FUNCTION(3,    "mss_spi",  "csn"),
0319          MPP_FUNCTION(4,    "tdm",      "fsync"),
0320          MPP_FUNCTION(5,    "au",       "i2smclk"),
0321          MPP_FUNCTION(6,    "sdio",     "bus_pwr"),
0322          MPP_FUNCTION(8,    "xg",       "mdio"),
0323          MPP_FUNCTION(9,    "pcie2",    "clkreq"),
0324          MPP_FUNCTION(10,   "mss_gpio1",    NULL)),
0325     MPP_MODE(34,
0326          MPP_FUNCTION(0,    "gpio",     NULL),
0327          MPP_FUNCTION(1,    "mii",      "rxerr"),
0328          MPP_FUNCTION(2,    "sdio",     "pwr11"),
0329          MPP_FUNCTION(3,    "mss_spi",  "mosi"),
0330          MPP_FUNCTION(4,    "tdm",      "dtx"),
0331          MPP_FUNCTION(5,    "au",       "i2slrclk"),
0332          MPP_FUNCTION(6,    "sdio",     "wr_protect"),
0333          MPP_FUNCTION(7,    "ge",       "mdc"),
0334          MPP_FUNCTION(9,    "pcie0",    "clkreq"),
0335          MPP_FUNCTION(10,   "mss_gpio2",    NULL)),
0336     MPP_MODE(35,
0337          MPP_FUNCTION(0,    "gpio",     NULL),
0338          MPP_FUNCTION(1,    "sata1",    "present_act"),
0339          MPP_FUNCTION(2,    "i2c1",     "sda"),
0340          MPP_FUNCTION(3,    "mss_spi",  "clk"),
0341          MPP_FUNCTION(4,    "tdm",      "pclk"),
0342          MPP_FUNCTION(5,    "au",       "i2sdo_spdifo"),
0343          MPP_FUNCTION(6,    "sdio",     "card_detect"),
0344          MPP_FUNCTION(7,    "xg",       "mdio"),
0345          MPP_FUNCTION(8,    "ge",       "mdio"),
0346          MPP_FUNCTION(9,    "pcie",     "rstoutn"),
0347          MPP_FUNCTION(10,   "mss_gpio3",    NULL)),
0348     MPP_MODE(36,
0349          MPP_FUNCTION(0,    "gpio",     NULL),
0350          MPP_FUNCTION(1,    "synce2",   "clk"),
0351          MPP_FUNCTION(2,    "i2c1",     "sck"),
0352          MPP_FUNCTION(3,    "ptp",      "clk"),
0353          MPP_FUNCTION(4,    "synce1",   "clk"),
0354          MPP_FUNCTION(5,    "au",       "i2sbclk"),
0355          MPP_FUNCTION(6,    "sata0",    "present_act"),
0356          MPP_FUNCTION(7,    "xg",       "mdc"),
0357          MPP_FUNCTION(8,    "ge",       "mdc"),
0358          MPP_FUNCTION(9,    "pcie2",    "clkreq"),
0359          MPP_FUNCTION(10,   "mss_gpio5",    NULL)),
0360     MPP_MODE(37,
0361          MPP_FUNCTION(0,    "gpio",     NULL),
0362          MPP_FUNCTION(1,    "uart2",    "rxd"),
0363          MPP_FUNCTION(2,    "i2c0",     "sck"),
0364          MPP_FUNCTION(3,    "ptp",      "pclk_out"),
0365          MPP_FUNCTION(4,    "tdm",      "intn"),
0366          MPP_FUNCTION(5,    "mss_i2c",  "sck"),
0367          MPP_FUNCTION(6,    "sata1",    "present_act"),
0368          MPP_FUNCTION(7,    "ge",       "mdc"),
0369          MPP_FUNCTION(8,    "xg",       "mdc"),
0370          MPP_FUNCTION(9,    "pcie1",    "clkreq"),
0371          MPP_FUNCTION(10,   "mss_gpio6",    NULL),
0372          MPP_FUNCTION(11,   "link",     "rd_out_cp2cp")),
0373     MPP_MODE(38,
0374          MPP_FUNCTION(0,    "gpio",     NULL),
0375          MPP_FUNCTION(1,    "uart2",    "txd"),
0376          MPP_FUNCTION(2,    "i2c0",     "sda"),
0377          MPP_FUNCTION(3,    "ptp",      "pulse"),
0378          MPP_FUNCTION(4,    "tdm",      "rstn"),
0379          MPP_FUNCTION(5,    "mss_i2c",  "sda"),
0380          MPP_FUNCTION(6,    "sata0",    "present_act"),
0381          MPP_FUNCTION(7,    "ge",       "mdio"),
0382          MPP_FUNCTION(8,    "xg",       "mdio"),
0383          MPP_FUNCTION(9,    "au",       "i2sextclk"),
0384          MPP_FUNCTION(10,   "mss_gpio7",    NULL),
0385          MPP_FUNCTION(11,   "ptp",      "pulse_cp2cp")),
0386     MPP_MODE(39,
0387          MPP_FUNCTION(0,    "gpio",     NULL),
0388          MPP_FUNCTION(1,    "sdio",     "wr_protect"),
0389          MPP_FUNCTION(4,    "au",       "i2sbclk"),
0390          MPP_FUNCTION(5,    "ptp",      "clk"),
0391          MPP_FUNCTION(6,    "spi0",     "csn1"),
0392          MPP_FUNCTION(9,    "sata1",    "present_act"),
0393          MPP_FUNCTION(10,   "mss_gpio0",    NULL)),
0394     MPP_MODE(40,
0395          MPP_FUNCTION(0,    "gpio",     NULL),
0396          MPP_FUNCTION(1,    "sdio",     "pwr11"),
0397          MPP_FUNCTION(2,    "synce1",   "clk"),
0398          MPP_FUNCTION(3,    "mss_i2c",  "sda"),
0399          MPP_FUNCTION(4,    "au",       "i2sdo_spdifo"),
0400          MPP_FUNCTION(5,    "ptp",      "pclk_out"),
0401          MPP_FUNCTION(6,    "spi0",     "clk"),
0402          MPP_FUNCTION(7,    "uart1",    "txd"),
0403          MPP_FUNCTION(8,    "ge",       "mdio"),
0404          MPP_FUNCTION(9,    "sata0",    "present_act"),
0405          MPP_FUNCTION(10,   "mss_gpio1",    NULL)),
0406     MPP_MODE(41,
0407          MPP_FUNCTION(0,    "gpio",     NULL),
0408          MPP_FUNCTION(1,    "sdio",     "pwr10"),
0409          MPP_FUNCTION(2,    "sdio",     "bus_pwr"),
0410          MPP_FUNCTION(3,    "mss_i2c",  "sck"),
0411          MPP_FUNCTION(4,    "au",       "i2slrclk"),
0412          MPP_FUNCTION(5,    "ptp",      "pulse"),
0413          MPP_FUNCTION(6,    "spi0",     "mosi"),
0414          MPP_FUNCTION(7,    "uart1",    "rxd"),
0415          MPP_FUNCTION(8,    "ge",       "mdc"),
0416          MPP_FUNCTION(9,    "sata1",    "present_act"),
0417          MPP_FUNCTION(10,   "mss_gpio2",    NULL),
0418          MPP_FUNCTION(11,   "rei",      "out_cp2cp")),
0419     MPP_MODE(42,
0420          MPP_FUNCTION(0,    "gpio",     NULL),
0421          MPP_FUNCTION(1,    "sdio",     "v18_en"),
0422          MPP_FUNCTION(2,    "sdio",     "wr_protect"),
0423          MPP_FUNCTION(3,    "synce2",   "clk"),
0424          MPP_FUNCTION(4,    "au",       "i2smclk"),
0425          MPP_FUNCTION(5,    "mss_uart", "txd"),
0426          MPP_FUNCTION(6,    "spi0",     "miso"),
0427          MPP_FUNCTION(7,    "uart1",    "cts"),
0428          MPP_FUNCTION(8,    "xg",       "mdc"),
0429          MPP_FUNCTION(9,    "sata0",    "present_act"),
0430          MPP_FUNCTION(10,   "mss_gpio4",    NULL)),
0431     MPP_MODE(43,
0432          MPP_FUNCTION(0,    "gpio",     NULL),
0433          MPP_FUNCTION(1,    "sdio",     "card_detect"),
0434          MPP_FUNCTION(3,    "synce1",   "clk"),
0435          MPP_FUNCTION(4,    "au",       "i2sextclk"),
0436          MPP_FUNCTION(5,    "mss_uart", "rxd"),
0437          MPP_FUNCTION(6,    "spi0",     "csn0"),
0438          MPP_FUNCTION(7,    "uart1",    "rts"),
0439          MPP_FUNCTION(8,    "xg",       "mdio"),
0440          MPP_FUNCTION(9,    "sata1",    "present_act"),
0441          MPP_FUNCTION(10,   "mss_gpio5",    NULL),
0442          MPP_FUNCTION(11,   "wakeup",   "out_cp2cp")),
0443     MPP_MODE(44,
0444          MPP_FUNCTION(0,    "gpio",     NULL),
0445          MPP_FUNCTION(1,    "ge1",      "txd2"),
0446          MPP_FUNCTION(7,    "uart0",    "rts"),
0447          MPP_FUNCTION(11,   "ptp",      "clk_cp2cp")),
0448     MPP_MODE(45,
0449          MPP_FUNCTION(0,    "gpio",     NULL),
0450          MPP_FUNCTION(1,    "ge1",      "txd3"),
0451          MPP_FUNCTION(7,    "uart0",    "txd"),
0452          MPP_FUNCTION(9,    "pcie",     "rstoutn")),
0453     MPP_MODE(46,
0454          MPP_FUNCTION(0,    "gpio",     NULL),
0455          MPP_FUNCTION(1,    "ge1",      "txd1"),
0456          MPP_FUNCTION(7,    "uart1",    "rts")),
0457     MPP_MODE(47,
0458          MPP_FUNCTION(0,    "gpio",     NULL),
0459          MPP_FUNCTION(1,    "ge1",      "txd0"),
0460          MPP_FUNCTION(5,    "spi1",     "clk"),
0461          MPP_FUNCTION(7,    "uart1",    "txd"),
0462          MPP_FUNCTION(8,    "ge",       "mdc")),
0463     MPP_MODE(48,
0464          MPP_FUNCTION(0,    "gpio",     NULL),
0465          MPP_FUNCTION(1,    "ge1",      "txctl_txen"),
0466          MPP_FUNCTION(5,    "spi1",     "mosi"),
0467          MPP_FUNCTION(8,    "xg",       "mdc"),
0468          MPP_FUNCTION(11,   "wakeup",   "in_cp2cp")),
0469     MPP_MODE(49,
0470          MPP_FUNCTION(0,    "gpio",     NULL),
0471          MPP_FUNCTION(1,    "ge1",      "txclkout"),
0472          MPP_FUNCTION(2,    "mii",      "crs"),
0473          MPP_FUNCTION(5,    "spi1",     "miso"),
0474          MPP_FUNCTION(7,    "uart1",    "rxd"),
0475          MPP_FUNCTION(8,    "ge",       "mdio"),
0476          MPP_FUNCTION(9,    "pcie0",    "clkreq"),
0477          MPP_FUNCTION(10,   "sdio",     "v18_en"),
0478          MPP_FUNCTION(11,   "sei",      "out_cp2cp")),
0479     MPP_MODE(50,
0480          MPP_FUNCTION(0,    "gpio",     NULL),
0481          MPP_FUNCTION(1,    "ge1",      "rxclk"),
0482          MPP_FUNCTION(2,    "mss_i2c",  "sda"),
0483          MPP_FUNCTION(5,    "spi1",     "csn0"),
0484          MPP_FUNCTION(6,    "uart2",    "txd"),
0485          MPP_FUNCTION(7,    "uart0",    "rxd"),
0486          MPP_FUNCTION(8,    "xg",       "mdio"),
0487          MPP_FUNCTION(10,   "sdio",     "pwr11")),
0488     MPP_MODE(51,
0489          MPP_FUNCTION(0,    "gpio",     NULL),
0490          MPP_FUNCTION(1,    "ge1",      "rxd0"),
0491          MPP_FUNCTION(2,    "mss_i2c",  "sck"),
0492          MPP_FUNCTION(5,    "spi1",     "csn1"),
0493          MPP_FUNCTION(6,    "uart2",    "rxd"),
0494          MPP_FUNCTION(7,    "uart0",    "cts"),
0495          MPP_FUNCTION(10,   "sdio",     "pwr10")),
0496     MPP_MODE(52,
0497          MPP_FUNCTION(0,    "gpio",     NULL),
0498          MPP_FUNCTION(1,    "ge1",      "rxd1"),
0499          MPP_FUNCTION(2,    "synce1",   "clk"),
0500          MPP_FUNCTION(4,    "synce2",   "clk"),
0501          MPP_FUNCTION(5,    "spi1",     "csn2"),
0502          MPP_FUNCTION(7,    "uart1",    "cts"),
0503          MPP_FUNCTION(8,    "led",      "clk"),
0504          MPP_FUNCTION(9,    "pcie",     "rstoutn"),
0505          MPP_FUNCTION(10,   "pcie0",    "clkreq")),
0506     MPP_MODE(53,
0507          MPP_FUNCTION(0,    "gpio",     NULL),
0508          MPP_FUNCTION(1,    "ge1",      "rxd2"),
0509          MPP_FUNCTION(3,    "ptp",      "clk"),
0510          MPP_FUNCTION(5,    "spi1",     "csn3"),
0511          MPP_FUNCTION(7,    "uart1",    "rxd"),
0512          MPP_FUNCTION(8,    "led",      "stb"),
0513          MPP_FUNCTION(11,   "sdio",     "led")),
0514     MPP_MODE(54,
0515          MPP_FUNCTION(0,    "gpio",     NULL),
0516          MPP_FUNCTION(1,    "ge1",      "rxd3"),
0517          MPP_FUNCTION(2,    "synce2",   "clk"),
0518          MPP_FUNCTION(3,    "ptp",      "pclk_out"),
0519          MPP_FUNCTION(4,    "synce1",   "clk"),
0520          MPP_FUNCTION(8,    "led",      "data"),
0521          MPP_FUNCTION(10,   "sdio",     "hw_rst"),
0522          MPP_FUNCTION(11,   "sdio_wp",  "wr_protect")),
0523     MPP_MODE(55,
0524          MPP_FUNCTION(0,    "gpio",     NULL),
0525          MPP_FUNCTION(1,    "ge1",      "rxctl_rxdv"),
0526          MPP_FUNCTION(3,    "ptp",      "pulse"),
0527          MPP_FUNCTION(10,   "sdio",     "led"),
0528          MPP_FUNCTION(11,   "sdio_cd",  "card_detect")),
0529     MPP_MODE(56,
0530          MPP_FUNCTION(0,    "gpio",     NULL),
0531          MPP_FUNCTION(4,    "tdm",      "drx"),
0532          MPP_FUNCTION(5,    "au",       "i2sdo_spdifo"),
0533          MPP_FUNCTION(6,    "spi0",     "clk"),
0534          MPP_FUNCTION(7,    "uart1",    "rxd"),
0535          MPP_FUNCTION(9,    "sata1",    "present_act"),
0536          MPP_FUNCTION(14,   "sdio",     "clk")),
0537     MPP_MODE(57,
0538          MPP_FUNCTION(0,    "gpio",     NULL),
0539          MPP_FUNCTION(2,    "mss_i2c",  "sda"),
0540          MPP_FUNCTION(3,    "ptp",      "pclk_out"),
0541          MPP_FUNCTION(4,    "tdm",      "intn"),
0542          MPP_FUNCTION(5,    "au",       "i2sbclk"),
0543          MPP_FUNCTION(6,    "spi0",     "mosi"),
0544          MPP_FUNCTION(7,    "uart1",    "txd"),
0545          MPP_FUNCTION(9,    "sata0",    "present_act"),
0546          MPP_FUNCTION(14,   "sdio",     "cmd")),
0547     MPP_MODE(58,
0548          MPP_FUNCTION(0,    "gpio",     NULL),
0549          MPP_FUNCTION(2,    "mss_i2c",  "sck"),
0550          MPP_FUNCTION(3,    "ptp",      "clk"),
0551          MPP_FUNCTION(4,    "tdm",      "rstn"),
0552          MPP_FUNCTION(5,    "au",       "i2sdi"),
0553          MPP_FUNCTION(6,    "spi0",     "miso"),
0554          MPP_FUNCTION(7,    "uart1",    "cts"),
0555          MPP_FUNCTION(8,    "led",      "clk"),
0556          MPP_FUNCTION(14,   "sdio",     "d0")),
0557     MPP_MODE(59,
0558          MPP_FUNCTION(0,    "gpio",     NULL),
0559          MPP_FUNCTION(1,    "mss_gpio7",    NULL),
0560          MPP_FUNCTION(2,    "synce2",   "clk"),
0561          MPP_FUNCTION(4,    "tdm",      "fsync"),
0562          MPP_FUNCTION(5,    "au",       "i2slrclk"),
0563          MPP_FUNCTION(6,    "spi0",     "csn0"),
0564          MPP_FUNCTION(7,    "uart0",    "cts"),
0565          MPP_FUNCTION(8,    "led",      "stb"),
0566          MPP_FUNCTION(9,    "uart1",    "txd"),
0567          MPP_FUNCTION(14,   "sdio",     "d1")),
0568     MPP_MODE(60,
0569          MPP_FUNCTION(0,    "gpio",     NULL),
0570          MPP_FUNCTION(1,    "mss_gpio6",    NULL),
0571          MPP_FUNCTION(3,    "ptp",      "pulse"),
0572          MPP_FUNCTION(4,    "tdm",      "dtx"),
0573          MPP_FUNCTION(5,    "au",       "i2smclk"),
0574          MPP_FUNCTION(6,    "spi0",     "csn1"),
0575          MPP_FUNCTION(7,    "uart0",    "rts"),
0576          MPP_FUNCTION(8,    "led",      "data"),
0577          MPP_FUNCTION(9,    "uart1",    "rxd"),
0578          MPP_FUNCTION(14,   "sdio",     "d2")),
0579     MPP_MODE(61,
0580          MPP_FUNCTION(0,    "gpio",     NULL),
0581          MPP_FUNCTION(1,    "mss_gpio5",    NULL),
0582          MPP_FUNCTION(3,    "ptp",      "clk"),
0583          MPP_FUNCTION(4,    "tdm",      "pclk"),
0584          MPP_FUNCTION(5,    "au",       "i2sextclk"),
0585          MPP_FUNCTION(6,    "spi0",     "csn2"),
0586          MPP_FUNCTION(7,    "uart0",    "txd"),
0587          MPP_FUNCTION(8,    "uart2",    "txd"),
0588          MPP_FUNCTION(9,    "sata1",    "present_act"),
0589          MPP_FUNCTION(10,   "ge",       "mdio"),
0590          MPP_FUNCTION(14,   "sdio",     "d3")),
0591     MPP_MODE(62,
0592          MPP_FUNCTION(0,    "gpio",     NULL),
0593          MPP_FUNCTION(1,    "mss_gpio4",    NULL),
0594          MPP_FUNCTION(2,    "synce1",   "clk"),
0595          MPP_FUNCTION(3,    "ptp",      "pclk_out"),
0596          MPP_FUNCTION(5,    "sata1",    "present_act"),
0597          MPP_FUNCTION(6,    "spi0",     "csn3"),
0598          MPP_FUNCTION(7,    "uart0",    "rxd"),
0599          MPP_FUNCTION(8,    "uart2",    "rxd"),
0600          MPP_FUNCTION(9,    "sata0",    "present_act"),
0601          MPP_FUNCTION(10,   "ge",       "mdc"),
0602          MPP_FUNCTION(14,   "sdio",     "ds")),
0603 };
0604 
0605 static const struct of_device_id armada_cp110_pinctrl_of_match[] = {
0606     {
0607         .compatible = "marvell,armada-7k-pinctrl",
0608         .data       = (void *) V_ARMADA_7K,
0609     },
0610     {
0611         .compatible = "marvell,armada-8k-cpm-pinctrl",
0612         .data       = (void *) V_ARMADA_8K_CPM,
0613     },
0614     {
0615         .compatible = "marvell,armada-8k-cps-pinctrl",
0616         .data       = (void *) V_ARMADA_8K_CPS,
0617     },
0618     {
0619         .compatible = "marvell,cp115-standalone-pinctrl",
0620         .data       = (void *) V_CP115_STANDALONE,
0621     },
0622     { },
0623 };
0624 
0625 static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls[] = {
0626     MPP_FUNC_CTRL(0, 62, NULL, mvebu_regmap_mpp_ctrl),
0627 };
0628 
0629 static void mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode *m,
0630                      u8 variant)
0631 {
0632     struct mvebu_mpp_ctrl_setting *s;
0633 
0634     for (s = m->settings ; s->name ; s++)
0635         s->variant = variant;
0636 }
0637 
0638 static int armada_cp110_pinctrl_probe(struct platform_device *pdev)
0639 {
0640     struct mvebu_pinctrl_soc_info *soc;
0641     const struct of_device_id *match =
0642         of_match_device(armada_cp110_pinctrl_of_match, &pdev->dev);
0643     int i;
0644 
0645     if (!pdev->dev.parent)
0646         return -ENODEV;
0647 
0648     soc = devm_kzalloc(&pdev->dev,
0649                sizeof(struct mvebu_pinctrl_soc_info), GFP_KERNEL);
0650     if (!soc)
0651         return -ENOMEM;
0652 
0653     soc->variant = (unsigned long) match->data & 0xff;
0654     soc->controls = armada_cp110_mpp_controls;
0655     soc->ncontrols = ARRAY_SIZE(armada_cp110_mpp_controls);
0656     soc->modes = armada_cp110_mpp_modes;
0657     soc->nmodes = ARRAY_SIZE(armada_cp110_mpp_modes);
0658     for (i = 0; i < ARRAY_SIZE(armada_cp110_mpp_modes); i++) {
0659         struct mvebu_mpp_mode *m = &armada_cp110_mpp_modes[i];
0660 
0661         switch (i) {
0662         case 0 ... 31:
0663             mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPS |
0664                              V_CP115_STANDALONE));
0665             break;
0666         case 32 ... 38:
0667             mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
0668                              V_CP115_STANDALONE));
0669             break;
0670         case 39 ... 43:
0671             mvebu_pinctrl_assign_variant(m, (V_ARMADA_8K_CPM |
0672                              V_CP115_STANDALONE));
0673             break;
0674         case 44 ... 62:
0675             mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
0676                              V_CP115_STANDALONE));
0677             break;
0678         }
0679     }
0680     pdev->dev.platform_data = soc;
0681 
0682     return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
0683 }
0684 
0685 static struct platform_driver armada_cp110_pinctrl_driver = {
0686     .driver = {
0687         .name = "armada-cp110-pinctrl",
0688         .of_match_table = of_match_ptr(armada_cp110_pinctrl_of_match),
0689     },
0690     .probe = armada_cp110_pinctrl_probe,
0691 };
0692 
0693 builtin_platform_driver(armada_cp110_pinctrl_driver);