Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
@@ -0,0 +1,34 @@
# SPDX-License-Identifier: GPL-2.0-only
if (ARCH_BERLIN || COMPILE_TEST)
config PINCTRL_BERLIN
bool
select PINMUX
select REGMAP_MMIO
config PINCTRL_AS370
bool "Synaptics as370 pin controller driver"
depends on OF
select PINCTRL_BERLIN
config PINCTRL_BERLIN_BG2
def_bool MACH_BERLIN_BG2
depends on OF
select PINCTRL_BERLIN
config PINCTRL_BERLIN_BG2CD
def_bool MACH_BERLIN_BG2CD
depends on OF
select PINCTRL_BERLIN
config PINCTRL_BERLIN_BG2Q
def_bool MACH_BERLIN_BG2Q
depends on OF
select PINCTRL_BERLIN
config PINCTRL_BERLIN_BG4CT
bool "Marvell berlin4ct pin controller driver"
depends on OF
select PINCTRL_BERLIN
endif
@@ -0,0 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-y += berlin.o
obj-$(CONFIG_PINCTRL_BERLIN_BG2) += berlin-bg2.o
obj-$(CONFIG_PINCTRL_BERLIN_BG2CD) += berlin-bg2cd.o
obj-$(CONFIG_PINCTRL_BERLIN_BG2Q) += berlin-bg2q.o
obj-$(CONFIG_PINCTRL_BERLIN_BG4CT) += berlin-bg4ct.o
obj-$(CONFIG_PINCTRL_AS370) += pinctrl-as370.o
@@ -0,0 +1,241 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Marvell Berlin BG2 pinctrl driver.
*
* Copyright (C) 2014 Marvell Technology Group Ltd.
*
* Antoine Ténart <antoine.tenart@free-electrons.com>
*/
#include <linux/init.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include "berlin.h"
static const struct berlin_desc_group berlin2_soc_pinctrl_groups[] = {
/* G */
BERLIN_PINCTRL_GROUP("G0", 0x00, 0x1, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G1", 0x00, 0x2, 0x01,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS1n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "usb1")),
BERLIN_PINCTRL_GROUP("G2", 0x00, 0x2, 0x02,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS2n */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s0")),
BERLIN_PINCTRL_GROUP("G3", 0x00, 0x2, 0x04,
BERLIN_PINCTRL_FUNCTION(0x0, "soc"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS3n */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s1")),
BERLIN_PINCTRL_GROUP("G4", 0x00, 0x2, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK/SDI/SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "pwm")),
BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x08,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x2, "et"),
/*
* Mode 0x3 mux i2s2 mclk *and* i2s3 mclk:
* add two functions so it can be used with other groups
* within the same subnode in the device tree
*/
BERLIN_PINCTRL_FUNCTION(0x3, "i2s2"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s3")),
BERLIN_PINCTRL_GROUP("G6", 0x00, 0x2, 0x0b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
BERLIN_PINCTRL_FUNCTION(0x2, "et")),
BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x0d,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
BERLIN_PINCTRL_FUNCTION(0x2, "et"),
BERLIN_PINCTRL_FUNCTION(0x3, "vdac")),
BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x10,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "et"),
BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x4, "sata_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x13,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "et"),
BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x4, "sata_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x16,
BERLIN_PINCTRL_FUNCTION(0x0, "soc"),
BERLIN_PINCTRL_FUNCTION(0x1, "twsi0"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "ptp")),
BERLIN_PINCTRL_GROUP("G11", 0x00, 0x2, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "soc"),
BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "eddc")),
BERLIN_PINCTRL_GROUP("G12", 0x00, 0x3, 0x1a,
BERLIN_PINCTRL_FUNCTION(0x0, "sts2"),
BERLIN_PINCTRL_FUNCTION(0x1, "sata"),
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"),
BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sata"),
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"),
BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x03,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G15", 0x04, 0x2, 0x04,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "et"),
BERLIN_PINCTRL_FUNCTION(0x3, "osco")),
BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp")),
BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp")),
BERLIN_PINCTRL_GROUP("G18", 0x04, 0x1, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "pll"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s0")),
BERLIN_PINCTRL_GROUP("G19", 0x04, 0x1, 0x0d,
BERLIN_PINCTRL_FUNCTION(0x0, "i2s0"),
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")),
BERLIN_PINCTRL_GROUP("G20", 0x04, 0x1, 0x0e,
BERLIN_PINCTRL_FUNCTION(0x0, "spdif"),
BERLIN_PINCTRL_FUNCTION(0x1, "arc")),
BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x3, "adac_dbg"),
BERLIN_PINCTRL_FUNCTION(0x4, "pdm_a"), /* gpio17..19,pdm */
BERLIN_PINCTRL_FUNCTION(0x7, "pdm_b")), /* gpio12..14,pdm */
BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x3, "twsi0"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm")),
BERLIN_PINCTRL_GROUP("G23", 0x04, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "vclki"),
BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x7, "pdm")),
BERLIN_PINCTRL_GROUP("G24", 0x04, 0x2, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "i2s2"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1")),
BERLIN_PINCTRL_GROUP("G25", 0x04, 0x2, 0x1a,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "nand"),
BERLIN_PINCTRL_FUNCTION(0x2, "i2s2")),
BERLIN_PINCTRL_GROUP("G26", 0x04, 0x1, 0x1c,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
BERLIN_PINCTRL_FUNCTION(0x1, "emmc")),
BERLIN_PINCTRL_GROUP("G27", 0x04, 0x1, 0x1d,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "nand")),
BERLIN_PINCTRL_GROUP("G28", 0x04, 0x2, 0x1e,
BERLIN_PINCTRL_FUNCTION(0x0, "dvo"),
BERLIN_PINCTRL_FUNCTION(0x2, "sp")),
};
static const struct berlin_desc_group berlin2_sysmgr_pinctrl_groups[] = {
/* GSM */
BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS0n */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1")),
BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS1n */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1")),
BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04,
BERLIN_PINCTRL_FUNCTION(0x0, "twsi2"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2")), /* SS2n/SS3n */
BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "uart0"), /* CTS/RTS */
BERLIN_PINCTRL_FUNCTION(0x2, "uart2"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x3, "twsi2")),
BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x1, "irda0")),
BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x2, "irda1"),
BERLIN_PINCTRL_FUNCTION(0x3, "twsi3")),
BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* CLK/SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "clki")),
BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "led")),
BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "led")),
BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "led")),
};
static const struct berlin_pinctrl_desc berlin2_soc_pinctrl_data = {
.groups = berlin2_soc_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin2_soc_pinctrl_groups),
};
static const struct berlin_pinctrl_desc berlin2_sysmgr_pinctrl_data = {
.groups = berlin2_sysmgr_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin2_sysmgr_pinctrl_groups),
};
static const struct of_device_id berlin2_pinctrl_match[] = {
{
.compatible = "marvell,berlin2-soc-pinctrl",
.data = &berlin2_soc_pinctrl_data
},
{
.compatible = "marvell,berlin2-system-pinctrl",
.data = &berlin2_sysmgr_pinctrl_data
},
{}
};
static int berlin2_pinctrl_probe(struct platform_device *pdev)
{
return berlin_pinctrl_probe(pdev, device_get_match_data(&pdev->dev));
}
static struct platform_driver berlin2_pinctrl_driver = {
.probe = berlin2_pinctrl_probe,
.driver = {
.name = "berlin-bg2-pinctrl",
.of_match_table = berlin2_pinctrl_match,
},
};
builtin_platform_driver(berlin2_pinctrl_driver);
@@ -0,0 +1,186 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Marvell Berlin BG2CD pinctrl driver.
*
* Copyright (C) 2014 Marvell Technology Group Ltd.
*
* Antoine Ténart <antoine.tenart@free-electrons.com>
*/
#include <linux/init.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include "berlin.h"
static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = {
/* G */
BERLIN_PINCTRL_GROUP("G0", 0x00, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "led"),
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")),
BERLIN_PINCTRL_GROUP("G1", 0x00, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G2", 0x00, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fe"),
BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G3", 0x00, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "twsi2"),
BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
BERLIN_PINCTRL_FUNCTION(0x4, "fe"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G4", 0x00, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
BERLIN_PINCTRL_FUNCTION(0x3, "pll"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"),
BERLIN_PINCTRL_FUNCTION(0x3, "arc"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G6", 0x00, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "eddc"),
BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS1n/SS2n */
BERLIN_PINCTRL_FUNCTION(0x3, "twsi0")),
BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x1e,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G11", 0x04, 0x2, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI/SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G12", 0x04, 0x3, 0x02,
BERLIN_PINCTRL_FUNCTION(0x0, "usb1"),
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x05,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
BERLIN_PINCTRL_FUNCTION(0x1, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x2, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x08,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G15", 0x04, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G18", 0x04, 0x2, 0x12,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G19", 0x04, 0x2, 0x14,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G20", 0x04, 0x2, 0x16,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G23", 0x08, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G24", 0x08, 0x2, 0x03,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G25", 0x08, 0x2, 0x05,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G26", 0x08, 0x1, 0x07,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G27", 0x08, 0x2, 0x08,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G28", 0x08, 0x3, 0x0a,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("G29", 0x08, 0x3, 0x0d,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
};
static const struct berlin_desc_group berlin2cd_sysmgr_pinctrl_groups[] = {
/* GSM */
BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12,
BERLIN_PINCTRL_FUNCTION_UNKNOWN),
};
static const struct berlin_pinctrl_desc berlin2cd_soc_pinctrl_data = {
.groups = berlin2cd_soc_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin2cd_soc_pinctrl_groups),
};
static const struct berlin_pinctrl_desc berlin2cd_sysmgr_pinctrl_data = {
.groups = berlin2cd_sysmgr_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin2cd_sysmgr_pinctrl_groups),
};
static const struct of_device_id berlin2cd_pinctrl_match[] = {
{
.compatible = "marvell,berlin2cd-soc-pinctrl",
.data = &berlin2cd_soc_pinctrl_data
},
{
.compatible = "marvell,berlin2cd-system-pinctrl",
.data = &berlin2cd_sysmgr_pinctrl_data
},
{}
};
static int berlin2cd_pinctrl_probe(struct platform_device *pdev)
{
return berlin_pinctrl_probe(pdev, device_get_match_data(&pdev->dev));
}
static struct platform_driver berlin2cd_pinctrl_driver = {
.probe = berlin2cd_pinctrl_probe,
.driver = {
.name = "berlin-bg2cd-pinctrl",
.of_match_table = berlin2cd_pinctrl_match,
},
};
builtin_platform_driver(berlin2cd_pinctrl_driver);
@@ -0,0 +1,403 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Marvell Berlin BG2Q pinctrl driver
*
* Copyright (C) 2014 Marvell Technology Group Ltd.
*
* Antoine Ténart <antoine.tenart@free-electrons.com>
*/
#include <linux/init.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include "berlin.h"
static const struct berlin_desc_group berlin2q_soc_pinctrl_groups[] = {
/* G */
BERLIN_PINCTRL_GROUP("G0", 0x18, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
BERLIN_PINCTRL_FUNCTION(0x1, "mmc"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G1", 0x18, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G2", 0x18, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "arc"),
BERLIN_PINCTRL_FUNCTION(0x3, "lvds")),
BERLIN_PINCTRL_GROUP("G3", 0x18, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "i2s2"),
BERLIN_PINCTRL_FUNCTION(0x3, "lvds")),
BERLIN_PINCTRL_GROUP("G4", 0x18, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "pll"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"),
BERLIN_PINCTRL_FUNCTION(0x3, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x5, "sata_dbg"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G5", 0x18, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"),
BERLIN_PINCTRL_FUNCTION(0x5, "sata_dbg"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G6", 0x18, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
BERLIN_PINCTRL_FUNCTION(0x1, "twsi0"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G7", 0x18, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "eddc")),
BERLIN_PINCTRL_GROUP("G8", 0x18, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* CLK/SDI/SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G9", 0x18, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n/SS1n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x5, "sata")),
BERLIN_PINCTRL_GROUP("G10", 0x1c, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS2n */
BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x5, "sata")),
BERLIN_PINCTRL_GROUP("G11", 0x1c, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS3n */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s1"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x5, "sata")),
BERLIN_PINCTRL_GROUP("G12", 0x1c, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "agc"),
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")),
BERLIN_PINCTRL_GROUP("G13", 0x1c, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G14", 0x1c, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G15", 0x1c, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x5, "vdac"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G16", 0x1c, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x5, "osco"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G17", 0x1c, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"),
BERLIN_PINCTRL_FUNCTION(0x3, "spdif"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"),
BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")),
BERLIN_PINCTRL_GROUP("G18", 0x1c, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s2"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1")),
BERLIN_PINCTRL_GROUP("G19", 0x1c, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s3"),
BERLIN_PINCTRL_FUNCTION(0x4, "sts1"),
BERLIN_PINCTRL_FUNCTION(0x5, "osco")),
BERLIN_PINCTRL_GROUP("G20", 0x20, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "demod"),
/*
* Mode 0x4 mux usb2_dbg *and* usb3_dbg:
* add two functions so it can be used with other groups
* within the same subnode in the device tree
*/
BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg"),
BERLIN_PINCTRL_FUNCTION(0x4, "usb3_dbg")),
BERLIN_PINCTRL_GROUP("G21", 0x20, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "sts2"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "demod")),
BERLIN_PINCTRL_GROUP("G22", 0x20, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G23", 0x20, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "avif"),
BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")),
BERLIN_PINCTRL_GROUP("G24", 0x20, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "demod"),
BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")),
BERLIN_PINCTRL_GROUP("G25", 0x20, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "vga"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "avif"),
BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")),
BERLIN_PINCTRL_GROUP("G26", 0x20, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "lvds"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G27", 0x20, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "agc"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G28", 0x20, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x3, "avif"),
BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")),
BERLIN_PINCTRL_GROUP("G29", 0x20, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G30", 0x24, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "scrd1"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G31", 0x24, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd1"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("G32", 0x24, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "cam"),
BERLIN_PINCTRL_FUNCTION(0x1, "sd1"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
/* GAV */
BERLIN_PINCTRL_GROUP("GAV0", 0x24, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "lvds")),
BERLIN_PINCTRL_GROUP("GAV1", 0x24, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "vga")),
BERLIN_PINCTRL_GROUP("GAV2", 0x24, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s3"),
BERLIN_PINCTRL_FUNCTION(0x4, "pdm"),
BERLIN_PINCTRL_FUNCTION(0x6, "adac")),
BERLIN_PINCTRL_GROUP("GAV3", 0x24, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s3"),
BERLIN_PINCTRL_FUNCTION(0x6, "adac")),
BERLIN_PINCTRL_GROUP("GAV4", 0x24, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "i2s1"),
BERLIN_PINCTRL_FUNCTION(0x6, "adac")),
BERLIN_PINCTRL_GROUP("GAV5", 0x24, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "spdif")),
BERLIN_PINCTRL_GROUP("GAV6", 0x24, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "i2s2")),
BERLIN_PINCTRL_GROUP("GAV7", 0x28, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dvio"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "i2s3")),
BERLIN_PINCTRL_GROUP("GAV8", 0x28, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm")),
BERLIN_PINCTRL_GROUP("GAV9", 0x28, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm")),
BERLIN_PINCTRL_GROUP("GAV10", 0x28, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x4, "agc")),
BERLIN_PINCTRL_GROUP("GAV11", 0x28, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "dv0"),
BERLIN_PINCTRL_FUNCTION(0x2, "fp"),
BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"),
BERLIN_PINCTRL_FUNCTION(0x4, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x5, "vclki")),
BERLIN_PINCTRL_GROUP("GAV12", 0x28, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"),
BERLIN_PINCTRL_FUNCTION(0x2, "i2s1")),
BERLIN_PINCTRL_GROUP("GAV13", 0x28, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2")),
BERLIN_PINCTRL_GROUP("GAV14", 0x28, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"),
BERLIN_PINCTRL_FUNCTION(0x2, "i2s1")),
BERLIN_PINCTRL_GROUP("GAV15", 0x28, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"),
BERLIN_PINCTRL_FUNCTION(0x6, "dac_dbg")),
BERLIN_PINCTRL_GROUP("GAV16", 0x28, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s0"),
BERLIN_PINCTRL_FUNCTION(0x2, "i2s1"),
BERLIN_PINCTRL_FUNCTION(0x4, "i2s3"),
BERLIN_PINCTRL_FUNCTION(0x5, "pdm"),
BERLIN_PINCTRL_FUNCTION(0x6, "dac_dbg")),
BERLIN_PINCTRL_GROUP("GAV17", 0x2c, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "i2s0"),
BERLIN_PINCTRL_FUNCTION(0x2, "i2s1"),
BERLIN_PINCTRL_FUNCTION(0x3, "pwm"),
BERLIN_PINCTRL_FUNCTION(0x4, "i2s3"),
BERLIN_PINCTRL_FUNCTION(0x5, "pdm"),
BERLIN_PINCTRL_FUNCTION(0x6, "dac_dbg")),
BERLIN_PINCTRL_GROUP("GAV18", 0x2c, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spdif"),
BERLIN_PINCTRL_FUNCTION(0x2, "arc")),
BERLIN_PINCTRL_GROUP("GAV19", 0x2c, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "avio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spdif"),
BERLIN_PINCTRL_FUNCTION(0x4, "i2s3"),
BERLIN_PINCTRL_FUNCTION(0x5, "pdm")),
};
static const struct berlin_desc_group berlin2q_sysmgr_pinctrl_groups[] = {
/* GSM */
BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS0n */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1")),
BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS1n */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1")),
BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS2n/SS3n */
BERLIN_PINCTRL_FUNCTION(0x2, "eddc")),
BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* CLK/SDO */
BERLIN_PINCTRL_FUNCTION(0x2, "eddc")),
BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x1, 0x08,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x1, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x1, 0x0a,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x0d,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")),
BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x0e,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "led")),
BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "led")),
BERLIN_PINCTRL_GROUP("GSM12", 0x40, 0x2, 0x10,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x1, "irda0"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("GSM13", 0x40, 0x2, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "uart0"), /* CTS/RTS */
BERLIN_PINCTRL_FUNCTION(0x2, "uart1"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x3, "twsi2")),
BERLIN_PINCTRL_GROUP("GSM14", 0x40, 0x2, 0x14,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RX/TX */
BERLIN_PINCTRL_FUNCTION(0x2, "irda1"),
BERLIN_PINCTRL_FUNCTION(0x3, "twsi3")),
BERLIN_PINCTRL_GROUP("GSM15", 0x40, 0x2, 0x16,
BERLIN_PINCTRL_FUNCTION(0x0, "pwr"),
BERLIN_PINCTRL_FUNCTION(0x1, "led"),
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")),
BERLIN_PINCTRL_GROUP("GSM16", 0x40, 0x1, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "eddc")),
BERLIN_PINCTRL_GROUP("GSM17", 0x40, 0x1, 0x19,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "eddc")),
BERLIN_PINCTRL_GROUP("GSM18", 0x40, 0x1, 0x1a,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"),
BERLIN_PINCTRL_FUNCTION(0x1, "eddc")),
};
static const struct berlin_pinctrl_desc berlin2q_soc_pinctrl_data = {
.groups = berlin2q_soc_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin2q_soc_pinctrl_groups),
};
static const struct berlin_pinctrl_desc berlin2q_sysmgr_pinctrl_data = {
.groups = berlin2q_sysmgr_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin2q_sysmgr_pinctrl_groups),
};
static const struct of_device_id berlin2q_pinctrl_match[] = {
{
.compatible = "marvell,berlin2q-soc-pinctrl",
.data = &berlin2q_soc_pinctrl_data,
},
{
.compatible = "marvell,berlin2q-system-pinctrl",
.data = &berlin2q_sysmgr_pinctrl_data,
},
{}
};
static int berlin2q_pinctrl_probe(struct platform_device *pdev)
{
return berlin_pinctrl_probe(pdev, device_get_match_data(&pdev->dev));
}
static struct platform_driver berlin2q_pinctrl_driver = {
.probe = berlin2q_pinctrl_probe,
.driver = {
.name = "berlin-bg2q-pinctrl",
.of_match_table = berlin2q_pinctrl_match,
},
};
builtin_platform_driver(berlin2q_pinctrl_driver);
@@ -0,0 +1,487 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Marvell berlin4ct pinctrl driver
*
* Copyright (C) 2015 Marvell Technology Group Ltd.
*
* Author: Jisheng Zhang <jszhang@marvell.com>
*/
#include <linux/init.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include "berlin.h"
static const struct berlin_desc_group berlin4ct_soc_pinctrl_groups[] = {
BERLIN_PINCTRL_GROUP("EMMC_RSTn", 0x0, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "emmc"), /* RSTn */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* GPIO47 */
BERLIN_PINCTRL_GROUP("NAND_IO0", 0x0, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO0 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD0 */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO0 */
BERLIN_PINCTRL_GROUP("NAND_IO1", 0x0, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO1 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD1 */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* CDn */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO1 */
BERLIN_PINCTRL_GROUP("NAND_IO2", 0x0, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO2 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD2 */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT0 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO2 */
BERLIN_PINCTRL_GROUP("NAND_IO3", 0x0, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO3 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXD3 */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT1 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO3 */
BERLIN_PINCTRL_GROUP("NAND_IO4", 0x0, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO4 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXC */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT2 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO4 */
BERLIN_PINCTRL_GROUP("NAND_IO5", 0x0, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO5 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* RXCTL */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* DAT3 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO5 */
BERLIN_PINCTRL_GROUP("NAND_IO6", 0x0, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO6 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* MDC */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* CMD */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO6 */
BERLIN_PINCTRL_GROUP("NAND_IO7", 0x0, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO7 */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* MDIO */
BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), /* WP */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO7 */
BERLIN_PINCTRL_GROUP("NAND_ALE", 0x0, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* ALE */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD0 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO8 */
BERLIN_PINCTRL_GROUP("NAND_CLE", 0x4, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* CLE */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD1 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO9 */
BERLIN_PINCTRL_GROUP("NAND_WEn", 0x4, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* WEn */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD2 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO10 */
BERLIN_PINCTRL_GROUP("NAND_REn", 0x4, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* REn */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXD3 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO11 */
BERLIN_PINCTRL_GROUP("NAND_WPn", 0x4, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* WPn */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO12 */
BERLIN_PINCTRL_GROUP("NAND_CEn", 0x4, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* CEn */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXC */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO13 */
BERLIN_PINCTRL_GROUP("NAND_RDY", 0x4, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* RDY */
BERLIN_PINCTRL_FUNCTION(0x1, "rgmii"), /* TXCTL */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO14 */
BERLIN_PINCTRL_GROUP("SD0_CLK", 0x4, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO29 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CLK*/
BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG8 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG8 */
BERLIN_PINCTRL_GROUP("SD0_DAT0", 0x4, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO30 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT0 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG9 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG9 */
BERLIN_PINCTRL_GROUP("SD0_DAT1", 0x4, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO31 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT1 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG10 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG10 */
BERLIN_PINCTRL_GROUP("SD0_DAT2", 0x4, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO32 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT2 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts4"), /* VALD */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG11 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG11 */
BERLIN_PINCTRL_GROUP("SD0_DAT3", 0x8, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO33 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT3 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG12 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG12 */
BERLIN_PINCTRL_GROUP("SD0_CDn", 0x8, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO34 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CDn */
BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG13 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG13 */
BERLIN_PINCTRL_GROUP("SD0_CMD", 0x8, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO35 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CMD */
BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG14 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG14 */
BERLIN_PINCTRL_GROUP("SD0_WP", 0x8, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO36 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* WP */
BERLIN_PINCTRL_FUNCTION(0x2, "sts5"), /* VALD */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG15 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG15 */
BERLIN_PINCTRL_GROUP("STS0_CLK", 0x8, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO21 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x2, "cpupll"), /* CLKO */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG0 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG0 */
BERLIN_PINCTRL_GROUP("STS0_SOP", 0x8, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO22 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x2, "syspll"), /* CLKO */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG1 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG1 */
BERLIN_PINCTRL_GROUP("STS0_SD", 0x8, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO23 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x2, "mempll"), /* CLKO */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG2 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG2 */
BERLIN_PINCTRL_GROUP("STS0_VALD", 0x8, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO24 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), /* VALD */
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG3 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG3 */
BERLIN_PINCTRL_GROUP("STS1_CLK", 0x8, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO25 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm0"),
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG4 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG4 */
BERLIN_PINCTRL_GROUP("STS1_SOP", 0x8, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO26 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm1"),
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG5 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG5 */
BERLIN_PINCTRL_GROUP("STS1_SD", 0xc, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO27 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm2"),
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG6 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG6 */
BERLIN_PINCTRL_GROUP("STS1_VALD", 0xc, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO28 */
BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), /* VALD */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm3"),
BERLIN_PINCTRL_FUNCTION(0x5, "v4g"), /* DBG7 */
BERLIN_PINCTRL_FUNCTION(0x7, "phy")), /* DBG7 */
BERLIN_PINCTRL_GROUP("SCRD0_RST", 0xc, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO15 */
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* RST */
BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* CLK */
BERLIN_PINCTRL_GROUP("SCRD0_DCLK", 0xc, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO16 */
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* DCLK */
BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* CMD */
BERLIN_PINCTRL_GROUP("SCRD0_GPIO0", 0xc, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO17 */
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* SCRD0 GPIO0 */
BERLIN_PINCTRL_FUNCTION(0x2, "sif"), /* DIO */
BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT0 */
BERLIN_PINCTRL_GROUP("SCRD0_GPIO1", 0xc, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO18 */
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* SCRD0 GPIO1 */
BERLIN_PINCTRL_FUNCTION(0x2, "sif"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT1 */
BERLIN_PINCTRL_GROUP("SCRD0_DIO", 0xc, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO19 */
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* DIO */
BERLIN_PINCTRL_FUNCTION(0x2, "sif"), /* DEN */
BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT2 */
BERLIN_PINCTRL_GROUP("SCRD0_CRD_PRES", 0xc, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO20 */
BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), /* crd pres */
BERLIN_PINCTRL_FUNCTION(0x3, "sd1a")), /* DAT3 */
BERLIN_PINCTRL_GROUP("SPI1_SS0n", 0xc, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO37 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts2")), /* CLK */
BERLIN_PINCTRL_GROUP("SPI1_SS1n", 0xc, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS1n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO38 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts2"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x4, "pwm1")),
BERLIN_PINCTRL_GROUP("SPI1_SS2n", 0x10, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS2n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO39 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts2"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x4, "pwm0")),
BERLIN_PINCTRL_GROUP("SPI1_SS3n", 0x10, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS3n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO40 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts2")), /* VALD */
BERLIN_PINCTRL_GROUP("SPI1_SCLK", 0x10, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SCLK */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO41 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* CLK */
BERLIN_PINCTRL_GROUP("SPI1_SDO", 0x10, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO42 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* SOP */
BERLIN_PINCTRL_GROUP("SPI1_SDI", 0x10, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO43 */
BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* SD */
BERLIN_PINCTRL_GROUP("USB0_DRV_VBUS", 0x10, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO44 */
BERLIN_PINCTRL_FUNCTION(0x1, "usb0"), /* VBUS */
BERLIN_PINCTRL_FUNCTION(0x2, "sts3")), /* VALD */
BERLIN_PINCTRL_GROUP("TW0_SCL", 0x10, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO45 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw0")), /* SCL */
BERLIN_PINCTRL_GROUP("TW0_SDA", 0x10, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO46 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw0")), /* SDA */
};
static const struct berlin_desc_group berlin4ct_avio_pinctrl_groups[] = {
BERLIN_PINCTRL_GROUP("TX_EDDC_SCL", 0x0, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO0 */
BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc"), /* SCL */
BERLIN_PINCTRL_FUNCTION(0x2, "tw1")), /* SCL */
BERLIN_PINCTRL_GROUP("TX_EDDC_SDA", 0x0, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO1 */
BERLIN_PINCTRL_FUNCTION(0x1, "tx_eddc"), /* SDA */
BERLIN_PINCTRL_FUNCTION(0x2, "tw1")), /* SDA */
BERLIN_PINCTRL_GROUP("I2S1_LRCKO", 0x0, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO2 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* LRCKO */
BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x4, "adac"), /* DBG0 */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG0 */
BERLIN_PINCTRL_GROUP("I2S1_BCLKO", 0x0, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO3 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* BCLKO */
BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x4, "adac"), /* DBG1 */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* CMD */
BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG1 */
BERLIN_PINCTRL_GROUP("I2S1_DO", 0x0, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO4 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* DO */
BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x4, "adac"), /* DBG2 */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* DAT0 */
BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG2 */
BERLIN_PINCTRL_GROUP("I2S1_MCLK", 0x0, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO5 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* MCLK */
BERLIN_PINCTRL_FUNCTION(0x3, "sts6"), /* VALD */
BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* MCLK */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b"), /* DAT1 */
BERLIN_PINCTRL_FUNCTION(0x7, "avio")), /* DBG3 */
BERLIN_PINCTRL_GROUP("SPDIFO", 0x0, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO6 */
BERLIN_PINCTRL_FUNCTION(0x1, "spdifo"),
BERLIN_PINCTRL_FUNCTION(0x2, "avpll"), /* CLKO */
BERLIN_PINCTRL_FUNCTION(0x4, "adac")), /* DBG3 */
BERLIN_PINCTRL_GROUP("I2S2_MCLK", 0x0, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO7 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* MCLK */
BERLIN_PINCTRL_FUNCTION(0x4, "hdmi"), /* FBCLK */
BERLIN_PINCTRL_FUNCTION(0x5, "pdm")), /* CLKO */
BERLIN_PINCTRL_GROUP("I2S2_LRCKI", 0x0, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO8 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* LRCKI */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm0"),
BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* LRCK */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* DAT2 */
BERLIN_PINCTRL_GROUP("I2S2_BCLKI", 0x0, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO9 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* BCLKI */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm1"),
BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* SOP */
BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* BCLK */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* DAT3 */
BERLIN_PINCTRL_GROUP("I2S2_DI0", 0x4, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO10 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI0 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm2"),
BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* SD */
BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* SDIN */
BERLIN_PINCTRL_FUNCTION(0x5, "pdm"), /* DI0 */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* CDn */
BERLIN_PINCTRL_GROUP("I2S2_DI1", 0x4, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* AVIO GPIO11 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI1 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm3"),
BERLIN_PINCTRL_FUNCTION(0x3, "sts7"), /* VALD */
BERLIN_PINCTRL_FUNCTION(0x4, "adac_test"), /* PWMCLK */
BERLIN_PINCTRL_FUNCTION(0x5, "pdm"), /* DI1 */
BERLIN_PINCTRL_FUNCTION(0x6, "sd1b")), /* WP */
};
static const struct berlin_desc_group berlin4ct_sysmgr_pinctrl_groups[] = {
BERLIN_PINCTRL_GROUP("SM_TW2_SCL", 0x0, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO19 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw2")), /* SCL */
BERLIN_PINCTRL_GROUP("SM_TW2_SDA", 0x0, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO20 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw2")), /* SDA */
BERLIN_PINCTRL_GROUP("SM_TW3_SCL", 0x0, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO21 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw3")), /* SCL */
BERLIN_PINCTRL_GROUP("SM_TW3_SDA", 0x0, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO22 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw3")), /* SDA */
BERLIN_PINCTRL_GROUP("SM_TMS", 0x0, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TMS */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* SM GPIO0 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm0")),
BERLIN_PINCTRL_GROUP("SM_TDI", 0x0, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TDI */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* SM GPIO1 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm1")),
BERLIN_PINCTRL_GROUP("SM_TDO", 0x0, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO2 */
BERLIN_PINCTRL_GROUP("SM_URT0_TXD", 0x0, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* TXD */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO3 */
BERLIN_PINCTRL_GROUP("SM_URT0_RXD", 0x0, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RXD */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO4 */
BERLIN_PINCTRL_GROUP("SM_URT1_TXD", 0x0, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO5 */
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* TXD */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1"), /* RXCLK */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm2"),
BERLIN_PINCTRL_FUNCTION(0x4, "timer0"),
BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
BERLIN_PINCTRL_GROUP("SM_URT1_RXD", 0x4, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO6 */
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RXD */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm3"),
BERLIN_PINCTRL_FUNCTION(0x4, "timer1")),
BERLIN_PINCTRL_GROUP("SM_SPI2_SS0n", 0x4, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SS0 n*/
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO7 */
BERLIN_PINCTRL_GROUP("SM_SPI2_SS1n", 0x4, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO8 */
BERLIN_PINCTRL_FUNCTION(0x1, "spi2")), /* SS1n */
BERLIN_PINCTRL_GROUP("SM_SPI2_SS2n", 0x4, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO9 */
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS2n */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1"), /* MDC */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm0"),
BERLIN_PINCTRL_FUNCTION(0x4, "timer0"),
BERLIN_PINCTRL_FUNCTION(0x5, "clk_25m")),
BERLIN_PINCTRL_GROUP("SM_SPI2_SS3n", 0x4, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO10 */
BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), /* SS3n */
BERLIN_PINCTRL_FUNCTION(0x2, "eth1"), /* MDIO */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm1"),
BERLIN_PINCTRL_FUNCTION(0x4, "timer1")),
BERLIN_PINCTRL_GROUP("SM_SPI2_SDO", 0x4, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO11 */
BERLIN_PINCTRL_GROUP("SM_SPI2_SDI", 0x4, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SDI */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO12 */
BERLIN_PINCTRL_GROUP("SM_SPI2_SCLK", 0x4, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "spi2"), /* SCLK */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* SM GPIO13 */
BERLIN_PINCTRL_GROUP("SM_FE_LED0", 0x4, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO14 */
BERLIN_PINCTRL_FUNCTION(0x2, "led")), /* LED0 */
BERLIN_PINCTRL_GROUP("SM_FE_LED1", 0x4, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "pwr"),
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* SM GPIO 15 */
BERLIN_PINCTRL_FUNCTION(0x2, "led")), /* LED1 */
BERLIN_PINCTRL_GROUP("SM_FE_LED2", 0x8, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO16 */
BERLIN_PINCTRL_FUNCTION(0x2, "led")), /* LED2 */
BERLIN_PINCTRL_GROUP("SM_HDMI_HPD", 0x8, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO17 */
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), /* HPD */
BERLIN_PINCTRL_GROUP("SM_HDMI_CEC", 0x8, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* SM GPIO18 */
BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), /* CEC */
};
static const struct berlin_pinctrl_desc berlin4ct_soc_pinctrl_data = {
.groups = berlin4ct_soc_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin4ct_soc_pinctrl_groups),
};
static const struct berlin_pinctrl_desc berlin4ct_avio_pinctrl_data = {
.groups = berlin4ct_avio_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin4ct_avio_pinctrl_groups),
};
static const struct berlin_pinctrl_desc berlin4ct_sysmgr_pinctrl_data = {
.groups = berlin4ct_sysmgr_pinctrl_groups,
.ngroups = ARRAY_SIZE(berlin4ct_sysmgr_pinctrl_groups),
};
static const struct of_device_id berlin4ct_pinctrl_match[] = {
{
.compatible = "marvell,berlin4ct-soc-pinctrl",
.data = &berlin4ct_soc_pinctrl_data,
},
{
.compatible = "marvell,berlin4ct-avio-pinctrl",
.data = &berlin4ct_avio_pinctrl_data,
},
{
.compatible = "marvell,berlin4ct-system-pinctrl",
.data = &berlin4ct_sysmgr_pinctrl_data,
},
{}
};
static int berlin4ct_pinctrl_probe(struct platform_device *pdev)
{
const struct berlin_pinctrl_desc *desc =
device_get_match_data(&pdev->dev);
struct regmap_config *rmconfig;
struct regmap *regmap;
struct resource *res;
void __iomem *base;
rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL);
if (!rmconfig)
return -ENOMEM;
base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
if (IS_ERR(base))
return PTR_ERR(base);
rmconfig->reg_bits = 32,
rmconfig->val_bits = 32,
rmconfig->reg_stride = 4,
rmconfig->max_register = resource_size(res);
regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig);
if (IS_ERR(regmap))
return PTR_ERR(regmap);
return berlin_pinctrl_probe_regmap(pdev, desc, regmap);
}
static struct platform_driver berlin4ct_pinctrl_driver = {
.probe = berlin4ct_pinctrl_probe,
.driver = {
.name = "berlin4ct-pinctrl",
.of_match_table = berlin4ct_pinctrl_match,
},
};
builtin_platform_driver(berlin4ct_pinctrl_driver);
+343
View File
@@ -0,0 +1,343 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Marvell Berlin SoC pinctrl core driver
*
* Copyright (C) 2014 Marvell Technology Group Ltd.
*
* Antoine Ténart <antoine.tenart@free-electrons.com>
*/
#include <linux/io.h>
#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/slab.h>
#include "../core.h"
#include "../pinctrl-utils.h"
#include "berlin.h"
struct berlin_pinctrl {
struct regmap *regmap;
struct device *dev;
const struct berlin_pinctrl_desc *desc;
struct pinfunction *functions;
unsigned nfunctions;
struct pinctrl_dev *pctrl_dev;
};
static int berlin_pinctrl_get_group_count(struct pinctrl_dev *pctrl_dev)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
return pctrl->desc->ngroups;
}
static const char *berlin_pinctrl_get_group_name(struct pinctrl_dev *pctrl_dev,
unsigned group)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
return pctrl->desc->groups[group].name;
}
static int berlin_pinctrl_dt_node_to_map(struct pinctrl_dev *pctrl_dev,
struct device_node *node,
struct pinctrl_map **map,
unsigned *num_maps)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
struct property *prop;
const char *function_name, *group_name;
unsigned reserved_maps = 0;
int ret, ngroups;
*map = NULL;
*num_maps = 0;
ret = of_property_read_string(node, "function", &function_name);
if (ret) {
dev_err(pctrl->dev,
"missing function property in node %pOFn\n", node);
return -EINVAL;
}
ngroups = of_property_count_strings(node, "groups");
if (ngroups < 0) {
dev_err(pctrl->dev,
"missing groups property in node %pOFn\n", node);
return -EINVAL;
}
ret = pinctrl_utils_reserve_map(pctrl_dev, map, &reserved_maps,
num_maps, ngroups);
if (ret) {
dev_err(pctrl->dev, "can't reserve map: %d\n", ret);
return ret;
}
of_property_for_each_string(node, "groups", prop, group_name) {
ret = pinctrl_utils_add_map_mux(pctrl_dev, map, &reserved_maps,
num_maps, group_name,
function_name);
if (ret) {
dev_err(pctrl->dev, "can't add map: %d\n", ret);
return ret;
}
}
return 0;
}
static const struct pinctrl_ops berlin_pinctrl_ops = {
.get_groups_count = berlin_pinctrl_get_group_count,
.get_group_name = berlin_pinctrl_get_group_name,
.dt_node_to_map = berlin_pinctrl_dt_node_to_map,
.dt_free_map = pinctrl_utils_free_map,
};
static int berlin_pinmux_get_functions_count(struct pinctrl_dev *pctrl_dev)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
return pctrl->nfunctions;
}
static const char *berlin_pinmux_get_function_name(struct pinctrl_dev *pctrl_dev,
unsigned function)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
return pctrl->functions[function].name;
}
static int berlin_pinmux_get_function_groups(struct pinctrl_dev *pctrl_dev,
unsigned function,
const char * const **groups,
unsigned * const ngroups)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
*groups = pctrl->functions[function].groups;
*ngroups = pctrl->functions[function].ngroups;
return 0;
}
static struct berlin_desc_function *
berlin_pinctrl_find_function_by_name(struct berlin_pinctrl *pctrl,
const struct berlin_desc_group *group,
const char *fname)
{
struct berlin_desc_function *function = group->functions;
while (function->name) {
if (!strcmp(function->name, fname))
return function;
function++;
}
return NULL;
}
static int berlin_pinmux_set(struct pinctrl_dev *pctrl_dev,
unsigned function,
unsigned group)
{
struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
const struct berlin_desc_group *group_desc = pctrl->desc->groups + group;
struct pinfunction *func = pctrl->functions + function;
struct berlin_desc_function *function_desc =
berlin_pinctrl_find_function_by_name(pctrl, group_desc,
func->name);
u32 mask, val;
if (!function_desc)
return -EINVAL;
mask = GENMASK(group_desc->lsb + group_desc->bit_width - 1,
group_desc->lsb);
val = function_desc->muxval << group_desc->lsb;
regmap_update_bits(pctrl->regmap, group_desc->offset, mask, val);
return 0;
}
static const struct pinmux_ops berlin_pinmux_ops = {
.get_functions_count = &berlin_pinmux_get_functions_count,
.get_function_name = &berlin_pinmux_get_function_name,
.get_function_groups = &berlin_pinmux_get_function_groups,
.set_mux = &berlin_pinmux_set,
};
static int berlin_pinctrl_add_function(struct berlin_pinctrl *pctrl,
const char *name)
{
struct pinfunction *function = pctrl->functions;
while (function->name) {
if (!strcmp(function->name, name)) {
function->ngroups++;
return -EEXIST;
}
function++;
}
function->name = name;
function->ngroups = 1;
pctrl->nfunctions++;
return 0;
}
static int berlin_pinctrl_build_state(struct platform_device *pdev)
{
struct berlin_pinctrl *pctrl = platform_get_drvdata(pdev);
const struct berlin_desc_group *desc_group;
const struct berlin_desc_function *desc_function;
int i, max_functions = 0;
struct pinfunction *new_functions;
pctrl->nfunctions = 0;
for (i = 0; i < pctrl->desc->ngroups; i++) {
desc_group = pctrl->desc->groups + i;
/* compute the maximum number of functions a group can have */
max_functions += 1 << (desc_group->bit_width + 1);
}
/* we will reallocate later */
pctrl->functions = kzalloc_objs(*pctrl->functions, max_functions);
if (!pctrl->functions)
return -ENOMEM;
/* register all functions */
for (i = 0; i < pctrl->desc->ngroups; i++) {
desc_group = pctrl->desc->groups + i;
desc_function = desc_group->functions;
while (desc_function->name) {
berlin_pinctrl_add_function(pctrl, desc_function->name);
desc_function++;
}
}
new_functions = krealloc(pctrl->functions,
pctrl->nfunctions * sizeof(*pctrl->functions),
GFP_KERNEL);
if (!new_functions) {
kfree(pctrl->functions);
return -ENOMEM;
}
pctrl->functions = new_functions;
/* map functions to theirs groups */
for (i = 0; i < pctrl->desc->ngroups; i++) {
desc_group = pctrl->desc->groups + i;
desc_function = desc_group->functions;
while (desc_function->name) {
struct pinfunction *function = pctrl->functions;
const char **groups;
bool found = false;
while (function->name) {
if (!strcmp(desc_function->name, function->name)) {
found = true;
break;
}
function++;
}
if (!found) {
kfree(pctrl->functions);
return -EINVAL;
}
if (!function->groups) {
function->groups =
devm_kcalloc(&pdev->dev,
function->ngroups,
sizeof(*function->groups),
GFP_KERNEL);
if (!function->groups) {
kfree(pctrl->functions);
return -ENOMEM;
}
}
groups = (const char **)function->groups;
while (*groups)
groups++;
*groups = desc_group->name;
desc_function++;
}
}
return 0;
}
static const struct pinctrl_desc berlin_pctrl_desc = {
.name = "berlin-pinctrl",
.pctlops = &berlin_pinctrl_ops,
.pmxops = &berlin_pinmux_ops,
.owner = THIS_MODULE,
};
int berlin_pinctrl_probe_regmap(struct platform_device *pdev,
const struct berlin_pinctrl_desc *desc,
struct regmap *regmap)
{
struct device *dev = &pdev->dev;
struct berlin_pinctrl *pctrl;
int ret;
pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
if (!pctrl)
return -ENOMEM;
platform_set_drvdata(pdev, pctrl);
pctrl->regmap = regmap;
pctrl->dev = &pdev->dev;
pctrl->desc = desc;
ret = berlin_pinctrl_build_state(pdev);
if (ret) {
dev_err(dev, "cannot build driver state: %d\n", ret);
return ret;
}
pctrl->pctrl_dev = devm_pinctrl_register(dev, &berlin_pctrl_desc,
pctrl);
if (IS_ERR(pctrl->pctrl_dev)) {
dev_err(dev, "failed to register pinctrl driver\n");
return PTR_ERR(pctrl->pctrl_dev);
}
return 0;
}
int berlin_pinctrl_probe(struct platform_device *pdev,
const struct berlin_pinctrl_desc *desc)
{
struct device *dev = &pdev->dev;
struct device_node *parent_np = of_get_parent(dev->of_node);
struct regmap *regmap = syscon_node_to_regmap(parent_np);
of_node_put(parent_np);
if (IS_ERR(regmap))
return PTR_ERR(regmap);
return berlin_pinctrl_probe_regmap(pdev, desc, regmap);
}
@@ -0,0 +1,56 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Marvell Berlin SoC pinctrl driver.
*
* Copyright (C) 2014 Marvell Technology Group Ltd.
*
* Antoine Ténart <antoine.tenart@free-electrons.com>
*/
#ifndef __PINCTRL_BERLIN_H
#define __PINCTRL_BERLIN_H
struct berlin_desc_function {
const char *name;
u8 muxval;
};
struct berlin_desc_group {
const char *name;
u8 offset;
u8 bit_width;
u8 lsb;
struct berlin_desc_function *functions;
};
struct berlin_pinctrl_desc {
const struct berlin_desc_group *groups;
unsigned ngroups;
};
#define BERLIN_PINCTRL_GROUP(_name, _offset, _width, _lsb, ...) \
{ \
.name = _name, \
.offset = _offset, \
.bit_width = _width, \
.lsb = _lsb, \
.functions = (struct berlin_desc_function[]){ \
__VA_ARGS__, { } }, \
}
#define BERLIN_PINCTRL_FUNCTION(_muxval, _name) \
{ \
.name = _name, \
.muxval = _muxval, \
}
#define BERLIN_PINCTRL_FUNCTION_UNKNOWN {}
int berlin_pinctrl_probe(struct platform_device *pdev,
const struct berlin_pinctrl_desc *desc);
int berlin_pinctrl_probe_regmap(struct platform_device *pdev,
const struct berlin_pinctrl_desc *desc,
struct regmap *regmap);
#endif /* __PINCTRL_BERLIN_H */
@@ -0,0 +1,368 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Synaptics AS370 pinctrl driver
*
* Copyright (C) 2018 Synaptics Incorporated
*
* Author: Jisheng Zhang <jszhang@kernel.org>
*/
#include <linux/init.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include "berlin.h"
static const struct berlin_desc_group as370_soc_pinctrl_groups[] = {
BERLIN_PINCTRL_GROUP("I2S1_BCLKIO", 0x0, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO0 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* BCLKIO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG0 */
BERLIN_PINCTRL_GROUP("I2S1_LRCKIO", 0x0, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO1 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* LRCKIO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG1 */
BERLIN_PINCTRL_GROUP("I2S1_DO0", 0x0, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "por"), /* 1P8V RSTB*/
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* DO0 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio"), /* GPIO2 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG2 */
BERLIN_PINCTRL_GROUP("I2S1_DO1", 0x0, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "por"), /* 3P3V RSTB */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* DO1 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio"), /* GPIO3 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG3 */
BERLIN_PINCTRL_GROUP("I2S1_DO2", 0x0, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "por"), /* CORE RSTB */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* DO2 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM4 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio"), /* GPIO4 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG4 */
BERLIN_PINCTRL_GROUP("I2S1_DO3", 0x0, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO5 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* DO3 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM5 */
BERLIN_PINCTRL_FUNCTION(0x3, "spdifib"), /* SPDIFIB */
BERLIN_PINCTRL_FUNCTION(0x4, "spdifo"), /* SPDIFO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG5 */
BERLIN_PINCTRL_GROUP("I2S1_MCLK", 0x0, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO6 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), /* MCLK */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG6 */
BERLIN_PINCTRL_GROUP("I2S2_BCLKIO", 0x0, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO7 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* BCLKIO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG7 */
BERLIN_PINCTRL_GROUP("I2S2_LRCKIO", 0x0, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO8 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* LRCKIO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG8 */
BERLIN_PINCTRL_GROUP("I2S2_DI0", 0x0, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO9 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI0 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM2 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG9 */
BERLIN_PINCTRL_GROUP("I2S2_DI1", 0x4, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO10 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI1 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM3 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG10 */
BERLIN_PINCTRL_GROUP("I2S2_DI2", 0x4, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO11 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI2 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM6 */
BERLIN_PINCTRL_FUNCTION(0x3, "spdific"), /* SPDIFIC */
BERLIN_PINCTRL_FUNCTION(0x4, "spdifo"), /* SPDIFO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG11 */
BERLIN_PINCTRL_GROUP("I2S2_DI3", 0x4, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO12 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), /* DI3 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM7 */
BERLIN_PINCTRL_FUNCTION(0x3, "spdifia"), /* SPDIFIA */
BERLIN_PINCTRL_FUNCTION(0x4, "spdifo"), /* SPDIFO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG12 */
BERLIN_PINCTRL_GROUP("PDM_CLKO", 0x4, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO13 */
BERLIN_PINCTRL_FUNCTION(0x1, "pdm"), /* CLKO */
BERLIN_PINCTRL_FUNCTION(0x2, "i2s2"), /* MCLK */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG13 */
BERLIN_PINCTRL_GROUP("PDM_DI0", 0x4, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO14 */
BERLIN_PINCTRL_FUNCTION(0x1, "pdm"), /* DI0 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG14 */
BERLIN_PINCTRL_GROUP("PDM_DI1", 0x4, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO15 */
BERLIN_PINCTRL_FUNCTION(0x1, "pdm"), /* DI1 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG15 */
BERLIN_PINCTRL_GROUP("PDM_DI2", 0x4, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO16 */
BERLIN_PINCTRL_FUNCTION(0x1, "pdm"), /* DI2 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM4 */
BERLIN_PINCTRL_FUNCTION(0x3, "spdifid"), /* SPDIFID */
BERLIN_PINCTRL_FUNCTION(0x4, "spdifo"), /* SPDIFO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG16 */
BERLIN_PINCTRL_GROUP("PDM_DI3", 0x4, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO17 */
BERLIN_PINCTRL_FUNCTION(0x1, "pdm"), /* DI3 */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM5 */
BERLIN_PINCTRL_FUNCTION(0x3, "spdifi"), /* SPDIFI */
BERLIN_PINCTRL_FUNCTION(0x4, "spdifo"), /* SPDIFO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG17 */
BERLIN_PINCTRL_GROUP("NAND_IO0", 0x4, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO0 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* DATA0 */
BERLIN_PINCTRL_FUNCTION(0x4, "pcie0")), /* MDIO */
BERLIN_PINCTRL_GROUP("NAND_IO1", 0x4, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO1 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* DATA1 */
BERLIN_PINCTRL_FUNCTION(0x4, "pcie0")), /* MDC */
BERLIN_PINCTRL_GROUP("NAND_IO2", 0x8, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO2 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* DATA2 */
BERLIN_PINCTRL_FUNCTION(0x4, "pcie1")), /* MDIO */
BERLIN_PINCTRL_GROUP("NAND_IO3", 0x8, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO3 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* DATA3 */
BERLIN_PINCTRL_FUNCTION(0x4, "pcie1")), /* MDC */
BERLIN_PINCTRL_GROUP("NAND_IO4", 0x8, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO4 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc")), /* DATA4 */
BERLIN_PINCTRL_GROUP("NAND_IO5", 0x8, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO5 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc")), /* DATA5 */
BERLIN_PINCTRL_GROUP("NAND_IO6", 0x8, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO6 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc")), /* DATA6 */
BERLIN_PINCTRL_GROUP("NAND_IO7", 0x8, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* IO7 */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc")), /* DATA7 */
BERLIN_PINCTRL_GROUP("NAND_ALE", 0x8, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* ALE */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM6 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO18 */
BERLIN_PINCTRL_GROUP("NAND_CLE", 0x8, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* CLE */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM7 */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO19 */
BERLIN_PINCTRL_GROUP("NAND_WEn", 0x8, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* WEn */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO20 */
BERLIN_PINCTRL_GROUP("NAND_REn", 0x8, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* REn */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO21 */
BERLIN_PINCTRL_GROUP("NAND_WPn", 0xc, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* WPn */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* CLK */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO22 */
BERLIN_PINCTRL_GROUP("NAND_CEn", 0xc, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* CEn */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* RSTn */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO23 */
BERLIN_PINCTRL_GROUP("NAND_RDY", 0xc, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "nand"), /* RDY */
BERLIN_PINCTRL_FUNCTION(0x1, "emmc"), /* CMD */
BERLIN_PINCTRL_FUNCTION(0x3, "gpio")), /* GPIO24 */
BERLIN_PINCTRL_GROUP("SPI1_SS0n", 0xc, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS0n */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* GPIO25 */
BERLIN_PINCTRL_GROUP("SPI1_SS1n", 0xc, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SS1n */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), /* GPIO26 */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), /* PWM2 */
BERLIN_PINCTRL_GROUP("SPI1_SS2n", 0xc, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RXD */
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS2n */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), /* GPIO27 */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), /* PWM3 */
BERLIN_PINCTRL_GROUP("SPI1_SS3n", 0xc, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* TXD */
BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), /* SS3n */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO28 */
BERLIN_PINCTRL_GROUP("SPI1_SCLK", 0xc, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SCLK */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO29 */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), /* PWM4 */
BERLIN_PINCTRL_GROUP("SPI1_SDO", 0xc, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO30 */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), /* PWM5 */
BERLIN_PINCTRL_GROUP("SPI1_SDI", 0xc, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), /* SDI */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), /* GPIO31 */
BERLIN_PINCTRL_GROUP("USB0_DRV_VBUS", 0x10, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "usb0"), /* VBUS */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO32 */
BERLIN_PINCTRL_FUNCTION(0x3, "refclko")), /* 25M */
BERLIN_PINCTRL_GROUP("TW1_SCL", 0x10, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO33 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw1")), /* SCL */
BERLIN_PINCTRL_GROUP("TW1_SDA", 0x10, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO34 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw1")), /* SDA */
BERLIN_PINCTRL_GROUP("TW0_SCL", 0x10, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO35 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw0")), /* SCL */
BERLIN_PINCTRL_GROUP("TW0_SDA", 0x10, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO36 */
BERLIN_PINCTRL_FUNCTION(0x1, "tw0")), /* SDA */
BERLIN_PINCTRL_GROUP("TMS", 0x10, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TMS */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO37 */
BERLIN_PINCTRL_FUNCTION(0x4, "pwm")), /* PWM0 */
BERLIN_PINCTRL_GROUP("TDI", 0x10, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TDI */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO38 */
BERLIN_PINCTRL_FUNCTION(0x4, "pwm")), /* PWM1 */
BERLIN_PINCTRL_GROUP("TDO", 0x10, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), /* TDO */
BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), /* GPIO39 */
BERLIN_PINCTRL_FUNCTION(0x4, "pwm")), /* PWM0 */
BERLIN_PINCTRL_GROUP("PWM6", 0x10, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO40 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM6 */
BERLIN_PINCTRL_GROUP("PWM7", 0x10, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO41 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM7 */
BERLIN_PINCTRL_GROUP("PWM0", 0x14, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "por"), /* VDDCPUSOC RSTB */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm"), /* PWM0 */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO42 */
BERLIN_PINCTRL_GROUP("PWM1", 0x14, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO43 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM1 */
BERLIN_PINCTRL_GROUP("PWM2", 0x14, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO44 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM2 */
BERLIN_PINCTRL_GROUP("PWM3", 0x14, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO45 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM3 */
BERLIN_PINCTRL_GROUP("PWM4", 0x14, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO46 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM4 */
BERLIN_PINCTRL_GROUP("PWM5", 0x14, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO47 */
BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), /* PWM5 */
BERLIN_PINCTRL_GROUP("URT1_RTSn", 0x14, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO48 */
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RTSn */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM6 */
BERLIN_PINCTRL_FUNCTION(0x3, "tw1a"), /* SCL */
BERLIN_PINCTRL_FUNCTION(0x4, "aio"), /* DBG0 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG18 */
BERLIN_PINCTRL_GROUP("URT1_CTSn", 0x14, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO49 */
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* CTSn */
BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), /* PWM7 */
BERLIN_PINCTRL_FUNCTION(0x3, "tw1a"), /* SDA */
BERLIN_PINCTRL_FUNCTION(0x4, "aio"), /* DBG1 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG19 */
BERLIN_PINCTRL_GROUP("URT1_RXD", 0x14, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO50 */
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RXD */
BERLIN_PINCTRL_FUNCTION(0x4, "aio"), /* DBG2 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG20 */
BERLIN_PINCTRL_GROUP("URT1_TXD", 0x14, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO51 */
BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* TXD */
BERLIN_PINCTRL_FUNCTION(0x4, "aio"), /* DBG3 */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG21 */
BERLIN_PINCTRL_GROUP("I2S3_DI", 0x18, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO52 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s3"), /* DI */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG22 */
BERLIN_PINCTRL_GROUP("I2S3_DO", 0x18, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO53 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s3"), /* DO */
BERLIN_PINCTRL_FUNCTION(0x5, "phy")), /* DBG23 */
BERLIN_PINCTRL_GROUP("I2S3_BCLKIO", 0x18, 0x3, 0x06,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO54 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s3"), /* BCLKIO */
BERLIN_PINCTRL_FUNCTION(0x5, "clk")), /* DBG */
BERLIN_PINCTRL_GROUP("I2S3_LRCKIO", 0x18, 0x3, 0x09,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO55 */
BERLIN_PINCTRL_FUNCTION(0x1, "i2s3")), /* LRCKIO */
BERLIN_PINCTRL_GROUP("SD0_DAT0", 0x18, 0x3, 0x0c,
BERLIN_PINCTRL_FUNCTION(0x0, "cpupll"), /* OUT */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT0 */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO56 */
BERLIN_PINCTRL_GROUP("SD0_DAT1", 0x18, 0x3, 0x0f,
BERLIN_PINCTRL_FUNCTION(0x0, "syspll"), /* OUT */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT1 */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO57 */
BERLIN_PINCTRL_GROUP("SD0_CLK", 0x18, 0x3, 0x12,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO58 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0")), /* CLK */
BERLIN_PINCTRL_GROUP("SD0_DAT2", 0x18, 0x3, 0x15,
BERLIN_PINCTRL_FUNCTION(0x0, "mempll"), /* OUT */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT2 */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO59 */
BERLIN_PINCTRL_GROUP("SD0_DAT3", 0x18, 0x3, 0x18,
BERLIN_PINCTRL_FUNCTION(0x0, "apll0"), /* OUT */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* DAT3 */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO60 */
BERLIN_PINCTRL_GROUP("SD0_CMD", 0x18, 0x3, 0x1b,
BERLIN_PINCTRL_FUNCTION(0x0, "apll1"), /* OUT */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CMD */
BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), /* GPIO61 */
BERLIN_PINCTRL_GROUP("SD0_CDn", 0x1c, 0x3, 0x00,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO62 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* CDn */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), /* PWM2 */
BERLIN_PINCTRL_GROUP("SD0_WP", 0x1c, 0x3, 0x03,
BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), /* GPIO63 */
BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), /* WP */
BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), /* PWM3 */
};
static const struct berlin_pinctrl_desc as370_soc_pinctrl_data = {
.groups = as370_soc_pinctrl_groups,
.ngroups = ARRAY_SIZE(as370_soc_pinctrl_groups),
};
static const struct of_device_id as370_pinctrl_match[] = {
{
.compatible = "syna,as370-soc-pinctrl",
.data = &as370_soc_pinctrl_data,
},
{}
};
static int as370_pinctrl_probe(struct platform_device *pdev)
{
const struct berlin_pinctrl_desc *desc =
device_get_match_data(&pdev->dev);
struct regmap_config *rmconfig;
struct regmap *regmap;
struct resource *res;
void __iomem *base;
rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL);
if (!rmconfig)
return -ENOMEM;
base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
if (IS_ERR(base))
return PTR_ERR(base);
rmconfig->reg_bits = 32,
rmconfig->val_bits = 32,
rmconfig->reg_stride = 4,
rmconfig->max_register = resource_size(res);
regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig);
if (IS_ERR(regmap))
return PTR_ERR(regmap);
return berlin_pinctrl_probe_regmap(pdev, desc, regmap);
}
static struct platform_driver as370_pinctrl_driver = {
.probe = as370_pinctrl_probe,
.driver = {
.name = "as370-pinctrl",
.of_match_table = as370_pinctrl_match,
},
};
builtin_platform_driver(as370_pinctrl_driver);