// 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(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad2" ),
MPP_FUNCTION(0 x2, "spi0" , "cs1" ),
MPP_FUNCTION(0 x3, "spi1" , "cs1" ),
MPP_FUNCTION(0 x5, "nand" , "io2" )),
MPP_MODE(1 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad3" ),
MPP_FUNCTION(0 x2, "spi0" , "mosi" ),
MPP_FUNCTION(0 x3, "spi1" , "mosi" ),
MPP_FUNCTION(0 x5, "nand" , "io3" )),
MPP_MODE(2 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad4" ),
MPP_FUNCTION(0 x2, "ptp" , "evreq" ),
MPP_FUNCTION(0 x3, "led" , "c0" ),
MPP_FUNCTION(0 x4, "audio" , "sdi" ),
MPP_FUNCTION(0 x5, "nand" , "io4" ),
MPP_FUNCTION(0 x6, "spi1" , "mosi" )),
MPP_MODE(3 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad5" ),
MPP_FUNCTION(0 x2, "ptp" , "trig" ),
MPP_FUNCTION(0 x3, "led" , "p3" ),
MPP_FUNCTION(0 x4, "audio" , "mclk" ),
MPP_FUNCTION(0 x5, "nand" , "io5" ),
MPP_FUNCTION(0 x6, "spi1" , "miso" )),
MPP_MODE(4 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad6" ),
MPP_FUNCTION(0 x2, "spi0" , "miso" ),
MPP_FUNCTION(0 x3, "spi1" , "miso" ),
MPP_FUNCTION(0 x5, "nand" , "io6" )),
MPP_MODE(5 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad7" ),
MPP_FUNCTION(0 x2, "spi0" , "cs2" ),
MPP_FUNCTION(0 x3, "spi1" , "cs2" ),
MPP_FUNCTION(0 x5, "nand" , "io7" ),
MPP_FUNCTION(0 x6, "spi1" , "miso" )),
MPP_MODE(6 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad0" ),
MPP_FUNCTION(0 x3, "led" , "p1" ),
MPP_FUNCTION(0 x4, "audio" , "lrclk" ),
MPP_FUNCTION(0 x5, "nand" , "io0" )),
MPP_MODE(7 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad1" ),
MPP_FUNCTION(0 x2, "ptp" , "clk" ),
MPP_FUNCTION(0 x3, "led" , "p2" ),
MPP_FUNCTION(0 x4, "audio" , "extclk" ),
MPP_FUNCTION(0 x5, "nand" , "io1" )),
MPP_MODE(8 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "bootcs" ),
MPP_FUNCTION(0 x2, "spi0" , "cs0" ),
MPP_FUNCTION(0 x3, "spi1" , "cs0" ),
MPP_FUNCTION(0 x5, "nand" , "ce" )),
MPP_MODE(9 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "spi0" , "sck" ),
MPP_FUNCTION(0 x3, "spi1" , "sck" ),
MPP_FUNCTION(0 x5, "nand" , "we" )),
MPP_MODE(10 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "dram" , "vttctrl" ),
MPP_FUNCTION(0 x3, "led" , "c1" ),
MPP_FUNCTION(0 x5, "nand" , "re" ),
MPP_FUNCTION(0 x6, "spi1" , "sck" )),
MPP_MODE(11 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "a0" ),
MPP_FUNCTION(0 x3, "led" , "c2" ),
MPP_FUNCTION(0 x4, "audio" , "sdo" ),
MPP_FUNCTION(0 x5, "nand" , "cle" )),
MPP_MODE(12 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "a1" ),
MPP_FUNCTION(0 x4, "audio" , "bclk" ),
MPP_FUNCTION(0 x5, "nand" , "ale" )),
MPP_MODE(13 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ready" ),
MPP_FUNCTION(0 x2, "pcie0" , "rstout" ),
MPP_FUNCTION(0 x3, "pcie1" , "rstout" ),
MPP_FUNCTION(0 x5, "nand" , "rb" ),
MPP_FUNCTION(0 x6, "spi1" , "mosi" )),
MPP_MODE(14 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "i2c0" , "sda" ),
MPP_FUNCTION(0 x3, "uart1" , "txd" )),
MPP_MODE(15 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "i2c0" , "sck" ),
MPP_FUNCTION(0 x3, "uart1" , "rxd" )),
MPP_MODE(16 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "uart0" , "txd" )),
MPP_MODE(17 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "uart0" , "rxd" )),
MPP_MODE(18 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "tdm" , "int" )),
MPP_MODE(19 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "tdm" , "rst" )),
MPP_MODE(20 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "tdm" , "pclk" )),
MPP_MODE(21 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "tdm" , "fsync" )),
MPP_MODE(22 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "tdm" , "drx" )),
MPP_MODE(23 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "tdm" , "dtx" )),
MPP_MODE(24 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p0" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd0" ),
MPP_FUNCTION(0 x3, "sd" , "cmd" ),
MPP_FUNCTION(0 x4, "uart0" , "rts" ),
MPP_FUNCTION(0 x5, "spi0" , "cs0" ),
MPP_FUNCTION(0 x6, "dev" , "cs1" )),
MPP_MODE(25 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p2" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd1" ),
MPP_FUNCTION(0 x3, "sd" , "d0" ),
MPP_FUNCTION(0 x4, "uart0" , "cts" ),
MPP_FUNCTION(0 x5, "spi0" , "mosi" ),
MPP_FUNCTION(0 x6, "dev" , "cs2" )),
MPP_MODE(26 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie0" , "clkreq" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd2" ),
MPP_FUNCTION(0 x3, "sd" , "d2" ),
MPP_FUNCTION(0 x4, "uart1" , "rts" ),
MPP_FUNCTION(0 x5, "spi0" , "cs1" ),
MPP_FUNCTION(0 x6, "led" , "c1" )),
MPP_MODE(27 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie1" , "clkreq" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd3" ),
MPP_FUNCTION(0 x3, "sd" , "d1" ),
MPP_FUNCTION(0 x4, "uart1" , "cts" ),
MPP_FUNCTION(0 x5, "spi0" , "miso" ),
MPP_FUNCTION(0 x6, "led" , "c2" )),
MPP_MODE(28 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p3" ),
MPP_FUNCTION(0 x2, "ge1" , "txctl" ),
MPP_FUNCTION(0 x3, "sd" , "clk" ),
MPP_FUNCTION(0 x5, "dram" , "vttctrl" )),
MPP_MODE(29 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie1" , "clkreq" ),
MPP_FUNCTION(0 x2, "ge1" , "rxclk" ),
MPP_FUNCTION(0 x3, "sd" , "d3" ),
MPP_FUNCTION(0 x5, "spi0" , "sck" ),
MPP_FUNCTION(0 x6, "pcie0" , "rstout" )),
MPP_MODE(30 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge1" , "txd0" ),
MPP_FUNCTION(0 x3, "spi1" , "cs0" ),
MPP_FUNCTION(0 x5, "led" , "p3" ),
MPP_FUNCTION(0 x6, "ptp" , "evreq" )),
MPP_MODE(31 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge1" , "txd1" ),
MPP_FUNCTION(0 x3, "spi1" , "mosi" ),
MPP_FUNCTION(0 x5, "led" , "p0" )),
MPP_MODE(32 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge1" , "txd2" ),
MPP_FUNCTION(0 x3, "spi1" , "sck" ),
MPP_FUNCTION(0 x4, "ptp" , "trig" ),
MPP_FUNCTION(0 x5, "led" , "c0" )),
MPP_MODE(33 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge1" , "txd3" ),
MPP_FUNCTION(0 x3, "spi1" , "miso" ),
MPP_FUNCTION(0 x5, "led" , "p2" )),
MPP_MODE(34 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge1" , "txclkout" ),
MPP_FUNCTION(0 x3, "spi1" , "sck" ),
MPP_FUNCTION(0 x5, "led" , "c1" )),
MPP_MODE(35 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge1" , "rxctl" ),
MPP_FUNCTION(0 x3, "spi1" , "cs1" ),
MPP_FUNCTION(0 x4, "spi0" , "cs2" ),
MPP_FUNCTION(0 x5, "led" , "p1" )),
MPP_MODE(36 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie0" , "clkreq" ),
MPP_FUNCTION(0 x5, "led" , "c2" )),
MPP_MODE(37 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie0" , "clkreq" ),
MPP_FUNCTION(0 x2, "tdm" , "int" ),
MPP_FUNCTION(0 x4, "ge" , "mdc" )),
MPP_MODE(38 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie1" , "clkreq" ),
MPP_FUNCTION(0 x4, "ge" , "mdio" )),
MPP_MODE(39 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x4, "ref" , "clkout" ),
MPP_FUNCTION(0 x5, "led" , "p3" )),
MPP_MODE(40 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x4, "uart1" , "txd" ),
MPP_FUNCTION(0 x5, "led" , "p0" )),
MPP_MODE(41 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x4, "uart1" , "rxd" ),
MPP_FUNCTION(0 x5, "led" , "p1" )),
MPP_MODE(42 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x3, "spi1" , "cs2" ),
MPP_FUNCTION(0 x4, "led" , "c0" ),
MPP_FUNCTION(0 x6, "ptp" , "clk" )),
MPP_MODE(43 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "sata0" , "prsnt" ),
MPP_FUNCTION(0 x4, "dram" , "vttctrl" ),
MPP_FUNCTION(0 x5, "led" , "c1" )),
MPP_MODE(44 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x4, "sata0" , "prsnt" )),
MPP_MODE(45 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "spi0" , "cs2" ),
MPP_FUNCTION(0 x4, "pcie0" , "rstout" ),
MPP_FUNCTION(0 x5, "led" , "c2" ),
MPP_FUNCTION(0 x6, "spi1" , "cs2" )),
MPP_MODE(46 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p0" ),
MPP_FUNCTION(0 x2, "ge0" , "txd0" ),
MPP_FUNCTION(0 x3, "ge1" , "txd0" ),
MPP_FUNCTION(0 x6, "dev" , "we1" )),
MPP_MODE(47 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p1" ),
MPP_FUNCTION(0 x2, "ge0" , "txd1" ),
MPP_FUNCTION(0 x3, "ge1" , "txd1" ),
MPP_FUNCTION(0 x5, "ptp" , "trig" ),
MPP_FUNCTION(0 x6, "dev" , "ale0" )),
MPP_MODE(48 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p2" ),
MPP_FUNCTION(0 x2, "ge0" , "txd2" ),
MPP_FUNCTION(0 x3, "ge1" , "txd2" ),
MPP_FUNCTION(0 x6, "dev" , "ale1" )),
MPP_MODE(49 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "p3" ),
MPP_FUNCTION(0 x2, "ge0" , "txd3" ),
MPP_FUNCTION(0 x3, "ge1" , "txd3" ),
MPP_FUNCTION(0 x6, "dev" , "a2" )),
MPP_MODE(50 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "c0" ),
MPP_FUNCTION(0 x2, "ge0" , "rxd0" ),
MPP_FUNCTION(0 x3, "ge1" , "rxd0" ),
MPP_FUNCTION(0 x5, "ptp" , "evreq" ),
MPP_FUNCTION(0 x6, "dev" , "ad12" )),
MPP_MODE(51 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "c1" ),
MPP_FUNCTION(0 x2, "ge0" , "rxd1" ),
MPP_FUNCTION(0 x3, "ge1" , "rxd1" ),
MPP_FUNCTION(0 x6, "dev" , "ad8" )),
MPP_MODE(52 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "led" , "c2" ),
MPP_FUNCTION(0 x2, "ge0" , "rxd2" ),
MPP_FUNCTION(0 x3, "ge1" , "rxd2" ),
MPP_FUNCTION(0 x5, "i2c0" , "sda" ),
MPP_FUNCTION(0 x6, "dev" , "ad9" )),
MPP_MODE(53 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie1" , "rstout" ),
MPP_FUNCTION(0 x2, "ge0" , "rxd3" ),
MPP_FUNCTION(0 x3, "ge1" , "rxd3" ),
MPP_FUNCTION(0 x5, "i2c0" , "sck" ),
MPP_FUNCTION(0 x6, "dev" , "ad10" )),
MPP_MODE(54 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "pcie0" , "rstout" ),
MPP_FUNCTION(0 x2, "ge0" , "rxctl" ),
MPP_FUNCTION(0 x3, "ge1" , "rxctl" ),
MPP_FUNCTION(0 x6, "dev" , "ad11" )),
MPP_MODE(55 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge0" , "rxclk" ),
MPP_FUNCTION(0 x3, "ge1" , "rxclk" ),
MPP_FUNCTION(0 x6, "dev" , "cs0" )),
MPP_MODE(56 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge0" , "txclkout" ),
MPP_FUNCTION(0 x3, "ge1" , "txclkout" ),
MPP_FUNCTION(0 x6, "dev" , "oe" )),
MPP_MODE(57 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ge0" , "txctl" ),
MPP_FUNCTION(0 x3, "ge1" , "txctl" ),
MPP_FUNCTION(0 x6, "dev" , "we0" )),
MPP_MODE(58 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x4, "led" , "c0" )),
MPP_MODE(59 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x4, "led" , "c1" )),
MPP_MODE(60 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "uart1" , "txd" ),
MPP_FUNCTION(0 x4, "led" , "c2" ),
MPP_FUNCTION(0 x6, "dev" , "ad13" )),
MPP_MODE(61 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "i2c1" , "sda" ),
MPP_FUNCTION(0 x2, "uart1" , "rxd" ),
MPP_FUNCTION(0 x3, "spi1" , "cs2" ),
MPP_FUNCTION(0 x4, "led" , "p0" ),
MPP_FUNCTION(0 x6, "dev" , "ad14" )),
MPP_MODE(62 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "i2c1" , "sck" ),
MPP_FUNCTION(0 x4, "led" , "p1" ),
MPP_FUNCTION(0 x6, "dev" , "ad15" )),
MPP_MODE(63 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ptp" , "trig" ),
MPP_FUNCTION(0 x4, "led" , "p2" ),
MPP_FUNCTION(0 x6, "dev" , "burst/last" )),
MPP_MODE(64 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "dram" , "vttctrl" ),
MPP_FUNCTION(0 x4, "led" , "p3" )),
MPP_MODE(65 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "sata1" , "prsnt" )),
MPP_MODE(66 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x2, "ptp" , "evreq" ),
MPP_FUNCTION(0 x4, "spi1" , "cs3" ),
MPP_FUNCTION(0 x5, "pcie0" , "rstout" ),
MPP_FUNCTION(0 x6, "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);
Messung V0.5 in Prozent C=100 H=99 G=99