// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Marvell Armada CP110 pinctrl driver based on mvebu pinctrl core
*
* Copyright (C) 2017 Marvell
*
* Hanna Hawa <hannah@marvell.com>
*/
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/mfd/syscon.h>
#include <linux/of.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include "pinctrl-mvebu.h"
/*
* Even if the pin controller is the same the MMP available depend on the SoC
* integration.
* - In Armada7K (single CP) almost all the MPPs are available (except the
* MMP 39 to 43)
* - In Armada8K (dual CP) the MPPs are split into 2 parts, MPPs 0-31 from
* CPS, and MPPs 32-62 from CPM, the below flags (V_ARMADA_8K_CPM,
* V_ARMADA_8K_CPS) set which MPP is available to the CPx.
* The x_PLUS enum mean that the MPP available for CPx and for Armada70x0
*/
enum {
V_ARMADA_7K = BIT(0),
V_ARMADA_8K_CPM = BIT(1),
V_ARMADA_8K_CPS = BIT(2),
V_CP115_STANDALONE = BIT(3),
V_ARMADA_7K_8K_CPM = (V_ARMADA_7K | V_ARMADA_8K_CPM),
V_ARMADA_7K_8K_CPS = (V_ARMADA_7K | V_ARMADA_8K_CPS),
};
static struct mvebu_mpp_mode armada_cp110_mpp_modes[] = {
MPP_MODE(0,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ale1" ),
MPP_FUNCTION(2, "au" , "i2smclk" ),
MPP_FUNCTION(3, "ge0" , "rxd3" ),
MPP_FUNCTION(4, "tdm" , "pclk" ),
MPP_FUNCTION(6, "ptp" , "pulse" ),
MPP_FUNCTION(7, "mss_i2c" , "sda" ),
MPP_FUNCTION(8, "uart0" , "rxd" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "ge" , "mdio" )),
MPP_MODE(1,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ale0" ),
MPP_FUNCTION(2, "au" , "i2sdo_spdifo" ),
MPP_FUNCTION(3, "ge0" , "rxd2" ),
MPP_FUNCTION(4, "tdm" , "drx" ),
MPP_FUNCTION(6, "ptp" , "clk" ),
MPP_FUNCTION(7, "mss_i2c" , "sck" ),
MPP_FUNCTION(8, "uart0" , "txd" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "ge" , "mdc" )),
MPP_MODE(2,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad15" ),
MPP_FUNCTION(2, "au" , "i2sextclk" ),
MPP_FUNCTION(3, "ge0" , "rxd1" ),
MPP_FUNCTION(4, "tdm" , "dtx" ),
MPP_FUNCTION(5, "mss_uart" , "rxd" ),
MPP_FUNCTION(6, "ptp" , "pclk_out" ),
MPP_FUNCTION(7, "i2c1" , "sck" ),
MPP_FUNCTION(8, "uart1" , "rxd" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "xg" , "mdc" )),
MPP_MODE(3,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad14" ),
MPP_FUNCTION(2, "au" , "i2slrclk" ),
MPP_FUNCTION(3, "ge0" , "rxd0" ),
MPP_FUNCTION(4, "tdm" , "fsync" ),
MPP_FUNCTION(5, "mss_uart" , "txd" ),
MPP_FUNCTION(6, "pcie" , "rstoutn" ),
MPP_FUNCTION(7, "i2c1" , "sda" ),
MPP_FUNCTION(8, "uart1" , "txd" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "xg" , "mdio" )),
MPP_MODE(4,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad13" ),
MPP_FUNCTION(2, "au" , "i2sbclk" ),
MPP_FUNCTION(3, "ge0" , "rxctl" ),
MPP_FUNCTION(4, "tdm" , "rstn" ),
MPP_FUNCTION(5, "mss_uart" , "rxd" ),
MPP_FUNCTION(6, "uart1" , "cts" ),
MPP_FUNCTION(7, "pcie0" , "clkreq" ),
MPP_FUNCTION(8, "uart3" , "rxd" ),
MPP_FUNCTION(10, "ge" , "mdc" )),
MPP_MODE(5,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad12" ),
MPP_FUNCTION(2, "au" , "i2sdi" ),
MPP_FUNCTION(3, "ge0" , "rxclk" ),
MPP_FUNCTION(4, "tdm" , "intn" ),
MPP_FUNCTION(5, "mss_uart" , "txd" ),
MPP_FUNCTION(6, "uart1" , "rts" ),
MPP_FUNCTION(7, "pcie1" , "clkreq" ),
MPP_FUNCTION(8, "uart3" , "txd" ),
MPP_FUNCTION(10, "ge" , "mdio" )),
MPP_MODE(6,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad11" ),
MPP_FUNCTION(3, "ge0" , "txd3" ),
MPP_FUNCTION(4, "spi0" , "csn2" ),
MPP_FUNCTION(5, "au" , "i2sextclk" ),
MPP_FUNCTION(6, "sata1" , "present_act" ),
MPP_FUNCTION(7, "pcie2" , "clkreq" ),
MPP_FUNCTION(8, "uart0" , "rxd" ),
MPP_FUNCTION(9, "ptp" , "pulse" )),
MPP_MODE(7,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad10" ),
MPP_FUNCTION(3, "ge0" , "txd2" ),
MPP_FUNCTION(4, "spi0" , "csn1" ),
MPP_FUNCTION(5, "spi1" , "csn1" ),
MPP_FUNCTION(6, "sata0" , "present_act" ),
MPP_FUNCTION(7, "led" , "data" ),
MPP_FUNCTION(8, "uart0" , "txd" ),
MPP_FUNCTION(9, "ptp" , "clk" )),
MPP_MODE(8,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad9" ),
MPP_FUNCTION(3, "ge0" , "txd1" ),
MPP_FUNCTION(4, "spi0" , "csn0" ),
MPP_FUNCTION(5, "spi1" , "csn0" ),
MPP_FUNCTION(6, "uart0" , "cts" ),
MPP_FUNCTION(7, "led" , "stb" ),
MPP_FUNCTION(8, "uart2" , "rxd" ),
MPP_FUNCTION(9, "ptp" , "pclk_out" ),
MPP_FUNCTION(10, "synce1" , "clk" )),
MPP_MODE(9,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad8" ),
MPP_FUNCTION(3, "ge0" , "txd0" ),
MPP_FUNCTION(4, "spi0" , "mosi" ),
MPP_FUNCTION(5, "spi1" , "mosi" ),
MPP_FUNCTION(7, "pcie" , "rstoutn" ),
MPP_FUNCTION(10, "synce2" , "clk" )),
MPP_MODE(10,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "readyn" ),
MPP_FUNCTION(3, "ge0" , "txctl" ),
MPP_FUNCTION(4, "spi0" , "miso" ),
MPP_FUNCTION(5, "spi1" , "miso" ),
MPP_FUNCTION(6, "uart0" , "cts" ),
MPP_FUNCTION(7, "sata1" , "present_act" )),
MPP_MODE(11,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "wen1" ),
MPP_FUNCTION(3, "ge0" , "txclkout" ),
MPP_FUNCTION(4, "spi0" , "clk" ),
MPP_FUNCTION(5, "spi1" , "clk" ),
MPP_FUNCTION(6, "uart0" , "rts" ),
MPP_FUNCTION(7, "led" , "clk" ),
MPP_FUNCTION(8, "uart2" , "txd" ),
MPP_FUNCTION(9, "sata0" , "present_act" )),
MPP_MODE(12,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "clk_out" ),
MPP_FUNCTION(2, "nf" , "rbn1" ),
MPP_FUNCTION(3, "spi1" , "csn1" ),
MPP_FUNCTION(4, "ge0" , "rxclk" )),
MPP_MODE(13,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "burstn" ),
MPP_FUNCTION(2, "nf" , "rbn0" ),
MPP_FUNCTION(3, "spi1" , "miso" ),
MPP_FUNCTION(4, "ge0" , "rxctl" ),
MPP_FUNCTION(8, "mss_spi" , "miso" )),
MPP_MODE(14,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "bootcsn" ),
MPP_FUNCTION(2, "dev" , "csn0" ),
MPP_FUNCTION(3, "spi1" , "csn0" ),
MPP_FUNCTION(4, "spi0" , "csn3" ),
MPP_FUNCTION(5, "au" , "i2sextclk" ),
MPP_FUNCTION(6, "spi0" , "miso" ),
MPP_FUNCTION(7, "sata0" , "present_act" ),
MPP_FUNCTION(8, "mss_spi" , "csn" )),
MPP_MODE(15,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad7" ),
MPP_FUNCTION(3, "spi1" , "mosi" ),
MPP_FUNCTION(6, "spi0" , "mosi" ),
MPP_FUNCTION(8, "mss_spi" , "mosi" ),
MPP_FUNCTION(11, "ptp" , "pulse_cp2cp" )),
MPP_MODE(16,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad6" ),
MPP_FUNCTION(3, "spi1" , "clk" ),
MPP_FUNCTION(8, "mss_spi" , "clk" )),
MPP_MODE(17,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad5" ),
MPP_FUNCTION(4, "ge0" , "txd3" )),
MPP_MODE(18,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad4" ),
MPP_FUNCTION(4, "ge0" , "txd2" ),
MPP_FUNCTION(11, "ptp" , "clk_cp2cp" )),
MPP_MODE(19,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad3" ),
MPP_FUNCTION(4, "ge0" , "txd1" ),
MPP_FUNCTION(11, "wakeup" , "out_cp2cp" )),
MPP_MODE(20,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad2" ),
MPP_FUNCTION(4, "ge0" , "txd0" )),
MPP_MODE(21,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad1" ),
MPP_FUNCTION(4, "ge0" , "txctl" ),
MPP_FUNCTION(11, "sei" , "in_cp2cp" )),
MPP_MODE(22,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "ad0" ),
MPP_FUNCTION(4, "ge0" , "txclkout" ),
MPP_FUNCTION(11, "wakeup" , "in_cp2cp" )),
MPP_MODE(23,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "a1" ),
MPP_FUNCTION(5, "au" , "i2smclk" ),
MPP_FUNCTION(11, "link" , "rd_in_cp2cp" )),
MPP_MODE(24,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "a0" ),
MPP_FUNCTION(5, "au" , "i2slrclk" )),
MPP_MODE(25,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "oen" ),
MPP_FUNCTION(5, "au" , "i2sdo_spdifo" )),
MPP_MODE(26,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "wen0" ),
MPP_FUNCTION(5, "au" , "i2sbclk" )),
MPP_MODE(27,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "csn0" ),
MPP_FUNCTION(2, "spi1" , "miso" ),
MPP_FUNCTION(3, "mss_gpio4" , NULL),
MPP_FUNCTION(4, "ge0" , "rxd3" ),
MPP_FUNCTION(5, "spi0" , "csn4" ),
MPP_FUNCTION(8, "ge" , "mdio" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "uart0" , "rts" ),
MPP_FUNCTION(11, "rei" , "in_cp2cp" )),
MPP_MODE(28,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "csn1" ),
MPP_FUNCTION(2, "spi1" , "csn0" ),
MPP_FUNCTION(3, "mss_gpio5" , NULL),
MPP_FUNCTION(4, "ge0" , "rxd2" ),
MPP_FUNCTION(5, "spi0" , "csn5" ),
MPP_FUNCTION(6, "pcie2" , "clkreq" ),
MPP_FUNCTION(7, "ptp" , "pulse" ),
MPP_FUNCTION(8, "ge" , "mdc" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "uart0" , "cts" ),
MPP_FUNCTION(11, "led" , "data" )),
MPP_MODE(29,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "csn2" ),
MPP_FUNCTION(2, "spi1" , "mosi" ),
MPP_FUNCTION(3, "mss_gpio6" , NULL),
MPP_FUNCTION(4, "ge0" , "rxd1" ),
MPP_FUNCTION(5, "spi0" , "csn6" ),
MPP_FUNCTION(6, "pcie1" , "clkreq" ),
MPP_FUNCTION(7, "ptp" , "clk" ),
MPP_FUNCTION(8, "mss_i2c" , "sda" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "uart0" , "rxd" ),
MPP_FUNCTION(11, "led" , "stb" )),
MPP_MODE(30,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "csn3" ),
MPP_FUNCTION(2, "spi1" , "clk" ),
MPP_FUNCTION(3, "mss_gpio7" , NULL),
MPP_FUNCTION(4, "ge0" , "rxd0" ),
MPP_FUNCTION(5, "spi0" , "csn7" ),
MPP_FUNCTION(6, "pcie0" , "clkreq" ),
MPP_FUNCTION(7, "ptp" , "pclk_out" ),
MPP_FUNCTION(8, "mss_i2c" , "sck" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "uart0" , "txd" ),
MPP_FUNCTION(11, "led" , "clk" )),
MPP_MODE(31,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "dev" , "a2" ),
MPP_FUNCTION(3, "mss_gpio4" , NULL),
MPP_FUNCTION(6, "pcie" , "rstoutn" ),
MPP_FUNCTION(8, "ge" , "mdc" )),
MPP_MODE(32,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mii" , "col" ),
MPP_FUNCTION(2, "mii" , "txerr" ),
MPP_FUNCTION(3, "mss_spi" , "miso" ),
MPP_FUNCTION(4, "tdm" , "drx" ),
MPP_FUNCTION(5, "au" , "i2sextclk" ),
MPP_FUNCTION(6, "au" , "i2sdi" ),
MPP_FUNCTION(7, "ge" , "mdio" ),
MPP_FUNCTION(8, "sdio" , "v18_en" ),
MPP_FUNCTION(9, "pcie1" , "clkreq" ),
MPP_FUNCTION(10, "mss_gpio0" , NULL)),
MPP_MODE(33,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mii" , "txclk" ),
MPP_FUNCTION(2, "sdio" , "pwr10" ),
MPP_FUNCTION(3, "mss_spi" , "csn" ),
MPP_FUNCTION(4, "tdm" , "fsync" ),
MPP_FUNCTION(5, "au" , "i2smclk" ),
MPP_FUNCTION(6, "sdio" , "bus_pwr" ),
MPP_FUNCTION(8, "xg" , "mdio" ),
MPP_FUNCTION(9, "pcie2" , "clkreq" ),
MPP_FUNCTION(10, "mss_gpio1" , NULL)),
MPP_MODE(34,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mii" , "rxerr" ),
MPP_FUNCTION(2, "sdio" , "pwr11" ),
MPP_FUNCTION(3, "mss_spi" , "mosi" ),
MPP_FUNCTION(4, "tdm" , "dtx" ),
MPP_FUNCTION(5, "au" , "i2slrclk" ),
MPP_FUNCTION(6, "sdio" , "wr_protect" ),
MPP_FUNCTION(7, "ge" , "mdc" ),
MPP_FUNCTION(9, "pcie0" , "clkreq" ),
MPP_FUNCTION(10, "mss_gpio2" , NULL)),
MPP_MODE(35,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "sata1" , "present_act" ),
MPP_FUNCTION(2, "i2c1" , "sda" ),
MPP_FUNCTION(3, "mss_spi" , "clk" ),
MPP_FUNCTION(4, "tdm" , "pclk" ),
MPP_FUNCTION(5, "au" , "i2sdo_spdifo" ),
MPP_FUNCTION(6, "sdio" , "card_detect" ),
MPP_FUNCTION(7, "xg" , "mdio" ),
MPP_FUNCTION(8, "ge" , "mdio" ),
MPP_FUNCTION(9, "pcie" , "rstoutn" ),
MPP_FUNCTION(10, "mss_gpio3" , NULL)),
MPP_MODE(36,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "synce2" , "clk" ),
MPP_FUNCTION(2, "i2c1" , "sck" ),
MPP_FUNCTION(3, "ptp" , "clk" ),
MPP_FUNCTION(4, "synce1" , "clk" ),
MPP_FUNCTION(5, "au" , "i2sbclk" ),
MPP_FUNCTION(6, "sata0" , "present_act" ),
MPP_FUNCTION(7, "xg" , "mdc" ),
MPP_FUNCTION(8, "ge" , "mdc" ),
MPP_FUNCTION(9, "pcie2" , "clkreq" ),
MPP_FUNCTION(10, "mss_gpio5" , NULL)),
MPP_MODE(37,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "uart2" , "rxd" ),
MPP_FUNCTION(2, "i2c0" , "sck" ),
MPP_FUNCTION(3, "ptp" , "pclk_out" ),
MPP_FUNCTION(4, "tdm" , "intn" ),
MPP_FUNCTION(5, "mss_i2c" , "sck" ),
MPP_FUNCTION(6, "sata1" , "present_act" ),
MPP_FUNCTION(7, "ge" , "mdc" ),
MPP_FUNCTION(8, "xg" , "mdc" ),
MPP_FUNCTION(9, "pcie1" , "clkreq" ),
MPP_FUNCTION(10, "mss_gpio6" , NULL),
MPP_FUNCTION(11, "link" , "rd_out_cp2cp" )),
MPP_MODE(38,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "uart2" , "txd" ),
MPP_FUNCTION(2, "i2c0" , "sda" ),
MPP_FUNCTION(3, "ptp" , "pulse" ),
MPP_FUNCTION(4, "tdm" , "rstn" ),
MPP_FUNCTION(5, "mss_i2c" , "sda" ),
MPP_FUNCTION(6, "sata0" , "present_act" ),
MPP_FUNCTION(7, "ge" , "mdio" ),
MPP_FUNCTION(8, "xg" , "mdio" ),
MPP_FUNCTION(9, "au" , "i2sextclk" ),
MPP_FUNCTION(10, "mss_gpio7" , NULL),
MPP_FUNCTION(11, "ptp" , "pulse_cp2cp" )),
MPP_MODE(39,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "sdio" , "wr_protect" ),
MPP_FUNCTION(4, "au" , "i2sbclk" ),
MPP_FUNCTION(5, "ptp" , "clk" ),
MPP_FUNCTION(6, "spi0" , "csn1" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "mss_gpio0" , NULL)),
MPP_MODE(40,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "sdio" , "pwr11" ),
MPP_FUNCTION(2, "synce1" , "clk" ),
MPP_FUNCTION(3, "mss_i2c" , "sda" ),
MPP_FUNCTION(4, "au" , "i2sdo_spdifo" ),
MPP_FUNCTION(5, "ptp" , "pclk_out" ),
MPP_FUNCTION(6, "spi0" , "clk" ),
MPP_FUNCTION(7, "uart1" , "txd" ),
MPP_FUNCTION(8, "ge" , "mdio" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "mss_gpio1" , NULL)),
MPP_MODE(41,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "sdio" , "pwr10" ),
MPP_FUNCTION(2, "sdio" , "bus_pwr" ),
MPP_FUNCTION(3, "mss_i2c" , "sck" ),
MPP_FUNCTION(4, "au" , "i2slrclk" ),
MPP_FUNCTION(5, "ptp" , "pulse" ),
MPP_FUNCTION(6, "spi0" , "mosi" ),
MPP_FUNCTION(7, "uart1" , "rxd" ),
MPP_FUNCTION(8, "ge" , "mdc" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "mss_gpio2" , NULL),
MPP_FUNCTION(11, "rei" , "out_cp2cp" )),
MPP_MODE(42,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "sdio" , "v18_en" ),
MPP_FUNCTION(2, "sdio" , "wr_protect" ),
MPP_FUNCTION(3, "synce2" , "clk" ),
MPP_FUNCTION(4, "au" , "i2smclk" ),
MPP_FUNCTION(5, "mss_uart" , "txd" ),
MPP_FUNCTION(6, "spi0" , "miso" ),
MPP_FUNCTION(7, "uart1" , "cts" ),
MPP_FUNCTION(8, "xg" , "mdc" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "mss_gpio4" , NULL)),
MPP_MODE(43,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "sdio" , "card_detect" ),
MPP_FUNCTION(3, "synce1" , "clk" ),
MPP_FUNCTION(4, "au" , "i2sextclk" ),
MPP_FUNCTION(5, "mss_uart" , "rxd" ),
MPP_FUNCTION(6, "spi0" , "csn0" ),
MPP_FUNCTION(7, "uart1" , "rts" ),
MPP_FUNCTION(8, "xg" , "mdio" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "mss_gpio5" , NULL),
MPP_FUNCTION(11, "wakeup" , "out_cp2cp" )),
MPP_MODE(44,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "txd2" ),
MPP_FUNCTION(7, "uart0" , "rts" ),
MPP_FUNCTION(11, "ptp" , "clk_cp2cp" )),
MPP_MODE(45,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "txd3" ),
MPP_FUNCTION(7, "uart0" , "txd" ),
MPP_FUNCTION(9, "pcie" , "rstoutn" )),
MPP_MODE(46,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "txd1" ),
MPP_FUNCTION(7, "uart1" , "rts" )),
MPP_MODE(47,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "txd0" ),
MPP_FUNCTION(5, "spi1" , "clk" ),
MPP_FUNCTION(7, "uart1" , "txd" ),
MPP_FUNCTION(8, "ge" , "mdc" )),
MPP_MODE(48,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "txctl_txen" ),
MPP_FUNCTION(5, "spi1" , "mosi" ),
MPP_FUNCTION(8, "xg" , "mdc" ),
MPP_FUNCTION(11, "wakeup" , "in_cp2cp" )),
MPP_MODE(49,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "txclkout" ),
MPP_FUNCTION(2, "mii" , "crs" ),
MPP_FUNCTION(5, "spi1" , "miso" ),
MPP_FUNCTION(7, "uart1" , "rxd" ),
MPP_FUNCTION(8, "ge" , "mdio" ),
MPP_FUNCTION(9, "pcie0" , "clkreq" ),
MPP_FUNCTION(10, "sdio" , "v18_en" ),
MPP_FUNCTION(11, "sei" , "out_cp2cp" )),
MPP_MODE(50,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "rxclk" ),
MPP_FUNCTION(2, "mss_i2c" , "sda" ),
MPP_FUNCTION(5, "spi1" , "csn0" ),
MPP_FUNCTION(6, "uart2" , "txd" ),
MPP_FUNCTION(7, "uart0" , "rxd" ),
MPP_FUNCTION(8, "xg" , "mdio" ),
MPP_FUNCTION(10, "sdio" , "pwr11" )),
MPP_MODE(51,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "rxd0" ),
MPP_FUNCTION(2, "mss_i2c" , "sck" ),
MPP_FUNCTION(5, "spi1" , "csn1" ),
MPP_FUNCTION(6, "uart2" , "rxd" ),
MPP_FUNCTION(7, "uart0" , "cts" ),
MPP_FUNCTION(10, "sdio" , "pwr10" )),
MPP_MODE(52,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "rxd1" ),
MPP_FUNCTION(2, "synce1" , "clk" ),
MPP_FUNCTION(4, "synce2" , "clk" ),
MPP_FUNCTION(5, "spi1" , "csn2" ),
MPP_FUNCTION(7, "uart1" , "cts" ),
MPP_FUNCTION(8, "led" , "clk" ),
MPP_FUNCTION(9, "pcie" , "rstoutn" ),
MPP_FUNCTION(10, "pcie0" , "clkreq" )),
MPP_MODE(53,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "rxd2" ),
MPP_FUNCTION(3, "ptp" , "clk" ),
MPP_FUNCTION(5, "spi1" , "csn3" ),
MPP_FUNCTION(7, "uart1" , "rxd" ),
MPP_FUNCTION(8, "led" , "stb" ),
MPP_FUNCTION(11, "sdio" , "led" )),
MPP_MODE(54,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "rxd3" ),
MPP_FUNCTION(2, "synce2" , "clk" ),
MPP_FUNCTION(3, "ptp" , "pclk_out" ),
MPP_FUNCTION(4, "synce1" , "clk" ),
MPP_FUNCTION(8, "led" , "data" ),
MPP_FUNCTION(10, "sdio" , "hw_rst" ),
MPP_FUNCTION(11, "sdio_wp" , "wr_protect" )),
MPP_MODE(55,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "ge1" , "rxctl_rxdv" ),
MPP_FUNCTION(3, "ptp" , "pulse" ),
MPP_FUNCTION(10, "sdio" , "led" ),
MPP_FUNCTION(11, "sdio_cd" , "card_detect" )),
MPP_MODE(56,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(4, "tdm" , "drx" ),
MPP_FUNCTION(5, "au" , "i2sdo_spdifo" ),
MPP_FUNCTION(6, "spi0" , "clk" ),
MPP_FUNCTION(7, "uart1" , "rxd" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(14, "sdio" , "clk" )),
MPP_MODE(57,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(2, "mss_i2c" , "sda" ),
MPP_FUNCTION(3, "ptp" , "pclk_out" ),
MPP_FUNCTION(4, "tdm" , "intn" ),
MPP_FUNCTION(5, "au" , "i2sbclk" ),
MPP_FUNCTION(6, "spi0" , "mosi" ),
MPP_FUNCTION(7, "uart1" , "txd" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(14, "sdio" , "cmd" )),
MPP_MODE(58,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(2, "mss_i2c" , "sck" ),
MPP_FUNCTION(3, "ptp" , "clk" ),
MPP_FUNCTION(4, "tdm" , "rstn" ),
MPP_FUNCTION(5, "au" , "i2sdi" ),
MPP_FUNCTION(6, "spi0" , "miso" ),
MPP_FUNCTION(7, "uart1" , "cts" ),
MPP_FUNCTION(8, "led" , "clk" ),
MPP_FUNCTION(14, "sdio" , "d0" )),
MPP_MODE(59,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mss_gpio7" , NULL),
MPP_FUNCTION(2, "synce2" , "clk" ),
MPP_FUNCTION(4, "tdm" , "fsync" ),
MPP_FUNCTION(5, "au" , "i2slrclk" ),
MPP_FUNCTION(6, "spi0" , "csn0" ),
MPP_FUNCTION(7, "uart0" , "cts" ),
MPP_FUNCTION(8, "led" , "stb" ),
MPP_FUNCTION(9, "uart1" , "txd" ),
MPP_FUNCTION(14, "sdio" , "d1" )),
MPP_MODE(60,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mss_gpio6" , NULL),
MPP_FUNCTION(3, "ptp" , "pulse" ),
MPP_FUNCTION(4, "tdm" , "dtx" ),
MPP_FUNCTION(5, "au" , "i2smclk" ),
MPP_FUNCTION(6, "spi0" , "csn1" ),
MPP_FUNCTION(7, "uart0" , "rts" ),
MPP_FUNCTION(8, "led" , "data" ),
MPP_FUNCTION(9, "uart1" , "rxd" ),
MPP_FUNCTION(14, "sdio" , "d2" )),
MPP_MODE(61,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mss_gpio5" , NULL),
MPP_FUNCTION(3, "ptp" , "clk" ),
MPP_FUNCTION(4, "tdm" , "pclk" ),
MPP_FUNCTION(5, "au" , "i2sextclk" ),
MPP_FUNCTION(6, "spi0" , "csn2" ),
MPP_FUNCTION(7, "uart0" , "txd" ),
MPP_FUNCTION(8, "uart2" , "txd" ),
MPP_FUNCTION(9, "sata1" , "present_act" ),
MPP_FUNCTION(10, "ge" , "mdio" ),
MPP_FUNCTION(14, "sdio" , "d3" )),
MPP_MODE(62,
MPP_FUNCTION(0, "gpio" , NULL),
MPP_FUNCTION(1, "mss_gpio4" , NULL),
MPP_FUNCTION(2, "synce1" , "clk" ),
MPP_FUNCTION(3, "ptp" , "pclk_out" ),
MPP_FUNCTION(5, "sata1" , "present_act" ),
MPP_FUNCTION(6, "spi0" , "csn3" ),
MPP_FUNCTION(7, "uart0" , "rxd" ),
MPP_FUNCTION(8, "uart2" , "rxd" ),
MPP_FUNCTION(9, "sata0" , "present_act" ),
MPP_FUNCTION(10, "ge" , "mdc" ),
MPP_FUNCTION(14, "sdio" , "ds" )),
};
static const struct of_device_id armada_cp110_pinctrl_of_match[] = {
{
.compatible = "marvell,armada-7k-pinctrl" ,
.data = (void *) V_ARMADA_7K,
},
{
.compatible = "marvell,armada-8k-cpm-pinctrl" ,
.data = (void *) V_ARMADA_8K_CPM,
},
{
.compatible = "marvell,armada-8k-cps-pinctrl" ,
.data = (void *) V_ARMADA_8K_CPS,
},
{
.compatible = "marvell,cp115-standalone-pinctrl" ,
.data = (void *) V_CP115_STANDALONE,
},
{ },
};
static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls[] = {
MPP_FUNC_CTRL(0, 62, NULL, mvebu_regmap_mpp_ctrl),
};
static void mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode *m,
u8 variant)
{
struct mvebu_mpp_ctrl_setting *s;
for (s = m->settings ; s->name ; s++)
s->variant = variant;
}
static int armada_cp110_pinctrl_probe(struct platform_device *pdev)
{
struct mvebu_pinctrl_soc_info *soc;
int i;
if (!pdev->dev.parent)
return -ENODEV;
soc = devm_kzalloc(&pdev->dev,
sizeof (struct mvebu_pinctrl_soc_info), GFP_KERNEL);
if (!soc)
return -ENOMEM;
soc->variant = (unsigned long )device_get_match_data(&pdev->dev) & 0xff;
soc->controls = armada_cp110_mpp_controls;
soc->ncontrols = ARRAY_SIZE(armada_cp110_mpp_controls);
soc->modes = armada_cp110_mpp_modes;
soc->nmodes = ARRAY_SIZE(armada_cp110_mpp_modes);
for (i = 0; i < ARRAY_SIZE(armada_cp110_mpp_modes); i++) {
struct mvebu_mpp_mode *m = &armada_cp110_mpp_modes[i];
switch (i) {
case 0 ... 31:
mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPS |
V_CP115_STANDALONE));
break ;
case 32 ... 38:
mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
V_CP115_STANDALONE));
break ;
case 39 ... 43:
mvebu_pinctrl_assign_variant(m, (V_ARMADA_8K_CPM |
V_CP115_STANDALONE));
break ;
case 44 ... 62:
mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
V_CP115_STANDALONE));
break ;
}
}
pdev->dev.platform_data = soc;
return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
}
static struct platform_driver armada_cp110_pinctrl_driver = {
.driver = {
.name = "armada-cp110-pinctrl" ,
.of_match_table = of_match_ptr(armada_cp110_pinctrl_of_match),
},
.probe = armada_cp110_pinctrl_probe,
};
builtin_platform_driver(armada_cp110_pinctrl_driver);
Messung V0.5 C=97 H=94 G=95