// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Marvell Armada 370 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 mv88f6710_mpp_modes[] = {
MPP_MODE(0 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "uart0" , "rxd" )),
MPP_MODE(1 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "uart0" , "txd" )),
MPP_MODE(2 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "i2c0" , "sck" ),
MPP_FUNCTION(0 x2, "uart0" , "txd" )),
MPP_MODE(3 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "i2c0" , "sda" ),
MPP_FUNCTION(0 x2, "uart0" , "rxd" )),
MPP_MODE(4 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "vdd" , "cpu-pd" )),
MPP_MODE(5 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txclkout" ),
MPP_FUNCTION(0 x2, "uart1" , "txd" ),
MPP_FUNCTION(0 x4, "spi1" , "sck" ),
MPP_FUNCTION(0 x5, "audio" , "mclk" )),
MPP_MODE(6 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd0" ),
MPP_FUNCTION(0 x2, "sata0" , "prsnt" ),
MPP_FUNCTION(0 x4, "tdm" , "rst" ),
MPP_FUNCTION(0 x5, "audio" , "sdo" )),
MPP_MODE(7 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd1" ),
MPP_FUNCTION(0 x4, "tdm" , "dtx" ),
MPP_FUNCTION(0 x5, "audio" , "lrclk" )),
MPP_MODE(8 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd2" ),
MPP_FUNCTION(0 x2, "uart0" , "rts" ),
MPP_FUNCTION(0 x4, "tdm" , "drx" ),
MPP_FUNCTION(0 x5, "audio" , "bclk" )),
MPP_MODE(9 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd3" ),
MPP_FUNCTION(0 x2, "uart1" , "txd" ),
MPP_FUNCTION(0 x3, "sd0" , "clk" ),
MPP_FUNCTION(0 x5, "audio" , "spdifo" )),
MPP_MODE(10 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txctl" ),
MPP_FUNCTION(0 x2, "uart0" , "cts" ),
MPP_FUNCTION(0 x4, "tdm" , "fsync" ),
MPP_FUNCTION(0 x5, "audio" , "sdi" )),
MPP_MODE(11 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd0" ),
MPP_FUNCTION(0 x2, "uart1" , "rxd" ),
MPP_FUNCTION(0 x3, "sd0" , "cmd" ),
MPP_FUNCTION(0 x4, "spi0" , "cs1" ),
MPP_FUNCTION(0 x5, "sata1" , "prsnt" ),
MPP_FUNCTION(0 x6, "spi1" , "cs1" )),
MPP_MODE(12 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd1" ),
MPP_FUNCTION(0 x2, "i2c1" , "sda" ),
MPP_FUNCTION(0 x3, "sd0" , "d0" ),
MPP_FUNCTION(0 x4, "spi1" , "cs0" ),
MPP_FUNCTION(0 x5, "audio" , "spdifi" )),
MPP_MODE(13 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd2" ),
MPP_FUNCTION(0 x2, "i2c1" , "sck" ),
MPP_FUNCTION(0 x3, "sd0" , "d1" ),
MPP_FUNCTION(0 x4, "tdm" , "pclk" ),
MPP_FUNCTION(0 x5, "audio" , "rmclk" )),
MPP_MODE(14 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd3" ),
MPP_FUNCTION(0 x2, "pcie" , "clkreq0" ),
MPP_FUNCTION(0 x3, "sd0" , "d2" ),
MPP_FUNCTION(0 x4, "spi1" , "mosi" ),
MPP_FUNCTION(0 x5, "spi0" , "cs2" )),
MPP_MODE(15 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxctl" ),
MPP_FUNCTION(0 x2, "pcie" , "clkreq1" ),
MPP_FUNCTION(0 x3, "sd0" , "d3" ),
MPP_FUNCTION(0 x4, "spi1" , "miso" ),
MPP_FUNCTION(0 x5, "spi0" , "cs3" )),
MPP_MODE(16 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxclk" ),
MPP_FUNCTION(0 x2, "uart1" , "rxd" ),
MPP_FUNCTION(0 x4, "tdm" , "int" ),
MPP_FUNCTION(0 x5, "audio" , "extclk" )),
MPP_MODE(17 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge" , "mdc" )),
MPP_MODE(18 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge" , "mdio" )),
MPP_MODE(19 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txclk" ),
MPP_FUNCTION(0 x2, "ge1" , "txclkout" ),
MPP_FUNCTION(0 x4, "tdm" , "pclk" )),
MPP_MODE(20 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd4" ),
MPP_FUNCTION(0 x2, "ge1" , "txd0" )),
MPP_MODE(21 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd5" ),
MPP_FUNCTION(0 x2, "ge1" , "txd1" ),
MPP_FUNCTION(0 x4, "uart1" , "txd" )),
MPP_MODE(22 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd6" ),
MPP_FUNCTION(0 x2, "ge1" , "txd2" ),
MPP_FUNCTION(0 x4, "uart0" , "rts" )),
MPP_MODE(23 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "txd7" ),
MPP_FUNCTION(0 x2, "ge1" , "txd3" ),
MPP_FUNCTION(0 x4, "spi1" , "mosi" )),
MPP_MODE(24 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "col" ),
MPP_FUNCTION(0 x2, "ge1" , "txctl" ),
MPP_FUNCTION(0 x4, "spi1" , "cs0" )),
MPP_MODE(25 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxerr" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd0" ),
MPP_FUNCTION(0 x4, "uart1" , "rxd" )),
MPP_MODE(26 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "crs" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd1" ),
MPP_FUNCTION(0 x4, "spi1" , "miso" )),
MPP_MODE(27 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd4" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd2" ),
MPP_FUNCTION(0 x4, "uart0" , "cts" )),
MPP_MODE(28 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd5" ),
MPP_FUNCTION(0 x2, "ge1" , "rxd3" )),
MPP_MODE(29 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd6" ),
MPP_FUNCTION(0 x2, "ge1" , "rxctl" ),
MPP_FUNCTION(0 x4, "i2c1" , "sda" )),
MPP_MODE(30 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "ge0" , "rxd7" ),
MPP_FUNCTION(0 x2, "ge1" , "rxclk" ),
MPP_FUNCTION(0 x4, "i2c1" , "sck" )),
MPP_MODE(31 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x3, "tclk" , NULL),
MPP_FUNCTION(0 x4, "ge0" , "txerr" )),
MPP_MODE(32 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "spi0" , "cs0" )),
MPP_MODE(33 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "bootcs" ),
MPP_FUNCTION(0 x2, "spi0" , "cs0" )),
MPP_MODE(34 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "we0" ),
MPP_FUNCTION(0 x2, "spi0" , "mosi" )),
MPP_MODE(35 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "oe" ),
MPP_FUNCTION(0 x2, "spi0" , "sck" )),
MPP_MODE(36 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "a1" ),
MPP_FUNCTION(0 x2, "spi0" , "miso" )),
MPP_MODE(37 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "a0" ),
MPP_FUNCTION(0 x2, "sata0" , "prsnt" )),
MPP_MODE(38 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ready" ),
MPP_FUNCTION(0 x2, "uart1" , "cts" ),
MPP_FUNCTION(0 x3, "uart0" , "cts" )),
MPP_MODE(39 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad0" ),
MPP_FUNCTION(0 x2, "audio" , "spdifo" )),
MPP_MODE(40 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad1" ),
MPP_FUNCTION(0 x2, "uart1" , "rts" ),
MPP_FUNCTION(0 x3, "uart0" , "rts" )),
MPP_MODE(41 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad2" ),
MPP_FUNCTION(0 x2, "uart1" , "rxd" )),
MPP_MODE(42 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad3" ),
MPP_FUNCTION(0 x2, "uart1" , "txd" )),
MPP_MODE(43 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad4" ),
MPP_FUNCTION(0 x2, "audio" , "bclk" )),
MPP_MODE(44 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad5" ),
MPP_FUNCTION(0 x2, "audio" , "mclk" )),
MPP_MODE(45 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad6" ),
MPP_FUNCTION(0 x2, "audio" , "lrclk" )),
MPP_MODE(46 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad7" ),
MPP_FUNCTION(0 x2, "audio" , "sdo" )),
MPP_MODE(47 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad8" ),
MPP_FUNCTION(0 x3, "sd0" , "clk" ),
MPP_FUNCTION(0 x5, "audio" , "spdifo" )),
MPP_MODE(48 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad9" ),
MPP_FUNCTION(0 x2, "uart0" , "rts" ),
MPP_FUNCTION(0 x3, "sd0" , "cmd" ),
MPP_FUNCTION(0 x4, "sata1" , "prsnt" ),
MPP_FUNCTION(0 x5, "spi0" , "cs1" )),
MPP_MODE(49 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad10" ),
MPP_FUNCTION(0 x2, "pcie" , "clkreq1" ),
MPP_FUNCTION(0 x3, "sd0" , "d0" ),
MPP_FUNCTION(0 x4, "spi1" , "cs0" ),
MPP_FUNCTION(0 x5, "audio" , "spdifi" )),
MPP_MODE(50 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad11" ),
MPP_FUNCTION(0 x2, "uart0" , "cts" ),
MPP_FUNCTION(0 x3, "sd0" , "d1" ),
MPP_FUNCTION(0 x4, "spi1" , "miso" ),
MPP_FUNCTION(0 x5, "audio" , "rmclk" )),
MPP_MODE(51 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad12" ),
MPP_FUNCTION(0 x2, "i2c1" , "sda" ),
MPP_FUNCTION(0 x3, "sd0" , "d2" ),
MPP_FUNCTION(0 x4, "spi1" , "mosi" )),
MPP_MODE(52 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad13" ),
MPP_FUNCTION(0 x2, "i2c1" , "sck" ),
MPP_FUNCTION(0 x3, "sd0" , "d3" ),
MPP_FUNCTION(0 x4, "spi1" , "sck" )),
MPP_MODE(53 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad14" ),
MPP_FUNCTION(0 x2, "sd0" , "clk" ),
MPP_FUNCTION(0 x3, "tdm" , "pclk" ),
MPP_FUNCTION(0 x4, "spi0" , "cs2" ),
MPP_FUNCTION(0 x5, "pcie" , "clkreq1" )),
MPP_MODE(54 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ad15" ),
MPP_FUNCTION(0 x3, "tdm" , "dtx" )),
MPP_MODE(55 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "cs1" ),
MPP_FUNCTION(0 x2, "uart1" , "txd" ),
MPP_FUNCTION(0 x3, "tdm" , "rst" ),
MPP_FUNCTION(0 x4, "sata1" , "prsnt" ),
MPP_FUNCTION(0 x5, "sata0" , "prsnt" )),
MPP_MODE(56 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "cs2" ),
MPP_FUNCTION(0 x2, "uart1" , "cts" ),
MPP_FUNCTION(0 x3, "uart0" , "cts" ),
MPP_FUNCTION(0 x4, "spi0" , "cs3" ),
MPP_FUNCTION(0 x5, "pcie" , "clkreq0" ),
MPP_FUNCTION(0 x6, "spi1" , "cs1" )),
MPP_MODE(57 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "cs3" ),
MPP_FUNCTION(0 x2, "uart1" , "rxd" ),
MPP_FUNCTION(0 x3, "tdm" , "fsync" ),
MPP_FUNCTION(0 x4, "sata0" , "prsnt" ),
MPP_FUNCTION(0 x5, "audio" , "sdo" )),
MPP_MODE(58 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "cs0" ),
MPP_FUNCTION(0 x2, "uart1" , "rts" ),
MPP_FUNCTION(0 x3, "tdm" , "int" ),
MPP_FUNCTION(0 x5, "audio" , "extclk" ),
MPP_FUNCTION(0 x6, "uart0" , "rts" )),
MPP_MODE(59 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ale0" ),
MPP_FUNCTION(0 x2, "uart1" , "rts" ),
MPP_FUNCTION(0 x3, "uart0" , "rts" ),
MPP_FUNCTION(0 x5, "audio" , "bclk" )),
MPP_MODE(60 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "ale1" ),
MPP_FUNCTION(0 x2, "uart1" , "rxd" ),
MPP_FUNCTION(0 x3, "sata0" , "prsnt" ),
MPP_FUNCTION(0 x4, "pcie" , "rstout" ),
MPP_FUNCTION(0 x5, "audio" , "sdi" )),
MPP_MODE(61 ,
MPP_FUNCTION(0 x0, "gpo" , NULL),
MPP_FUNCTION(0 x1, "dev" , "we1" ),
MPP_FUNCTION(0 x2, "uart1" , "txd" ),
MPP_FUNCTION(0 x5, "audio" , "lrclk" )),
MPP_MODE(62 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "dev" , "a2" ),
MPP_FUNCTION(0 x2, "uart1" , "cts" ),
MPP_FUNCTION(0 x3, "tdm" , "drx" ),
MPP_FUNCTION(0 x4, "pcie" , "clkreq0" ),
MPP_FUNCTION(0 x5, "audio" , "mclk" ),
MPP_FUNCTION(0 x6, "uart0" , "cts" )),
MPP_MODE(63 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "spi0" , "sck" ),
MPP_FUNCTION(0 x2, "tclk" , NULL)),
MPP_MODE(64 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "spi0" , "miso" ),
MPP_FUNCTION(0 x2, "spi0" , "cs1" )),
MPP_MODE(65 ,
MPP_FUNCTION(0 x0, "gpio" , NULL),
MPP_FUNCTION(0 x1, "spi0" , "mosi" ),
MPP_FUNCTION(0 x2, "spi0" , "cs2" )),
};
static struct mvebu_pinctrl_soc_info armada_370_pinctrl_info;
static const struct of_device_id armada_370_pinctrl_of_match[] = {
{ .compatible = "marvell,mv88f6710-pinctrl" },
{ },
};
static const struct mvebu_mpp_ctrl mv88f6710_mpp_controls[] = {
MPP_FUNC_CTRL(0 , 65 , NULL, mvebu_mmio_mpp_ctrl),
};
static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {
MPP_GPIO_RANGE(0 , 0 , 0 , 32 ),
MPP_GPIO_RANGE(1 , 32 , 32 , 32 ),
MPP_GPIO_RANGE(2 , 64 , 64 , 2 ),
};
static int armada_370_pinctrl_probe(struct platform_device *pdev)
{
struct mvebu_pinctrl_soc_info *soc = &armada_370_pinctrl_info;
soc->variant = 0 ; /* no variants for Armada 370 */
soc->controls = mv88f6710_mpp_controls;
soc->ncontrols = ARRAY_SIZE(mv88f6710_mpp_controls);
soc->modes = mv88f6710_mpp_modes;
soc->nmodes = ARRAY_SIZE(mv88f6710_mpp_modes);
soc->gpioranges = mv88f6710_mpp_gpio_ranges;
soc->ngpioranges = ARRAY_SIZE(mv88f6710_mpp_gpio_ranges);
pdev->dev.platform_data = soc;
return mvebu_pinctrl_simple_mmio_probe(pdev);
}
static struct platform_driver armada_370_pinctrl_driver = {
.driver = {
.name = "armada-370-pinctrl" ,
.of_match_table = armada_370_pinctrl_of_match,
},
.probe = armada_370_pinctrl_probe,
};
builtin_platform_driver(armada_370_pinctrl_driver);
Messung V0.5 in Prozent C=99 H=99 G=98