// 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/of_device.h> #include <linux/pinctrl/pinctrl.h> #include <linux/platform_device.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; const struct of_device_id *match = of_match_device(armada_cp110_pinctrl_of_match, &pdev->dev); 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) match->data & 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);