| // 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", "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", "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); |