// SPDX-License-Identifier: GPL-2.0-or-later /* * Marvell Armada 375 pinctrl driver based on mvebu pinctrl core * * Copyright (C) 2012 Marvell * * Thomas Petazzoni <thomas.petazzoni@free-electrons.com> */ #include <linux/err.h> #include <linux/init.h> #include <linux/io.h> #include <linux/platform_device.h> #include <linux/clk.h> #include <linux/of.h> #include <linux/pinctrl/pinctrl.h> #include "pinctrl-mvebu.h" static struct mvebu_mpp_mode mv88f6720_mpp_modes[] = { MPP_MODE(0, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad2"), MPP_FUNCTION(0x2, "spi0", "cs1"), MPP_FUNCTION(0x3, "spi1", "cs1"), MPP_FUNCTION(0x5, "nand", "io2")), MPP_MODE(1, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad3"), MPP_FUNCTION(0x2, "spi0", "mosi"), MPP_FUNCTION(0x3, "spi1", "mosi"), MPP_FUNCTION(0x5, "nand", "io3")), MPP_MODE(2, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad4"), MPP_FUNCTION(0x2, "ptp", "evreq"), MPP_FUNCTION(0x3, "led", "c0"), MPP_FUNCTION(0x4, "audio", "sdi"), MPP_FUNCTION(0x5, "nand", "io4"), MPP_FUNCTION(0x6, "spi1", "mosi")), MPP_MODE(3, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad5"), MPP_FUNCTION(0x2, "ptp", "trig"), MPP_FUNCTION(0x3, "led", "p3"), MPP_FUNCTION(0x4, "audio", "mclk"), MPP_FUNCTION(0x5, "nand", "io5"), MPP_FUNCTION(0x6, "spi1", "miso")), MPP_MODE(4, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad6"), MPP_FUNCTION(0x2, "spi0", "miso"), MPP_FUNCTION(0x3, "spi1", "miso"), MPP_FUNCTION(0x5, "nand", "io6")), MPP_MODE(5, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad7"), MPP_FUNCTION(0x2, "spi0", "cs2"), MPP_FUNCTION(0x3, "spi1", "cs2"), MPP_FUNCTION(0x5, "nand", "io7"), MPP_FUNCTION(0x6, "spi1", "miso")), MPP_MODE(6, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad0"), MPP_FUNCTION(0x3, "led", "p1"), MPP_FUNCTION(0x4, "audio", "lrclk"), MPP_FUNCTION(0x5, "nand", "io0")), MPP_MODE(7, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ad1"), MPP_FUNCTION(0x2, "ptp", "clk"), MPP_FUNCTION(0x3, "led", "p2"), MPP_FUNCTION(0x4, "audio", "extclk"), MPP_FUNCTION(0x5, "nand", "io1")), MPP_MODE(8, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "bootcs"), MPP_FUNCTION(0x2, "spi0", "cs0"), MPP_FUNCTION(0x3, "spi1", "cs0"), MPP_FUNCTION(0x5, "nand", "ce")), MPP_MODE(9, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "spi0", "sck"), MPP_FUNCTION(0x3, "spi1", "sck"), MPP_FUNCTION(0x5, "nand", "we")), MPP_MODE(10, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "dram", "vttctrl"), MPP_FUNCTION(0x3, "led", "c1"), MPP_FUNCTION(0x5, "nand", "re"), MPP_FUNCTION(0x6, "spi1", "sck")), MPP_MODE(11, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "a0"), MPP_FUNCTION(0x3, "led", "c2"), MPP_FUNCTION(0x4, "audio", "sdo"), MPP_FUNCTION(0x5, "nand", "cle")), MPP_MODE(12, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "a1"), MPP_FUNCTION(0x4, "audio", "bclk"), MPP_FUNCTION(0x5, "nand", "ale")), MPP_MODE(13, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "dev", "ready"), MPP_FUNCTION(0x2, "pcie0", "rstout"), MPP_FUNCTION(0x3, "pcie1", "rstout"), MPP_FUNCTION(0x5, "nand", "rb"), MPP_FUNCTION(0x6, "spi1", "mosi")), MPP_MODE(14, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "i2c0", "sda"), MPP_FUNCTION(0x3, "uart1", "txd")), MPP_MODE(15, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "i2c0", "sck"), MPP_FUNCTION(0x3, "uart1", "rxd")), MPP_MODE(16, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "uart0", "txd")), MPP_MODE(17, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "uart0", "rxd")), MPP_MODE(18, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "tdm", "int")), MPP_MODE(19, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "tdm", "rst")), MPP_MODE(20, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "tdm", "pclk")), MPP_MODE(21, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "tdm", "fsync")), MPP_MODE(22, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "tdm", "drx")), MPP_MODE(23, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "tdm", "dtx")), MPP_MODE(24, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p0"), MPP_FUNCTION(0x2, "ge1", "rxd0"), MPP_FUNCTION(0x3, "sd", "cmd"), MPP_FUNCTION(0x4, "uart0", "rts"), MPP_FUNCTION(0x5, "spi0", "cs0"), MPP_FUNCTION(0x6, "dev", "cs1")), MPP_MODE(25, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p2"), MPP_FUNCTION(0x2, "ge1", "rxd1"), MPP_FUNCTION(0x3, "sd", "d0"), MPP_FUNCTION(0x4, "uart0", "cts"), MPP_FUNCTION(0x5, "spi0", "mosi"), MPP_FUNCTION(0x6, "dev", "cs2")), MPP_MODE(26, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie0", "clkreq"), MPP_FUNCTION(0x2, "ge1", "rxd2"), MPP_FUNCTION(0x3, "sd", "d2"), MPP_FUNCTION(0x4, "uart1", "rts"), MPP_FUNCTION(0x5, "spi0", "cs1"), MPP_FUNCTION(0x6, "led", "c1")), MPP_MODE(27, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie1", "clkreq"), MPP_FUNCTION(0x2, "ge1", "rxd3"), MPP_FUNCTION(0x3, "sd", "d1"), MPP_FUNCTION(0x4, "uart1", "cts"), MPP_FUNCTION(0x5, "spi0", "miso"), MPP_FUNCTION(0x6, "led", "c2")), MPP_MODE(28, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p3"), MPP_FUNCTION(0x2, "ge1", "txctl"), MPP_FUNCTION(0x3, "sd", "clk"), MPP_FUNCTION(0x5, "dram", "vttctrl")), MPP_MODE(29, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie1", "clkreq"), MPP_FUNCTION(0x2, "ge1", "rxclk"), MPP_FUNCTION(0x3, "sd", "d3"), MPP_FUNCTION(0x5, "spi0", "sck"), MPP_FUNCTION(0x6, "pcie0", "rstout")), MPP_MODE(30, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge1", "txd0"), MPP_FUNCTION(0x3, "spi1", "cs0"), MPP_FUNCTION(0x5, "led", "p3"), MPP_FUNCTION(0x6, "ptp", "evreq")), MPP_MODE(31, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge1", "txd1"), MPP_FUNCTION(0x3, "spi1", "mosi"), MPP_FUNCTION(0x5, "led", "p0")), MPP_MODE(32, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge1", "txd2"), MPP_FUNCTION(0x3, "spi1", "sck"), MPP_FUNCTION(0x4, "ptp", "trig"), MPP_FUNCTION(0x5, "led", "c0")), MPP_MODE(33, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge1", "txd3"), MPP_FUNCTION(0x3, "spi1", "miso"), MPP_FUNCTION(0x5, "led", "p2")), MPP_MODE(34, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge1", "txclkout"), MPP_FUNCTION(0x3, "spi1", "sck"), MPP_FUNCTION(0x5, "led", "c1")), MPP_MODE(35, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge1", "rxctl"), MPP_FUNCTION(0x3, "spi1", "cs1"), MPP_FUNCTION(0x4, "spi0", "cs2"), MPP_FUNCTION(0x5, "led", "p1")), MPP_MODE(36, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie0", "clkreq"), MPP_FUNCTION(0x5, "led", "c2")), MPP_MODE(37, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie0", "clkreq"), MPP_FUNCTION(0x2, "tdm", "int"), MPP_FUNCTION(0x4, "ge", "mdc")), MPP_MODE(38, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie1", "clkreq"), MPP_FUNCTION(0x4, "ge", "mdio")), MPP_MODE(39, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x4, "ref", "clkout"), MPP_FUNCTION(0x5, "led", "p3")), MPP_MODE(40, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x4, "uart1", "txd"), MPP_FUNCTION(0x5, "led", "p0")), MPP_MODE(41, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x4, "uart1", "rxd"), MPP_FUNCTION(0x5, "led", "p1")), MPP_MODE(42, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x3, "spi1", "cs2"), MPP_FUNCTION(0x4, "led", "c0"), MPP_FUNCTION(0x6, "ptp", "clk")), MPP_MODE(43, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "sata0", "prsnt"), MPP_FUNCTION(0x4, "dram", "vttctrl"), MPP_FUNCTION(0x5, "led", "c1")), MPP_MODE(44, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x4, "sata0", "prsnt")), MPP_MODE(45, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "spi0", "cs2"), MPP_FUNCTION(0x4, "pcie0", "rstout"), MPP_FUNCTION(0x5, "led", "c2"), MPP_FUNCTION(0x6, "spi1", "cs2")), MPP_MODE(46, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p0"), MPP_FUNCTION(0x2, "ge0", "txd0"), MPP_FUNCTION(0x3, "ge1", "txd0"), MPP_FUNCTION(0x6, "dev", "we1")), MPP_MODE(47, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p1"), MPP_FUNCTION(0x2, "ge0", "txd1"), MPP_FUNCTION(0x3, "ge1", "txd1"), MPP_FUNCTION(0x5, "ptp", "trig"), MPP_FUNCTION(0x6, "dev", "ale0")), MPP_MODE(48, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p2"), MPP_FUNCTION(0x2, "ge0", "txd2"), MPP_FUNCTION(0x3, "ge1", "txd2"), MPP_FUNCTION(0x6, "dev", "ale1")), MPP_MODE(49, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "p3"), MPP_FUNCTION(0x2, "ge0", "txd3"), MPP_FUNCTION(0x3, "ge1", "txd3"), MPP_FUNCTION(0x6, "dev", "a2")), MPP_MODE(50, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "c0"), MPP_FUNCTION(0x2, "ge0", "rxd0"), MPP_FUNCTION(0x3, "ge1", "rxd0"), MPP_FUNCTION(0x5, "ptp", "evreq"), MPP_FUNCTION(0x6, "dev", "ad12")), MPP_MODE(51, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "c1"), MPP_FUNCTION(0x2, "ge0", "rxd1"), MPP_FUNCTION(0x3, "ge1", "rxd1"), MPP_FUNCTION(0x6, "dev", "ad8")), MPP_MODE(52, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "led", "c2"), MPP_FUNCTION(0x2, "ge0", "rxd2"), MPP_FUNCTION(0x3, "ge1", "rxd2"), MPP_FUNCTION(0x5, "i2c0", "sda"), MPP_FUNCTION(0x6, "dev", "ad9")), MPP_MODE(53, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie1", "rstout"), MPP_FUNCTION(0x2, "ge0", "rxd3"), MPP_FUNCTION(0x3, "ge1", "rxd3"), MPP_FUNCTION(0x5, "i2c0", "sck"), MPP_FUNCTION(0x6, "dev", "ad10")), MPP_MODE(54, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "pcie0", "rstout"), MPP_FUNCTION(0x2, "ge0", "rxctl"), MPP_FUNCTION(0x3, "ge1", "rxctl"), MPP_FUNCTION(0x6, "dev", "ad11")), MPP_MODE(55, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge0", "rxclk"), MPP_FUNCTION(0x3, "ge1", "rxclk"), MPP_FUNCTION(0x6, "dev", "cs0")), MPP_MODE(56, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge0", "txclkout"), MPP_FUNCTION(0x3, "ge1", "txclkout"), MPP_FUNCTION(0x6, "dev", "oe")), MPP_MODE(57, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ge0", "txctl"), MPP_FUNCTION(0x3, "ge1", "txctl"), MPP_FUNCTION(0x6, "dev", "we0")), MPP_MODE(58, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x4, "led", "c0")), MPP_MODE(59, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x4, "led", "c1")), MPP_MODE(60, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "uart1", "txd"), MPP_FUNCTION(0x4, "led", "c2"), MPP_FUNCTION(0x6, "dev", "ad13")), MPP_MODE(61, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "i2c1", "sda"), MPP_FUNCTION(0x2, "uart1", "rxd"), MPP_FUNCTION(0x3, "spi1", "cs2"), MPP_FUNCTION(0x4, "led", "p0"), MPP_FUNCTION(0x6, "dev", "ad14")), MPP_MODE(62, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "i2c1", "sck"), MPP_FUNCTION(0x4, "led", "p1"), MPP_FUNCTION(0x6, "dev", "ad15")), MPP_MODE(63, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ptp", "trig"), MPP_FUNCTION(0x4, "led", "p2"), MPP_FUNCTION(0x6, "dev", "burst/last")), MPP_MODE(64, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "dram", "vttctrl"), MPP_FUNCTION(0x4, "led", "p3")), MPP_MODE(65, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x1, "sata1", "prsnt")), MPP_MODE(66, MPP_FUNCTION(0x0, "gpio", NULL), MPP_FUNCTION(0x2, "ptp", "evreq"), MPP_FUNCTION(0x4, "spi1", "cs3"), MPP_FUNCTION(0x5, "pcie0", "rstout"), MPP_FUNCTION(0x6, "dev", "cs3")), }; static struct mvebu_pinctrl_soc_info armada_375_pinctrl_info; static const struct of_device_id armada_375_pinctrl_of_match[] = { { .compatible = "marvell,mv88f6720-pinctrl" }, { }, }; static const struct mvebu_mpp_ctrl mv88f6720_mpp_controls[] = { MPP_FUNC_CTRL(0, 69, NULL, mvebu_mmio_mpp_ctrl), }; static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = { MPP_GPIO_RANGE(0, 0, 0, 32), MPP_GPIO_RANGE(1, 32, 32, 32), MPP_GPIO_RANGE(2, 64, 64, 3), }; static int armada_375_pinctrl_probe(struct platform_device *pdev) { struct mvebu_pinctrl_soc_info *soc = &armada_375_pinctrl_info; soc->variant = 0; /* no variants for Armada 375 */ soc->controls = mv88f6720_mpp_controls; soc->ncontrols = ARRAY_SIZE(mv88f6720_mpp_controls); soc->modes = mv88f6720_mpp_modes; soc->nmodes = ARRAY_SIZE(mv88f6720_mpp_modes); soc->gpioranges = mv88f6720_mpp_gpio_ranges; soc->ngpioranges = ARRAY_SIZE(mv88f6720_mpp_gpio_ranges); pdev->dev.platform_data = soc; return mvebu_pinctrl_simple_mmio_probe(pdev); } static struct platform_driver armada_375_pinctrl_driver = { .driver = { .name = "armada-375-pinctrl", .of_match_table = of_match_ptr(armada_375_pinctrl_of_match), }, .probe = armada_375_pinctrl_probe, }; builtin_platform_driver(armada_375_pinctrl_driver);