mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
This is the big bulk of pin control changes for the v4.13 series:
Core:
- The documentation is moved over to RST.
- We now have agreed bindings for enabling input and output
buffers without actually enabling input and/or output on a
pin. We are chiseling out some details of pin control
electronics.
New drivers:
- ZTE ZX
- Renesas RZA1
- MIPS Ingenic JZ47xx: also switch over existing drivers in the
tree to use this pin controller and consolidate earlier
spread out code.
- Microschip MCP23S08: this driver is migrated from the GPIO
subsystem and totally rewritten to use proper pin control.
All users are switched over.
New subdrivers:
- Renesas R8A7743 and R8A7745.
- Allwinner Sunxi A83T R_PIO.
- Marvell MVEBU Armada CP110 and AP806.
- Intel Cannon Lake PCH.
- Qualcomm IPQ8074.
Notable improvements:
- IRQ support on the Marvell MVEBU Armada 37xx.
- Meson driver supports HDMI CEC, AO, I2S, SPDIF and PWM.
- Rockchip driver now supports iomux-route switching for
RK3228, RK3328 and RK3399.
- Rockchip A10 and A20 are merged into a single driver.
- STM32 has improved GPIO support.
- Samsung Exynos drivers are split per ARMv7 and ARMv8.
- Marvell MVEBU is converted to use regmap for register
access.
Maintenance:
- Several Renesas SH-PFC refactorings and updates.
- Serious code size cut for Mediatek MT7623.
- Misc janitorial and MAINTAINERS fixes.
-----BEGIN PGP SIGNATURE-----
iQIcBAABAgAGBQJZXeUhAAoJEEEQszewGV1zcl8QAMZ6To2JBQeK0Qi+pik9ZbW7
CvnIFT7E4X45tstwFNKIgdQ1C/IcfzKpPSUDRUqi2nWJiWcuYgn3wQwQ5qbkGtaG
vne0KVChgFGkT2SwycUZy11JxuP75U73e27BwAruxHhwWo5PesUOjjkmUtMqdbNQ
VAwx6KoCBx1VBlb0uscbSSqFyAspdyeAHPEvSj4IpsqRZzT7YFqDm4C+uTnwavPx
ZLoTji0HCpPIAo4C8JUAvweWbpxMC1IMdfm9jRkZ4rR/gTFQXvK+9ssI6lxSK6a6
RiCJaAE6wQHKYm4LL0pGbW+aMGWRRRp8MERNmg8NgnWONcfCxYowoOYeYLeqPhAg
kWkFHlmjpfo/A79V6tmN32vCpeQd34XGCetMpI93TuZ42olniD2Puv6RscVaSP3T
3mIqydX9BY8iAviyMaLcHQeChaNdhLQi+AVjrn1VQjdkWn0C7uR++JznsyaxaI+S
cVadl6k8H393R1Qdvh3JdoL0owsntQxWVWCbR6fyAZTHHiLGEyvL1ceO/rbpSRrn
c8Ghk5s7f3DFltn7yWiV4k3KVhDPb5iK2dYP9uGCgqbigHWqlcB5PanRu1aGSFov
h/1VFEMagNCXQCrgGcIfmkEiwW3SqUsFaaoMLhlYpNb/ON3ihGgsZYiczWSj8l4L
yfCOoszuEsVkV1dFNAjA
=dUFL
-----END PGP SIGNATURE-----
Merge tag 'pinctrl-v4.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control updates from Linus Walleij:
"This is the big bulk of pin control changes for the v4.13 series:
Core:
- The documentation is moved over to RST.
- We now have agreed bindings for enabling input and output buffers
without actually enabling input and/or output on a pin. We are
chiseling out some details of pin control electronics.
New drivers:
- ZTE ZX
- Renesas RZA1
- MIPS Ingenic JZ47xx: also switch over existing drivers in the tree
to use this pin controller and consolidate earlier spread out code.
- Microschip MCP23S08: this driver is migrated from the GPIO
subsystem and totally rewritten to use proper pin control. All
users are switched over.
New subdrivers:
- Renesas R8A7743 and R8A7745.
- Allwinner Sunxi A83T R_PIO.
- Marvell MVEBU Armada CP110 and AP806.
- Intel Cannon Lake PCH.
- Qualcomm IPQ8074.
Notable improvements:
- IRQ support on the Marvell MVEBU Armada 37xx.
- Meson driver supports HDMI CEC, AO, I2S, SPDIF and PWM.
- Rockchip driver now supports iomux-route switching for RK3228,
RK3328 and RK3399.
- Rockchip A10 and A20 are merged into a single driver.
- STM32 has improved GPIO support.
- Samsung Exynos drivers are split per ARMv7 and ARMv8.
- Marvell MVEBU is converted to use regmap for register access.
Maintenance:
- Several Renesas SH-PFC refactorings and updates.
- Serious code size cut for Mediatek MT7623.
- Misc janitorial and MAINTAINERS fixes"
* tag 'pinctrl-v4.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (137 commits)
pinctrl: samsung: Remove bogus irq_[un]mask from resource management
pinctrl: rza1: make structures rza1_gpiochip_template and rza1_pinmux_ops static
pinctrl: rza1: Remove unneeded wrong check for wrong variable
pinctrl: qcom: Add ipq8074 pinctrl driver
pinctrl: freescale: imx7d: make of_device_ids const.
pinctrl: DT: extend the pinmux property to support integers array
pinctrl: generic: Add output-enable property
pinctrl: armada-37xx: Fix number of pin in sdio_sb
pinctrl: armada-37xx: Fix uart2 group selection register mask
pinctrl: bcm2835: Avoid warning from __irq_do_set_handler
pinctrl: sh-pfc: r8a7795: Add PWM support
MAINTAINERS: Add Qualcomm pinctrl drivers section
arm: dts: dt-bindings: Add Renesas RZ/A1 pinctrl header
dt-bindings: pinctrl: Add RZ/A1 bindings doc
pinctrl: Renesas RZ/A1 pin and gpio controller
pinctrl: sh-pfc: r8a7792: Add SCIF1 and SCIF2 pin groups
pinctrl.txt: move it to the driver-api book
pinctrl: ingenic: checking for NULL instead of IS_ERR()
pinctrl: uniphier: fix WARN_ON() of pingroups dump on LD20
pinctrl: uniphier: fix WARN_ON() of pingroups dump on LD11
...
This commit is contained in:
commit
ac7b75966c
123 changed files with 14159 additions and 8629 deletions
|
|
@ -146,6 +146,20 @@ config PINCTRL_FALCON
|
|||
depends on SOC_FALCON
|
||||
depends on PINCTRL_LANTIQ
|
||||
|
||||
config PINCTRL_MCP23S08
|
||||
tristate "Microchip MCP23xxx I/O expander"
|
||||
depends on SPI_MASTER || I2C
|
||||
depends on I2C || I2C=n
|
||||
select GPIOLIB_IRQCHIP
|
||||
select REGMAP_I2C if I2C
|
||||
select REGMAP_SPI if SPI_MASTER
|
||||
select GENERIC_PINCONF
|
||||
help
|
||||
SPI/I2C driver for Microchip MCP23S08/MCP23S17/MCP23008/MCP23017
|
||||
I/O expanders.
|
||||
This provides a GPIO interface supporting inputs and outputs.
|
||||
The I2C versions of the chips can be used as interrupt-controller.
|
||||
|
||||
config PINCTRL_MESON
|
||||
bool
|
||||
depends on OF
|
||||
|
|
@ -174,6 +188,17 @@ config PINCTRL_ROCKCHIP
|
|||
select GENERIC_IRQ_CHIP
|
||||
select MFD_SYSCON
|
||||
|
||||
config PINCTRL_RZA1
|
||||
bool "Renesas RZ/A1 gpio and pinctrl driver"
|
||||
depends on OF
|
||||
depends on ARCH_R7S72100 || COMPILE_TEST
|
||||
select GPIOLIB
|
||||
select GENERIC_PINCTRL_GROUPS
|
||||
select GENERIC_PINMUX_FUNCTIONS
|
||||
select GENERIC_PINCONF
|
||||
help
|
||||
This selects pinctrl driver for Renesas RZ/A1 platforms.
|
||||
|
||||
config PINCTRL_SINGLE
|
||||
tristate "One-register-per-pin type device tree based pinctrl driver"
|
||||
depends on OF
|
||||
|
|
@ -296,6 +321,16 @@ config PINCTRL_ZYNQ
|
|||
help
|
||||
This selects the pinctrl driver for Xilinx Zynq.
|
||||
|
||||
config PINCTRL_INGENIC
|
||||
bool "Pinctrl driver for the Ingenic JZ47xx SoCs"
|
||||
default y
|
||||
depends on OF
|
||||
depends on MACH_INGENIC || COMPILE_TEST
|
||||
select GENERIC_PINCONF
|
||||
select GENERIC_PINCTRL_GROUPS
|
||||
select GENERIC_PINMUX_FUNCTIONS
|
||||
select REGMAP_MMIO
|
||||
|
||||
source "drivers/pinctrl/aspeed/Kconfig"
|
||||
source "drivers/pinctrl/bcm/Kconfig"
|
||||
source "drivers/pinctrl/berlin/Kconfig"
|
||||
|
|
@ -315,6 +350,7 @@ source "drivers/pinctrl/ti/Kconfig"
|
|||
source "drivers/pinctrl/uniphier/Kconfig"
|
||||
source "drivers/pinctrl/vt8500/Kconfig"
|
||||
source "drivers/pinctrl/mediatek/Kconfig"
|
||||
source "drivers/pinctrl/zte/Kconfig"
|
||||
|
||||
config PINCTRL_XWAY
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -19,12 +19,14 @@ obj-$(CONFIG_PINCTRL_DA850_PUPD) += pinctrl-da850-pupd.o
|
|||
obj-$(CONFIG_PINCTRL_DIGICOLOR) += pinctrl-digicolor.o
|
||||
obj-$(CONFIG_PINCTRL_FALCON) += pinctrl-falcon.o
|
||||
obj-$(CONFIG_PINCTRL_MAX77620) += pinctrl-max77620.o
|
||||
obj-$(CONFIG_PINCTRL_MCP23S08) += pinctrl-mcp23s08.o
|
||||
obj-$(CONFIG_PINCTRL_MESON) += meson/
|
||||
obj-$(CONFIG_PINCTRL_OXNAS) += pinctrl-oxnas.o
|
||||
obj-$(CONFIG_PINCTRL_PALMAS) += pinctrl-palmas.o
|
||||
obj-$(CONFIG_PINCTRL_PIC32) += pinctrl-pic32.o
|
||||
obj-$(CONFIG_PINCTRL_PISTACHIO) += pinctrl-pistachio.o
|
||||
obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o
|
||||
obj-$(CONFIG_PINCTRL_RZA1) += pinctrl-rza1.o
|
||||
obj-$(CONFIG_PINCTRL_SINGLE) += pinctrl-single.o
|
||||
obj-$(CONFIG_PINCTRL_SIRF) += sirf/
|
||||
obj-$(CONFIG_PINCTRL_SX150X) += pinctrl-sx150x.o
|
||||
|
|
@ -39,6 +41,7 @@ obj-$(CONFIG_PINCTRL_LPC18XX) += pinctrl-lpc18xx.o
|
|||
obj-$(CONFIG_PINCTRL_TB10X) += pinctrl-tb10x.o
|
||||
obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o
|
||||
obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o
|
||||
obj-$(CONFIG_PINCTRL_INGENIC) += pinctrl-ingenic.o
|
||||
|
||||
obj-$(CONFIG_ARCH_ASPEED) += aspeed/
|
||||
obj-y += bcm/
|
||||
|
|
@ -58,3 +61,4 @@ obj-y += ti/
|
|||
obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
|
||||
obj-$(CONFIG_ARCH_VT8500) += vt8500/
|
||||
obj-$(CONFIG_PINCTRL_MTK) += mediatek/
|
||||
obj-$(CONFIG_PINCTRL_ZX) += zte/
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2013 Broadcom Corporation
|
||||
* Copyright (C) 2013-2017 Broadcom
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
|
@ -10,9 +10,10 @@
|
|||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -1444,10 +1445,4 @@ static struct platform_driver bcm281xx_pinctrl_driver = {
|
|||
.of_match_table = bcm281xx_pinctrl_of_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver_probe(bcm281xx_pinctrl_driver, bcm281xx_pinctrl_probe);
|
||||
|
||||
MODULE_AUTHOR("Broadcom Corporation <[email protected]>");
|
||||
MODULE_AUTHOR("Sherman Yin <[email protected]>");
|
||||
MODULE_DESCRIPTION("Broadcom BCM281xx pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
builtin_platform_driver_probe(bcm281xx_pinctrl_driver, bcm281xx_pinctrl_probe);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqdesc.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
|
@ -1048,6 +1048,10 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
|
|||
for (i = 0; i < BCM2835_NUM_IRQS; i++) {
|
||||
pc->irq[i] = irq_of_parse_and_map(np, i);
|
||||
pc->irq_group[i] = i;
|
||||
|
||||
if (pc->irq[i] == 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Use the same handler for all groups: this is necessary
|
||||
* since we use one gpiochip to cover all lines - the
|
||||
|
|
@ -1075,31 +1079,17 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int bcm2835_pinctrl_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct bcm2835_pinctrl *pc = platform_get_drvdata(pdev);
|
||||
|
||||
gpiochip_remove(&pc->gpio_chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id bcm2835_pinctrl_match[] = {
|
||||
{ .compatible = "brcm,bcm2835-gpio" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, bcm2835_pinctrl_match);
|
||||
|
||||
static struct platform_driver bcm2835_pinctrl_driver = {
|
||||
.probe = bcm2835_pinctrl_probe,
|
||||
.remove = bcm2835_pinctrl_remove,
|
||||
.driver = {
|
||||
.name = MODULE_NAME,
|
||||
.of_match_table = bcm2835_pinctrl_match,
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
};
|
||||
module_platform_driver(bcm2835_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Chris Boot, Simon Arlott, Stephen Warren");
|
||||
MODULE_DESCRIPTION("BCM2835 Pin control driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
builtin_platform_driver(bcm2835_pinctrl_driver);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/* Copyright (C) 2014-2015 Broadcom Corporation
|
||||
/*
|
||||
* Copyright (C) 2014-2017 Broadcom
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
|
@ -8,6 +9,10 @@
|
|||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Broadcom Cygnus IOMUX driver
|
||||
*
|
||||
* This file contains the Cygnus IOMUX driver that supports group based PINMUX
|
||||
* configuration. Although PINMUX configuration is mainly group based, the
|
||||
|
|
@ -17,7 +22,6 @@
|
|||
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
|
@ -1016,7 +1020,3 @@ static int __init cygnus_pinmux_init(void)
|
|||
return platform_driver_register(&cygnus_pinmux_driver);
|
||||
}
|
||||
arch_initcall(cygnus_pinmux_init);
|
||||
|
||||
MODULE_AUTHOR("Ray Jui <[email protected]>");
|
||||
MODULE_DESCRIPTION("Broadcom Cygnus IOMUX driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2014-2015 Broadcom Corporation
|
||||
* Copyright (C) 2014-2017 Broadcom
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
|
@ -9,7 +9,9 @@
|
|||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the Broadcom Iproc GPIO driver that supports 3
|
||||
* GPIO controllers on Iproc including the ASIU GPIO controller, the
|
||||
* chipCommonG GPIO controller, and the always-on GPIO controller. Basic
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015 Broadcom Corporation
|
||||
* Copyright (C) 2014-2017 Broadcom
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
|
|
@ -9,7 +9,9 @@
|
|||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains the Broadcom Northstar Plus (NSP) GPIO driver that
|
||||
* supports the chipCommonA GPIO controller. Basic PINCONF such as bias,
|
||||
* pull up/down, slew and drive strength are also supported in this driver.
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin)
|
|||
const struct pin_desc *desc;
|
||||
|
||||
desc = pin_desc_get(pctldev, pin);
|
||||
if (desc == NULL) {
|
||||
if (!desc) {
|
||||
dev_err(pctldev->dev, "failed to get pin(%d) name\n",
|
||||
pin);
|
||||
return NULL;
|
||||
|
|
@ -214,7 +214,7 @@ static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
|
|||
|
||||
pindesc = radix_tree_lookup(&pctldev->pin_desc_tree,
|
||||
pins[i].number);
|
||||
if (pindesc != NULL) {
|
||||
if (pindesc) {
|
||||
radix_tree_delete(&pctldev->pin_desc_tree,
|
||||
pins[i].number);
|
||||
if (pindesc->dynamic_name)
|
||||
|
|
@ -230,7 +230,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
|
|||
struct pin_desc *pindesc;
|
||||
|
||||
pindesc = pin_desc_get(pctldev, pin->number);
|
||||
if (pindesc != NULL) {
|
||||
if (pindesc) {
|
||||
dev_err(pctldev->dev, "pin %d already registered\n",
|
||||
pin->number);
|
||||
return -EINVAL;
|
||||
|
|
@ -248,7 +248,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
|
|||
pindesc->name = pin->name;
|
||||
} else {
|
||||
pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", pin->number);
|
||||
if (pindesc->name == NULL) {
|
||||
if (!pindesc->name) {
|
||||
kfree(pindesc);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
@ -402,7 +402,7 @@ static int pinctrl_get_device_gpio_range(unsigned gpio,
|
|||
struct pinctrl_gpio_range *range;
|
||||
|
||||
range = pinctrl_match_gpio_range(pctldev, gpio);
|
||||
if (range != NULL) {
|
||||
if (range) {
|
||||
*outdev = pctldev;
|
||||
*outrange = range;
|
||||
mutex_unlock(&pinctrldev_list_mutex);
|
||||
|
|
@ -933,7 +933,7 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
|
|||
else
|
||||
setting->pctldev =
|
||||
get_pinctrl_dev_from_devname(map->ctrl_dev_name);
|
||||
if (setting->pctldev == NULL) {
|
||||
if (!setting->pctldev) {
|
||||
kfree(setting);
|
||||
/* Do not defer probing of hogs (circular loop) */
|
||||
if (!strcmp(map->ctrl_dev_name, map->dev_name))
|
||||
|
|
@ -1024,6 +1024,16 @@ static struct pinctrl *create_pinctrl(struct device *dev,
|
|||
/* Map must be for this device */
|
||||
if (strcmp(map->dev_name, devname))
|
||||
continue;
|
||||
/*
|
||||
* If pctldev is not null, we are claiming hog for it,
|
||||
* that means, setting that is served by pctldev by itself.
|
||||
*
|
||||
* Thus we must skip map that is for this device but is served
|
||||
* by other device.
|
||||
*/
|
||||
if (pctldev &&
|
||||
strcmp(dev_name(pctldev->dev), map->ctrl_dev_name))
|
||||
continue;
|
||||
|
||||
ret = add_setting(p, pctldev, map);
|
||||
/*
|
||||
|
|
@ -1080,7 +1090,7 @@ struct pinctrl *pinctrl_get(struct device *dev)
|
|||
* return another pointer to it.
|
||||
*/
|
||||
p = find_pinctrl(dev);
|
||||
if (p != NULL) {
|
||||
if (p) {
|
||||
dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
|
||||
kref_get(&p->users);
|
||||
return p;
|
||||
|
|
@ -1551,7 +1561,7 @@ static int pinctrl_pins_show(struct seq_file *s, void *what)
|
|||
pin = pctldev->desc->pins[i].number;
|
||||
desc = pin_desc_get(pctldev, pin);
|
||||
/* Pin space may be sparse */
|
||||
if (desc == NULL)
|
||||
if (!desc)
|
||||
continue;
|
||||
|
||||
seq_printf(s, "pin %d (%s) ", pin, desc->name);
|
||||
|
|
@ -1718,7 +1728,7 @@ static int pinctrl_maps_show(struct seq_file *s, void *what)
|
|||
break;
|
||||
}
|
||||
|
||||
seq_printf(s, "\n");
|
||||
seq_putc(s, '\n');
|
||||
}
|
||||
mutex_unlock(&pinctrl_maps_mutex);
|
||||
|
||||
|
|
@ -2131,7 +2141,7 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev)
|
|||
{
|
||||
struct pinctrl_gpio_range *range, *n;
|
||||
|
||||
if (pctldev == NULL)
|
||||
if (!pctldev)
|
||||
return;
|
||||
|
||||
mutex_lock(&pctldev->mutex);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ config PINCTRL_IMX
|
|||
bool
|
||||
select GENERIC_PINCTRL_GROUPS
|
||||
select GENERIC_PINMUX_FUNCTIONS
|
||||
select PINCONF
|
||||
select GENERIC_PINCONF
|
||||
select REGMAP
|
||||
|
||||
config PINCTRL_IMX1_CORE
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/regmap.h>
|
||||
|
||||
#include "../core.h"
|
||||
#include "../pinconf.h"
|
||||
#include "../pinmux.h"
|
||||
#include "pinctrl-imx.h"
|
||||
|
||||
|
|
@ -196,14 +197,16 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
|
|||
if (info->flags & SHARE_MUX_CONF_REG) {
|
||||
u32 reg;
|
||||
reg = readl(ipctl->base + pin_reg->mux_reg);
|
||||
reg &= ~(0x7 << 20);
|
||||
reg |= (pin->mux_mode << 20);
|
||||
reg &= ~info->mux_mask;
|
||||
reg |= (pin->mux_mode << info->mux_shift);
|
||||
writel(reg, ipctl->base + pin_reg->mux_reg);
|
||||
dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n",
|
||||
pin_reg->mux_reg, reg);
|
||||
} else {
|
||||
writel(pin->mux_mode, ipctl->base + pin_reg->mux_reg);
|
||||
dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n",
|
||||
pin_reg->mux_reg, pin->mux_mode);
|
||||
}
|
||||
dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n",
|
||||
pin_reg->mux_reg, pin->mux_mode);
|
||||
|
||||
/*
|
||||
* If the select input value begins with 0xff, it's a quirky
|
||||
|
|
@ -287,7 +290,7 @@ static int imx_pmx_gpio_request_enable(struct pinctrl_dev *pctldev,
|
|||
|
||||
mux_pin:
|
||||
reg = readl(ipctl->base + pin_reg->mux_reg);
|
||||
reg &= ~(0x7 << 20);
|
||||
reg &= ~info->mux_mask;
|
||||
reg |= imx_pin->config;
|
||||
writel(reg, ipctl->base + pin_reg->mux_reg);
|
||||
|
||||
|
|
@ -359,6 +362,62 @@ static const struct pinmux_ops imx_pmx_ops = {
|
|||
.gpio_set_direction = imx_pmx_gpio_set_direction,
|
||||
};
|
||||
|
||||
/* decode generic config into raw register values */
|
||||
static u32 imx_pinconf_decode_generic_config(struct imx_pinctrl *ipctl,
|
||||
unsigned long *configs,
|
||||
unsigned int num_configs)
|
||||
{
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
struct imx_cfg_params_decode *decode;
|
||||
enum pin_config_param param;
|
||||
u32 raw_config = 0;
|
||||
u32 param_val;
|
||||
int i, j;
|
||||
|
||||
WARN_ON(num_configs > info->num_decodes);
|
||||
|
||||
for (i = 0; i < num_configs; i++) {
|
||||
param = pinconf_to_config_param(configs[i]);
|
||||
param_val = pinconf_to_config_argument(configs[i]);
|
||||
decode = info->decodes;
|
||||
for (j = 0; j < info->num_decodes; j++) {
|
||||
if (param == decode->param) {
|
||||
if (decode->invert)
|
||||
param_val = !param_val;
|
||||
raw_config |= (param_val << decode->shift)
|
||||
& decode->mask;
|
||||
break;
|
||||
}
|
||||
decode++;
|
||||
}
|
||||
}
|
||||
|
||||
if (info->fixup)
|
||||
info->fixup(configs, num_configs, &raw_config);
|
||||
|
||||
return raw_config;
|
||||
}
|
||||
|
||||
static u32 imx_pinconf_parse_generic_config(struct device_node *np,
|
||||
struct imx_pinctrl *ipctl)
|
||||
{
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
struct pinctrl_dev *pctl = ipctl->pctl;
|
||||
unsigned int num_configs;
|
||||
unsigned long *configs;
|
||||
int ret;
|
||||
|
||||
if (!info->generic_pinconf)
|
||||
return 0;
|
||||
|
||||
ret = pinconf_generic_parse_dt_config(np, pctl, &configs,
|
||||
&num_configs);
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
return imx_pinconf_decode_generic_config(ipctl, configs, num_configs);
|
||||
}
|
||||
|
||||
static int imx_pinconf_get(struct pinctrl_dev *pctldev,
|
||||
unsigned pin_id, unsigned long *config)
|
||||
{
|
||||
|
|
@ -375,7 +434,7 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev,
|
|||
*config = readl(ipctl->base + pin_reg->conf_reg);
|
||||
|
||||
if (info->flags & SHARE_MUX_CONF_REG)
|
||||
*config &= 0xffff;
|
||||
*config &= ~info->mux_mask;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -402,14 +461,16 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev,
|
|||
if (info->flags & SHARE_MUX_CONF_REG) {
|
||||
u32 reg;
|
||||
reg = readl(ipctl->base + pin_reg->conf_reg);
|
||||
reg &= ~0xffff;
|
||||
reg &= info->mux_mask;
|
||||
reg |= configs[i];
|
||||
writel(reg, ipctl->base + pin_reg->conf_reg);
|
||||
dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n",
|
||||
pin_reg->conf_reg, reg);
|
||||
} else {
|
||||
writel(configs[i], ipctl->base + pin_reg->conf_reg);
|
||||
dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%lx\n",
|
||||
pin_reg->conf_reg, configs[i]);
|
||||
}
|
||||
dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%lx\n",
|
||||
pin_reg->conf_reg, configs[i]);
|
||||
} /* for each config */
|
||||
|
||||
return 0;
|
||||
|
|
@ -475,9 +536,10 @@ static const struct pinconf_ops imx_pinconf_ops = {
|
|||
|
||||
static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
struct group_desc *grp,
|
||||
struct imx_pinctrl_soc_info *info,
|
||||
struct imx_pinctrl *ipctl,
|
||||
u32 index)
|
||||
{
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
int size, pin_size;
|
||||
const __be32 *list;
|
||||
int i;
|
||||
|
|
@ -489,25 +551,44 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
|||
pin_size = SHARE_FSL_PIN_SIZE;
|
||||
else
|
||||
pin_size = FSL_PIN_SIZE;
|
||||
|
||||
if (info->generic_pinconf)
|
||||
pin_size -= 4;
|
||||
|
||||
/* Initialise group */
|
||||
grp->name = np->name;
|
||||
|
||||
/*
|
||||
* the binding format is fsl,pins = <PIN_FUNC_ID CONFIG ...>,
|
||||
* do sanity check and calculate pins number
|
||||
*
|
||||
* First try legacy 'fsl,pins' property, then fall back to the
|
||||
* generic 'pins'.
|
||||
*
|
||||
* Note: for generic 'pins' case, there's no CONFIG part in
|
||||
* the binding format.
|
||||
*/
|
||||
list = of_get_property(np, "fsl,pins", &size);
|
||||
if (!list) {
|
||||
dev_err(info->dev, "no fsl,pins property in node %s\n", np->full_name);
|
||||
return -EINVAL;
|
||||
list = of_get_property(np, "pins", &size);
|
||||
if (!list) {
|
||||
dev_err(info->dev,
|
||||
"no fsl,pins and pins property in node %s\n",
|
||||
np->full_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* we do not check return since it's safe node passed down */
|
||||
if (!size || size % pin_size) {
|
||||
dev_err(info->dev, "Invalid fsl,pins property in node %s\n", np->full_name);
|
||||
dev_err(info->dev, "Invalid fsl,pins or pins property in node %s\n",
|
||||
np->full_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* first try to parse the generic pin config */
|
||||
config = imx_pinconf_parse_generic_config(np, ipctl);
|
||||
|
||||
grp->num_pins = size / pin_size;
|
||||
grp->data = devm_kzalloc(info->dev, grp->num_pins *
|
||||
sizeof(struct imx_pin), GFP_KERNEL);
|
||||
|
|
@ -544,11 +625,18 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
|||
pin->mux_mode = be32_to_cpu(*list++);
|
||||
pin->input_val = be32_to_cpu(*list++);
|
||||
|
||||
/* SION bit is in mux register */
|
||||
config = be32_to_cpu(*list++);
|
||||
if (config & IMX_PAD_SION)
|
||||
pin->mux_mode |= IOMUXC_CONFIG_SION;
|
||||
pin->config = config & ~IMX_PAD_SION;
|
||||
if (info->generic_pinconf) {
|
||||
/* generic pin config decoded */
|
||||
pin->config = config;
|
||||
} else {
|
||||
/* legacy pin config read from devicetree */
|
||||
config = be32_to_cpu(*list++);
|
||||
|
||||
/* SION bit is in mux register */
|
||||
if (config & IMX_PAD_SION)
|
||||
pin->mux_mode |= IOMUXC_CONFIG_SION;
|
||||
pin->config = config & ~IMX_PAD_SION;
|
||||
}
|
||||
|
||||
dev_dbg(info->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,
|
||||
pin->mux_mode, pin->config);
|
||||
|
|
@ -581,9 +669,10 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
|
|||
dev_err(info->dev, "no groups defined in %s\n", np->full_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
func->group_names = devm_kzalloc(info->dev,
|
||||
func->num_group_names *
|
||||
func->group_names = devm_kcalloc(info->dev, func->num_group_names,
|
||||
sizeof(char *), GFP_KERNEL);
|
||||
if (!func->group_names)
|
||||
return -ENOMEM;
|
||||
|
||||
for_each_child_of_node(np, child) {
|
||||
func->group_names[i] = child->name;
|
||||
|
|
@ -598,7 +687,7 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
|
|||
info->group_index++, grp);
|
||||
mutex_unlock(&info->mutex);
|
||||
|
||||
imx_pinctrl_parse_groups(child, grp, info, i++);
|
||||
imx_pinctrl_parse_groups(child, grp, ipctl, i++);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -769,6 +858,10 @@ int imx_pinctrl_probe(struct platform_device *pdev,
|
|||
imx_pinctrl_desc->confops = &imx_pinconf_ops;
|
||||
imx_pinctrl_desc->owner = THIS_MODULE;
|
||||
|
||||
/* for generic pinconf */
|
||||
imx_pinctrl_desc->custom_params = info->custom_params;
|
||||
imx_pinctrl_desc->num_custom_params = info->num_custom_params;
|
||||
|
||||
mutex_init(&info->mutex);
|
||||
|
||||
ipctl->info = info;
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@
|
|||
#ifndef __DRIVERS_PINCTRL_IMX_H
|
||||
#define __DRIVERS_PINCTRL_IMX_H
|
||||
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
|
||||
struct platform_device;
|
||||
|
||||
/**
|
||||
|
|
@ -44,6 +46,14 @@ struct imx_pin_reg {
|
|||
s16 conf_reg;
|
||||
};
|
||||
|
||||
/* decode a generic config into raw register value */
|
||||
struct imx_cfg_params_decode {
|
||||
enum pin_config_param param;
|
||||
u32 mask;
|
||||
u8 shift;
|
||||
bool invert;
|
||||
};
|
||||
|
||||
struct imx_pinctrl_soc_info {
|
||||
struct device *dev;
|
||||
const struct pinctrl_pin_desc *pins;
|
||||
|
|
@ -53,8 +63,27 @@ struct imx_pinctrl_soc_info {
|
|||
unsigned int flags;
|
||||
const char *gpr_compatible;
|
||||
struct mutex mutex;
|
||||
|
||||
/* MUX_MODE shift and mask in case SHARE_MUX_CONF_REG */
|
||||
unsigned int mux_mask;
|
||||
u8 mux_shift;
|
||||
|
||||
/* generic pinconf */
|
||||
bool generic_pinconf;
|
||||
const struct pinconf_generic_params *custom_params;
|
||||
unsigned int num_custom_params;
|
||||
struct imx_cfg_params_decode *decodes;
|
||||
unsigned int num_decodes;
|
||||
void (*fixup)(unsigned long *configs, unsigned int num_configs,
|
||||
u32 *raw_config);
|
||||
};
|
||||
|
||||
#define IMX_CFG_PARAMS_DECODE(p, m, o) \
|
||||
{ .param = p, .mask = m, .shift = o, .invert = false, }
|
||||
|
||||
#define IMX_CFG_PARAMS_DECODE_INVERT(p, m, o) \
|
||||
{ .param = p, .mask = m, .shift = o, .invert = true, }
|
||||
|
||||
#define SHARE_MUX_CONF_REG 0x1
|
||||
#define ZERO_OFFSET_VALID 0x2
|
||||
|
||||
|
|
|
|||
|
|
@ -358,19 +358,19 @@ static const struct pinctrl_pin_desc imx7d_lpsr_pinctrl_pads[] = {
|
|||
IMX_PINCTRL_PIN(MX7D_PAD_GPIO1_IO07),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx7d_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx7d_pinctrl_info = {
|
||||
.pins = imx7d_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx7d_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx7d-iomuxc-gpr",
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx7d_lpsr_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx7d_lpsr_pinctrl_info = {
|
||||
.pins = imx7d_lpsr_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx7d_lpsr_pinctrl_pads),
|
||||
.flags = ZERO_OFFSET_VALID,
|
||||
};
|
||||
|
||||
static struct of_device_id imx7d_pinctrl_of_match[] = {
|
||||
static const struct of_device_id imx7d_pinctrl_of_match[] = {
|
||||
{ .compatible = "fsl,imx7d-iomuxc", .data = &imx7d_pinctrl_info, },
|
||||
{ .compatible = "fsl,imx7d-iomuxc-lpsr", .data = &imx7d_lpsr_pinctrl_info },
|
||||
{ /* sentinel */ }
|
||||
|
|
|
|||
|
|
@ -299,6 +299,8 @@ static struct imx_pinctrl_soc_info vf610_pinctrl_info = {
|
|||
.pins = vf610_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(vf610_pinctrl_pads),
|
||||
.flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID,
|
||||
.mux_mask = 0x700000,
|
||||
.mux_shift = 20,
|
||||
};
|
||||
|
||||
static const struct of_device_id vf610_pinctrl_of_match[] = {
|
||||
|
|
|
|||
|
|
@ -56,6 +56,14 @@ config PINCTRL_BROXTON
|
|||
Broxton pinctrl driver provides an interface that allows
|
||||
configuring of SoC pins and using them as GPIOs.
|
||||
|
||||
config PINCTRL_CANNONLAKE
|
||||
tristate "Intel Cannon Lake PCH pinctrl and GPIO driver"
|
||||
depends on ACPI
|
||||
select PINCTRL_INTEL
|
||||
help
|
||||
This pinctrl driver provides an interface that allows configuring
|
||||
of Intel Cannon Lake PCH pins and using them as GPIOs.
|
||||
|
||||
config PINCTRL_GEMINILAKE
|
||||
tristate "Intel Gemini Lake SoC pinctrl and GPIO driver"
|
||||
depends on ACPI
|
||||
|
|
|
|||
|
|
@ -5,5 +5,6 @@ obj-$(CONFIG_PINCTRL_CHERRYVIEW) += pinctrl-cherryview.o
|
|||
obj-$(CONFIG_PINCTRL_MERRIFIELD) += pinctrl-merrifield.o
|
||||
obj-$(CONFIG_PINCTRL_INTEL) += pinctrl-intel.o
|
||||
obj-$(CONFIG_PINCTRL_BROXTON) += pinctrl-broxton.o
|
||||
obj-$(CONFIG_PINCTRL_CANNONLAKE) += pinctrl-cannonlake.o
|
||||
obj-$(CONFIG_PINCTRL_GEMINILAKE) += pinctrl-geminilake.o
|
||||
obj-$(CONFIG_PINCTRL_SUNRISEPOINT) += pinctrl-sunrisepoint.o
|
||||
|
|
|
|||
442
drivers/pinctrl/intel/pinctrl-cannonlake.c
Normal file
442
drivers/pinctrl/intel/pinctrl-cannonlake.c
Normal file
|
|
@ -0,0 +1,442 @@
|
|||
/*
|
||||
* Intel Cannon Lake PCH pinctrl/GPIO driver
|
||||
*
|
||||
* Copyright (C) 2017, Intel Corporation
|
||||
* Author: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
#include "pinctrl-intel.h"
|
||||
|
||||
#define CNL_PAD_OWN 0x020
|
||||
#define CNL_PADCFGLOCK 0x080
|
||||
#define CNL_HOSTSW_OWN 0x0b0
|
||||
#define CNL_GPI_IE 0x120
|
||||
|
||||
#define CNL_GPP(r, s, e) \
|
||||
{ \
|
||||
.reg_num = (r), \
|
||||
.base = (s), \
|
||||
.size = ((e) - (s) + 1), \
|
||||
}
|
||||
|
||||
#define CNL_COMMUNITY(b, s, e, g) \
|
||||
{ \
|
||||
.barno = (b), \
|
||||
.padown_offset = CNL_PAD_OWN, \
|
||||
.padcfglock_offset = CNL_PADCFGLOCK, \
|
||||
.hostown_offset = CNL_HOSTSW_OWN, \
|
||||
.ie_offset = CNL_GPI_IE, \
|
||||
.pin_base = (s), \
|
||||
.npins = ((e) - (s) + 1), \
|
||||
.gpps = (g), \
|
||||
.ngpps = ARRAY_SIZE(g), \
|
||||
}
|
||||
|
||||
/* Cannon Lake-LP */
|
||||
static const struct pinctrl_pin_desc cnllp_pins[] = {
|
||||
/* GPP_A */
|
||||
PINCTRL_PIN(0, "RCINB"),
|
||||
PINCTRL_PIN(1, "LAD_0"),
|
||||
PINCTRL_PIN(2, "LAD_1"),
|
||||
PINCTRL_PIN(3, "LAD_2"),
|
||||
PINCTRL_PIN(4, "LAD_3"),
|
||||
PINCTRL_PIN(5, "LFRAMEB"),
|
||||
PINCTRL_PIN(6, "SERIRQ"),
|
||||
PINCTRL_PIN(7, "PIRQAB"),
|
||||
PINCTRL_PIN(8, "CLKRUNB"),
|
||||
PINCTRL_PIN(9, "CLKOUT_LPC_0"),
|
||||
PINCTRL_PIN(10, "CLKOUT_LPC_1"),
|
||||
PINCTRL_PIN(11, "PMEB"),
|
||||
PINCTRL_PIN(12, "BM_BUSYB"),
|
||||
PINCTRL_PIN(13, "SUSWARNB_SUSPWRDNACK"),
|
||||
PINCTRL_PIN(14, "SUS_STATB"),
|
||||
PINCTRL_PIN(15, "SUSACKB"),
|
||||
PINCTRL_PIN(16, "SD_1P8_SEL"),
|
||||
PINCTRL_PIN(17, "SD_PWR_EN_B"),
|
||||
PINCTRL_PIN(18, "ISH_GP_0"),
|
||||
PINCTRL_PIN(19, "ISH_GP_1"),
|
||||
PINCTRL_PIN(20, "ISH_GP_2"),
|
||||
PINCTRL_PIN(21, "ISH_GP_3"),
|
||||
PINCTRL_PIN(22, "ISH_GP_4"),
|
||||
PINCTRL_PIN(23, "ISH_GP_5"),
|
||||
PINCTRL_PIN(24, "ESPI_CLK_LOOPBK"),
|
||||
/* GPP_B */
|
||||
PINCTRL_PIN(25, "CORE_VID_0"),
|
||||
PINCTRL_PIN(26, "CORE_VID_1"),
|
||||
PINCTRL_PIN(27, "VRALERTB"),
|
||||
PINCTRL_PIN(28, "CPU_GP_2"),
|
||||
PINCTRL_PIN(29, "CPU_GP_3"),
|
||||
PINCTRL_PIN(30, "SRCCLKREQB_0"),
|
||||
PINCTRL_PIN(31, "SRCCLKREQB_1"),
|
||||
PINCTRL_PIN(32, "SRCCLKREQB_2"),
|
||||
PINCTRL_PIN(33, "SRCCLKREQB_3"),
|
||||
PINCTRL_PIN(34, "SRCCLKREQB_4"),
|
||||
PINCTRL_PIN(35, "SRCCLKREQB_5"),
|
||||
PINCTRL_PIN(36, "EXT_PWR_GATEB"),
|
||||
PINCTRL_PIN(37, "SLP_S0B"),
|
||||
PINCTRL_PIN(38, "PLTRSTB"),
|
||||
PINCTRL_PIN(39, "SPKR"),
|
||||
PINCTRL_PIN(40, "GSPI0_CS0B"),
|
||||
PINCTRL_PIN(41, "GSPI0_CLK"),
|
||||
PINCTRL_PIN(42, "GSPI0_MISO"),
|
||||
PINCTRL_PIN(43, "GSPI0_MOSI"),
|
||||
PINCTRL_PIN(44, "GSPI1_CS0B"),
|
||||
PINCTRL_PIN(45, "GSPI1_CLK"),
|
||||
PINCTRL_PIN(46, "GSPI1_MISO"),
|
||||
PINCTRL_PIN(47, "GSPI1_MOSI"),
|
||||
PINCTRL_PIN(48, "SML1ALERTB"),
|
||||
PINCTRL_PIN(49, "GSPI0_CLK_LOOPBK"),
|
||||
PINCTRL_PIN(50, "GSPI1_CLK_LOOPBK"),
|
||||
/* GPP_G */
|
||||
PINCTRL_PIN(51, "SD3_CMD"),
|
||||
PINCTRL_PIN(52, "SD3_D0_SD4_RCLK_P"),
|
||||
PINCTRL_PIN(53, "SD3_D1_SD4_RCLK_N"),
|
||||
PINCTRL_PIN(54, "SD3_D2"),
|
||||
PINCTRL_PIN(55, "SD3_D3"),
|
||||
PINCTRL_PIN(56, "SD3_CDB"),
|
||||
PINCTRL_PIN(57, "SD3_CLK"),
|
||||
PINCTRL_PIN(58, "SD3_WP"),
|
||||
/* SPI */
|
||||
PINCTRL_PIN(59, "SPI0_IO_2"),
|
||||
PINCTRL_PIN(60, "SPI0_IO_3"),
|
||||
PINCTRL_PIN(61, "SPI0_MOSI_IO_0"),
|
||||
PINCTRL_PIN(62, "SPI0_MISO_IO_1"),
|
||||
PINCTRL_PIN(63, "SPI0_TPM_CSB"),
|
||||
PINCTRL_PIN(64, "SPI0_FLASH_0_CSB"),
|
||||
PINCTRL_PIN(65, "SPI0_FLASH_1_CSB"),
|
||||
PINCTRL_PIN(66, "SPI0_CLK"),
|
||||
PINCTRL_PIN(67, "SPI0_CLK_LOOPBK"),
|
||||
/* GPP_D */
|
||||
PINCTRL_PIN(68, "SPI1_CSB"),
|
||||
PINCTRL_PIN(69, "SPI1_CLK"),
|
||||
PINCTRL_PIN(70, "SPI1_MISO_IO_1"),
|
||||
PINCTRL_PIN(71, "SPI1_MOSI_IO_0"),
|
||||
PINCTRL_PIN(72, "IMGCLKOUT_0"),
|
||||
PINCTRL_PIN(73, "ISH_I2C0_SDA"),
|
||||
PINCTRL_PIN(74, "ISH_I2C0_SCL"),
|
||||
PINCTRL_PIN(75, "ISH_I2C1_SDA"),
|
||||
PINCTRL_PIN(76, "ISH_I2C1_SCL"),
|
||||
PINCTRL_PIN(77, "ISH_SPI_CSB"),
|
||||
PINCTRL_PIN(78, "ISH_SPI_CLK"),
|
||||
PINCTRL_PIN(79, "ISH_SPI_MISO"),
|
||||
PINCTRL_PIN(80, "ISH_SPI_MOSI"),
|
||||
PINCTRL_PIN(81, "ISH_UART0_RXD"),
|
||||
PINCTRL_PIN(82, "ISH_UART0_TXD"),
|
||||
PINCTRL_PIN(83, "ISH_UART0_RTSB"),
|
||||
PINCTRL_PIN(84, "ISH_UART0_CTSB"),
|
||||
PINCTRL_PIN(85, "DMIC_CLK_1"),
|
||||
PINCTRL_PIN(86, "DMIC_DATA_1"),
|
||||
PINCTRL_PIN(87, "DMIC_CLK_0"),
|
||||
PINCTRL_PIN(88, "DMIC_DATA_0"),
|
||||
PINCTRL_PIN(89, "SPI1_IO_2"),
|
||||
PINCTRL_PIN(90, "SPI1_IO_3"),
|
||||
PINCTRL_PIN(91, "SSP_MCLK"),
|
||||
PINCTRL_PIN(92, "GSPI2_CLK_LOOPBK"),
|
||||
/* GPP_F */
|
||||
PINCTRL_PIN(93, "CNV_GNSS_PA_BLANKING"),
|
||||
PINCTRL_PIN(94, "CNV_GNSS_FTA"),
|
||||
PINCTRL_PIN(95, "CNV_GNSS_SYSCK"),
|
||||
PINCTRL_PIN(96, "EMMC_HIP_MON"),
|
||||
PINCTRL_PIN(97, "CNV_BRI_DT"),
|
||||
PINCTRL_PIN(98, "CNV_BRI_RSP"),
|
||||
PINCTRL_PIN(99, "CNV_RGI_DT"),
|
||||
PINCTRL_PIN(100, "CNV_RGI_RSP"),
|
||||
PINCTRL_PIN(101, "CNV_MFUART2_RXD"),
|
||||
PINCTRL_PIN(102, "CNV_MFUART2_TXD"),
|
||||
PINCTRL_PIN(103, "GPP_F_10"),
|
||||
PINCTRL_PIN(104, "EMMC_CMD"),
|
||||
PINCTRL_PIN(105, "EMMC_DATA_0"),
|
||||
PINCTRL_PIN(106, "EMMC_DATA_1"),
|
||||
PINCTRL_PIN(107, "EMMC_DATA_2"),
|
||||
PINCTRL_PIN(108, "EMMC_DATA_3"),
|
||||
PINCTRL_PIN(109, "EMMC_DATA_4"),
|
||||
PINCTRL_PIN(110, "EMMC_DATA_5"),
|
||||
PINCTRL_PIN(111, "EMMC_DATA_6"),
|
||||
PINCTRL_PIN(112, "EMMC_DATA_7"),
|
||||
PINCTRL_PIN(113, "EMMC_RCLK"),
|
||||
PINCTRL_PIN(114, "EMMC_CLK"),
|
||||
PINCTRL_PIN(115, "EMMC_RESETB"),
|
||||
PINCTRL_PIN(116, "A4WP_PRESENT"),
|
||||
/* GPP_H */
|
||||
PINCTRL_PIN(117, "SSP2_SCLK"),
|
||||
PINCTRL_PIN(118, "SSP2_SFRM"),
|
||||
PINCTRL_PIN(119, "SSP2_TXD"),
|
||||
PINCTRL_PIN(120, "SSP2_RXD"),
|
||||
PINCTRL_PIN(121, "I2C2_SDA"),
|
||||
PINCTRL_PIN(122, "I2C2_SCL"),
|
||||
PINCTRL_PIN(123, "I2C3_SDA"),
|
||||
PINCTRL_PIN(124, "I2C3_SCL"),
|
||||
PINCTRL_PIN(125, "I2C4_SDA"),
|
||||
PINCTRL_PIN(126, "I2C4_SCL"),
|
||||
PINCTRL_PIN(127, "I2C5_SDA"),
|
||||
PINCTRL_PIN(128, "I2C5_SCL"),
|
||||
PINCTRL_PIN(129, "M2_SKT2_CFG_0"),
|
||||
PINCTRL_PIN(130, "M2_SKT2_CFG_1"),
|
||||
PINCTRL_PIN(131, "M2_SKT2_CFG_2"),
|
||||
PINCTRL_PIN(132, "M2_SKT2_CFG_3"),
|
||||
PINCTRL_PIN(133, "DDPF_CTRLCLK"),
|
||||
PINCTRL_PIN(134, "DDPF_CTRLDATA"),
|
||||
PINCTRL_PIN(135, "CPU_VCCIO_PWR_GATEB"),
|
||||
PINCTRL_PIN(136, "TIMESYNC_0"),
|
||||
PINCTRL_PIN(137, "IMGCLKOUT_1"),
|
||||
PINCTRL_PIN(138, "GPPC_H_21"),
|
||||
PINCTRL_PIN(139, "GPPC_H_22"),
|
||||
PINCTRL_PIN(140, "GPPC_H_23"),
|
||||
/* vGPIO */
|
||||
PINCTRL_PIN(141, "CNV_BTEN"),
|
||||
PINCTRL_PIN(142, "CNV_GNEN"),
|
||||
PINCTRL_PIN(143, "CNV_WFEN"),
|
||||
PINCTRL_PIN(144, "CNV_WCEN"),
|
||||
PINCTRL_PIN(145, "CNV_BT_HOST_WAKEB"),
|
||||
PINCTRL_PIN(146, "CNV_BT_IF_SELECT"),
|
||||
PINCTRL_PIN(147, "vCNV_BT_UART_TXD"),
|
||||
PINCTRL_PIN(148, "vCNV_BT_UART_RXD"),
|
||||
PINCTRL_PIN(149, "vCNV_BT_UART_CTS_B"),
|
||||
PINCTRL_PIN(150, "vCNV_BT_UART_RTS_B"),
|
||||
PINCTRL_PIN(151, "vCNV_MFUART1_TXD"),
|
||||
PINCTRL_PIN(152, "vCNV_MFUART1_RXD"),
|
||||
PINCTRL_PIN(153, "vCNV_MFUART1_CTS_B"),
|
||||
PINCTRL_PIN(154, "vCNV_MFUART1_RTS_B"),
|
||||
PINCTRL_PIN(155, "vCNV_GNSS_UART_TXD"),
|
||||
PINCTRL_PIN(156, "vCNV_GNSS_UART_RXD"),
|
||||
PINCTRL_PIN(157, "vCNV_GNSS_UART_CTS_B"),
|
||||
PINCTRL_PIN(158, "vCNV_GNSS_UART_RTS_B"),
|
||||
PINCTRL_PIN(159, "vUART0_TXD"),
|
||||
PINCTRL_PIN(160, "vUART0_RXD"),
|
||||
PINCTRL_PIN(161, "vUART0_CTS_B"),
|
||||
PINCTRL_PIN(162, "vUART0_RTS_B"),
|
||||
PINCTRL_PIN(163, "vISH_UART0_TXD"),
|
||||
PINCTRL_PIN(164, "vISH_UART0_RXD"),
|
||||
PINCTRL_PIN(165, "vISH_UART0_CTS_B"),
|
||||
PINCTRL_PIN(166, "vISH_UART0_RTS_B"),
|
||||
PINCTRL_PIN(167, "vISH_UART1_TXD"),
|
||||
PINCTRL_PIN(168, "vISH_UART1_RXD"),
|
||||
PINCTRL_PIN(169, "vISH_UART1_CTS_B"),
|
||||
PINCTRL_PIN(170, "vISH_UART1_RTS_B"),
|
||||
PINCTRL_PIN(171, "vCNV_BT_I2S_BCLK"),
|
||||
PINCTRL_PIN(172, "vCNV_BT_I2S_WS_SYNC"),
|
||||
PINCTRL_PIN(173, "vCNV_BT_I2S_SDO"),
|
||||
PINCTRL_PIN(174, "vCNV_BT_I2S_SDI"),
|
||||
PINCTRL_PIN(175, "vSSP2_SCLK"),
|
||||
PINCTRL_PIN(176, "vSSP2_SFRM"),
|
||||
PINCTRL_PIN(177, "vSSP2_TXD"),
|
||||
PINCTRL_PIN(178, "vSSP2_RXD"),
|
||||
PINCTRL_PIN(179, "vCNV_GNSS_HOST_WAKEB"),
|
||||
PINCTRL_PIN(180, "vSD3_CD_B"),
|
||||
/* GPP_C */
|
||||
PINCTRL_PIN(181, "SMBCLK"),
|
||||
PINCTRL_PIN(182, "SMBDATA"),
|
||||
PINCTRL_PIN(183, "SMBALERTB"),
|
||||
PINCTRL_PIN(184, "SML0CLK"),
|
||||
PINCTRL_PIN(185, "SML0DATA"),
|
||||
PINCTRL_PIN(186, "SML0ALERTB"),
|
||||
PINCTRL_PIN(187, "SML1CLK"),
|
||||
PINCTRL_PIN(188, "SML1DATA"),
|
||||
PINCTRL_PIN(189, "UART0_RXD"),
|
||||
PINCTRL_PIN(190, "UART0_TXD"),
|
||||
PINCTRL_PIN(191, "UART0_RTSB"),
|
||||
PINCTRL_PIN(192, "UART0_CTSB"),
|
||||
PINCTRL_PIN(193, "UART1_RXD"),
|
||||
PINCTRL_PIN(194, "UART1_TXD"),
|
||||
PINCTRL_PIN(195, "UART1_RTSB"),
|
||||
PINCTRL_PIN(196, "UART1_CTSB"),
|
||||
PINCTRL_PIN(197, "I2C0_SDA"),
|
||||
PINCTRL_PIN(198, "I2C0_SCL"),
|
||||
PINCTRL_PIN(199, "I2C1_SDA"),
|
||||
PINCTRL_PIN(200, "I2C1_SCL"),
|
||||
PINCTRL_PIN(201, "UART2_RXD"),
|
||||
PINCTRL_PIN(202, "UART2_TXD"),
|
||||
PINCTRL_PIN(203, "UART2_RTSB"),
|
||||
PINCTRL_PIN(204, "UART2_CTSB"),
|
||||
/* GPP_E */
|
||||
PINCTRL_PIN(205, "SATAXPCIE_0"),
|
||||
PINCTRL_PIN(206, "SATAXPCIE_1"),
|
||||
PINCTRL_PIN(207, "SATAXPCIE_2"),
|
||||
PINCTRL_PIN(208, "CPU_GP_0"),
|
||||
PINCTRL_PIN(209, "SATA_DEVSLP_0"),
|
||||
PINCTRL_PIN(210, "SATA_DEVSLP_1"),
|
||||
PINCTRL_PIN(211, "SATA_DEVSLP_2"),
|
||||
PINCTRL_PIN(212, "CPU_GP_1"),
|
||||
PINCTRL_PIN(213, "SATA_LEDB"),
|
||||
PINCTRL_PIN(214, "USB2_OCB_0"),
|
||||
PINCTRL_PIN(215, "USB2_OCB_1"),
|
||||
PINCTRL_PIN(216, "USB2_OCB_2"),
|
||||
PINCTRL_PIN(217, "USB2_OCB_3"),
|
||||
PINCTRL_PIN(218, "DDSP_HPD_0"),
|
||||
PINCTRL_PIN(219, "DDSP_HPD_1"),
|
||||
PINCTRL_PIN(220, "DDSP_HPD_2"),
|
||||
PINCTRL_PIN(221, "DDSP_HPD_3"),
|
||||
PINCTRL_PIN(222, "EDP_HPD"),
|
||||
PINCTRL_PIN(223, "DDPB_CTRLCLK"),
|
||||
PINCTRL_PIN(224, "DDPB_CTRLDATA"),
|
||||
PINCTRL_PIN(225, "DDPC_CTRLCLK"),
|
||||
PINCTRL_PIN(226, "DDPC_CTRLDATA"),
|
||||
PINCTRL_PIN(227, "DDPD_CTRLCLK"),
|
||||
PINCTRL_PIN(228, "DDPD_CTRLDATA"),
|
||||
/* JTAG */
|
||||
PINCTRL_PIN(229, "JTAG_TDO"),
|
||||
PINCTRL_PIN(230, "JTAGX"),
|
||||
PINCTRL_PIN(231, "PRDYB"),
|
||||
PINCTRL_PIN(232, "PREQB"),
|
||||
PINCTRL_PIN(233, "CPU_TRSTB"),
|
||||
PINCTRL_PIN(234, "JTAG_TDI"),
|
||||
PINCTRL_PIN(235, "JTAG_TMS"),
|
||||
PINCTRL_PIN(236, "JTAG_TCK"),
|
||||
PINCTRL_PIN(237, "ITP_PMODE"),
|
||||
/* HVCMOS */
|
||||
PINCTRL_PIN(238, "L_BKLTEN"),
|
||||
PINCTRL_PIN(239, "L_BKLTCTL"),
|
||||
PINCTRL_PIN(240, "L_VDDEN"),
|
||||
PINCTRL_PIN(241, "SYS_PWROK"),
|
||||
PINCTRL_PIN(242, "SYS_RESETB"),
|
||||
PINCTRL_PIN(243, "MLK_RSTB"),
|
||||
};
|
||||
|
||||
static const unsigned int cnllp_spi0_pins[] = { 40, 41, 42, 43, 7 };
|
||||
static const unsigned int cnllp_spi0_modes[] = { 1, 1, 1, 1, 2 };
|
||||
static const unsigned int cnllp_spi1_pins[] = { 44, 45, 46, 47, 11 };
|
||||
static const unsigned int cnllp_spi1_modes[] = { 1, 1, 1, 1, 2 };
|
||||
static const unsigned int cnllp_spi2_pins[] = { 77, 78, 79, 80, 83 };
|
||||
static const unsigned int cnllp_spi2_modes[] = { 3, 3, 3, 3, 2 };
|
||||
|
||||
static const unsigned int cnllp_i2c0_pins[] = { 197, 198 };
|
||||
static const unsigned int cnllp_i2c1_pins[] = { 199, 200 };
|
||||
static const unsigned int cnllp_i2c2_pins[] = { 121, 122 };
|
||||
static const unsigned int cnllp_i2c3_pins[] = { 123, 124 };
|
||||
static const unsigned int cnllp_i2c4_pins[] = { 125, 126 };
|
||||
static const unsigned int cnllp_i2c5_pins[] = { 127, 128 };
|
||||
|
||||
static const unsigned int cnllp_uart0_pins[] = { 189, 190, 191, 192 };
|
||||
static const unsigned int cnllp_uart1_pins[] = { 193, 194, 195, 196 };
|
||||
static const unsigned int cnllp_uart2_pins[] = { 201, 202, 203, 204 };
|
||||
|
||||
static const struct intel_pingroup cnllp_groups[] = {
|
||||
PIN_GROUP("spi0_grp", cnllp_spi0_pins, cnllp_spi0_modes),
|
||||
PIN_GROUP("spi1_grp", cnllp_spi1_pins, cnllp_spi1_modes),
|
||||
PIN_GROUP("spi2_grp", cnllp_spi2_pins, cnllp_spi2_modes),
|
||||
PIN_GROUP("i2c0_grp", cnllp_i2c0_pins, 1),
|
||||
PIN_GROUP("i2c1_grp", cnllp_i2c1_pins, 1),
|
||||
PIN_GROUP("i2c2_grp", cnllp_i2c2_pins, 1),
|
||||
PIN_GROUP("i2c3_grp", cnllp_i2c3_pins, 1),
|
||||
PIN_GROUP("i2c4_grp", cnllp_i2c4_pins, 1),
|
||||
PIN_GROUP("i2c5_grp", cnllp_i2c5_pins, 1),
|
||||
PIN_GROUP("uart0_grp", cnllp_uart0_pins, 1),
|
||||
PIN_GROUP("uart1_grp", cnllp_uart1_pins, 1),
|
||||
PIN_GROUP("uart2_grp", cnllp_uart2_pins, 1),
|
||||
};
|
||||
|
||||
static const char * const cnllp_spi0_groups[] = { "spi0_grp" };
|
||||
static const char * const cnllp_spi1_groups[] = { "spi1_grp" };
|
||||
static const char * const cnllp_spi2_groups[] = { "spi2_grp" };
|
||||
static const char * const cnllp_i2c0_groups[] = { "i2c0_grp" };
|
||||
static const char * const cnllp_i2c1_groups[] = { "i2c1_grp" };
|
||||
static const char * const cnllp_i2c2_groups[] = { "i2c2_grp" };
|
||||
static const char * const cnllp_i2c3_groups[] = { "i2c3_grp" };
|
||||
static const char * const cnllp_i2c4_groups[] = { "i2c4_grp" };
|
||||
static const char * const cnllp_i2c5_groups[] = { "i2c5_grp" };
|
||||
static const char * const cnllp_uart0_groups[] = { "uart0_grp" };
|
||||
static const char * const cnllp_uart1_groups[] = { "uart1_grp" };
|
||||
static const char * const cnllp_uart2_groups[] = { "uart2_grp" };
|
||||
|
||||
static const struct intel_function cnllp_functions[] = {
|
||||
FUNCTION("spi0", cnllp_spi0_groups),
|
||||
FUNCTION("spi1", cnllp_spi1_groups),
|
||||
FUNCTION("spi2", cnllp_spi2_groups),
|
||||
FUNCTION("i2c0", cnllp_i2c0_groups),
|
||||
FUNCTION("i2c1", cnllp_i2c1_groups),
|
||||
FUNCTION("i2c2", cnllp_i2c2_groups),
|
||||
FUNCTION("i2c3", cnllp_i2c3_groups),
|
||||
FUNCTION("i2c4", cnllp_i2c4_groups),
|
||||
FUNCTION("i2c5", cnllp_i2c5_groups),
|
||||
FUNCTION("uart0", cnllp_uart0_groups),
|
||||
FUNCTION("uart1", cnllp_uart1_groups),
|
||||
FUNCTION("uart2", cnllp_uart2_groups),
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnllp_community0_gpps[] = {
|
||||
CNL_GPP(0, 0, 24), /* GPP_A */
|
||||
CNL_GPP(1, 25, 50), /* GPP_B */
|
||||
CNL_GPP(2, 51, 58), /* GPP_G */
|
||||
CNL_GPP(3, 59, 67), /* SPI */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnllp_community1_gpps[] = {
|
||||
CNL_GPP(0, 68, 92), /* GPP_D */
|
||||
CNL_GPP(1, 93, 116), /* GPP_F */
|
||||
CNL_GPP(2, 117, 140), /* GPP_H */
|
||||
CNL_GPP(3, 141, 172), /* vGPIO */
|
||||
CNL_GPP(4, 173, 180), /* vGPIO */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnllp_community4_gpps[] = {
|
||||
CNL_GPP(0, 181, 204), /* GPP_C */
|
||||
CNL_GPP(1, 205, 228), /* GPP_E */
|
||||
CNL_GPP(2, 229, 237), /* JTAG */
|
||||
CNL_GPP(3, 238, 243), /* HVCMOS */
|
||||
};
|
||||
|
||||
static const struct intel_community cnllp_communities[] = {
|
||||
CNL_COMMUNITY(0, 0, 67, cnllp_community0_gpps),
|
||||
CNL_COMMUNITY(1, 68, 180, cnllp_community1_gpps),
|
||||
CNL_COMMUNITY(2, 181, 243, cnllp_community4_gpps),
|
||||
};
|
||||
|
||||
static const struct intel_pinctrl_soc_data cnllp_soc_data = {
|
||||
.pins = cnllp_pins,
|
||||
.npins = ARRAY_SIZE(cnllp_pins),
|
||||
.groups = cnllp_groups,
|
||||
.ngroups = ARRAY_SIZE(cnllp_groups),
|
||||
.functions = cnllp_functions,
|
||||
.nfunctions = ARRAY_SIZE(cnllp_functions),
|
||||
.communities = cnllp_communities,
|
||||
.ncommunities = ARRAY_SIZE(cnllp_communities),
|
||||
};
|
||||
|
||||
static const struct acpi_device_id cnl_pinctrl_acpi_match[] = {
|
||||
{ "INT34BB", (kernel_ulong_t)&cnllp_soc_data },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, cnl_pinctrl_acpi_match);
|
||||
|
||||
static int cnl_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct intel_pinctrl_soc_data *soc_data;
|
||||
const struct acpi_device_id *id;
|
||||
|
||||
id = acpi_match_device(cnl_pinctrl_acpi_match, &pdev->dev);
|
||||
if (!id || !id->driver_data)
|
||||
return -ENODEV;
|
||||
|
||||
soc_data = (const struct intel_pinctrl_soc_data *)id->driver_data;
|
||||
return intel_pinctrl_probe(pdev, soc_data);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops cnl_pinctrl_pm_ops = {
|
||||
SET_LATE_SYSTEM_SLEEP_PM_OPS(intel_pinctrl_suspend,
|
||||
intel_pinctrl_resume)
|
||||
};
|
||||
|
||||
static struct platform_driver cnl_pinctrl_driver = {
|
||||
.probe = cnl_pinctrl_probe,
|
||||
.driver = {
|
||||
.name = "cannonlake-pinctrl",
|
||||
.acpi_match_table = cnl_pinctrl_acpi_match,
|
||||
.pm = &cnl_pinctrl_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(cnl_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Mika Westerberg <[email protected]>");
|
||||
MODULE_DESCRIPTION("Intel Cannon Lake PCH pinctrl/GPIO driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
@ -117,6 +117,7 @@ struct intel_pinctrl {
|
|||
};
|
||||
|
||||
#define pin_to_padno(c, p) ((p) - (c)->pin_base)
|
||||
#define padgroup_offset(g, p) ((p) - (g)->base)
|
||||
|
||||
static struct intel_community *intel_get_community(struct intel_pinctrl *pctrl,
|
||||
unsigned pin)
|
||||
|
|
@ -135,6 +136,22 @@ static struct intel_community *intel_get_community(struct intel_pinctrl *pctrl,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static const struct intel_padgroup *
|
||||
intel_community_get_padgroup(const struct intel_community *community,
|
||||
unsigned pin)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < community->ngpps; i++) {
|
||||
const struct intel_padgroup *padgrp = &community->gpps[i];
|
||||
|
||||
if (pin >= padgrp->base && pin < padgrp->base + padgrp->size)
|
||||
return padgrp;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void __iomem *intel_get_padcfg(struct intel_pinctrl *pctrl, unsigned pin,
|
||||
unsigned reg)
|
||||
{
|
||||
|
|
@ -158,7 +175,8 @@ static void __iomem *intel_get_padcfg(struct intel_pinctrl *pctrl, unsigned pin,
|
|||
static bool intel_pad_owned_by_host(struct intel_pinctrl *pctrl, unsigned pin)
|
||||
{
|
||||
const struct intel_community *community;
|
||||
unsigned padno, gpp, offset, group;
|
||||
const struct intel_padgroup *padgrp;
|
||||
unsigned gpp, offset, gpp_offset;
|
||||
void __iomem *padown;
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
|
|
@ -167,19 +185,23 @@ static bool intel_pad_owned_by_host(struct intel_pinctrl *pctrl, unsigned pin)
|
|||
if (!community->padown_offset)
|
||||
return true;
|
||||
|
||||
padno = pin_to_padno(community, pin);
|
||||
group = padno / community->gpp_size;
|
||||
gpp = PADOWN_GPP(padno % community->gpp_size);
|
||||
offset = community->padown_offset + 0x10 * group + gpp * 4;
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return false;
|
||||
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
gpp = PADOWN_GPP(gpp_offset);
|
||||
offset = community->padown_offset + padgrp->padown_num * 4 + gpp * 4;
|
||||
padown = community->regs + offset;
|
||||
|
||||
return !(readl(padown) & PADOWN_MASK(padno));
|
||||
return !(readl(padown) & PADOWN_MASK(gpp_offset));
|
||||
}
|
||||
|
||||
static bool intel_pad_acpi_mode(struct intel_pinctrl *pctrl, unsigned pin)
|
||||
{
|
||||
const struct intel_community *community;
|
||||
unsigned padno, gpp, offset;
|
||||
const struct intel_padgroup *padgrp;
|
||||
unsigned offset, gpp_offset;
|
||||
void __iomem *hostown;
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
|
|
@ -188,18 +210,22 @@ static bool intel_pad_acpi_mode(struct intel_pinctrl *pctrl, unsigned pin)
|
|||
if (!community->hostown_offset)
|
||||
return false;
|
||||
|
||||
padno = pin_to_padno(community, pin);
|
||||
gpp = padno / community->gpp_size;
|
||||
offset = community->hostown_offset + gpp * 4;
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return true;
|
||||
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
offset = community->hostown_offset + padgrp->reg_num * 4;
|
||||
hostown = community->regs + offset;
|
||||
|
||||
return !(readl(hostown) & BIT(padno % community->gpp_size));
|
||||
return !(readl(hostown) & BIT(gpp_offset));
|
||||
}
|
||||
|
||||
static bool intel_pad_locked(struct intel_pinctrl *pctrl, unsigned pin)
|
||||
{
|
||||
struct intel_community *community;
|
||||
unsigned padno, gpp, offset;
|
||||
const struct intel_padgroup *padgrp;
|
||||
unsigned offset, gpp_offset;
|
||||
u32 value;
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
|
|
@ -208,22 +234,25 @@ static bool intel_pad_locked(struct intel_pinctrl *pctrl, unsigned pin)
|
|||
if (!community->padcfglock_offset)
|
||||
return false;
|
||||
|
||||
padno = pin_to_padno(community, pin);
|
||||
gpp = padno / community->gpp_size;
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return true;
|
||||
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
|
||||
/*
|
||||
* If PADCFGLOCK and PADCFGLOCKTX bits are both clear for this pad,
|
||||
* the pad is considered unlocked. Any other case means that it is
|
||||
* either fully or partially locked and we don't touch it.
|
||||
*/
|
||||
offset = community->padcfglock_offset + gpp * 8;
|
||||
offset = community->padcfglock_offset + padgrp->reg_num * 8;
|
||||
value = readl(community->regs + offset);
|
||||
if (value & BIT(pin % community->gpp_size))
|
||||
if (value & BIT(gpp_offset))
|
||||
return true;
|
||||
|
||||
offset = community->padcfglock_offset + 4 + gpp * 8;
|
||||
offset = community->padcfglock_offset + 4 + padgrp->reg_num * 8;
|
||||
value = readl(community->regs + offset);
|
||||
if (value & BIT(pin % community->gpp_size))
|
||||
if (value & BIT(gpp_offset))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
|
@ -369,7 +398,11 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function,
|
|||
value = readl(padcfg0);
|
||||
|
||||
value &= ~PADCFG0_PMODE_MASK;
|
||||
value |= grp->mode << PADCFG0_PMODE_SHIFT;
|
||||
|
||||
if (grp->modes)
|
||||
value |= grp->modes[i] << PADCFG0_PMODE_SHIFT;
|
||||
else
|
||||
value |= grp->mode << PADCFG0_PMODE_SHIFT;
|
||||
|
||||
writel(value, padcfg0);
|
||||
}
|
||||
|
|
@ -777,18 +810,22 @@ static void intel_gpio_irq_ack(struct irq_data *d)
|
|||
const struct intel_community *community;
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
|
||||
raw_spin_lock(&pctrl->lock);
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
if (community) {
|
||||
unsigned padno = pin_to_padno(community, pin);
|
||||
unsigned gpp_offset = padno % community->gpp_size;
|
||||
unsigned gpp = padno / community->gpp_size;
|
||||
const struct intel_padgroup *padgrp;
|
||||
unsigned gpp, gpp_offset;
|
||||
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return;
|
||||
|
||||
gpp = padgrp->reg_num;
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
|
||||
raw_spin_lock(&pctrl->lock);
|
||||
writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
|
||||
raw_spin_unlock(&pctrl->lock);
|
||||
}
|
||||
|
||||
raw_spin_unlock(&pctrl->lock);
|
||||
}
|
||||
|
||||
static void intel_gpio_irq_enable(struct irq_data *d)
|
||||
|
|
@ -797,27 +834,30 @@ static void intel_gpio_irq_enable(struct irq_data *d)
|
|||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
const struct intel_community *community;
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
if (community) {
|
||||
unsigned padno = pin_to_padno(community, pin);
|
||||
unsigned gpp_size = community->gpp_size;
|
||||
unsigned gpp_offset = padno % gpp_size;
|
||||
unsigned gpp = padno / gpp_size;
|
||||
const struct intel_padgroup *padgrp;
|
||||
unsigned gpp, gpp_offset;
|
||||
unsigned long flags;
|
||||
u32 value;
|
||||
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return;
|
||||
|
||||
gpp = padgrp->reg_num;
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
|
||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
/* Clear interrupt status first to avoid unexpected interrupt */
|
||||
writel(BIT(gpp_offset), community->regs + GPI_IS + gpp * 4);
|
||||
|
||||
value = readl(community->regs + community->ie_offset + gpp * 4);
|
||||
value |= BIT(gpp_offset);
|
||||
writel(value, community->regs + community->ie_offset + gpp * 4);
|
||||
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
|
||||
}
|
||||
|
||||
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
|
||||
}
|
||||
|
||||
static void intel_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
|
||||
|
|
@ -826,28 +866,33 @@ static void intel_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
|
|||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
const struct intel_community *community;
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
if (community) {
|
||||
unsigned padno = pin_to_padno(community, pin);
|
||||
unsigned gpp_offset = padno % community->gpp_size;
|
||||
unsigned gpp = padno / community->gpp_size;
|
||||
const struct intel_padgroup *padgrp;
|
||||
unsigned gpp, gpp_offset;
|
||||
unsigned long flags;
|
||||
void __iomem *reg;
|
||||
u32 value;
|
||||
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return;
|
||||
|
||||
gpp = padgrp->reg_num;
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
|
||||
reg = community->regs + community->ie_offset + gpp * 4;
|
||||
|
||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
value = readl(reg);
|
||||
if (mask)
|
||||
value &= ~BIT(gpp_offset);
|
||||
else
|
||||
value |= BIT(gpp_offset);
|
||||
writel(value, reg);
|
||||
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
|
||||
}
|
||||
|
||||
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
|
||||
}
|
||||
|
||||
static void intel_gpio_irq_mask(struct irq_data *d)
|
||||
|
|
@ -938,23 +983,20 @@ static irqreturn_t intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
|
|||
int gpp;
|
||||
|
||||
for (gpp = 0; gpp < community->ngpps; gpp++) {
|
||||
const struct intel_padgroup *padgrp = &community->gpps[gpp];
|
||||
unsigned long pending, enabled, gpp_offset;
|
||||
|
||||
pending = readl(community->regs + GPI_IS + gpp * 4);
|
||||
pending = readl(community->regs + GPI_IS + padgrp->reg_num * 4);
|
||||
enabled = readl(community->regs + community->ie_offset +
|
||||
gpp * 4);
|
||||
padgrp->reg_num * 4);
|
||||
|
||||
/* Only interrupts that are enabled */
|
||||
pending &= enabled;
|
||||
|
||||
for_each_set_bit(gpp_offset, &pending, community->gpp_size) {
|
||||
for_each_set_bit(gpp_offset, &pending, padgrp->size) {
|
||||
unsigned padno, irq;
|
||||
|
||||
/*
|
||||
* The last group in community can have less pins
|
||||
* than NPADS_IN_GPP.
|
||||
*/
|
||||
padno = gpp_offset + gpp * community->gpp_size;
|
||||
padno = padgrp->base - community->pin_base + gpp_offset;
|
||||
if (padno >= community->npins)
|
||||
break;
|
||||
|
||||
|
|
@ -1045,6 +1087,56 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int intel_pinctrl_add_padgroups(struct intel_pinctrl *pctrl,
|
||||
struct intel_community *community)
|
||||
{
|
||||
struct intel_padgroup *gpps;
|
||||
unsigned npins = community->npins;
|
||||
unsigned padown_num = 0;
|
||||
size_t ngpps, i;
|
||||
|
||||
if (community->gpps)
|
||||
ngpps = community->ngpps;
|
||||
else
|
||||
ngpps = DIV_ROUND_UP(community->npins, community->gpp_size);
|
||||
|
||||
gpps = devm_kcalloc(pctrl->dev, ngpps, sizeof(*gpps), GFP_KERNEL);
|
||||
if (!gpps)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ngpps; i++) {
|
||||
if (community->gpps) {
|
||||
gpps[i] = community->gpps[i];
|
||||
} else {
|
||||
unsigned gpp_size = community->gpp_size;
|
||||
|
||||
gpps[i].reg_num = i;
|
||||
gpps[i].base = community->pin_base + i * gpp_size;
|
||||
gpps[i].size = min(gpp_size, npins);
|
||||
npins -= gpps[i].size;
|
||||
}
|
||||
|
||||
if (gpps[i].size > 32)
|
||||
return -EINVAL;
|
||||
|
||||
gpps[i].padown_num = padown_num;
|
||||
|
||||
/*
|
||||
* In older hardware the number of padown registers per
|
||||
* group is fixed regardless of the group size.
|
||||
*/
|
||||
if (community->gpp_num_padown_regs)
|
||||
padown_num += community->gpp_num_padown_regs;
|
||||
else
|
||||
padown_num += DIV_ROUND_UP(gpps[i].size * 4, 32);
|
||||
}
|
||||
|
||||
community->ngpps = ngpps;
|
||||
community->gpps = gpps;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_pinctrl_pm_init(struct intel_pinctrl *pctrl)
|
||||
{
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
|
@ -1142,8 +1234,10 @@ int intel_pinctrl_probe(struct platform_device *pdev,
|
|||
|
||||
community->regs = regs;
|
||||
community->pad_regs = regs + padbar;
|
||||
community->ngpps = DIV_ROUND_UP(community->npins,
|
||||
community->gpp_size);
|
||||
|
||||
ret = intel_pinctrl_add_padgroups(pctrl, community);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
|
|
|
|||
|
|
@ -22,13 +22,16 @@ struct device;
|
|||
* @name: Name of the groups
|
||||
* @pins: All pins in this group
|
||||
* @npins: Number of pins in this groups
|
||||
* @mode: Native mode in which the group is muxed out @pins
|
||||
* @mode: Native mode in which the group is muxed out @pins. Used if @modes
|
||||
* is %NULL.
|
||||
* @modes: If not %NULL this will hold mode for each pin in @pins
|
||||
*/
|
||||
struct intel_pingroup {
|
||||
const char *name;
|
||||
const unsigned *pins;
|
||||
size_t npins;
|
||||
unsigned short mode;
|
||||
const unsigned *modes;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -43,6 +46,23 @@ struct intel_function {
|
|||
size_t ngroups;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct intel_padgroup - Hardware pad group information
|
||||
* @reg_num: GPI_IS register number
|
||||
* @base: Starting pin of this group
|
||||
* @size: Size of this group (maximum is 32).
|
||||
* @padown_num: PAD_OWN register number (assigned by the core driver)
|
||||
*
|
||||
* If pad groups of a community are not the same size, use this structure
|
||||
* to specify them.
|
||||
*/
|
||||
struct intel_padgroup {
|
||||
unsigned reg_num;
|
||||
unsigned base;
|
||||
unsigned size;
|
||||
unsigned padown_num;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct intel_community - Intel pin community description
|
||||
* @barno: MMIO BAR number where registers for this community reside
|
||||
|
|
@ -56,13 +76,22 @@ struct intel_function {
|
|||
* @ie_offset: Register offset of GPI_IE from @regs.
|
||||
* @pin_base: Starting pin of pins in this community
|
||||
* @gpp_size: Maximum number of pads in each group, such as PADCFGLOCK,
|
||||
* HOSTSW_OWN, GPI_IS, GPI_IE, etc.
|
||||
* HOSTSW_OWN, GPI_IS, GPI_IE, etc. Used when @gpps is %NULL.
|
||||
* @gpp_num_padown_regs: Number of pad registers each pad group consumes at
|
||||
* minimum. Use %0 if the number of registers can be
|
||||
* determined by the size of the group.
|
||||
* @npins: Number of pins in this community
|
||||
* @features: Additional features supported by the hardware
|
||||
* @gpps: Pad groups if the controller has variable size pad groups
|
||||
* @ngpps: Number of pad groups in this community
|
||||
* @regs: Community specific common registers (reserved for core driver)
|
||||
* @pad_regs: Community specific pad registers (reserved for core driver)
|
||||
* @ngpps: Number of groups (hw groups) in this community (reserved for
|
||||
* core driver)
|
||||
*
|
||||
* Most Intel GPIO host controllers this driver supports each pad group is
|
||||
* of equal size (except the last one). In that case the driver can just
|
||||
* fill in @gpp_size field and let the core driver to handle the rest. If
|
||||
* the controller has pad groups of variable size the client driver can
|
||||
* pass custom @gpps and @ngpps instead.
|
||||
*/
|
||||
struct intel_community {
|
||||
unsigned barno;
|
||||
|
|
@ -72,23 +101,37 @@ struct intel_community {
|
|||
unsigned ie_offset;
|
||||
unsigned pin_base;
|
||||
unsigned gpp_size;
|
||||
unsigned gpp_num_padown_regs;
|
||||
size_t npins;
|
||||
unsigned features;
|
||||
const struct intel_padgroup *gpps;
|
||||
size_t ngpps;
|
||||
/* Reserved for the core driver */
|
||||
void __iomem *regs;
|
||||
void __iomem *pad_regs;
|
||||
size_t ngpps;
|
||||
};
|
||||
|
||||
/* Additional features supported by the hardware */
|
||||
#define PINCTRL_FEATURE_DEBOUNCE BIT(0)
|
||||
#define PINCTRL_FEATURE_1K_PD BIT(1)
|
||||
|
||||
#define PIN_GROUP(n, p, m) \
|
||||
{ \
|
||||
.name = (n), \
|
||||
.pins = (p), \
|
||||
.npins = ARRAY_SIZE((p)), \
|
||||
.mode = (m), \
|
||||
/**
|
||||
* PIN_GROUP - Declare a pin group
|
||||
* @n: Name of the group
|
||||
* @p: An array of pins this group consists
|
||||
* @m: Mode which the pins are put when this group is active. Can be either
|
||||
* a single integer or an array of integers in which case mode is per
|
||||
* pin.
|
||||
*/
|
||||
#define PIN_GROUP(n, p, m) \
|
||||
{ \
|
||||
.name = (n), \
|
||||
.pins = (p), \
|
||||
.npins = ARRAY_SIZE((p)), \
|
||||
.mode = __builtin_choose_expr( \
|
||||
__builtin_constant_p((m)), (m), 0), \
|
||||
.modes = __builtin_choose_expr( \
|
||||
__builtin_constant_p((m)), NULL, (m)), \
|
||||
}
|
||||
|
||||
#define FUNCTION(n, g) \
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
.hostown_offset = SPT_HOSTSW_OWN, \
|
||||
.ie_offset = SPT_GPI_IE, \
|
||||
.gpp_size = 24, \
|
||||
.gpp_num_padown_regs = 4, \
|
||||
.pin_base = (s), \
|
||||
.npins = ((e) - (s) + 1), \
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,18 +11,11 @@ config PINCTRL_MTK
|
|||
# For ARMv7 SoCs
|
||||
config PINCTRL_MT2701
|
||||
bool "Mediatek MT2701 pin control"
|
||||
depends on MACH_MT2701 || COMPILE_TEST
|
||||
depends on MACH_MT7623 || MACH_MT2701 || COMPILE_TEST
|
||||
depends on OF
|
||||
default MACH_MT2701
|
||||
select PINCTRL_MTK
|
||||
|
||||
config PINCTRL_MT7623
|
||||
bool "Mediatek MT7623 pin control"
|
||||
depends on MACH_MT7623 || COMPILE_TEST
|
||||
depends on OF
|
||||
default MACH_MT7623
|
||||
select PINCTRL_MTK_COMMON
|
||||
|
||||
config PINCTRL_MT8135
|
||||
bool "Mediatek MT8135 pin control"
|
||||
depends on MACH_MT8135 || COMPILE_TEST
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ obj-y += pinctrl-mtk-common.o
|
|||
|
||||
# SoC Drivers
|
||||
obj-$(CONFIG_PINCTRL_MT2701) += pinctrl-mt2701.o
|
||||
obj-$(CONFIG_PINCTRL_MT7623) += pinctrl-mt7623.o
|
||||
obj-$(CONFIG_PINCTRL_MT8135) += pinctrl-mt8135.o
|
||||
obj-$(CONFIG_PINCTRL_MT8127) += pinctrl-mt8127.o
|
||||
obj-$(CONFIG_PINCTRL_MT8173) += pinctrl-mt8173.o
|
||||
|
|
|
|||
|
|
@ -565,6 +565,7 @@ static int mt2701_pinctrl_probe(struct platform_device *pdev)
|
|||
|
||||
static const struct of_device_id mt2701_pctrl_match[] = {
|
||||
{ .compatible = "mediatek,mt2701-pinctrl", },
|
||||
{ .compatible = "mediatek,mt7623-pinctrl", },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mt2701_pctrl_match);
|
||||
|
|
|
|||
|
|
@ -1,379 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2016 John Crispin <john@phrozen.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/pinctrl/mt65xx.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "pinctrl-mtk-common.h"
|
||||
#include "pinctrl-mtk-mt7623.h"
|
||||
|
||||
static const struct mtk_drv_group_desc mt7623_drv_grp[] = {
|
||||
/* 0E4E8SR 4/8/12/16 */
|
||||
MTK_DRV_GRP(4, 16, 1, 2, 4),
|
||||
/* 0E2E4SR 2/4/6/8 */
|
||||
MTK_DRV_GRP(2, 8, 1, 2, 2),
|
||||
/* E8E4E2 2/4/6/8/10/12/14/16 */
|
||||
MTK_DRV_GRP(2, 16, 0, 2, 2)
|
||||
};
|
||||
|
||||
#define DRV_SEL0 0xf50
|
||||
#define DRV_SEL1 0xf60
|
||||
#define DRV_SEL2 0xf70
|
||||
#define DRV_SEL3 0xf80
|
||||
#define DRV_SEL4 0xf90
|
||||
#define DRV_SEL5 0xfa0
|
||||
#define DRV_SEL6 0xfb0
|
||||
#define DRV_SEL7 0xfe0
|
||||
#define DRV_SEL8 0xfd0
|
||||
#define DRV_SEL9 0xff0
|
||||
#define DRV_SEL10 0xf00
|
||||
|
||||
#define MSDC0_CTRL0 0xcc0
|
||||
#define MSDC0_CTRL1 0xcd0
|
||||
#define MSDC0_CTRL2 0xce0
|
||||
#define MSDC0_CTRL3 0xcf0
|
||||
#define MSDC0_CTRL4 0xd00
|
||||
#define MSDC0_CTRL5 0xd10
|
||||
#define MSDC0_CTRL6 0xd20
|
||||
#define MSDC1_CTRL0 0xd30
|
||||
#define MSDC1_CTRL1 0xd40
|
||||
#define MSDC1_CTRL2 0xd50
|
||||
#define MSDC1_CTRL3 0xd60
|
||||
#define MSDC1_CTRL4 0xd70
|
||||
#define MSDC1_CTRL5 0xd80
|
||||
#define MSDC1_CTRL6 0xd90
|
||||
|
||||
#define IES_EN0 0xb20
|
||||
#define IES_EN1 0xb30
|
||||
#define IES_EN2 0xb40
|
||||
|
||||
#define SMT_EN0 0xb50
|
||||
#define SMT_EN1 0xb60
|
||||
#define SMT_EN2 0xb70
|
||||
|
||||
static const struct mtk_pin_drv_grp mt7623_pin_drv[] = {
|
||||
MTK_PIN_DRV_GRP(0, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(1, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(2, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(3, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(4, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(5, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(6, DRV_SEL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(7, DRV_SEL0, 4, 1),
|
||||
MTK_PIN_DRV_GRP(8, DRV_SEL0, 4, 1),
|
||||
MTK_PIN_DRV_GRP(9, DRV_SEL0, 4, 1),
|
||||
MTK_PIN_DRV_GRP(10, DRV_SEL0, 8, 1),
|
||||
MTK_PIN_DRV_GRP(11, DRV_SEL0, 8, 1),
|
||||
MTK_PIN_DRV_GRP(12, DRV_SEL0, 8, 1),
|
||||
MTK_PIN_DRV_GRP(13, DRV_SEL0, 8, 1),
|
||||
MTK_PIN_DRV_GRP(14, DRV_SEL0, 12, 0),
|
||||
MTK_PIN_DRV_GRP(15, DRV_SEL0, 12, 0),
|
||||
MTK_PIN_DRV_GRP(18, DRV_SEL1, 4, 0),
|
||||
MTK_PIN_DRV_GRP(19, DRV_SEL1, 4, 0),
|
||||
MTK_PIN_DRV_GRP(20, DRV_SEL1, 4, 0),
|
||||
MTK_PIN_DRV_GRP(21, DRV_SEL1, 4, 0),
|
||||
MTK_PIN_DRV_GRP(22, DRV_SEL1, 8, 0),
|
||||
MTK_PIN_DRV_GRP(23, DRV_SEL1, 8, 0),
|
||||
MTK_PIN_DRV_GRP(24, DRV_SEL1, 8, 0),
|
||||
MTK_PIN_DRV_GRP(25, DRV_SEL1, 8, 0),
|
||||
MTK_PIN_DRV_GRP(26, DRV_SEL1, 8, 0),
|
||||
MTK_PIN_DRV_GRP(27, DRV_SEL1, 12, 0),
|
||||
MTK_PIN_DRV_GRP(28, DRV_SEL1, 12, 0),
|
||||
MTK_PIN_DRV_GRP(29, DRV_SEL1, 12, 0),
|
||||
MTK_PIN_DRV_GRP(33, DRV_SEL2, 0, 0),
|
||||
MTK_PIN_DRV_GRP(34, DRV_SEL2, 0, 0),
|
||||
MTK_PIN_DRV_GRP(35, DRV_SEL2, 0, 0),
|
||||
MTK_PIN_DRV_GRP(36, DRV_SEL2, 0, 0),
|
||||
MTK_PIN_DRV_GRP(37, DRV_SEL2, 0, 0),
|
||||
MTK_PIN_DRV_GRP(39, DRV_SEL2, 8, 1),
|
||||
MTK_PIN_DRV_GRP(40, DRV_SEL2, 8, 1),
|
||||
MTK_PIN_DRV_GRP(41, DRV_SEL2, 8, 1),
|
||||
MTK_PIN_DRV_GRP(42, DRV_SEL2, 8, 1),
|
||||
MTK_PIN_DRV_GRP(43, DRV_SEL2, 12, 0),
|
||||
MTK_PIN_DRV_GRP(44, DRV_SEL2, 12, 0),
|
||||
MTK_PIN_DRV_GRP(45, DRV_SEL2, 12, 0),
|
||||
MTK_PIN_DRV_GRP(47, DRV_SEL3, 0, 0),
|
||||
MTK_PIN_DRV_GRP(48, DRV_SEL3, 0, 0),
|
||||
MTK_PIN_DRV_GRP(49, DRV_SEL3, 4, 0),
|
||||
MTK_PIN_DRV_GRP(53, DRV_SEL3, 12, 0),
|
||||
MTK_PIN_DRV_GRP(54, DRV_SEL3, 12, 0),
|
||||
MTK_PIN_DRV_GRP(55, DRV_SEL3, 12, 0),
|
||||
MTK_PIN_DRV_GRP(56, DRV_SEL3, 12, 0),
|
||||
MTK_PIN_DRV_GRP(60, DRV_SEL4, 8, 1),
|
||||
MTK_PIN_DRV_GRP(61, DRV_SEL4, 8, 1),
|
||||
MTK_PIN_DRV_GRP(62, DRV_SEL4, 8, 1),
|
||||
MTK_PIN_DRV_GRP(63, DRV_SEL4, 12, 1),
|
||||
MTK_PIN_DRV_GRP(64, DRV_SEL4, 12, 1),
|
||||
MTK_PIN_DRV_GRP(65, DRV_SEL4, 12, 1),
|
||||
MTK_PIN_DRV_GRP(66, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(67, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(68, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(69, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(70, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(71, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(72, DRV_SEL3, 4, 0),
|
||||
MTK_PIN_DRV_GRP(73, DRV_SEL3, 4, 0),
|
||||
MTK_PIN_DRV_GRP(74, DRV_SEL3, 4, 0),
|
||||
MTK_PIN_DRV_GRP(83, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(84, DRV_SEL5, 0, 1),
|
||||
MTK_PIN_DRV_GRP(105, MSDC1_CTRL1, 0, 1),
|
||||
MTK_PIN_DRV_GRP(106, MSDC1_CTRL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(107, MSDC1_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(108, MSDC1_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(109, MSDC1_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(110, MSDC1_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(111, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(112, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(113, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(114, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(115, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(116, MSDC0_CTRL1, 0, 1),
|
||||
MTK_PIN_DRV_GRP(117, MSDC0_CTRL0, 0, 1),
|
||||
MTK_PIN_DRV_GRP(118, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(119, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(120, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(121, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(126, DRV_SEL3, 4, 0),
|
||||
MTK_PIN_DRV_GRP(199, DRV_SEL0, 4, 1),
|
||||
MTK_PIN_DRV_GRP(200, DRV_SEL8, 0, 0),
|
||||
MTK_PIN_DRV_GRP(201, DRV_SEL8, 0, 0),
|
||||
MTK_PIN_DRV_GRP(203, DRV_SEL8, 4, 0),
|
||||
MTK_PIN_DRV_GRP(204, DRV_SEL8, 4, 0),
|
||||
MTK_PIN_DRV_GRP(205, DRV_SEL8, 4, 0),
|
||||
MTK_PIN_DRV_GRP(206, DRV_SEL8, 4, 0),
|
||||
MTK_PIN_DRV_GRP(207, DRV_SEL8, 4, 0),
|
||||
MTK_PIN_DRV_GRP(208, DRV_SEL8, 8, 0),
|
||||
MTK_PIN_DRV_GRP(209, DRV_SEL8, 8, 0),
|
||||
MTK_PIN_DRV_GRP(236, DRV_SEL9, 4, 0),
|
||||
MTK_PIN_DRV_GRP(237, DRV_SEL9, 4, 0),
|
||||
MTK_PIN_DRV_GRP(238, DRV_SEL9, 4, 0),
|
||||
MTK_PIN_DRV_GRP(239, DRV_SEL9, 4, 0),
|
||||
MTK_PIN_DRV_GRP(240, DRV_SEL9, 4, 0),
|
||||
MTK_PIN_DRV_GRP(241, DRV_SEL9, 4, 0),
|
||||
MTK_PIN_DRV_GRP(242, DRV_SEL9, 8, 0),
|
||||
MTK_PIN_DRV_GRP(243, DRV_SEL9, 8, 0),
|
||||
MTK_PIN_DRV_GRP(257, MSDC0_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(261, MSDC1_CTRL2, 0, 1),
|
||||
MTK_PIN_DRV_GRP(262, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(263, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(264, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(265, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(266, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(267, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(268, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(269, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(270, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(271, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(272, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(274, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(275, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(276, DRV_SEL10, 8, 0),
|
||||
MTK_PIN_DRV_GRP(278, DRV_SEL2, 8, 1),
|
||||
};
|
||||
|
||||
static const struct mtk_pin_spec_pupd_set_samereg mt7623_spec_pupd[] = {
|
||||
MTK_PIN_PUPD_SPEC_SR(105, MSDC1_CTRL1, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(106, MSDC1_CTRL0, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(107, MSDC1_CTRL3, 0, 1, 2),
|
||||
MTK_PIN_PUPD_SPEC_SR(108, MSDC1_CTRL3, 4, 5, 6),
|
||||
MTK_PIN_PUPD_SPEC_SR(109, MSDC1_CTRL3, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(110, MSDC1_CTRL3, 12, 13, 14),
|
||||
MTK_PIN_PUPD_SPEC_SR(111, MSDC0_CTRL4, 12, 13, 14),
|
||||
MTK_PIN_PUPD_SPEC_SR(112, MSDC0_CTRL4, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(113, MSDC0_CTRL4, 4, 5, 6),
|
||||
MTK_PIN_PUPD_SPEC_SR(114, MSDC0_CTRL4, 0, 1, 2),
|
||||
MTK_PIN_PUPD_SPEC_SR(115, MSDC0_CTRL5, 0, 1, 2),
|
||||
MTK_PIN_PUPD_SPEC_SR(116, MSDC0_CTRL1, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(117, MSDC0_CTRL0, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(118, MSDC0_CTRL3, 12, 13, 14),
|
||||
MTK_PIN_PUPD_SPEC_SR(119, MSDC0_CTRL3, 8, 9, 10),
|
||||
MTK_PIN_PUPD_SPEC_SR(120, MSDC0_CTRL3, 4, 5, 6),
|
||||
MTK_PIN_PUPD_SPEC_SR(121, MSDC0_CTRL3, 0, 1, 2),
|
||||
};
|
||||
|
||||
static int mt7623_spec_pull_set(struct regmap *regmap, unsigned int pin,
|
||||
unsigned char align, bool isup, unsigned int r1r0)
|
||||
{
|
||||
return mtk_pctrl_spec_pull_set_samereg(regmap, mt7623_spec_pupd,
|
||||
ARRAY_SIZE(mt7623_spec_pupd), pin, align, isup, r1r0);
|
||||
}
|
||||
|
||||
static const struct mtk_pin_ies_smt_set mt7623_ies_set[] = {
|
||||
MTK_PIN_IES_SMT_SPEC(0, 6, IES_EN0, 0),
|
||||
MTK_PIN_IES_SMT_SPEC(7, 9, IES_EN0, 1),
|
||||
MTK_PIN_IES_SMT_SPEC(10, 13, IES_EN0, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(14, 15, IES_EN0, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(18, 21, IES_EN0, 5),
|
||||
MTK_PIN_IES_SMT_SPEC(22, 26, IES_EN0, 6),
|
||||
MTK_PIN_IES_SMT_SPEC(27, 29, IES_EN0, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(33, 37, IES_EN0, 8),
|
||||
MTK_PIN_IES_SMT_SPEC(39, 42, IES_EN0, 9),
|
||||
MTK_PIN_IES_SMT_SPEC(43, 45, IES_EN0, 10),
|
||||
MTK_PIN_IES_SMT_SPEC(47, 48, IES_EN0, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(49, 49, IES_EN0, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(53, 56, IES_EN0, 14),
|
||||
MTK_PIN_IES_SMT_SPEC(60, 62, IES_EN1, 0),
|
||||
MTK_PIN_IES_SMT_SPEC(63, 65, IES_EN1, 1),
|
||||
MTK_PIN_IES_SMT_SPEC(66, 71, IES_EN1, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(72, 74, IES_EN0, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(75, 76, IES_EN1, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(83, 84, IES_EN1, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(105, 121, MSDC1_CTRL1, 4),
|
||||
MTK_PIN_IES_SMT_SPEC(122, 125, IES_EN1, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(126, 126, IES_EN0, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(199, 201, IES_EN0, 1),
|
||||
MTK_PIN_IES_SMT_SPEC(203, 207, IES_EN2, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(208, 209, IES_EN2, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(236, 241, IES_EN2, 6),
|
||||
MTK_PIN_IES_SMT_SPEC(242, 243, IES_EN2, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(261, 261, MSDC1_CTRL2, 4),
|
||||
MTK_PIN_IES_SMT_SPEC(262, 272, IES_EN2, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(274, 276, IES_EN2, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(278, 278, IES_EN2, 13),
|
||||
};
|
||||
|
||||
static const struct mtk_pin_ies_smt_set mt7623_smt_set[] = {
|
||||
MTK_PIN_IES_SMT_SPEC(0, 6, SMT_EN0, 0),
|
||||
MTK_PIN_IES_SMT_SPEC(7, 9, SMT_EN0, 1),
|
||||
MTK_PIN_IES_SMT_SPEC(10, 13, SMT_EN0, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(14, 15, SMT_EN0, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(18, 21, SMT_EN0, 5),
|
||||
MTK_PIN_IES_SMT_SPEC(22, 26, SMT_EN0, 6),
|
||||
MTK_PIN_IES_SMT_SPEC(27, 29, SMT_EN0, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(33, 37, SMT_EN0, 8),
|
||||
MTK_PIN_IES_SMT_SPEC(39, 42, SMT_EN0, 9),
|
||||
MTK_PIN_IES_SMT_SPEC(43, 45, SMT_EN0, 10),
|
||||
MTK_PIN_IES_SMT_SPEC(47, 48, SMT_EN0, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(49, 49, SMT_EN0, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(53, 56, SMT_EN0, 14),
|
||||
MTK_PIN_IES_SMT_SPEC(60, 62, SMT_EN1, 0),
|
||||
MTK_PIN_IES_SMT_SPEC(63, 65, SMT_EN1, 1),
|
||||
MTK_PIN_IES_SMT_SPEC(66, 71, SMT_EN1, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(72, 74, SMT_EN0, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(75, 76, SMT_EN1, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(83, 84, SMT_EN1, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(105, 106, MSDC1_CTRL1, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(107, 107, MSDC1_CTRL3, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(108, 108, MSDC1_CTRL3, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(109, 109, MSDC1_CTRL3, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(110, 111, MSDC1_CTRL3, 15),
|
||||
MTK_PIN_IES_SMT_SPEC(112, 112, MSDC0_CTRL4, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(113, 113, MSDC0_CTRL4, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(114, 115, MSDC0_CTRL4, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(116, 117, MSDC0_CTRL1, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(118, 118, MSDC0_CTRL3, 15),
|
||||
MTK_PIN_IES_SMT_SPEC(119, 119, MSDC0_CTRL3, 11),
|
||||
MTK_PIN_IES_SMT_SPEC(120, 120, MSDC0_CTRL3, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(121, 121, MSDC0_CTRL3, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(122, 125, SMT_EN1, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(126, 126, SMT_EN0, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(199, 201, SMT_EN0, 1),
|
||||
MTK_PIN_IES_SMT_SPEC(203, 207, SMT_EN2, 2),
|
||||
MTK_PIN_IES_SMT_SPEC(208, 209, SMT_EN2, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(236, 241, SMT_EN2, 6),
|
||||
MTK_PIN_IES_SMT_SPEC(242, 243, SMT_EN2, 7),
|
||||
MTK_PIN_IES_SMT_SPEC(261, 261, MSDC1_CTRL6, 3),
|
||||
MTK_PIN_IES_SMT_SPEC(262, 272, SMT_EN2, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(274, 276, SMT_EN2, 12),
|
||||
MTK_PIN_IES_SMT_SPEC(278, 278, SMT_EN2, 13),
|
||||
};
|
||||
|
||||
static int mt7623_ies_smt_set(struct regmap *regmap, unsigned int pin,
|
||||
unsigned char align, int value, enum pin_config_param arg)
|
||||
{
|
||||
if (arg == PIN_CONFIG_INPUT_ENABLE)
|
||||
return mtk_pconf_spec_set_ies_smt_range(regmap, mt7623_ies_set,
|
||||
ARRAY_SIZE(mt7623_ies_set), pin, align, value);
|
||||
else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
|
||||
return mtk_pconf_spec_set_ies_smt_range(regmap, mt7623_smt_set,
|
||||
ARRAY_SIZE(mt7623_smt_set), pin, align, value);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static const struct mtk_pinctrl_devdata mt7623_pinctrl_data = {
|
||||
.pins = mtk_pins_mt7623,
|
||||
.npins = ARRAY_SIZE(mtk_pins_mt7623),
|
||||
.grp_desc = mt7623_drv_grp,
|
||||
.n_grp_cls = ARRAY_SIZE(mt7623_drv_grp),
|
||||
.pin_drv_grp = mt7623_pin_drv,
|
||||
.n_pin_drv_grps = ARRAY_SIZE(mt7623_pin_drv),
|
||||
.spec_pull_set = mt7623_spec_pull_set,
|
||||
.spec_ies_smt_set = mt7623_ies_smt_set,
|
||||
.dir_offset = 0x0000,
|
||||
.pullen_offset = 0x0150,
|
||||
.pullsel_offset = 0x0280,
|
||||
.dout_offset = 0x0500,
|
||||
.din_offset = 0x0630,
|
||||
.pinmux_offset = 0x0760,
|
||||
.type1_start = 280,
|
||||
.type1_end = 280,
|
||||
.port_shf = 4,
|
||||
.port_mask = 0x1f,
|
||||
.port_align = 4,
|
||||
.eint_offsets = {
|
||||
.name = "mt7623_eint",
|
||||
.stat = 0x000,
|
||||
.ack = 0x040,
|
||||
.mask = 0x080,
|
||||
.mask_set = 0x0c0,
|
||||
.mask_clr = 0x100,
|
||||
.sens = 0x140,
|
||||
.sens_set = 0x180,
|
||||
.sens_clr = 0x1c0,
|
||||
.soft = 0x200,
|
||||
.soft_set = 0x240,
|
||||
.soft_clr = 0x280,
|
||||
.pol = 0x300,
|
||||
.pol_set = 0x340,
|
||||
.pol_clr = 0x380,
|
||||
.dom_en = 0x400,
|
||||
.dbnc_ctrl = 0x500,
|
||||
.dbnc_set = 0x600,
|
||||
.dbnc_clr = 0x700,
|
||||
.port_mask = 6,
|
||||
.ports = 6,
|
||||
},
|
||||
.ap_num = 169,
|
||||
.db_cnt = 16,
|
||||
};
|
||||
|
||||
static int mt7623_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
return mtk_pctrl_init(pdev, &mt7623_pinctrl_data, NULL);
|
||||
}
|
||||
|
||||
static const struct of_device_id mt7623_pctrl_match[] = {
|
||||
{ .compatible = "mediatek,mt7623-pinctrl", },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mt7623_pctrl_match);
|
||||
|
||||
static struct platform_driver mtk_pinctrl_driver = {
|
||||
.probe = mt7623_pinctrl_probe,
|
||||
.driver = {
|
||||
.name = "mediatek-mt7623-pinctrl",
|
||||
.of_match_table = mt7623_pctrl_match,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init mtk_pinctrl_init(void)
|
||||
{
|
||||
return platform_driver_register(&mtk_pinctrl_driver);
|
||||
}
|
||||
|
||||
arch_initcall(mtk_pinctrl_init);
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -85,6 +85,7 @@ static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
|
|||
MESON_PIN(GPIODV_15, EE_OFF),
|
||||
MESON_PIN(GPIODV_16, EE_OFF),
|
||||
MESON_PIN(GPIODV_17, EE_OFF),
|
||||
MESON_PIN(GPIODV_18, EE_OFF),
|
||||
MESON_PIN(GPIODV_19, EE_OFF),
|
||||
MESON_PIN(GPIODV_20, EE_OFF),
|
||||
MESON_PIN(GPIODV_21, EE_OFF),
|
||||
|
|
@ -137,7 +138,6 @@ static const struct pinctrl_pin_desc meson_gxbb_periphs_pins[] = {
|
|||
MESON_PIN(GPIOX_19, EE_OFF),
|
||||
MESON_PIN(GPIOX_20, EE_OFF),
|
||||
MESON_PIN(GPIOX_21, EE_OFF),
|
||||
MESON_PIN(GPIOX_22, EE_OFF),
|
||||
|
||||
MESON_PIN(GPIOCLK_0, EE_OFF),
|
||||
MESON_PIN(GPIOCLK_1, EE_OFF),
|
||||
|
|
@ -161,6 +161,11 @@ static const unsigned int nor_q_pins[] = { PIN(BOOT_12, EE_OFF) };
|
|||
static const unsigned int nor_c_pins[] = { PIN(BOOT_13, EE_OFF) };
|
||||
static const unsigned int nor_cs_pins[] = { PIN(BOOT_15, EE_OFF) };
|
||||
|
||||
static const unsigned int spi_sclk_pins[] = { PIN(GPIOZ_6, EE_OFF) };
|
||||
static const unsigned int spi_ss0_pins[] = { PIN(GPIOZ_7, EE_OFF) };
|
||||
static const unsigned int spi_miso_pins[] = { PIN(GPIOZ_12, EE_OFF) };
|
||||
static const unsigned int spi_mosi_pins[] = { PIN(GPIOZ_13, EE_OFF) };
|
||||
|
||||
static const unsigned int sdcard_d0_pins[] = { PIN(CARD_1, EE_OFF) };
|
||||
static const unsigned int sdcard_d1_pins[] = { PIN(CARD_0, EE_OFF) };
|
||||
static const unsigned int sdcard_d2_pins[] = { PIN(CARD_5, EE_OFF) };
|
||||
|
|
@ -290,6 +295,9 @@ static const unsigned int i2s_out_ch45_ao_pins[] = { PIN(GPIOAO_13, 0) };
|
|||
static const unsigned int spdif_out_ao_6_pins[] = { PIN(GPIOAO_6, 0) };
|
||||
static const unsigned int spdif_out_ao_13_pins[] = { PIN(GPIOAO_13, 0) };
|
||||
|
||||
static const unsigned int ao_cec_pins[] = { PIN(GPIOAO_12, 0) };
|
||||
static const unsigned int ee_cec_pins[] = { PIN(GPIOAO_12, 0) };
|
||||
|
||||
static struct meson_pmx_group meson_gxbb_periphs_groups[] = {
|
||||
GPIO_GROUP(GPIOZ_0, EE_OFF),
|
||||
GPIO_GROUP(GPIOZ_1, EE_OFF),
|
||||
|
|
@ -462,6 +470,10 @@ static struct meson_pmx_group meson_gxbb_periphs_groups[] = {
|
|||
GROUP(eth_txd1, 6, 4),
|
||||
GROUP(eth_txd2, 6, 3),
|
||||
GROUP(eth_txd3, 6, 2),
|
||||
GROUP(spi_ss0, 5, 26),
|
||||
GROUP(spi_sclk, 5, 27),
|
||||
GROUP(spi_miso, 5, 28),
|
||||
GROUP(spi_mosi, 5, 29),
|
||||
|
||||
/* Bank H */
|
||||
GROUP(hdmi_hpd, 1, 26),
|
||||
|
|
@ -551,6 +563,8 @@ static struct meson_pmx_group meson_gxbb_aobus_groups[] = {
|
|||
GROUP(i2s_out_ch45_ao, 1, 1),
|
||||
GROUP(spdif_out_ao_6, 0, 16),
|
||||
GROUP(spdif_out_ao_13, 0, 4),
|
||||
GROUP(ao_cec, 0, 15),
|
||||
GROUP(ee_cec, 0, 14),
|
||||
};
|
||||
|
||||
static const char * const gpio_periphs_groups[] = {
|
||||
|
|
@ -598,6 +612,10 @@ static const char * const nor_groups[] = {
|
|||
"nor_d", "nor_q", "nor_c", "nor_cs",
|
||||
};
|
||||
|
||||
static const char * const spi_groups[] = {
|
||||
"spi_mosi", "spi_miso", "spi_ss0", "spi_sclk",
|
||||
};
|
||||
|
||||
static const char * const sdcard_groups[] = {
|
||||
"sdcard_d0", "sdcard_d1", "sdcard_d2", "sdcard_d3",
|
||||
"sdcard_cmd", "sdcard_clk",
|
||||
|
|
@ -739,10 +757,15 @@ static const char * const spdif_out_ao_groups[] = {
|
|||
"spdif_out_ao_6", "spdif_out_ao_13",
|
||||
};
|
||||
|
||||
static const char * const cec_ao_groups[] = {
|
||||
"ao_cec", "ee_cec",
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson_gxbb_periphs_functions[] = {
|
||||
FUNCTION(gpio_periphs),
|
||||
FUNCTION(emmc),
|
||||
FUNCTION(nor),
|
||||
FUNCTION(spi),
|
||||
FUNCTION(sdcard),
|
||||
FUNCTION(sdio),
|
||||
FUNCTION(nand),
|
||||
|
|
@ -779,23 +802,24 @@ static struct meson_pmx_func meson_gxbb_aobus_functions[] = {
|
|||
FUNCTION(pwm_ao_b),
|
||||
FUNCTION(i2s_out_ao),
|
||||
FUNCTION(spdif_out_ao),
|
||||
FUNCTION(cec_ao),
|
||||
};
|
||||
|
||||
static struct meson_bank meson_gxbb_periphs_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, EE_OFF), PIN(GPIOX_22, EE_OFF), 4, 0, 4, 0, 12, 0, 13, 0, 14, 0),
|
||||
BANK("Y", PIN(GPIOY_0, EE_OFF), PIN(GPIOY_16, EE_OFF), 1, 0, 1, 0, 3, 0, 4, 0, 5, 0),
|
||||
BANK("DV", PIN(GPIODV_0, EE_OFF), PIN(GPIODV_29, EE_OFF), 0, 0, 0, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("H", PIN(GPIOH_0, EE_OFF), PIN(GPIOH_3, EE_OFF), 1, 20, 1, 20, 3, 20, 4, 20, 5, 20),
|
||||
BANK("Z", PIN(GPIOZ_0, EE_OFF), PIN(GPIOZ_15, EE_OFF), 3, 0, 3, 0, 9, 0, 10, 0, 11, 0),
|
||||
BANK("CARD", PIN(CARD_0, EE_OFF), PIN(CARD_6, EE_OFF), 2, 20, 2, 20, 6, 20, 7, 20, 8, 20),
|
||||
BANK("BOOT", PIN(BOOT_0, EE_OFF), PIN(BOOT_17, EE_OFF), 2, 0, 2, 0, 6, 0, 7, 0, 8, 0),
|
||||
BANK("CLK", PIN(GPIOCLK_0, EE_OFF), PIN(GPIOCLK_3, EE_OFF), 3, 28, 3, 28, 9, 28, 10, 28, 11, 28),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, EE_OFF), PIN(GPIOX_22, EE_OFF), 106, 128, 4, 0, 4, 0, 12, 0, 13, 0, 14, 0),
|
||||
BANK("Y", PIN(GPIOY_0, EE_OFF), PIN(GPIOY_16, EE_OFF), 89, 105, 1, 0, 1, 0, 3, 0, 4, 0, 5, 0),
|
||||
BANK("DV", PIN(GPIODV_0, EE_OFF), PIN(GPIODV_29, EE_OFF), 59, 88, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("H", PIN(GPIOH_0, EE_OFF), PIN(GPIOH_3, EE_OFF), 30, 33, 1, 20, 1, 20, 3, 20, 4, 20, 5, 20),
|
||||
BANK("Z", PIN(GPIOZ_0, EE_OFF), PIN(GPIOZ_15, EE_OFF), 14, 29, 3, 0, 3, 0, 9, 0, 10, 0, 11, 0),
|
||||
BANK("CARD", PIN(CARD_0, EE_OFF), PIN(CARD_6, EE_OFF), 52, 58, 2, 20, 2, 20, 6, 20, 7, 20, 8, 20),
|
||||
BANK("BOOT", PIN(BOOT_0, EE_OFF), PIN(BOOT_17, EE_OFF), 34, 51, 2, 0, 2, 0, 6, 0, 7, 0, 8, 0),
|
||||
BANK("CLK", PIN(GPIOCLK_0, EE_OFF), PIN(GPIOCLK_3, EE_OFF), 129, 132, 3, 28, 3, 28, 9, 28, 10, 28, 11, 28),
|
||||
};
|
||||
|
||||
static struct meson_bank meson_gxbb_aobus_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, 0), PIN(GPIOAO_13, 0), 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, 0), PIN(GPIOAO_13, 0), 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
};
|
||||
|
||||
struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ static const struct pinctrl_pin_desc meson_gxl_periphs_pins[] = {
|
|||
MESON_PIN(GPIODV_15, EE_OFF),
|
||||
MESON_PIN(GPIODV_16, EE_OFF),
|
||||
MESON_PIN(GPIODV_17, EE_OFF),
|
||||
MESON_PIN(GPIODV_18, EE_OFF),
|
||||
MESON_PIN(GPIODV_19, EE_OFF),
|
||||
MESON_PIN(GPIODV_20, EE_OFF),
|
||||
MESON_PIN(GPIODV_21, EE_OFF),
|
||||
|
|
@ -141,6 +142,11 @@ static const unsigned int nor_q_pins[] = { PIN(BOOT_12, EE_OFF) };
|
|||
static const unsigned int nor_c_pins[] = { PIN(BOOT_13, EE_OFF) };
|
||||
static const unsigned int nor_cs_pins[] = { PIN(BOOT_15, EE_OFF) };
|
||||
|
||||
static const unsigned int spi_mosi_pins[] = { PIN(GPIOX_8, EE_OFF) };
|
||||
static const unsigned int spi_miso_pins[] = { PIN(GPIOX_9, EE_OFF) };
|
||||
static const unsigned int spi_ss0_pins[] = { PIN(GPIOX_10, EE_OFF) };
|
||||
static const unsigned int spi_sclk_pins[] = { PIN(GPIOX_11, EE_OFF) };
|
||||
|
||||
static const unsigned int sdcard_d0_pins[] = { PIN(CARD_1, EE_OFF) };
|
||||
static const unsigned int sdcard_d1_pins[] = { PIN(CARD_0, EE_OFF) };
|
||||
static const unsigned int sdcard_d2_pins[] = { PIN(CARD_5, EE_OFF) };
|
||||
|
|
@ -234,6 +240,28 @@ static const unsigned int i2s_out_ch67_z_pins[] = { PIN(GPIOZ_7, EE_OFF) };
|
|||
|
||||
static const unsigned int spdif_out_h_pins[] = { PIN(GPIOH_4, EE_OFF) };
|
||||
|
||||
static const unsigned int eth_link_led_pins[] = { PIN(GPIOZ_14, EE_OFF) };
|
||||
static const unsigned int eth_act_led_pins[] = { PIN(GPIOZ_15, EE_OFF) };
|
||||
|
||||
static const unsigned int tsin_a_d0_pins[] = { PIN(GPIODV_0, EE_OFF) };
|
||||
static const unsigned int tsin_a_d0_x_pins[] = { PIN(GPIOX_10, EE_OFF) };
|
||||
static const unsigned int tsin_a_clk_pins[] = { PIN(GPIODV_8, EE_OFF) };
|
||||
static const unsigned int tsin_a_clk_x_pins[] = { PIN(GPIOX_11, EE_OFF) };
|
||||
static const unsigned int tsin_a_sop_pins[] = { PIN(GPIODV_9, EE_OFF) };
|
||||
static const unsigned int tsin_a_sop_x_pins[] = { PIN(GPIOX_8, EE_OFF) };
|
||||
static const unsigned int tsin_a_d_valid_pins[] = { PIN(GPIODV_10, EE_OFF) };
|
||||
static const unsigned int tsin_a_d_valid_x_pins[] = { PIN(GPIOX_9, EE_OFF) };
|
||||
static const unsigned int tsin_a_fail_pins[] = { PIN(GPIODV_11, EE_OFF) };
|
||||
static const unsigned int tsin_a_dp_pins[] = {
|
||||
PIN(GPIODV_1, EE_OFF),
|
||||
PIN(GPIODV_2, EE_OFF),
|
||||
PIN(GPIODV_3, EE_OFF),
|
||||
PIN(GPIODV_4, EE_OFF),
|
||||
PIN(GPIODV_5, EE_OFF),
|
||||
PIN(GPIODV_6, EE_OFF),
|
||||
PIN(GPIODV_7, EE_OFF),
|
||||
};
|
||||
|
||||
static const struct pinctrl_pin_desc meson_gxl_aobus_pins[] = {
|
||||
MESON_PIN(GPIOAO_0, 0),
|
||||
MESON_PIN(GPIOAO_1, 0),
|
||||
|
|
@ -271,11 +299,14 @@ static const unsigned int pwm_ao_a_8_pins[] = { PIN(GPIOAO_8, 0) };
|
|||
static const unsigned int pwm_ao_b_pins[] = { PIN(GPIOAO_9, 0) };
|
||||
static const unsigned int pwm_ao_b_6_pins[] = { PIN(GPIOAO_6, 0) };
|
||||
|
||||
static const unsigned int i2s_out_ch23_ao_pins[] = { PIN(GPIOAO_8, EE_OFF) };
|
||||
static const unsigned int i2s_out_ch45_ao_pins[] = { PIN(GPIOAO_9, EE_OFF) };
|
||||
static const unsigned int i2s_out_ch23_ao_pins[] = { PIN(GPIOAO_8, 0) };
|
||||
static const unsigned int i2s_out_ch45_ao_pins[] = { PIN(GPIOAO_9, 0) };
|
||||
|
||||
static const unsigned int spdif_out_ao_6_pins[] = { PIN(GPIOAO_6, EE_OFF) };
|
||||
static const unsigned int spdif_out_ao_9_pins[] = { PIN(GPIOAO_9, EE_OFF) };
|
||||
static const unsigned int spdif_out_ao_6_pins[] = { PIN(GPIOAO_6, 0) };
|
||||
static const unsigned int spdif_out_ao_9_pins[] = { PIN(GPIOAO_9, 0) };
|
||||
|
||||
static const unsigned int ao_cec_pins[] = { PIN(GPIOAO_8, 0) };
|
||||
static const unsigned int ee_cec_pins[] = { PIN(GPIOAO_8, 0) };
|
||||
|
||||
static struct meson_pmx_group meson_gxl_periphs_groups[] = {
|
||||
GPIO_GROUP(GPIOZ_0, EE_OFF),
|
||||
|
|
@ -405,6 +436,14 @@ static struct meson_pmx_group meson_gxl_periphs_groups[] = {
|
|||
GROUP(pwm_a, 5, 25),
|
||||
GROUP(pwm_e, 5, 15),
|
||||
GROUP(pwm_f_x, 5, 14),
|
||||
GROUP(spi_mosi, 5, 3),
|
||||
GROUP(spi_miso, 5, 2),
|
||||
GROUP(spi_ss0, 5, 1),
|
||||
GROUP(spi_sclk, 5, 0),
|
||||
GROUP(tsin_a_sop_x, 6, 3),
|
||||
GROUP(tsin_a_d_valid_x, 6, 2),
|
||||
GROUP(tsin_a_d0_x, 6, 1),
|
||||
GROUP(tsin_a_clk_x, 6, 0),
|
||||
|
||||
/* Bank Z */
|
||||
GROUP(eth_mdio, 4, 23),
|
||||
|
|
@ -425,6 +464,8 @@ static struct meson_pmx_group meson_gxl_periphs_groups[] = {
|
|||
GROUP(i2s_out_ch23_z, 3, 26),
|
||||
GROUP(i2s_out_ch45_z, 3, 25),
|
||||
GROUP(i2s_out_ch67_z, 3, 24),
|
||||
GROUP(eth_link_led, 4, 25),
|
||||
GROUP(eth_act_led, 4, 24),
|
||||
|
||||
/* Bank H */
|
||||
GROUP(hdmi_hpd, 6, 31),
|
||||
|
|
@ -451,6 +492,12 @@ static struct meson_pmx_group meson_gxl_periphs_groups[] = {
|
|||
GROUP(i2c_sck_c, 1, 10),
|
||||
GROUP(pwm_b, 2, 11),
|
||||
GROUP(pwm_d, 2, 12),
|
||||
GROUP(tsin_a_d0, 2, 4),
|
||||
GROUP(tsin_a_dp, 2, 3),
|
||||
GROUP(tsin_a_clk, 2, 2),
|
||||
GROUP(tsin_a_sop, 2, 1),
|
||||
GROUP(tsin_a_d_valid, 2, 0),
|
||||
GROUP(tsin_a_fail, 1, 31),
|
||||
|
||||
/* Bank BOOT */
|
||||
GROUP(emmc_nand_d07, 7, 31),
|
||||
|
|
@ -518,6 +565,8 @@ static struct meson_pmx_group meson_gxl_aobus_groups[] = {
|
|||
GROUP(i2s_out_ch45_ao, 1, 1),
|
||||
GROUP(spdif_out_ao_6, 0, 16),
|
||||
GROUP(spdif_out_ao_9, 0, 4),
|
||||
GROUP(ao_cec, 0, 15),
|
||||
GROUP(ee_cec, 0, 14),
|
||||
};
|
||||
|
||||
static const char * const gpio_periphs_groups[] = {
|
||||
|
|
@ -560,6 +609,10 @@ static const char * const nor_groups[] = {
|
|||
"nor_d", "nor_q", "nor_c", "nor_cs",
|
||||
};
|
||||
|
||||
static const char * const spi_groups[] = {
|
||||
"spi_mosi", "spi_miso", "spi_ss0", "spi_sclk",
|
||||
};
|
||||
|
||||
static const char * const sdcard_groups[] = {
|
||||
"sdcard_d0", "sdcard_d1", "sdcard_d2", "sdcard_d3",
|
||||
"sdcard_cmd", "sdcard_clk",
|
||||
|
|
@ -647,6 +700,16 @@ static const char * const spdif_out_groups[] = {
|
|||
"spdif_out_h",
|
||||
};
|
||||
|
||||
static const char * const eth_led_groups[] = {
|
||||
"eth_link_led", "eth_act_led",
|
||||
};
|
||||
|
||||
static const char * const tsin_a_groups[] = {
|
||||
"tsin_a_clk", "tsin_a_clk_x", "tsin_a_sop", "tsin_a_sop_x",
|
||||
"tsin_a_d_valid", "tsin_a_d_valid_x", "tsin_a_d0", "tsin_a_d0_x",
|
||||
"tsin_a_dp", "tsin_a_fail",
|
||||
};
|
||||
|
||||
static const char * const gpio_aobus_groups[] = {
|
||||
"GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3", "GPIOAO_4",
|
||||
"GPIOAO_5", "GPIOAO_6", "GPIOAO_7", "GPIOAO_8", "GPIOAO_9",
|
||||
|
|
@ -689,10 +752,15 @@ static const char * const spdif_out_ao_groups[] = {
|
|||
"spdif_out_ao_6", "spdif_out_ao_9",
|
||||
};
|
||||
|
||||
static const char * const cec_ao_groups[] = {
|
||||
"ao_cec", "ee_cec",
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson_gxl_periphs_functions[] = {
|
||||
FUNCTION(gpio_periphs),
|
||||
FUNCTION(emmc),
|
||||
FUNCTION(nor),
|
||||
FUNCTION(spi),
|
||||
FUNCTION(sdcard),
|
||||
FUNCTION(sdio),
|
||||
FUNCTION(nand),
|
||||
|
|
@ -713,6 +781,8 @@ static struct meson_pmx_func meson_gxl_periphs_functions[] = {
|
|||
FUNCTION(hdmi_i2c),
|
||||
FUNCTION(i2s_out),
|
||||
FUNCTION(spdif_out),
|
||||
FUNCTION(eth_led),
|
||||
FUNCTION(tsin_a),
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson_gxl_aobus_functions[] = {
|
||||
|
|
@ -726,22 +796,23 @@ static struct meson_pmx_func meson_gxl_aobus_functions[] = {
|
|||
FUNCTION(pwm_ao_b),
|
||||
FUNCTION(i2s_out_ao),
|
||||
FUNCTION(spdif_out_ao),
|
||||
FUNCTION(cec_ao),
|
||||
};
|
||||
|
||||
static struct meson_bank meson_gxl_periphs_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, EE_OFF), PIN(GPIOX_18, EE_OFF), 4, 0, 4, 0, 12, 0, 13, 0, 14, 0),
|
||||
BANK("DV", PIN(GPIODV_0, EE_OFF), PIN(GPIODV_29, EE_OFF), 0, 0, 0, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("H", PIN(GPIOH_0, EE_OFF), PIN(GPIOH_9, EE_OFF), 1, 20, 1, 20, 3, 20, 4, 20, 5, 20),
|
||||
BANK("Z", PIN(GPIOZ_0, EE_OFF), PIN(GPIOZ_15, EE_OFF), 3, 0, 3, 0, 9, 0, 10, 0, 11, 0),
|
||||
BANK("CARD", PIN(CARD_0, EE_OFF), PIN(CARD_6, EE_OFF), 2, 20, 2, 20, 6, 20, 7, 20, 8, 20),
|
||||
BANK("BOOT", PIN(BOOT_0, EE_OFF), PIN(BOOT_15, EE_OFF), 2, 0, 2, 0, 6, 0, 7, 0, 8, 0),
|
||||
BANK("CLK", PIN(GPIOCLK_0, EE_OFF), PIN(GPIOCLK_1, EE_OFF), 3, 28, 3, 28, 9, 28, 10, 28, 11, 28),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, EE_OFF), PIN(GPIOX_18, EE_OFF), 89, 107, 4, 0, 4, 0, 12, 0, 13, 0, 14, 0),
|
||||
BANK("DV", PIN(GPIODV_0, EE_OFF), PIN(GPIODV_29, EE_OFF), 83, 88, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("H", PIN(GPIOH_0, EE_OFF), PIN(GPIOH_9, EE_OFF), 26, 35, 1, 20, 1, 20, 3, 20, 4, 20, 5, 20),
|
||||
BANK("Z", PIN(GPIOZ_0, EE_OFF), PIN(GPIOZ_15, EE_OFF), 10, 25, 3, 0, 3, 0, 9, 0, 10, 0, 11, 0),
|
||||
BANK("CARD", PIN(CARD_0, EE_OFF), PIN(CARD_6, EE_OFF), 52, 58, 2, 20, 2, 20, 6, 20, 7, 20, 8, 20),
|
||||
BANK("BOOT", PIN(BOOT_0, EE_OFF), PIN(BOOT_15, EE_OFF), 36, 51, 2, 0, 2, 0, 6, 0, 7, 0, 8, 0),
|
||||
BANK("CLK", PIN(GPIOCLK_0, EE_OFF), PIN(GPIOCLK_1, EE_OFF), 108, 109, 3, 28, 3, 28, 9, 28, 10, 28, 11, 28),
|
||||
};
|
||||
|
||||
static struct meson_bank meson_gxl_aobus_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, 0), PIN(GPIOAO_9, 0), 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, 0), PIN(GPIOAO_9, 0), 0, 9, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
};
|
||||
|
||||
struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ enum meson_reg_type {
|
|||
* @name: bank name
|
||||
* @first: first pin of the bank
|
||||
* @last: last pin of the bank
|
||||
* @irq: hwirq base number of the bank
|
||||
* @regs: array of register descriptors
|
||||
*
|
||||
* A bank represents a set of pins controlled by a contiguous set of
|
||||
|
|
@ -92,6 +93,8 @@ struct meson_bank {
|
|||
const char *name;
|
||||
unsigned int first;
|
||||
unsigned int last;
|
||||
int irq_first;
|
||||
int irq_last;
|
||||
struct meson_reg_desc regs[NUM_REG];
|
||||
};
|
||||
|
||||
|
|
@ -147,12 +150,14 @@ struct meson_pinctrl {
|
|||
.num_groups = ARRAY_SIZE(fn ## _groups), \
|
||||
}
|
||||
|
||||
#define BANK(n, f, l, per, peb, pr, pb, dr, db, or, ob, ir, ib) \
|
||||
#define BANK(n, f, l, fi, li, per, peb, pr, pb, dr, db, or, ob, ir, ib) \
|
||||
{ \
|
||||
.name = n, \
|
||||
.first = f, \
|
||||
.last = l, \
|
||||
.regs = { \
|
||||
.name = n, \
|
||||
.first = f, \
|
||||
.last = l, \
|
||||
.irq_first = fi, \
|
||||
.irq_last = li, \
|
||||
.regs = { \
|
||||
[REG_PULLEN] = { per, peb }, \
|
||||
[REG_PULL] = { pr, pb }, \
|
||||
[REG_DIR] = { dr, db }, \
|
||||
|
|
|
|||
|
|
@ -205,6 +205,9 @@ static const unsigned int i2c_sck_d0_pins[] = { PIN(GPIOX_17, 0) };
|
|||
static const unsigned int xtal_32k_out_pins[] = { PIN(GPIOX_10, 0) };
|
||||
static const unsigned int xtal_24m_out_pins[] = { PIN(GPIOX_11, 0) };
|
||||
|
||||
static const unsigned int pwm_e_pins[] = { PIN(GPIOX_10, 0) };
|
||||
static const unsigned int pwm_b_x_pins[] = { PIN(GPIOX_11, 0) };
|
||||
|
||||
/* bank Y */
|
||||
static const unsigned int uart_tx_c_pins[] = { PIN(GPIOY_0, 0) };
|
||||
static const unsigned int uart_rx_c_pins[] = { PIN(GPIOY_1, 0) };
|
||||
|
|
@ -219,6 +222,20 @@ static const unsigned int pcm_clk_b_pins[] = { PIN(GPIOY_7, 0) };
|
|||
static const unsigned int i2c_sda_c0_pins[] = { PIN(GPIOY_0, 0) };
|
||||
static const unsigned int i2c_sck_c0_pins[] = { PIN(GPIOY_1, 0) };
|
||||
|
||||
static const unsigned int pwm_a_y_pins[] = { PIN(GPIOY_16, 0) };
|
||||
|
||||
static const unsigned int i2s_out_ch45_pins[] = { PIN(GPIOY_0, 0) };
|
||||
static const unsigned int i2s_out_ch23_pins[] = { PIN(GPIOY_1, 0) };
|
||||
static const unsigned int i2s_out_ch01_pins[] = { PIN(GPIOY_4, 0) };
|
||||
static const unsigned int i2s_in_ch01_pins[] = { PIN(GPIOY_5, 0) };
|
||||
static const unsigned int i2s_lr_clk_in_pins[] = { PIN(GPIOY_6, 0) };
|
||||
static const unsigned int i2s_ao_clk_in_pins[] = { PIN(GPIOY_7, 0) };
|
||||
static const unsigned int i2s_am_clk_pins[] = { PIN(GPIOY_8, 0) };
|
||||
static const unsigned int i2s_out_ch78_pins[] = { PIN(GPIOY_9, 0) };
|
||||
|
||||
static const unsigned int spdif_in_pins[] = { PIN(GPIOY_2, 0) };
|
||||
static const unsigned int spdif_out_pins[] = { PIN(GPIOY_3, 0) };
|
||||
|
||||
/* bank DV */
|
||||
static const unsigned int dvin_rgb_pins[] = { PIN(GPIODV_0, 0), PIN(GPIODV_1, 0),
|
||||
PIN(GPIODV_2, 0), PIN(GPIODV_3, 0),
|
||||
|
|
@ -264,6 +281,10 @@ static const unsigned int uart_rts_b1_pins[] = { PIN(GPIODV_27, 0) };
|
|||
static const unsigned int vga_vs_pins[] = { PIN(GPIODV_24, 0) };
|
||||
static const unsigned int vga_hs_pins[] = { PIN(GPIODV_25, 0) };
|
||||
|
||||
static const unsigned int pwm_c_dv9_pins[] = { PIN(GPIODV_9, 0) };
|
||||
static const unsigned int pwm_c_dv29_pins[] = { PIN(GPIODV_29, 0) };
|
||||
static const unsigned int pwm_d_pins[] = { PIN(GPIODV_28, 0) };
|
||||
|
||||
/* bank H */
|
||||
static const unsigned int hdmi_hpd_pins[] = { PIN(GPIOH_0, 0) };
|
||||
static const unsigned int hdmi_sda_pins[] = { PIN(GPIOH_1, 0) };
|
||||
|
|
@ -312,6 +333,11 @@ static const unsigned int i2c_sck_a1_pins[] = { PIN(GPIOZ_1, 0) };
|
|||
static const unsigned int i2c_sda_a2_pins[] = { PIN(GPIOZ_0, 0) };
|
||||
static const unsigned int i2c_sck_a2_pins[] = { PIN(GPIOZ_1, 0) };
|
||||
|
||||
static const unsigned int pwm_a_z0_pins[] = { PIN(GPIOZ_0, 0) };
|
||||
static const unsigned int pwm_a_z7_pins[] = { PIN(GPIOZ_7, 0) };
|
||||
static const unsigned int pwm_b_z_pins[] = { PIN(GPIOZ_1, 0) };
|
||||
static const unsigned int pwm_c_z_pins[] = { PIN(GPIOZ_8, 0) };
|
||||
|
||||
/* bank BOOT */
|
||||
static const unsigned int sd_d0_c_pins[] = { PIN(BOOT_0, 0) };
|
||||
static const unsigned int sd_d1_c_pins[] = { PIN(BOOT_1, 0) };
|
||||
|
|
@ -369,6 +395,7 @@ static const unsigned int uart_cts_ao_a_pins[] = { PIN(GPIOAO_2, AO_OFF) };
|
|||
static const unsigned int uart_rts_ao_a_pins[] = { PIN(GPIOAO_3, AO_OFF) };
|
||||
|
||||
static const unsigned int remote_input_pins[] = { PIN(GPIOAO_7, AO_OFF) };
|
||||
static const unsigned int remote_output_ao_pins[] = { PIN(GPIOAO_13, AO_OFF) };
|
||||
|
||||
static const unsigned int i2c_slave_sck_ao_pins[] = { PIN(GPIOAO_4, AO_OFF) };
|
||||
static const unsigned int i2c_slave_sda_ao_pins[] = { PIN(GPIOAO_5, AO_OFF) };
|
||||
|
|
@ -382,6 +409,15 @@ static const unsigned int uart_rx_ao_b1_pins[] = { PIN(GPIOAO_5, AO_OFF) };
|
|||
static const unsigned int i2c_mst_sck_ao_pins[] = { PIN(GPIOAO_4, AO_OFF) };
|
||||
static const unsigned int i2c_mst_sda_ao_pins[] = { PIN(GPIOAO_5, AO_OFF) };
|
||||
|
||||
static const unsigned int pwm_f_ao_pins[] = { PIN(GPIO_TEST_N, AO_OFF) };
|
||||
|
||||
static const unsigned int i2s_am_clk_out_ao_pins[] = { PIN(GPIOAO_8, AO_OFF) };
|
||||
static const unsigned int i2s_ao_clk_out_ao_pins[] = { PIN(GPIOAO_9, AO_OFF) };
|
||||
static const unsigned int i2s_lr_clk_out_ao_pins[] = { PIN(GPIOAO_10, AO_OFF) };
|
||||
static const unsigned int i2s_out_ch01_ao_pins[] = { PIN(GPIOAO_11, AO_OFF) };
|
||||
|
||||
static const unsigned int hdmi_cec_ao_pins[] = { PIN(GPIOAO_12, AO_OFF) };
|
||||
|
||||
static struct meson_pmx_group meson8_cbus_groups[] = {
|
||||
GPIO_GROUP(GPIOX_0, 0),
|
||||
GPIO_GROUP(GPIOX_1, 0),
|
||||
|
|
@ -523,6 +559,9 @@ static struct meson_pmx_group meson8_cbus_groups[] = {
|
|||
GROUP(xtal_32k_out, 3, 22),
|
||||
GROUP(xtal_24m_out, 3, 23),
|
||||
|
||||
GROUP(pwm_e, 9, 19),
|
||||
GROUP(pwm_b_x, 2, 3),
|
||||
|
||||
/* bank Y */
|
||||
GROUP(uart_tx_c, 1, 19),
|
||||
GROUP(uart_rx_c, 1, 18),
|
||||
|
|
@ -537,6 +576,20 @@ static struct meson_pmx_group meson8_cbus_groups[] = {
|
|||
GROUP(i2c_sda_c0, 1, 15),
|
||||
GROUP(i2c_sck_c0, 1, 14),
|
||||
|
||||
GROUP(pwm_a_y, 9, 14),
|
||||
|
||||
GROUP(i2s_out_ch45, 1, 10),
|
||||
GROUP(i2s_out_ch23, 1, 19),
|
||||
GROUP(i2s_out_ch01, 1, 6),
|
||||
GROUP(i2s_in_ch01, 1, 5),
|
||||
GROUP(i2s_lr_clk_in, 1, 4),
|
||||
GROUP(i2s_ao_clk_in, 1, 2),
|
||||
GROUP(i2s_am_clk, 1, 0),
|
||||
GROUP(i2s_out_ch78, 1, 11),
|
||||
|
||||
GROUP(spdif_in, 1, 8),
|
||||
GROUP(spdif_out, 1, 7),
|
||||
|
||||
/* bank DV */
|
||||
GROUP(dvin_rgb, 0, 6),
|
||||
GROUP(dvin_vs, 0, 9),
|
||||
|
|
@ -571,6 +624,10 @@ static struct meson_pmx_group meson8_cbus_groups[] = {
|
|||
GROUP(vga_vs, 0, 21),
|
||||
GROUP(vga_hs, 0, 20),
|
||||
|
||||
GROUP(pwm_c_dv9, 3, 24),
|
||||
GROUP(pwm_c_dv29, 3, 25),
|
||||
GROUP(pwm_d, 3, 26),
|
||||
|
||||
/* bank H */
|
||||
GROUP(hdmi_hpd, 1, 26),
|
||||
GROUP(hdmi_sda, 1, 25),
|
||||
|
|
@ -619,6 +676,11 @@ static struct meson_pmx_group meson8_cbus_groups[] = {
|
|||
GROUP(i2c_sda_a2, 5, 7),
|
||||
GROUP(i2c_sck_a2, 5, 6),
|
||||
|
||||
GROUP(pwm_a_z0, 9, 16),
|
||||
GROUP(pwm_a_z7, 2, 0),
|
||||
GROUP(pwm_b_z, 9, 15),
|
||||
GROUP(pwm_c_z, 2, 1),
|
||||
|
||||
/* bank BOOT */
|
||||
GROUP(sd_d0_c, 6, 29),
|
||||
GROUP(sd_d1_c, 6, 28),
|
||||
|
|
@ -689,6 +751,7 @@ static struct meson_pmx_group meson8_aobus_groups[] = {
|
|||
GROUP(uart_rts_ao_a, 0, 9),
|
||||
|
||||
GROUP(remote_input, 0, 0),
|
||||
GROUP(remote_output_ao, 0, 31),
|
||||
|
||||
GROUP(i2c_slave_sck_ao, 0, 2),
|
||||
GROUP(i2c_slave_sda_ao, 0, 1),
|
||||
|
|
@ -701,6 +764,15 @@ static struct meson_pmx_group meson8_aobus_groups[] = {
|
|||
|
||||
GROUP(i2c_mst_sck_ao, 0, 6),
|
||||
GROUP(i2c_mst_sda_ao, 0, 5),
|
||||
|
||||
GROUP(pwm_f_ao, 0, 19),
|
||||
|
||||
GROUP(i2s_am_clk_out_ao, 0, 30),
|
||||
GROUP(i2s_ao_clk_out_ao, 0, 29),
|
||||
GROUP(i2s_lr_clk_out_ao, 0, 28),
|
||||
GROUP(i2s_out_ch01_ao, 0, 27),
|
||||
|
||||
GROUP(hdmi_cec_ao, 0, 17),
|
||||
};
|
||||
|
||||
static const char * const gpio_groups[] = {
|
||||
|
|
@ -828,6 +900,12 @@ static const char * const i2c_b_groups[] = {
|
|||
"i2c_sda_b", "i2c_sck_b"
|
||||
};
|
||||
|
||||
static const char * const i2s_groups[] = {
|
||||
"i2s_out_ch45", "i2s_out_ch23_pins", "i2s_out_ch01_pins",
|
||||
"i2s_in_ch01_pins", "i2s_lr_clk_in_pins", "i2s_ao_clk_in_pins",
|
||||
"i2s_am_clk_pins", "i2s_out_ch78_pins"
|
||||
};
|
||||
|
||||
static const char * const sd_c_groups[] = {
|
||||
"sd_d0_c", "sd_d1_c", "sd_d2_c", "sd_d3_c",
|
||||
"sd_cmd_c", "sd_clk_c"
|
||||
|
|
@ -849,6 +927,26 @@ static const char * const nor_groups[] = {
|
|||
"nor_d", "nor_q", "nor_c", "nor_cs"
|
||||
};
|
||||
|
||||
static const char * const pwm_a_groups[] = {
|
||||
"pwm_a_y", "pwm_a_z0", "pwm_a_z7"
|
||||
};
|
||||
|
||||
static const char * const pwm_b_groups[] = {
|
||||
"pwm_b_x", "pwm_b_z"
|
||||
};
|
||||
|
||||
static const char * const pwm_c_groups[] = {
|
||||
"pwm_c_dv9", "pwm_c_dv29", "pwm_c_z"
|
||||
};
|
||||
|
||||
static const char * const pwm_d_groups[] = {
|
||||
"pwm_d"
|
||||
};
|
||||
|
||||
static const char * const pwm_e_groups[] = {
|
||||
"pwm_e"
|
||||
};
|
||||
|
||||
static const char * const sd_b_groups[] = {
|
||||
"sd_d1_b", "sd_d0_b", "sd_clk_b", "sd_cmd_b",
|
||||
"sd_d3_b", "sd_d2_b"
|
||||
|
|
@ -858,12 +956,16 @@ static const char * const sdxc_b_groups[] = {
|
|||
"sdxc_d13_b", "sdxc_d0_b", "sdxc_clk_b", "sdxc_cmd_b"
|
||||
};
|
||||
|
||||
static const char * const spdif_groups[] = {
|
||||
"spdif_in", "spdif_out"
|
||||
};
|
||||
|
||||
static const char * const uart_ao_groups[] = {
|
||||
"uart_tx_ao_a", "uart_rx_ao_a", "uart_cts_ao_a", "uart_rts_ao_a"
|
||||
};
|
||||
|
||||
static const char * const remote_groups[] = {
|
||||
"remote_input"
|
||||
"remote_input", "remote_output_ao"
|
||||
};
|
||||
|
||||
static const char * const i2c_slave_ao_groups[] = {
|
||||
|
|
@ -878,6 +980,19 @@ static const char * const i2c_mst_ao_groups[] = {
|
|||
"i2c_mst_sck_ao", "i2c_mst_sda_ao"
|
||||
};
|
||||
|
||||
static const char * const pwm_f_ao_groups[] = {
|
||||
"pwm_f_ao"
|
||||
};
|
||||
|
||||
static const char * const i2s_ao_groups[] = {
|
||||
"i2s_am_clk_out_ao", "i2s_ao_clk_out_ao", "i2s_lr_clk_out_ao",
|
||||
"i2s_out_ch01_ao"
|
||||
};
|
||||
|
||||
static const char * const hdmi_cec_ao_groups[] = {
|
||||
"hdmi_cec_ao"
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson8_cbus_functions[] = {
|
||||
FUNCTION(gpio),
|
||||
FUNCTION(sd_a),
|
||||
|
|
@ -905,6 +1020,13 @@ static struct meson_pmx_func meson8_cbus_functions[] = {
|
|||
FUNCTION(nor),
|
||||
FUNCTION(sd_b),
|
||||
FUNCTION(sdxc_b),
|
||||
FUNCTION(pwm_a),
|
||||
FUNCTION(pwm_b),
|
||||
FUNCTION(pwm_c),
|
||||
FUNCTION(pwm_d),
|
||||
FUNCTION(pwm_e),
|
||||
FUNCTION(i2s),
|
||||
FUNCTION(spdif),
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson8_aobus_functions[] = {
|
||||
|
|
@ -913,22 +1035,25 @@ static struct meson_pmx_func meson8_aobus_functions[] = {
|
|||
FUNCTION(i2c_slave_ao),
|
||||
FUNCTION(uart_ao_b),
|
||||
FUNCTION(i2c_mst_ao),
|
||||
FUNCTION(pwm_f_ao),
|
||||
FUNCTION(i2s_ao),
|
||||
FUNCTION(hdmi_cec_ao),
|
||||
};
|
||||
|
||||
static struct meson_bank meson8_cbus_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, 0), PIN(GPIOX_21, 0), 4, 0, 4, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("Y", PIN(GPIOY_0, 0), PIN(GPIOY_16, 0), 3, 0, 3, 0, 3, 0, 4, 0, 5, 0),
|
||||
BANK("DV", PIN(GPIODV_0, 0), PIN(GPIODV_29, 0), 0, 0, 0, 0, 7, 0, 8, 0, 9, 0),
|
||||
BANK("H", PIN(GPIOH_0, 0), PIN(GPIOH_9, 0), 1, 16, 1, 16, 9, 19, 10, 19, 11, 19),
|
||||
BANK("Z", PIN(GPIOZ_0, 0), PIN(GPIOZ_14, 0), 1, 0, 1, 0, 3, 17, 4, 17, 5, 17),
|
||||
BANK("CARD", PIN(CARD_0, 0), PIN(CARD_6, 0), 2, 20, 2, 20, 0, 22, 1, 22, 2, 22),
|
||||
BANK("BOOT", PIN(BOOT_0, 0), PIN(BOOT_18, 0), 2, 0, 2, 0, 9, 0, 10, 0, 11, 0),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, 0), PIN(GPIOX_21, 0), 112, 133, 4, 0, 4, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("Y", PIN(GPIOY_0, 0), PIN(GPIOY_16, 0), 95, 111, 3, 0, 3, 0, 3, 0, 4, 0, 5, 0),
|
||||
BANK("DV", PIN(GPIODV_0, 0), PIN(GPIODV_29, 0), 65, 94, 0, 0, 0, 0, 7, 0, 8, 0, 9, 0),
|
||||
BANK("H", PIN(GPIOH_0, 0), PIN(GPIOH_9, 0), 29, 38, 1, 16, 1, 16, 9, 19, 10, 19, 11, 19),
|
||||
BANK("Z", PIN(GPIOZ_0, 0), PIN(GPIOZ_14, 0), 14, 28, 1, 0, 1, 0, 3, 17, 4, 17, 5, 17),
|
||||
BANK("CARD", PIN(CARD_0, 0), PIN(CARD_6, 0), 58, 64, 2, 20, 2, 20, 0, 22, 1, 22, 2, 22),
|
||||
BANK("BOOT", PIN(BOOT_0, 0), PIN(BOOT_18, 0), 39, 57, 2, 0, 2, 0, 9, 0, 10, 0, 11, 0),
|
||||
};
|
||||
|
||||
static struct meson_bank meson8_aobus_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, AO_OFF), PIN(GPIO_TEST_N, AO_OFF), 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, AO_OFF), PIN(GPIO_TEST_N, AO_OFF), 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
};
|
||||
|
||||
struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
|
||||
|
|
|
|||
|
|
@ -124,6 +124,12 @@ static const struct pinctrl_pin_desc meson8b_aobus_pins[] = {
|
|||
MESON_PIN(GPIOAO_11, AO_OFF),
|
||||
MESON_PIN(GPIOAO_12, AO_OFF),
|
||||
MESON_PIN(GPIOAO_13, AO_OFF),
|
||||
|
||||
/*
|
||||
* The following 2 pins are not mentionned in the public datasheet
|
||||
* According to this datasheet, they can't be used with the gpio
|
||||
* interrupt controller
|
||||
*/
|
||||
MESON_PIN(GPIO_BSD_EN, AO_OFF),
|
||||
MESON_PIN(GPIO_TEST_N, AO_OFF),
|
||||
};
|
||||
|
|
@ -881,19 +887,25 @@ static struct meson_pmx_func meson8b_aobus_functions[] = {
|
|||
};
|
||||
|
||||
static struct meson_bank meson8b_cbus_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, 0), PIN(GPIOX_21, 0), 4, 0, 4, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("Y", PIN(GPIOY_0, 0), PIN(GPIOY_14, 0), 3, 0, 3, 0, 3, 0, 4, 0, 5, 0),
|
||||
BANK("DV", PIN(GPIODV_9, 0), PIN(GPIODV_29, 0), 0, 0, 0, 0, 7, 0, 8, 0, 9, 0),
|
||||
BANK("H", PIN(GPIOH_0, 0), PIN(GPIOH_9, 0), 1, 16, 1, 16, 9, 19, 10, 19, 11, 19),
|
||||
BANK("CARD", PIN(CARD_0, 0), PIN(CARD_6, 0), 2, 20, 2, 20, 0, 22, 1, 22, 2, 22),
|
||||
BANK("BOOT", PIN(BOOT_0, 0), PIN(BOOT_18, 0), 2, 0, 2, 0, 9, 0, 10, 0, 11, 0),
|
||||
BANK("DIF", PIN(DIF_0_P, 0), PIN(DIF_4_N, 0), 5, 8, 5, 8, 12, 12, 13, 12, 14, 12),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("X", PIN(GPIOX_0, 0), PIN(GPIOX_21, 0), 97, 118, 4, 0, 4, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("Y", PIN(GPIOY_0, 0), PIN(GPIOY_14, 0), 80, 96, 3, 0, 3, 0, 3, 0, 4, 0, 5, 0),
|
||||
BANK("DV", PIN(GPIODV_9, 0), PIN(GPIODV_29, 0), 59, 79, 0, 0, 0, 0, 7, 0, 8, 0, 9, 0),
|
||||
BANK("H", PIN(GPIOH_0, 0), PIN(GPIOH_9, 0), 14, 23, 1, 16, 1, 16, 9, 19, 10, 19, 11, 19),
|
||||
BANK("CARD", PIN(CARD_0, 0), PIN(CARD_6, 0), 43, 49, 2, 20, 2, 20, 0, 22, 1, 22, 2, 22),
|
||||
BANK("BOOT", PIN(BOOT_0, 0), PIN(BOOT_18, 0), 24, 42, 2, 0, 2, 0, 9, 0, 10, 0, 11, 0),
|
||||
|
||||
/*
|
||||
* The following bank is not mentionned in the public datasheet
|
||||
* There is no information whether it can be used with the gpio
|
||||
* interrupt controller
|
||||
*/
|
||||
BANK("DIF", PIN(DIF_0_P, 0), PIN(DIF_4_N, 0), -1, -1, 5, 8, 5, 8, 12, 12, 13, 12, 14, 12),
|
||||
};
|
||||
|
||||
static struct meson_bank meson8b_aobus_banks[] = {
|
||||
/* name first last pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, AO_OFF), PIN(GPIO_TEST_N, AO_OFF), 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("AO", PIN(GPIOAO_0, AO_OFF), PIN(GPIO_TEST_N, AO_OFF), 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0),
|
||||
};
|
||||
|
||||
struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
if PLAT_ORION
|
||||
|
||||
config PINCTRL_MVEBU
|
||||
bool
|
||||
select PINMUX
|
||||
|
|
@ -30,6 +28,14 @@ config PINCTRL_ARMADA_39X
|
|||
bool
|
||||
select PINCTRL_MVEBU
|
||||
|
||||
config PINCTRL_ARMADA_AP806
|
||||
bool
|
||||
select PINCTRL_MVEBU
|
||||
|
||||
config PINCTRL_ARMADA_CP110
|
||||
bool
|
||||
select PINCTRL_MVEBU
|
||||
|
||||
config PINCTRL_ARMADA_XP
|
||||
bool
|
||||
select PINCTRL_MVEBU
|
||||
|
|
@ -38,8 +44,6 @@ config PINCTRL_ORION
|
|||
bool
|
||||
select PINCTRL_MVEBU
|
||||
|
||||
endif
|
||||
|
||||
config PINCTRL_ARMADA_37XX
|
||||
bool
|
||||
select GENERIC_PINCONF
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o
|
|||
obj-$(CONFIG_PINCTRL_ARMADA_375) += pinctrl-armada-375.o
|
||||
obj-$(CONFIG_PINCTRL_ARMADA_38X) += pinctrl-armada-38x.o
|
||||
obj-$(CONFIG_PINCTRL_ARMADA_39X) += pinctrl-armada-39x.o
|
||||
obj-$(CONFIG_PINCTRL_ARMADA_AP806) += pinctrl-armada-ap806.o
|
||||
obj-$(CONFIG_PINCTRL_ARMADA_CP110) += pinctrl-armada-cp110.o
|
||||
obj-$(CONFIG_PINCTRL_ARMADA_XP) += pinctrl-armada-xp.o
|
||||
obj-$(CONFIG_PINCTRL_ARMADA_37XX) += pinctrl-armada-37xx.o
|
||||
obj-$(CONFIG_PINCTRL_ORION) += pinctrl-orion.o
|
||||
|
|
|
|||
|
|
@ -13,7 +13,9 @@
|
|||
#include <linux/gpio/driver.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/pinctrl/pinconf.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -30,6 +32,11 @@
|
|||
#define OUTPUT_CTL 0x20
|
||||
#define SELECTION 0x30
|
||||
|
||||
#define IRQ_EN 0x0
|
||||
#define IRQ_POL 0x08
|
||||
#define IRQ_STATUS 0x10
|
||||
#define IRQ_WKUP 0x18
|
||||
|
||||
#define NB_FUNCS 2
|
||||
#define GPIO_PER_REG 32
|
||||
|
||||
|
|
@ -75,9 +82,12 @@ struct armada_37xx_pmx_func {
|
|||
|
||||
struct armada_37xx_pinctrl {
|
||||
struct regmap *regmap;
|
||||
void __iomem *base;
|
||||
const struct armada_37xx_pin_data *data;
|
||||
struct device *dev;
|
||||
struct gpio_chip gpio_chip;
|
||||
struct irq_chip irq_chip;
|
||||
spinlock_t irq_lock;
|
||||
struct pinctrl_desc pctl;
|
||||
struct pinctrl_dev *pctl_dev;
|
||||
struct armada_37xx_pin_group *groups;
|
||||
|
|
@ -147,8 +157,9 @@ static struct armada_37xx_pin_group armada_37xx_nb_groups[] = {
|
|||
PIN_GRP_GPIO("onewire", 4, 1, BIT(16), "onewire"),
|
||||
PIN_GRP_GPIO("uart1", 25, 2, BIT(17), "uart"),
|
||||
PIN_GRP_GPIO("spi_quad", 15, 2, BIT(18), "spi"),
|
||||
PIN_GRP_EXTRA("uart2", 9, 2, BIT(13) | BIT(14) | BIT(19),
|
||||
BIT(13) | BIT(14), BIT(19), 18, 2, "gpio", "uart"),
|
||||
PIN_GRP_EXTRA("uart2", 9, 2, BIT(1) | BIT(13) | BIT(14) | BIT(19),
|
||||
BIT(1) | BIT(13) | BIT(14), BIT(1) | BIT(19),
|
||||
18, 2, "gpio", "uart"),
|
||||
PIN_GRP_GPIO("led0_od", 11, 1, BIT(20), "led"),
|
||||
PIN_GRP_GPIO("led1_od", 12, 1, BIT(21), "led"),
|
||||
PIN_GRP_GPIO("led2_od", 13, 1, BIT(22), "led"),
|
||||
|
|
@ -159,8 +170,8 @@ static struct armada_37xx_pin_group armada_37xx_nb_groups[] = {
|
|||
static struct armada_37xx_pin_group armada_37xx_sb_groups[] = {
|
||||
PIN_GRP_GPIO("usb32_drvvbus0", 0, 1, BIT(0), "drvbus"),
|
||||
PIN_GRP_GPIO("usb2_drvvbus1", 1, 1, BIT(1), "drvbus"),
|
||||
PIN_GRP_GPIO("sdio_sb", 24, 5, BIT(2), "sdio"),
|
||||
PIN_GRP_EXTRA("rgmii", 6, 14, BIT(3), 0, BIT(3), 23, 1, "mii", "gpio"),
|
||||
PIN_GRP_GPIO("sdio_sb", 24, 6, BIT(2), "sdio"),
|
||||
PIN_GRP_EXTRA("rgmii", 6, 12, BIT(3), 0, BIT(3), 23, 1, "mii", "gpio"),
|
||||
PIN_GRP_GPIO("pcie1", 3, 2, BIT(4), "pcie"),
|
||||
PIN_GRP_GPIO("ptp", 20, 3, BIT(5), "ptp"),
|
||||
PIN_GRP("ptp_clk", 21, 1, BIT(6), "ptp", "mii"),
|
||||
|
|
@ -346,6 +357,14 @@ static int armada_37xx_pmx_set(struct pinctrl_dev *pctldev,
|
|||
return armada_37xx_pmx_set_by_name(pctldev, name, grp);
|
||||
}
|
||||
|
||||
static inline void armada_37xx_irq_update_reg(unsigned int *reg,
|
||||
struct irq_data *d)
|
||||
{
|
||||
int offset = irqd_to_hwirq(d);
|
||||
|
||||
armada_37xx_update_reg(reg, offset);
|
||||
}
|
||||
|
||||
static int armada_37xx_gpio_direction_input(struct gpio_chip *chip,
|
||||
unsigned int offset)
|
||||
{
|
||||
|
|
@ -468,6 +487,214 @@ static const struct gpio_chip armada_37xx_gpiolib_chip = {
|
|||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static void armada_37xx_irq_ack(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
|
||||
struct armada_37xx_pinctrl *info = gpiochip_get_data(chip);
|
||||
u32 reg = IRQ_STATUS;
|
||||
unsigned long flags;
|
||||
|
||||
armada_37xx_irq_update_reg(®, d);
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
writel(d->mask, info->base + reg);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
}
|
||||
|
||||
static void armada_37xx_irq_mask(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
|
||||
struct armada_37xx_pinctrl *info = gpiochip_get_data(chip);
|
||||
u32 val, reg = IRQ_EN;
|
||||
unsigned long flags;
|
||||
|
||||
armada_37xx_irq_update_reg(®, d);
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
val = readl(info->base + reg);
|
||||
writel(val & ~d->mask, info->base + reg);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
}
|
||||
|
||||
static void armada_37xx_irq_unmask(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
|
||||
struct armada_37xx_pinctrl *info = gpiochip_get_data(chip);
|
||||
u32 val, reg = IRQ_EN;
|
||||
unsigned long flags;
|
||||
|
||||
armada_37xx_irq_update_reg(®, d);
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
val = readl(info->base + reg);
|
||||
writel(val | d->mask, info->base + reg);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
}
|
||||
|
||||
static int armada_37xx_irq_set_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
|
||||
struct armada_37xx_pinctrl *info = gpiochip_get_data(chip);
|
||||
u32 val, reg = IRQ_WKUP;
|
||||
unsigned long flags;
|
||||
|
||||
armada_37xx_irq_update_reg(®, d);
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
val = readl(info->base + reg);
|
||||
if (on)
|
||||
val |= d->mask;
|
||||
else
|
||||
val &= ~d->mask;
|
||||
writel(val, info->base + reg);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int armada_37xx_irq_set_type(struct irq_data *d, unsigned int type)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
|
||||
struct armada_37xx_pinctrl *info = gpiochip_get_data(chip);
|
||||
u32 val, reg = IRQ_POL;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
armada_37xx_irq_update_reg(®, d);
|
||||
val = readl(info->base + reg);
|
||||
switch (type) {
|
||||
case IRQ_TYPE_EDGE_RISING:
|
||||
val &= ~d->mask;
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
val |= d->mask;
|
||||
break;
|
||||
default:
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
writel(val, info->base + reg);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void armada_37xx_irq_handler(struct irq_desc *desc)
|
||||
{
|
||||
struct gpio_chip *gc = irq_desc_get_handler_data(desc);
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
struct armada_37xx_pinctrl *info = gpiochip_get_data(gc);
|
||||
struct irq_domain *d = gc->irqdomain;
|
||||
int i;
|
||||
|
||||
chained_irq_enter(chip, desc);
|
||||
for (i = 0; i <= d->revmap_size / GPIO_PER_REG; i++) {
|
||||
u32 status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
status = readl_relaxed(info->base + IRQ_STATUS + 4 * i);
|
||||
/* Manage only the interrupt that was enabled */
|
||||
status &= readl_relaxed(info->base + IRQ_EN + 4 * i);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
while (status) {
|
||||
u32 hwirq = ffs(status) - 1;
|
||||
u32 virq = irq_find_mapping(d, hwirq +
|
||||
i * GPIO_PER_REG);
|
||||
|
||||
generic_handle_irq(virq);
|
||||
|
||||
/* Update status in case a new IRQ appears */
|
||||
spin_lock_irqsave(&info->irq_lock, flags);
|
||||
status = readl_relaxed(info->base +
|
||||
IRQ_STATUS + 4 * i);
|
||||
/* Manage only the interrupt that was enabled */
|
||||
status &= readl_relaxed(info->base + IRQ_EN + 4 * i);
|
||||
spin_unlock_irqrestore(&info->irq_lock, flags);
|
||||
}
|
||||
}
|
||||
chained_irq_exit(chip, desc);
|
||||
}
|
||||
|
||||
static int armada_37xx_irqchip_register(struct platform_device *pdev,
|
||||
struct armada_37xx_pinctrl *info)
|
||||
{
|
||||
struct device_node *np = info->dev->of_node;
|
||||
int nrirqs = info->data->nr_pins;
|
||||
struct gpio_chip *gc = &info->gpio_chip;
|
||||
struct irq_chip *irqchip = &info->irq_chip;
|
||||
struct resource res;
|
||||
int ret = -ENODEV, i, nr_irq_parent;
|
||||
|
||||
/* Check if we have at least one gpio-controller child node */
|
||||
for_each_child_of_node(info->dev->of_node, np) {
|
||||
if (of_property_read_bool(np, "gpio-controller")) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
};
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
nr_irq_parent = of_irq_count(np);
|
||||
spin_lock_init(&info->irq_lock);
|
||||
|
||||
if (!nr_irq_parent) {
|
||||
dev_err(&pdev->dev, "Invalid or no IRQ\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (of_address_to_resource(info->dev->of_node, 1, &res)) {
|
||||
dev_err(info->dev, "cannot find IO resource\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
info->base = devm_ioremap_resource(info->dev, &res);
|
||||
if (IS_ERR(info->base))
|
||||
return PTR_ERR(info->base);
|
||||
|
||||
irqchip->irq_ack = armada_37xx_irq_ack;
|
||||
irqchip->irq_mask = armada_37xx_irq_mask;
|
||||
irqchip->irq_unmask = armada_37xx_irq_unmask;
|
||||
irqchip->irq_set_wake = armada_37xx_irq_set_wake;
|
||||
irqchip->irq_set_type = armada_37xx_irq_set_type;
|
||||
irqchip->name = info->data->name;
|
||||
|
||||
ret = gpiochip_irqchip_add(gc, irqchip, 0,
|
||||
handle_edge_irq, IRQ_TYPE_NONE);
|
||||
if (ret) {
|
||||
dev_info(&pdev->dev, "could not add irqchip\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Many interrupts are connected to the parent interrupt
|
||||
* controller. But we do not take advantage of this and use
|
||||
* the chained irq with all of them.
|
||||
*/
|
||||
for (i = 0; i < nrirqs; i++) {
|
||||
struct irq_data *d = irq_get_irq_data(gc->irq_base + i);
|
||||
|
||||
/*
|
||||
* The mask field is a "precomputed bitmask for
|
||||
* accessing the chip registers" which was introduced
|
||||
* for the generic irqchip framework. As we don't use
|
||||
* this framework, we can reuse this field for our own
|
||||
* usage.
|
||||
*/
|
||||
d->mask = BIT(i % GPIO_PER_REG);
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_irq_parent; i++) {
|
||||
int irq = irq_of_parse_and_map(np, i);
|
||||
|
||||
if (irq < 0)
|
||||
continue;
|
||||
|
||||
gpiochip_set_chained_irqchip(gc, irqchip, irq,
|
||||
armada_37xx_irq_handler);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int armada_37xx_gpiochip_register(struct platform_device *pdev,
|
||||
struct armada_37xx_pinctrl *info)
|
||||
{
|
||||
|
|
@ -494,6 +721,9 @@ static int armada_37xx_gpiochip_register(struct platform_device *pdev,
|
|||
gc->label = info->data->name;
|
||||
|
||||
ret = devm_gpiochip_add_data(&pdev->dev, gc, info);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = armada_37xx_irqchip_register(pdev, info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
140
drivers/pinctrl/mvebu/pinctrl-armada-ap806.c
Normal file
140
drivers/pinctrl/mvebu/pinctrl-armada-ap806.c
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
* Marvell Armada ap806 pinctrl driver based on mvebu pinctrl core
|
||||
*
|
||||
* Copyright (C) 2017 Marvell
|
||||
*
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
* Hanna Hawa <hannah@marvell.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
#include "pinctrl-mvebu.h"
|
||||
|
||||
static struct mvebu_mpp_mode armada_ap806_mpp_modes[] = {
|
||||
MPP_MODE(0,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "clk"),
|
||||
MPP_FUNCTION(3, "spi0", "clk")),
|
||||
MPP_MODE(1,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "cmd"),
|
||||
MPP_FUNCTION(3, "spi0", "miso")),
|
||||
MPP_MODE(2,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d0"),
|
||||
MPP_FUNCTION(3, "spi0", "mosi")),
|
||||
MPP_MODE(3,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d1"),
|
||||
MPP_FUNCTION(3, "spi0", "cs0n")),
|
||||
MPP_MODE(4,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d2"),
|
||||
MPP_FUNCTION(3, "i2c0", "sda")),
|
||||
MPP_MODE(5,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d3"),
|
||||
MPP_FUNCTION(3, "i2c0", "sdk")),
|
||||
MPP_MODE(6,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "ds")),
|
||||
MPP_MODE(7,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d4"),
|
||||
MPP_FUNCTION(3, "uart1", "rxd")),
|
||||
MPP_MODE(8,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d5"),
|
||||
MPP_FUNCTION(3, "uart1", "txd")),
|
||||
MPP_MODE(9,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d6"),
|
||||
MPP_FUNCTION(3, "spi0", "cs1n")),
|
||||
MPP_MODE(10,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "d7")),
|
||||
MPP_MODE(11,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(3, "uart0", "txd")),
|
||||
MPP_MODE(12,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "pw_off"),
|
||||
MPP_FUNCTION(2, "sdio", "hw_rst")),
|
||||
MPP_MODE(13,
|
||||
MPP_FUNCTION(0, "gpio", NULL)),
|
||||
MPP_MODE(14,
|
||||
MPP_FUNCTION(0, "gpio", NULL)),
|
||||
MPP_MODE(15,
|
||||
MPP_FUNCTION(0, "gpio", NULL)),
|
||||
MPP_MODE(16,
|
||||
MPP_FUNCTION(0, "gpio", NULL)),
|
||||
MPP_MODE(17,
|
||||
MPP_FUNCTION(0, "gpio", NULL)),
|
||||
MPP_MODE(18,
|
||||
MPP_FUNCTION(0, "gpio", NULL)),
|
||||
MPP_MODE(19,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(3, "uart0", "rxd"),
|
||||
MPP_FUNCTION(4, "sdio", "pw_off")),
|
||||
};
|
||||
|
||||
static struct mvebu_pinctrl_soc_info armada_ap806_pinctrl_info;
|
||||
|
||||
static const struct of_device_id armada_ap806_pinctrl_of_match[] = {
|
||||
{
|
||||
.compatible = "marvell,ap806-pinctrl",
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static const struct mvebu_mpp_ctrl armada_ap806_mpp_controls[] = {
|
||||
MPP_FUNC_CTRL(0, 19, NULL, mvebu_regmap_mpp_ctrl),
|
||||
};
|
||||
|
||||
static struct pinctrl_gpio_range armada_ap806_mpp_gpio_ranges[] = {
|
||||
MPP_GPIO_RANGE(0, 0, 0, 20),
|
||||
};
|
||||
|
||||
static int armada_ap806_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mvebu_pinctrl_soc_info *soc = &armada_ap806_pinctrl_info;
|
||||
const struct of_device_id *match =
|
||||
of_match_device(armada_ap806_pinctrl_of_match, &pdev->dev);
|
||||
|
||||
if (!match || !pdev->dev.parent)
|
||||
return -ENODEV;
|
||||
|
||||
soc->variant = 0; /* no variants for Armada AP806 */
|
||||
soc->controls = armada_ap806_mpp_controls;
|
||||
soc->ncontrols = ARRAY_SIZE(armada_ap806_mpp_controls);
|
||||
soc->gpioranges = armada_ap806_mpp_gpio_ranges;
|
||||
soc->ngpioranges = ARRAY_SIZE(armada_ap806_mpp_gpio_ranges);
|
||||
soc->modes = armada_ap806_mpp_modes;
|
||||
soc->nmodes = armada_ap806_mpp_controls[0].npins;
|
||||
|
||||
pdev->dev.platform_data = soc;
|
||||
|
||||
return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
|
||||
}
|
||||
|
||||
static struct platform_driver armada_ap806_pinctrl_driver = {
|
||||
.driver = {
|
||||
.name = "armada-ap806-pinctrl",
|
||||
.of_match_table = of_match_ptr(armada_ap806_pinctrl_of_match),
|
||||
},
|
||||
.probe = armada_ap806_pinctrl_probe,
|
||||
};
|
||||
|
||||
builtin_platform_driver(armada_ap806_pinctrl_driver);
|
||||
687
drivers/pinctrl/mvebu/pinctrl-armada-cp110.c
Normal file
687
drivers/pinctrl/mvebu/pinctrl-armada-cp110.c
Normal file
|
|
@ -0,0 +1,687 @@
|
|||
/*
|
||||
* Marvell Armada CP110 pinctrl driver based on mvebu pinctrl core
|
||||
*
|
||||
* Copyright (C) 2017 Marvell
|
||||
*
|
||||
* Hanna Hawa <hannah@marvell.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "pinctrl-mvebu.h"
|
||||
|
||||
/*
|
||||
* Even if the pin controller is the same the MMP available depend on the SoC
|
||||
* integration.
|
||||
* - In Armada7K (single CP) almost all the MPPs are available (except the
|
||||
* MMP 39 to 43)
|
||||
* - In Armada8K (dual CP) the MPPs are split into 2 parts, MPPs 0-31 from
|
||||
* CPS, and MPPs 32-62 from CPM, the below flags (V_ARMADA_8K_CPM,
|
||||
* V_ARMADA_8K_CPS) set which MPP is available to the CPx.
|
||||
* The x_PLUS enum mean that the MPP available for CPx and for Armada70x0
|
||||
*/
|
||||
enum {
|
||||
V_ARMADA_7K = BIT(0),
|
||||
V_ARMADA_8K_CPM = BIT(1),
|
||||
V_ARMADA_8K_CPS = BIT(2),
|
||||
V_ARMADA_7K_8K_CPM = (V_ARMADA_7K | V_ARMADA_8K_CPM),
|
||||
V_ARMADA_7K_8K_CPS = (V_ARMADA_7K | V_ARMADA_8K_CPS),
|
||||
};
|
||||
|
||||
static struct mvebu_mpp_mode armada_cp110_mpp_modes[] = {
|
||||
MPP_MODE(0,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ale1"),
|
||||
MPP_FUNCTION(2, "au", "i2smclk"),
|
||||
MPP_FUNCTION(3, "ge0", "rxd3"),
|
||||
MPP_FUNCTION(4, "tdm", "pclk"),
|
||||
MPP_FUNCTION(6, "ptp", "pulse"),
|
||||
MPP_FUNCTION(7, "mss_i2c", "sda"),
|
||||
MPP_FUNCTION(8, "uart0", "rxd"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "ge", "mdio")),
|
||||
MPP_MODE(1,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ale0"),
|
||||
MPP_FUNCTION(2, "au", "i2sdo_spdifo"),
|
||||
MPP_FUNCTION(3, "ge0", "rxd2"),
|
||||
MPP_FUNCTION(4, "tdm", "drx"),
|
||||
MPP_FUNCTION(6, "ptp", "clk"),
|
||||
MPP_FUNCTION(7, "mss_i2c", "sck"),
|
||||
MPP_FUNCTION(8, "uart0", "txd"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "ge", "mdc")),
|
||||
MPP_MODE(2,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad15"),
|
||||
MPP_FUNCTION(2, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(3, "ge0", "rxd1"),
|
||||
MPP_FUNCTION(4, "tdm", "dtx"),
|
||||
MPP_FUNCTION(5, "mss_uart", "rxd"),
|
||||
MPP_FUNCTION(6, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(7, "i2c1", "sck"),
|
||||
MPP_FUNCTION(8, "uart1", "rxd"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "xg", "mdc")),
|
||||
MPP_MODE(3,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad14"),
|
||||
MPP_FUNCTION(2, "au", "i2slrclk"),
|
||||
MPP_FUNCTION(3, "ge0", "rxd0"),
|
||||
MPP_FUNCTION(4, "tdm", "fsync"),
|
||||
MPP_FUNCTION(5, "mss_uart", "txd"),
|
||||
MPP_FUNCTION(6, "pcie", "rstoutn"),
|
||||
MPP_FUNCTION(7, "i2c1", "sda"),
|
||||
MPP_FUNCTION(8, "uart1", "txd"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "xg", "mdio")),
|
||||
MPP_MODE(4,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad13"),
|
||||
MPP_FUNCTION(2, "au", "i2sbclk"),
|
||||
MPP_FUNCTION(3, "ge0", "rxctl"),
|
||||
MPP_FUNCTION(4, "tdm", "rstn"),
|
||||
MPP_FUNCTION(5, "mss_uart", "rxd"),
|
||||
MPP_FUNCTION(6, "uart1", "cts"),
|
||||
MPP_FUNCTION(7, "pcie0", "clkreq"),
|
||||
MPP_FUNCTION(8, "uart3", "rxd"),
|
||||
MPP_FUNCTION(10, "ge", "mdc")),
|
||||
MPP_MODE(5,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad12"),
|
||||
MPP_FUNCTION(2, "au", "i2sdi"),
|
||||
MPP_FUNCTION(3, "ge0", "rxclk"),
|
||||
MPP_FUNCTION(4, "tdm", "intn"),
|
||||
MPP_FUNCTION(5, "mss_uart", "txd"),
|
||||
MPP_FUNCTION(6, "uart1", "rts"),
|
||||
MPP_FUNCTION(7, "pcie1", "clkreq"),
|
||||
MPP_FUNCTION(8, "uart3", "txd"),
|
||||
MPP_FUNCTION(10, "ge", "mdio")),
|
||||
MPP_MODE(6,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad11"),
|
||||
MPP_FUNCTION(3, "ge0", "txd3"),
|
||||
MPP_FUNCTION(4, "spi0", "csn2"),
|
||||
MPP_FUNCTION(5, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(6, "sata1", "present_act"),
|
||||
MPP_FUNCTION(7, "pcie2", "clkreq"),
|
||||
MPP_FUNCTION(8, "uart0", "rxd"),
|
||||
MPP_FUNCTION(9, "ptp", "pulse")),
|
||||
MPP_MODE(7,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad10"),
|
||||
MPP_FUNCTION(3, "ge0", "txd2"),
|
||||
MPP_FUNCTION(4, "spi0", "csn1"),
|
||||
MPP_FUNCTION(5, "spi1", "csn1"),
|
||||
MPP_FUNCTION(6, "sata0", "present_act"),
|
||||
MPP_FUNCTION(7, "led", "data"),
|
||||
MPP_FUNCTION(8, "uart0", "txd"),
|
||||
MPP_FUNCTION(9, "ptp", "clk")),
|
||||
MPP_MODE(8,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad9"),
|
||||
MPP_FUNCTION(3, "ge0", "txd1"),
|
||||
MPP_FUNCTION(4, "spi0", "csn0"),
|
||||
MPP_FUNCTION(5, "spi1", "csn0"),
|
||||
MPP_FUNCTION(6, "uart0", "cts"),
|
||||
MPP_FUNCTION(7, "led", "stb"),
|
||||
MPP_FUNCTION(8, "uart2", "rxd"),
|
||||
MPP_FUNCTION(9, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(10, "synce1", "clk")),
|
||||
MPP_MODE(9,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad8"),
|
||||
MPP_FUNCTION(3, "ge0", "txd0"),
|
||||
MPP_FUNCTION(4, "spi0", "mosi"),
|
||||
MPP_FUNCTION(5, "spi1", "mosi"),
|
||||
MPP_FUNCTION(7, "pcie", "rstoutn"),
|
||||
MPP_FUNCTION(10, "synce2", "clk")),
|
||||
MPP_MODE(10,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "readyn"),
|
||||
MPP_FUNCTION(3, "ge0", "txctl"),
|
||||
MPP_FUNCTION(4, "spi0", "miso"),
|
||||
MPP_FUNCTION(5, "spi1", "miso"),
|
||||
MPP_FUNCTION(6, "uart0", "cts"),
|
||||
MPP_FUNCTION(7, "sata1", "present_act")),
|
||||
MPP_MODE(11,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "wen1"),
|
||||
MPP_FUNCTION(3, "ge0", "txclkout"),
|
||||
MPP_FUNCTION(4, "spi0", "clk"),
|
||||
MPP_FUNCTION(5, "spi1", "clk"),
|
||||
MPP_FUNCTION(6, "uart0", "rts"),
|
||||
MPP_FUNCTION(7, "led", "clk"),
|
||||
MPP_FUNCTION(8, "uart2", "txd"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act")),
|
||||
MPP_MODE(12,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "clk_out"),
|
||||
MPP_FUNCTION(2, "nf", "rbn1"),
|
||||
MPP_FUNCTION(3, "spi1", "csn1"),
|
||||
MPP_FUNCTION(4, "ge0", "rxclk")),
|
||||
MPP_MODE(13,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "burstn"),
|
||||
MPP_FUNCTION(2, "nf", "rbn0"),
|
||||
MPP_FUNCTION(3, "spi1", "miso"),
|
||||
MPP_FUNCTION(4, "ge0", "rxctl"),
|
||||
MPP_FUNCTION(8, "mss_spi", "miso")),
|
||||
MPP_MODE(14,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "bootcsn"),
|
||||
MPP_FUNCTION(2, "dev", "csn0"),
|
||||
MPP_FUNCTION(3, "spi1", "csn0"),
|
||||
MPP_FUNCTION(4, "spi0", "csn3"),
|
||||
MPP_FUNCTION(5, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(6, "spi0", "miso"),
|
||||
MPP_FUNCTION(7, "sata0", "present_act"),
|
||||
MPP_FUNCTION(8, "mss_spi", "csn")),
|
||||
MPP_MODE(15,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad7"),
|
||||
MPP_FUNCTION(3, "spi1", "mosi"),
|
||||
MPP_FUNCTION(6, "spi0", "mosi"),
|
||||
MPP_FUNCTION(8, "mss_spi", "mosi"),
|
||||
MPP_FUNCTION(11, "ptp", "pulse_cp2cp")),
|
||||
MPP_MODE(16,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad6"),
|
||||
MPP_FUNCTION(3, "spi1", "clk"),
|
||||
MPP_FUNCTION(8, "mss_spi", "clk")),
|
||||
MPP_MODE(17,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad5"),
|
||||
MPP_FUNCTION(4, "ge0", "txd3")),
|
||||
MPP_MODE(18,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad4"),
|
||||
MPP_FUNCTION(4, "ge0", "txd2"),
|
||||
MPP_FUNCTION(11, "ptp", "clk_cp2cp")),
|
||||
MPP_MODE(19,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad3"),
|
||||
MPP_FUNCTION(4, "ge0", "txd1"),
|
||||
MPP_FUNCTION(11, "wakeup", "out_cp2cp")),
|
||||
MPP_MODE(20,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad2"),
|
||||
MPP_FUNCTION(4, "ge0", "txd0")),
|
||||
MPP_MODE(21,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad1"),
|
||||
MPP_FUNCTION(4, "ge0", "txctl"),
|
||||
MPP_FUNCTION(11, "sei", "in_cp2cp")),
|
||||
MPP_MODE(22,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "ad0"),
|
||||
MPP_FUNCTION(4, "ge0", "txclkout"),
|
||||
MPP_FUNCTION(11, "wakeup", "in_cp2cp")),
|
||||
MPP_MODE(23,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "a1"),
|
||||
MPP_FUNCTION(5, "au", "i2smclk"),
|
||||
MPP_FUNCTION(11, "link", "rd_in_cp2cp")),
|
||||
MPP_MODE(24,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "a0"),
|
||||
MPP_FUNCTION(5, "au", "i2slrclk")),
|
||||
MPP_MODE(25,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "oen"),
|
||||
MPP_FUNCTION(5, "au", "i2sdo_spdifo")),
|
||||
MPP_MODE(26,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "wen0"),
|
||||
MPP_FUNCTION(5, "au", "i2sbclk")),
|
||||
MPP_MODE(27,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "csn0"),
|
||||
MPP_FUNCTION(2, "spi1", "miso"),
|
||||
MPP_FUNCTION(3, "mss_gpio4", NULL),
|
||||
MPP_FUNCTION(4, "ge0", "rxd3"),
|
||||
MPP_FUNCTION(5, "spi0", "csn4"),
|
||||
MPP_FUNCTION(8, "ge", "mdio"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "uart0", "rts"),
|
||||
MPP_FUNCTION(11, "rei", "in_cp2cp")),
|
||||
MPP_MODE(28,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "csn1"),
|
||||
MPP_FUNCTION(2, "spi1", "csn0"),
|
||||
MPP_FUNCTION(3, "mss_gpio5", NULL),
|
||||
MPP_FUNCTION(4, "ge0", "rxd2"),
|
||||
MPP_FUNCTION(5, "spi0", "csn5"),
|
||||
MPP_FUNCTION(6, "pcie2", "clkreq"),
|
||||
MPP_FUNCTION(7, "ptp", "pulse"),
|
||||
MPP_FUNCTION(8, "ge", "mdc"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "uart0", "cts"),
|
||||
MPP_FUNCTION(11, "led", "data")),
|
||||
MPP_MODE(29,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "csn2"),
|
||||
MPP_FUNCTION(2, "spi1", "mosi"),
|
||||
MPP_FUNCTION(3, "mss_gpio6", NULL),
|
||||
MPP_FUNCTION(4, "ge0", "rxd1"),
|
||||
MPP_FUNCTION(5, "spi0", "csn6"),
|
||||
MPP_FUNCTION(6, "pcie1", "clkreq"),
|
||||
MPP_FUNCTION(7, "ptp", "clk"),
|
||||
MPP_FUNCTION(8, "mss_i2c", "sda"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "uart0", "rxd"),
|
||||
MPP_FUNCTION(11, "led", "stb")),
|
||||
MPP_MODE(30,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "csn3"),
|
||||
MPP_FUNCTION(2, "spi1", "clk"),
|
||||
MPP_FUNCTION(3, "mss_gpio7", NULL),
|
||||
MPP_FUNCTION(4, "ge0", "rxd0"),
|
||||
MPP_FUNCTION(5, "spi0", "csn7"),
|
||||
MPP_FUNCTION(6, "pcie0", "clkreq"),
|
||||
MPP_FUNCTION(7, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(8, "mss_i2c", "sck"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "uart0", "txd"),
|
||||
MPP_FUNCTION(11, "led", "clk")),
|
||||
MPP_MODE(31,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "dev", "a2"),
|
||||
MPP_FUNCTION(3, "mss_gpio4", NULL),
|
||||
MPP_FUNCTION(6, "pcie", "rstoutn"),
|
||||
MPP_FUNCTION(8, "ge", "mdc")),
|
||||
MPP_MODE(32,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mii", "col"),
|
||||
MPP_FUNCTION(2, "mii", "txerr"),
|
||||
MPP_FUNCTION(3, "mss_spi", "miso"),
|
||||
MPP_FUNCTION(4, "tdm", "drx"),
|
||||
MPP_FUNCTION(5, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(6, "au", "i2sdi"),
|
||||
MPP_FUNCTION(7, "ge", "mdio"),
|
||||
MPP_FUNCTION(8, "sdio", "v18_en"),
|
||||
MPP_FUNCTION(9, "pcie1", "clkreq"),
|
||||
MPP_FUNCTION(10, "mss_gpio0", NULL)),
|
||||
MPP_MODE(33,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mii", "txclk"),
|
||||
MPP_FUNCTION(2, "sdio", "pwr10"),
|
||||
MPP_FUNCTION(3, "mss_spi", "csn"),
|
||||
MPP_FUNCTION(4, "tdm", "fsync"),
|
||||
MPP_FUNCTION(5, "au", "i2smclk"),
|
||||
MPP_FUNCTION(6, "sdio", "bus_pwr"),
|
||||
MPP_FUNCTION(8, "xg", "mdio"),
|
||||
MPP_FUNCTION(9, "pcie2", "clkreq"),
|
||||
MPP_FUNCTION(10, "mss_gpio1", NULL)),
|
||||
MPP_MODE(34,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mii", "rxerr"),
|
||||
MPP_FUNCTION(2, "sdio", "pwr11"),
|
||||
MPP_FUNCTION(3, "mss_spi", "mosi"),
|
||||
MPP_FUNCTION(4, "tdm", "dtx"),
|
||||
MPP_FUNCTION(5, "au", "i2slrclk"),
|
||||
MPP_FUNCTION(6, "sdio", "wr_protect"),
|
||||
MPP_FUNCTION(7, "ge", "mdc"),
|
||||
MPP_FUNCTION(9, "pcie0", "clkreq"),
|
||||
MPP_FUNCTION(10, "mss_gpio2", NULL)),
|
||||
MPP_MODE(35,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sata1", "present_act"),
|
||||
MPP_FUNCTION(2, "i2c1", "sda"),
|
||||
MPP_FUNCTION(3, "mss_spi", "clk"),
|
||||
MPP_FUNCTION(4, "tdm", "pclk"),
|
||||
MPP_FUNCTION(5, "au", "i2sdo_spdifo"),
|
||||
MPP_FUNCTION(6, "sdio", "card_detect"),
|
||||
MPP_FUNCTION(7, "xg", "mdio"),
|
||||
MPP_FUNCTION(8, "ge", "mdio"),
|
||||
MPP_FUNCTION(9, "pcie", "rstoutn"),
|
||||
MPP_FUNCTION(10, "mss_gpio3", NULL)),
|
||||
MPP_MODE(36,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "synce2", "clk"),
|
||||
MPP_FUNCTION(2, "i2c1", "sck"),
|
||||
MPP_FUNCTION(3, "ptp", "clk"),
|
||||
MPP_FUNCTION(4, "synce1", "clk"),
|
||||
MPP_FUNCTION(5, "au", "i2sbclk"),
|
||||
MPP_FUNCTION(6, "sata0", "present_act"),
|
||||
MPP_FUNCTION(7, "xg", "mdc"),
|
||||
MPP_FUNCTION(8, "ge", "mdc"),
|
||||
MPP_FUNCTION(9, "pcie2", "clkreq"),
|
||||
MPP_FUNCTION(10, "mss_gpio5", NULL)),
|
||||
MPP_MODE(37,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "uart2", "rxd"),
|
||||
MPP_FUNCTION(2, "i2c0", "sck"),
|
||||
MPP_FUNCTION(3, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(4, "tdm", "intn"),
|
||||
MPP_FUNCTION(5, "mss_i2c", "sck"),
|
||||
MPP_FUNCTION(6, "sata1", "present_act"),
|
||||
MPP_FUNCTION(7, "ge", "mdc"),
|
||||
MPP_FUNCTION(8, "xg", "mdc"),
|
||||
MPP_FUNCTION(9, "pcie1", "clkreq"),
|
||||
MPP_FUNCTION(10, "mss_gpio6", NULL),
|
||||
MPP_FUNCTION(11, "link", "rd_out_cp2cp")),
|
||||
MPP_MODE(38,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "uart2", "txd"),
|
||||
MPP_FUNCTION(2, "i2c0", "sda"),
|
||||
MPP_FUNCTION(3, "ptp", "pulse"),
|
||||
MPP_FUNCTION(4, "tdm", "rstn"),
|
||||
MPP_FUNCTION(5, "mss_i2c", "sda"),
|
||||
MPP_FUNCTION(6, "sata0", "present_act"),
|
||||
MPP_FUNCTION(7, "ge", "mdio"),
|
||||
MPP_FUNCTION(8, "xg", "mdio"),
|
||||
MPP_FUNCTION(9, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(10, "mss_gpio7", NULL),
|
||||
MPP_FUNCTION(11, "ptp", "pulse_cp2cp")),
|
||||
MPP_MODE(39,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "wr_protect"),
|
||||
MPP_FUNCTION(4, "au", "i2sbclk"),
|
||||
MPP_FUNCTION(5, "ptp", "clk"),
|
||||
MPP_FUNCTION(6, "spi0", "csn1"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "mss_gpio0", NULL)),
|
||||
MPP_MODE(40,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "pwr11"),
|
||||
MPP_FUNCTION(2, "synce1", "clk"),
|
||||
MPP_FUNCTION(3, "mss_i2c", "sda"),
|
||||
MPP_FUNCTION(4, "au", "i2sdo_spdifo"),
|
||||
MPP_FUNCTION(5, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(6, "spi0", "clk"),
|
||||
MPP_FUNCTION(7, "uart1", "txd"),
|
||||
MPP_FUNCTION(8, "ge", "mdio"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "mss_gpio1", NULL)),
|
||||
MPP_MODE(41,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "pwr10"),
|
||||
MPP_FUNCTION(2, "sdio", "bus_pwr"),
|
||||
MPP_FUNCTION(3, "mss_i2c", "sck"),
|
||||
MPP_FUNCTION(4, "au", "i2slrclk"),
|
||||
MPP_FUNCTION(5, "ptp", "pulse"),
|
||||
MPP_FUNCTION(6, "spi0", "mosi"),
|
||||
MPP_FUNCTION(7, "uart1", "rxd"),
|
||||
MPP_FUNCTION(8, "ge", "mdc"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "mss_gpio2", NULL),
|
||||
MPP_FUNCTION(11, "rei", "out_cp2cp")),
|
||||
MPP_MODE(42,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "v18_en"),
|
||||
MPP_FUNCTION(2, "sdio", "wr_protect"),
|
||||
MPP_FUNCTION(3, "synce2", "clk"),
|
||||
MPP_FUNCTION(4, "au", "i2smclk"),
|
||||
MPP_FUNCTION(5, "mss_uart", "txd"),
|
||||
MPP_FUNCTION(6, "spi0", "miso"),
|
||||
MPP_FUNCTION(7, "uart1", "cts"),
|
||||
MPP_FUNCTION(8, "xg", "mdc"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "mss_gpio4", NULL)),
|
||||
MPP_MODE(43,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "sdio", "card_detect"),
|
||||
MPP_FUNCTION(3, "synce1", "clk"),
|
||||
MPP_FUNCTION(4, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(5, "mss_uart", "rxd"),
|
||||
MPP_FUNCTION(6, "spi0", "csn0"),
|
||||
MPP_FUNCTION(7, "uart1", "rts"),
|
||||
MPP_FUNCTION(8, "xg", "mdio"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "mss_gpio5", NULL),
|
||||
MPP_FUNCTION(11, "wakeup", "out_cp2cp")),
|
||||
MPP_MODE(44,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "txd2"),
|
||||
MPP_FUNCTION(7, "uart0", "rts"),
|
||||
MPP_FUNCTION(11, "ptp", "clk_cp2cp")),
|
||||
MPP_MODE(45,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "txd3"),
|
||||
MPP_FUNCTION(7, "uart0", "txd"),
|
||||
MPP_FUNCTION(9, "pcie", "rstoutn")),
|
||||
MPP_MODE(46,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "txd1"),
|
||||
MPP_FUNCTION(7, "uart1", "rts")),
|
||||
MPP_MODE(47,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "txd0"),
|
||||
MPP_FUNCTION(5, "spi1", "clk"),
|
||||
MPP_FUNCTION(7, "uart1", "txd"),
|
||||
MPP_FUNCTION(8, "ge", "mdc")),
|
||||
MPP_MODE(48,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "txctl_txen"),
|
||||
MPP_FUNCTION(5, "spi1", "mosi"),
|
||||
MPP_FUNCTION(8, "xg", "mdc"),
|
||||
MPP_FUNCTION(11, "wakeup", "in_cp2cp")),
|
||||
MPP_MODE(49,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "txclkout"),
|
||||
MPP_FUNCTION(2, "mii", "crs"),
|
||||
MPP_FUNCTION(5, "spi1", "miso"),
|
||||
MPP_FUNCTION(7, "uart1", "rxd"),
|
||||
MPP_FUNCTION(8, "ge", "mdio"),
|
||||
MPP_FUNCTION(9, "pcie0", "clkreq"),
|
||||
MPP_FUNCTION(10, "sdio", "v18_en"),
|
||||
MPP_FUNCTION(11, "sei", "out_cp2cp")),
|
||||
MPP_MODE(50,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "rxclk"),
|
||||
MPP_FUNCTION(2, "mss_i2c", "sda"),
|
||||
MPP_FUNCTION(5, "spi1", "csn0"),
|
||||
MPP_FUNCTION(6, "uart2", "txd"),
|
||||
MPP_FUNCTION(7, "uart0", "rxd"),
|
||||
MPP_FUNCTION(8, "xg", "mdio"),
|
||||
MPP_FUNCTION(10, "sdio", "pwr11")),
|
||||
MPP_MODE(51,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "rxd0"),
|
||||
MPP_FUNCTION(2, "mss_i2c", "sck"),
|
||||
MPP_FUNCTION(5, "spi1", "csn1"),
|
||||
MPP_FUNCTION(6, "uart2", "rxd"),
|
||||
MPP_FUNCTION(7, "uart0", "cts"),
|
||||
MPP_FUNCTION(10, "sdio", "pwr10")),
|
||||
MPP_MODE(52,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "rxd1"),
|
||||
MPP_FUNCTION(2, "synce1", "clk"),
|
||||
MPP_FUNCTION(4, "synce2", "clk"),
|
||||
MPP_FUNCTION(5, "spi1", "csn2"),
|
||||
MPP_FUNCTION(7, "uart1", "cts"),
|
||||
MPP_FUNCTION(8, "led", "clk"),
|
||||
MPP_FUNCTION(9, "pcie", "rstoutn"),
|
||||
MPP_FUNCTION(10, "pcie0", "clkreq")),
|
||||
MPP_MODE(53,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "rxd2"),
|
||||
MPP_FUNCTION(3, "ptp", "clk"),
|
||||
MPP_FUNCTION(5, "spi1", "csn3"),
|
||||
MPP_FUNCTION(7, "uart1", "rxd"),
|
||||
MPP_FUNCTION(8, "led", "stb"),
|
||||
MPP_FUNCTION(11, "sdio", "led")),
|
||||
MPP_MODE(54,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "rxd3"),
|
||||
MPP_FUNCTION(2, "synce2", "clk"),
|
||||
MPP_FUNCTION(3, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(4, "synce1", "clk"),
|
||||
MPP_FUNCTION(8, "led", "data"),
|
||||
MPP_FUNCTION(10, "sdio", "hw_rst"),
|
||||
MPP_FUNCTION(11, "sdio", "wr_protect")),
|
||||
MPP_MODE(55,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "ge1", "rxctl_rxdv"),
|
||||
MPP_FUNCTION(3, "ptp", "pulse"),
|
||||
MPP_FUNCTION(10, "sdio", "led"),
|
||||
MPP_FUNCTION(11, "sdio", "card_detect")),
|
||||
MPP_MODE(56,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(4, "tdm", "drx"),
|
||||
MPP_FUNCTION(5, "au", "i2sdo_spdifo"),
|
||||
MPP_FUNCTION(6, "spi0", "clk"),
|
||||
MPP_FUNCTION(7, "uart1", "rxd"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(14, "sdio", "clk")),
|
||||
MPP_MODE(57,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(2, "mss_i2c", "sda"),
|
||||
MPP_FUNCTION(3, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(4, "tdm", "intn"),
|
||||
MPP_FUNCTION(5, "au", "i2sbclk"),
|
||||
MPP_FUNCTION(6, "spi0", "mosi"),
|
||||
MPP_FUNCTION(7, "uart1", "txd"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(14, "sdio", "cmd")),
|
||||
MPP_MODE(58,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(2, "mss_i2c", "sck"),
|
||||
MPP_FUNCTION(3, "ptp", "clk"),
|
||||
MPP_FUNCTION(4, "tdm", "rstn"),
|
||||
MPP_FUNCTION(5, "au", "i2sdi"),
|
||||
MPP_FUNCTION(6, "spi0", "miso"),
|
||||
MPP_FUNCTION(7, "uart1", "cts"),
|
||||
MPP_FUNCTION(8, "led", "clk"),
|
||||
MPP_FUNCTION(14, "sdio", "d0")),
|
||||
MPP_MODE(59,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mss_gpio7", NULL),
|
||||
MPP_FUNCTION(2, "synce2", "clk"),
|
||||
MPP_FUNCTION(4, "tdm", "fsync"),
|
||||
MPP_FUNCTION(5, "au", "i2slrclk"),
|
||||
MPP_FUNCTION(6, "spi0", "csn0"),
|
||||
MPP_FUNCTION(7, "uart0", "cts"),
|
||||
MPP_FUNCTION(8, "led", "stb"),
|
||||
MPP_FUNCTION(9, "uart1", "txd"),
|
||||
MPP_FUNCTION(14, "sdio", "d1")),
|
||||
MPP_MODE(60,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mss_gpio6", NULL),
|
||||
MPP_FUNCTION(3, "ptp", "pulse"),
|
||||
MPP_FUNCTION(4, "tdm", "dtx"),
|
||||
MPP_FUNCTION(5, "au", "i2smclk"),
|
||||
MPP_FUNCTION(6, "spi0", "csn1"),
|
||||
MPP_FUNCTION(7, "uart0", "rts"),
|
||||
MPP_FUNCTION(8, "led", "data"),
|
||||
MPP_FUNCTION(9, "uart1", "rxd"),
|
||||
MPP_FUNCTION(14, "sdio", "d2")),
|
||||
MPP_MODE(61,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mss_gpio5", NULL),
|
||||
MPP_FUNCTION(3, "ptp", "clk"),
|
||||
MPP_FUNCTION(4, "tdm", "pclk"),
|
||||
MPP_FUNCTION(5, "au", "i2sextclk"),
|
||||
MPP_FUNCTION(6, "spi0", "csn2"),
|
||||
MPP_FUNCTION(7, "uart0", "txd"),
|
||||
MPP_FUNCTION(8, "uart2", "txd"),
|
||||
MPP_FUNCTION(9, "sata1", "present_act"),
|
||||
MPP_FUNCTION(10, "ge", "mdio"),
|
||||
MPP_FUNCTION(14, "sdio", "d3")),
|
||||
MPP_MODE(62,
|
||||
MPP_FUNCTION(0, "gpio", NULL),
|
||||
MPP_FUNCTION(1, "mss_gpio4", NULL),
|
||||
MPP_FUNCTION(2, "synce1", "clk"),
|
||||
MPP_FUNCTION(3, "ptp", "pclk_out"),
|
||||
MPP_FUNCTION(5, "sata1", "present_act"),
|
||||
MPP_FUNCTION(6, "spi0", "csn3"),
|
||||
MPP_FUNCTION(7, "uart0", "rxd"),
|
||||
MPP_FUNCTION(8, "uart2", "rxd"),
|
||||
MPP_FUNCTION(9, "sata0", "present_act"),
|
||||
MPP_FUNCTION(10, "ge", "mdc")),
|
||||
};
|
||||
|
||||
static const struct of_device_id armada_cp110_pinctrl_of_match[] = {
|
||||
{
|
||||
.compatible = "marvell,armada-7k-pinctrl",
|
||||
.data = (void *) V_ARMADA_7K,
|
||||
},
|
||||
{
|
||||
.compatible = "marvell,armada-8k-cpm-pinctrl",
|
||||
.data = (void *) V_ARMADA_8K_CPM,
|
||||
},
|
||||
{
|
||||
.compatible = "marvell,armada-8k-cps-pinctrl",
|
||||
.data = (void *) V_ARMADA_8K_CPS,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls[] = {
|
||||
MPP_FUNC_CTRL(0, 62, NULL, mvebu_regmap_mpp_ctrl),
|
||||
};
|
||||
|
||||
static void mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode *m,
|
||||
u8 variant)
|
||||
{
|
||||
struct mvebu_mpp_ctrl_setting *s;
|
||||
|
||||
for (s = m->settings ; s->name ; s++)
|
||||
s->variant = variant;
|
||||
}
|
||||
|
||||
static int armada_cp110_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mvebu_pinctrl_soc_info *soc;
|
||||
const struct of_device_id *match =
|
||||
of_match_device(armada_cp110_pinctrl_of_match, &pdev->dev);
|
||||
int i;
|
||||
|
||||
if (!pdev->dev.parent)
|
||||
return -ENODEV;
|
||||
|
||||
soc = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct mvebu_pinctrl_soc_info), GFP_KERNEL);
|
||||
if (!soc)
|
||||
return -ENOMEM;
|
||||
|
||||
soc->variant = (unsigned long) match->data & 0xff;
|
||||
soc->controls = armada_cp110_mpp_controls;
|
||||
soc->ncontrols = ARRAY_SIZE(armada_cp110_mpp_controls);
|
||||
soc->modes = armada_cp110_mpp_modes;
|
||||
soc->nmodes = ARRAY_SIZE(armada_cp110_mpp_modes);
|
||||
for (i = 0; i < ARRAY_SIZE(armada_cp110_mpp_modes); i++) {
|
||||
struct mvebu_mpp_mode *m = &armada_cp110_mpp_modes[i];
|
||||
|
||||
switch (i) {
|
||||
case 0 ... 31:
|
||||
mvebu_pinctrl_assign_variant(m, V_ARMADA_7K_8K_CPS);
|
||||
break;
|
||||
case 32 ... 38:
|
||||
mvebu_pinctrl_assign_variant(m, V_ARMADA_7K_8K_CPM);
|
||||
break;
|
||||
case 39 ... 43:
|
||||
mvebu_pinctrl_assign_variant(m, V_ARMADA_8K_CPM);
|
||||
break;
|
||||
case 44 ... 62:
|
||||
mvebu_pinctrl_assign_variant(m, V_ARMADA_7K_8K_CPM);
|
||||
break;
|
||||
}
|
||||
}
|
||||
pdev->dev.platform_data = soc;
|
||||
|
||||
return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
|
||||
}
|
||||
|
||||
static struct platform_driver armada_cp110_pinctrl_driver = {
|
||||
.driver = {
|
||||
.name = "armada-cp110-pinctrl",
|
||||
.of_match_table = of_match_ptr(armada_cp110_pinctrl_of_match),
|
||||
},
|
||||
.probe = armada_cp110_pinctrl_probe,
|
||||
};
|
||||
|
||||
builtin_platform_driver(armada_cp110_pinctrl_driver);
|
||||
|
|
@ -810,21 +810,17 @@ int mvebu_regmap_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
|
|||
}
|
||||
|
||||
int mvebu_pinctrl_simple_regmap_probe(struct platform_device *pdev,
|
||||
struct device *syscon_dev)
|
||||
struct device *syscon_dev, u32 offset)
|
||||
{
|
||||
struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
|
||||
struct mvebu_mpp_ctrl_data *mpp_data;
|
||||
struct regmap *regmap;
|
||||
u32 offset;
|
||||
int i;
|
||||
|
||||
regmap = syscon_node_to_regmap(syscon_dev->of_node);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
|
||||
if (of_property_read_u32(pdev->dev.of_node, "offset", &offset))
|
||||
return -EINVAL;
|
||||
|
||||
mpp_data = devm_kcalloc(&pdev->dev, soc->ncontrols, sizeof(*mpp_data),
|
||||
GFP_KERNEL);
|
||||
if (!mpp_data)
|
||||
|
|
|
|||
|
|
@ -210,6 +210,6 @@ int mvebu_regmap_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data, unsigned pid,
|
|||
int mvebu_pinctrl_probe(struct platform_device *pdev);
|
||||
int mvebu_pinctrl_simple_mmio_probe(struct platform_device *pdev);
|
||||
int mvebu_pinctrl_simple_regmap_probe(struct platform_device *pdev,
|
||||
struct device *syscon_dev);
|
||||
struct device *syscon_dev, u32 offset);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ static const struct pin_config_item conf_items[] = {
|
|||
PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT, "input schmitt trigger", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT_ENABLE, "input schmitt enabled", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_LOW_POWER_MODE, "pin low power", "mode", true),
|
||||
PCONFDUMP(PIN_CONFIG_OUTPUT_ENABLE, "output enabled", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_OUTPUT, "pin output", "level", true),
|
||||
PCONFDUMP(PIN_CONFIG_POWER_SOURCE, "pin power source", "selector", true),
|
||||
PCONFDUMP(PIN_CONFIG_SLEW_RATE, "slew rate", NULL, true),
|
||||
|
|
@ -172,6 +173,8 @@ static const struct pinconf_generic_params dt_params[] = {
|
|||
{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
|
||||
{ "low-power-disable", PIN_CONFIG_LOW_POWER_MODE, 0 },
|
||||
{ "low-power-enable", PIN_CONFIG_LOW_POWER_MODE, 1 },
|
||||
{ "output-disable", PIN_CONFIG_OUTPUT_ENABLE, 0 },
|
||||
{ "output-enable", PIN_CONFIG_OUTPUT_ENABLE, 1 },
|
||||
{ "output-high", PIN_CONFIG_OUTPUT, 1, },
|
||||
{ "output-low", PIN_CONFIG_OUTPUT, 0, },
|
||||
{ "power-source", PIN_CONFIG_POWER_SOURCE, 0 },
|
||||
|
|
|
|||
|
|
@ -87,9 +87,8 @@ int pin_config_group_get(const char *dev_name, const char *pin_group,
|
|||
ops = pctldev->desc->confops;
|
||||
|
||||
if (!ops || !ops->pin_config_group_get) {
|
||||
dev_dbg(pctldev->dev, "cannot get configuration for pin "
|
||||
"group, missing group config get function in "
|
||||
"driver\n");
|
||||
dev_dbg(pctldev->dev,
|
||||
"cannot get configuration for pin group, missing group config get function in driver\n");
|
||||
ret = -ENOTSUPP;
|
||||
goto unlock;
|
||||
}
|
||||
|
|
@ -232,7 +231,7 @@ static void pinconf_show_config(struct seq_file *s, struct pinctrl_dev *pctldev,
|
|||
configs[i]);
|
||||
else
|
||||
seq_printf(s, "%08lx", configs[i]);
|
||||
seq_puts(s, "\n");
|
||||
seq_putc(s, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -244,10 +243,10 @@ void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map)
|
|||
|
||||
switch (map->type) {
|
||||
case PIN_MAP_TYPE_CONFIGS_PIN:
|
||||
seq_printf(s, "pin ");
|
||||
seq_puts(s, "pin ");
|
||||
break;
|
||||
case PIN_MAP_TYPE_CONFIGS_GROUP:
|
||||
seq_printf(s, "group ");
|
||||
seq_puts(s, "group ");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -319,14 +318,13 @@ static int pinconf_pins_show(struct seq_file *s, void *what)
|
|||
pin = pctldev->desc->pins[i].number;
|
||||
desc = pin_desc_get(pctldev, pin);
|
||||
/* Skip if we cannot search the pin */
|
||||
if (desc == NULL)
|
||||
if (!desc)
|
||||
continue;
|
||||
|
||||
seq_printf(s, "pin %d (%s): ", pin, desc->name);
|
||||
|
||||
pinconf_dump_pin(pctldev, s, pin);
|
||||
|
||||
seq_printf(s, "\n");
|
||||
seq_putc(s, '\n');
|
||||
}
|
||||
|
||||
mutex_unlock(&pctldev->mutex);
|
||||
|
|
@ -361,8 +359,7 @@ static int pinconf_groups_show(struct seq_file *s, void *what)
|
|||
|
||||
seq_printf(s, "%u (%s): ", selector, gname);
|
||||
pinconf_dump_group(pctldev, s, selector, gname);
|
||||
seq_printf(s, "\n");
|
||||
|
||||
seq_putc(s, '\n');
|
||||
selector++;
|
||||
}
|
||||
|
||||
|
|
@ -397,9 +394,9 @@ static const struct file_operations pinconf_groups_ops = {
|
|||
|
||||
struct dbg_cfg {
|
||||
enum pinctrl_map_type map_type;
|
||||
char dev_name[MAX_NAME_LEN+1];
|
||||
char state_name[MAX_NAME_LEN+1];
|
||||
char pin_name[MAX_NAME_LEN+1];
|
||||
char dev_name[MAX_NAME_LEN + 1];
|
||||
char state_name[MAX_NAME_LEN + 1];
|
||||
char pin_name[MAX_NAME_LEN + 1];
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -485,7 +482,7 @@ static ssize_t pinconf_dbg_config_write(struct file *file,
|
|||
const struct pinconf_ops *confops = NULL;
|
||||
struct dbg_cfg *dbg = &pinconf_dbg_conf;
|
||||
const struct pinctrl_map_configs *configs;
|
||||
char config[MAX_NAME_LEN+1];
|
||||
char config[MAX_NAME_LEN + 1];
|
||||
char buf[128];
|
||||
char *b = &buf[0];
|
||||
int buf_size;
|
||||
|
|
@ -526,7 +523,7 @@ static ssize_t pinconf_dbg_config_write(struct file *file,
|
|||
|
||||
/* get arg 'device_name' */
|
||||
token = strsep(&b, " ");
|
||||
if (token == NULL)
|
||||
if (!token)
|
||||
return -EINVAL;
|
||||
if (strlen(token) >= MAX_NAME_LEN)
|
||||
return -EINVAL;
|
||||
|
|
@ -534,7 +531,7 @@ static ssize_t pinconf_dbg_config_write(struct file *file,
|
|||
|
||||
/* get arg 'state_name' */
|
||||
token = strsep(&b, " ");
|
||||
if (token == NULL)
|
||||
if (!token)
|
||||
return -EINVAL;
|
||||
if (strlen(token) >= MAX_NAME_LEN)
|
||||
return -EINVAL;
|
||||
|
|
@ -542,7 +539,7 @@ static ssize_t pinconf_dbg_config_write(struct file *file,
|
|||
|
||||
/* get arg 'pin_name' */
|
||||
token = strsep(&b, " ");
|
||||
if (token == NULL)
|
||||
if (!token)
|
||||
return -EINVAL;
|
||||
if (strlen(token) >= MAX_NAME_LEN)
|
||||
return -EINVAL;
|
||||
|
|
@ -550,7 +547,7 @@ static ssize_t pinconf_dbg_config_write(struct file *file,
|
|||
|
||||
/* get new_value of config' */
|
||||
token = strsep(&b, " ");
|
||||
if (token == NULL)
|
||||
if (!token)
|
||||
return -EINVAL;
|
||||
if (strlen(token) >= MAX_NAME_LEN)
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -8,6 +8,10 @@
|
|||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* Contact Information: Nehal Shah <Nehal-bakulchandra.Shah@amd.com>
|
||||
* Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
|
|
|
|||
852
drivers/pinctrl/pinctrl-ingenic.c
Normal file
852
drivers/pinctrl/pinctrl-ingenic.c
Normal file
|
|
@ -0,0 +1,852 @@
|
|||
/*
|
||||
* Ingenic SoCs pinctrl driver
|
||||
*
|
||||
* Copyright (c) 2017 Paul Cercueil <paul@crapouillou.net>
|
||||
*
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
#include <linux/pinctrl/pinconf.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "core.h"
|
||||
#include "pinconf.h"
|
||||
#include "pinmux.h"
|
||||
|
||||
#define JZ4740_GPIO_DATA 0x10
|
||||
#define JZ4740_GPIO_PULL_DIS 0x30
|
||||
#define JZ4740_GPIO_FUNC 0x40
|
||||
#define JZ4740_GPIO_SELECT 0x50
|
||||
#define JZ4740_GPIO_DIR 0x60
|
||||
#define JZ4740_GPIO_TRIG 0x70
|
||||
#define JZ4740_GPIO_FLAG 0x80
|
||||
|
||||
#define JZ4770_GPIO_INT 0x10
|
||||
#define JZ4770_GPIO_MSK 0x20
|
||||
#define JZ4770_GPIO_PAT1 0x30
|
||||
#define JZ4770_GPIO_PAT0 0x40
|
||||
#define JZ4770_GPIO_FLAG 0x50
|
||||
#define JZ4770_GPIO_PEN 0x70
|
||||
|
||||
#define REG_SET(x) ((x) + 0x4)
|
||||
#define REG_CLEAR(x) ((x) + 0x8)
|
||||
|
||||
#define PINS_PER_GPIO_CHIP 32
|
||||
|
||||
enum jz_version {
|
||||
ID_JZ4740,
|
||||
ID_JZ4770,
|
||||
ID_JZ4780,
|
||||
};
|
||||
|
||||
struct ingenic_chip_info {
|
||||
unsigned int num_chips;
|
||||
|
||||
const struct group_desc *groups;
|
||||
unsigned int num_groups;
|
||||
|
||||
const struct function_desc *functions;
|
||||
unsigned int num_functions;
|
||||
|
||||
const u32 *pull_ups, *pull_downs;
|
||||
};
|
||||
|
||||
struct ingenic_pinctrl {
|
||||
struct device *dev;
|
||||
struct regmap *map;
|
||||
struct pinctrl_dev *pctl;
|
||||
struct pinctrl_pin_desc *pdesc;
|
||||
enum jz_version version;
|
||||
|
||||
const struct ingenic_chip_info *info;
|
||||
};
|
||||
|
||||
static const u32 jz4740_pull_ups[4] = {
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
};
|
||||
|
||||
static const u32 jz4740_pull_downs[4] = {
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
static int jz4740_mmc_1bit_pins[] = { 0x69, 0x68, 0x6a, };
|
||||
static int jz4740_mmc_4bit_pins[] = { 0x6b, 0x6c, 0x6d, };
|
||||
static int jz4740_uart0_data_pins[] = { 0x7a, 0x79, };
|
||||
static int jz4740_uart0_hwflow_pins[] = { 0x7e, 0x7f, };
|
||||
static int jz4740_uart1_data_pins[] = { 0x7e, 0x7f, };
|
||||
static int jz4740_lcd_8bit_pins[] = {
|
||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x52, 0x53, 0x54,
|
||||
};
|
||||
static int jz4740_lcd_16bit_pins[] = {
|
||||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x55,
|
||||
};
|
||||
static int jz4740_lcd_18bit_pins[] = { 0x50, 0x51, };
|
||||
static int jz4740_lcd_18bit_tft_pins[] = { 0x56, 0x57, 0x31, 0x32, };
|
||||
static int jz4740_nand_cs1_pins[] = { 0x39, };
|
||||
static int jz4740_nand_cs2_pins[] = { 0x3a, };
|
||||
static int jz4740_nand_cs3_pins[] = { 0x3b, };
|
||||
static int jz4740_nand_cs4_pins[] = { 0x3c, };
|
||||
static int jz4740_pwm_pwm0_pins[] = { 0x77, };
|
||||
static int jz4740_pwm_pwm1_pins[] = { 0x78, };
|
||||
static int jz4740_pwm_pwm2_pins[] = { 0x79, };
|
||||
static int jz4740_pwm_pwm3_pins[] = { 0x7a, };
|
||||
static int jz4740_pwm_pwm4_pins[] = { 0x7b, };
|
||||
static int jz4740_pwm_pwm5_pins[] = { 0x7c, };
|
||||
static int jz4740_pwm_pwm6_pins[] = { 0x7e, };
|
||||
static int jz4740_pwm_pwm7_pins[] = { 0x7f, };
|
||||
|
||||
static int jz4740_mmc_1bit_funcs[] = { 0, 0, 0, };
|
||||
static int jz4740_mmc_4bit_funcs[] = { 0, 0, 0, };
|
||||
static int jz4740_uart0_data_funcs[] = { 1, 1, };
|
||||
static int jz4740_uart0_hwflow_funcs[] = { 1, 1, };
|
||||
static int jz4740_uart1_data_funcs[] = { 2, 2, };
|
||||
static int jz4740_lcd_8bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
|
||||
static int jz4740_lcd_16bit_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, };
|
||||
static int jz4740_lcd_18bit_funcs[] = { 0, 0, };
|
||||
static int jz4740_lcd_18bit_tft_funcs[] = { 0, 0, 0, 0, };
|
||||
static int jz4740_nand_cs1_funcs[] = { 0, };
|
||||
static int jz4740_nand_cs2_funcs[] = { 0, };
|
||||
static int jz4740_nand_cs3_funcs[] = { 0, };
|
||||
static int jz4740_nand_cs4_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm0_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm1_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm2_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm3_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm4_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm5_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm6_funcs[] = { 0, };
|
||||
static int jz4740_pwm_pwm7_funcs[] = { 0, };
|
||||
|
||||
#define INGENIC_PIN_GROUP(name, id) \
|
||||
{ \
|
||||
name, \
|
||||
id##_pins, \
|
||||
ARRAY_SIZE(id##_pins), \
|
||||
id##_funcs, \
|
||||
}
|
||||
|
||||
static const struct group_desc jz4740_groups[] = {
|
||||
INGENIC_PIN_GROUP("mmc-1bit", jz4740_mmc_1bit),
|
||||
INGENIC_PIN_GROUP("mmc-4bit", jz4740_mmc_4bit),
|
||||
INGENIC_PIN_GROUP("uart0-data", jz4740_uart0_data),
|
||||
INGENIC_PIN_GROUP("uart0-hwflow", jz4740_uart0_hwflow),
|
||||
INGENIC_PIN_GROUP("uart1-data", jz4740_uart1_data),
|
||||
INGENIC_PIN_GROUP("lcd-8bit", jz4740_lcd_8bit),
|
||||
INGENIC_PIN_GROUP("lcd-16bit", jz4740_lcd_16bit),
|
||||
INGENIC_PIN_GROUP("lcd-18bit", jz4740_lcd_18bit),
|
||||
INGENIC_PIN_GROUP("lcd-18bit-tft", jz4740_lcd_18bit_tft),
|
||||
{ "lcd-no-pins", },
|
||||
INGENIC_PIN_GROUP("nand-cs1", jz4740_nand_cs1),
|
||||
INGENIC_PIN_GROUP("nand-cs2", jz4740_nand_cs2),
|
||||
INGENIC_PIN_GROUP("nand-cs3", jz4740_nand_cs3),
|
||||
INGENIC_PIN_GROUP("nand-cs4", jz4740_nand_cs4),
|
||||
INGENIC_PIN_GROUP("pwm0", jz4740_pwm_pwm0),
|
||||
INGENIC_PIN_GROUP("pwm1", jz4740_pwm_pwm1),
|
||||
INGENIC_PIN_GROUP("pwm2", jz4740_pwm_pwm2),
|
||||
INGENIC_PIN_GROUP("pwm3", jz4740_pwm_pwm3),
|
||||
INGENIC_PIN_GROUP("pwm4", jz4740_pwm_pwm4),
|
||||
INGENIC_PIN_GROUP("pwm5", jz4740_pwm_pwm5),
|
||||
INGENIC_PIN_GROUP("pwm6", jz4740_pwm_pwm6),
|
||||
INGENIC_PIN_GROUP("pwm7", jz4740_pwm_pwm7),
|
||||
};
|
||||
|
||||
static const char *jz4740_mmc_groups[] = { "mmc-1bit", "mmc-4bit", };
|
||||
static const char *jz4740_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
|
||||
static const char *jz4740_uart1_groups[] = { "uart1-data", };
|
||||
static const char *jz4740_lcd_groups[] = {
|
||||
"lcd-8bit", "lcd-16bit", "lcd-18bit", "lcd-18bit-tft", "lcd-no-pins",
|
||||
};
|
||||
static const char *jz4740_nand_groups[] = {
|
||||
"nand-cs1", "nand-cs2", "nand-cs3", "nand-cs4",
|
||||
};
|
||||
static const char *jz4740_pwm0_groups[] = { "pwm0", };
|
||||
static const char *jz4740_pwm1_groups[] = { "pwm1", };
|
||||
static const char *jz4740_pwm2_groups[] = { "pwm2", };
|
||||
static const char *jz4740_pwm3_groups[] = { "pwm3", };
|
||||
static const char *jz4740_pwm4_groups[] = { "pwm4", };
|
||||
static const char *jz4740_pwm5_groups[] = { "pwm5", };
|
||||
static const char *jz4740_pwm6_groups[] = { "pwm6", };
|
||||
static const char *jz4740_pwm7_groups[] = { "pwm7", };
|
||||
|
||||
static const struct function_desc jz4740_functions[] = {
|
||||
{ "mmc", jz4740_mmc_groups, ARRAY_SIZE(jz4740_mmc_groups), },
|
||||
{ "uart0", jz4740_uart0_groups, ARRAY_SIZE(jz4740_uart0_groups), },
|
||||
{ "uart1", jz4740_uart1_groups, ARRAY_SIZE(jz4740_uart1_groups), },
|
||||
{ "lcd", jz4740_lcd_groups, ARRAY_SIZE(jz4740_lcd_groups), },
|
||||
{ "nand", jz4740_nand_groups, ARRAY_SIZE(jz4740_nand_groups), },
|
||||
{ "pwm0", jz4740_pwm0_groups, ARRAY_SIZE(jz4740_pwm0_groups), },
|
||||
{ "pwm1", jz4740_pwm1_groups, ARRAY_SIZE(jz4740_pwm1_groups), },
|
||||
{ "pwm2", jz4740_pwm2_groups, ARRAY_SIZE(jz4740_pwm2_groups), },
|
||||
{ "pwm3", jz4740_pwm3_groups, ARRAY_SIZE(jz4740_pwm3_groups), },
|
||||
{ "pwm4", jz4740_pwm4_groups, ARRAY_SIZE(jz4740_pwm4_groups), },
|
||||
{ "pwm5", jz4740_pwm5_groups, ARRAY_SIZE(jz4740_pwm5_groups), },
|
||||
{ "pwm6", jz4740_pwm6_groups, ARRAY_SIZE(jz4740_pwm6_groups), },
|
||||
{ "pwm7", jz4740_pwm7_groups, ARRAY_SIZE(jz4740_pwm7_groups), },
|
||||
};
|
||||
|
||||
static const struct ingenic_chip_info jz4740_chip_info = {
|
||||
.num_chips = 4,
|
||||
.groups = jz4740_groups,
|
||||
.num_groups = ARRAY_SIZE(jz4740_groups),
|
||||
.functions = jz4740_functions,
|
||||
.num_functions = ARRAY_SIZE(jz4740_functions),
|
||||
.pull_ups = jz4740_pull_ups,
|
||||
.pull_downs = jz4740_pull_downs,
|
||||
};
|
||||
|
||||
static const u32 jz4770_pull_ups[6] = {
|
||||
0x3fffffff, 0xfff0030c, 0xffffffff, 0xffff4fff, 0xfffffb7c, 0xffa7f00f,
|
||||
};
|
||||
|
||||
static const u32 jz4770_pull_downs[6] = {
|
||||
0x00000000, 0x000f0c03, 0x00000000, 0x0000b000, 0x00000483, 0x00580ff0,
|
||||
};
|
||||
|
||||
static int jz4770_uart0_data_pins[] = { 0xa0, 0xa3, };
|
||||
static int jz4770_uart0_hwflow_pins[] = { 0xa1, 0xa2, };
|
||||
static int jz4770_uart1_data_pins[] = { 0x7a, 0x7c, };
|
||||
static int jz4770_uart1_hwflow_pins[] = { 0x7b, 0x7d, };
|
||||
static int jz4770_uart2_data_pins[] = { 0x66, 0x67, };
|
||||
static int jz4770_uart2_hwflow_pins[] = { 0x65, 0x64, };
|
||||
static int jz4770_uart3_data_pins[] = { 0x6c, 0x85, };
|
||||
static int jz4770_uart3_hwflow_pins[] = { 0x88, 0x89, };
|
||||
static int jz4770_uart4_data_pins[] = { 0x54, 0x4a, };
|
||||
static int jz4770_mmc0_8bit_a_pins[] = { 0x04, 0x05, 0x06, 0x07, 0x18, };
|
||||
static int jz4770_mmc0_4bit_a_pins[] = { 0x15, 0x16, 0x17, };
|
||||
static int jz4770_mmc0_1bit_a_pins[] = { 0x12, 0x13, 0x14, };
|
||||
static int jz4770_mmc0_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
|
||||
static int jz4770_mmc0_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
|
||||
static int jz4770_mmc1_4bit_d_pins[] = { 0x75, 0x76, 0x77, };
|
||||
static int jz4770_mmc1_1bit_d_pins[] = { 0x78, 0x79, 0x74, };
|
||||
static int jz4770_mmc1_4bit_e_pins[] = { 0x95, 0x96, 0x97, };
|
||||
static int jz4770_mmc1_1bit_e_pins[] = { 0x9c, 0x9d, 0x94, };
|
||||
static int jz4770_nemc_data_pins[] = {
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
};
|
||||
static int jz4770_nemc_cle_ale_pins[] = { 0x20, 0x21, };
|
||||
static int jz4770_nemc_addr_pins[] = { 0x22, 0x23, 0x24, 0x25, };
|
||||
static int jz4770_nemc_rd_we_pins[] = { 0x10, 0x11, };
|
||||
static int jz4770_nemc_frd_fwe_pins[] = { 0x12, 0x13, };
|
||||
static int jz4770_nemc_cs1_pins[] = { 0x15, };
|
||||
static int jz4770_nemc_cs2_pins[] = { 0x16, };
|
||||
static int jz4770_nemc_cs3_pins[] = { 0x17, };
|
||||
static int jz4770_nemc_cs4_pins[] = { 0x18, };
|
||||
static int jz4770_nemc_cs5_pins[] = { 0x19, };
|
||||
static int jz4770_nemc_cs6_pins[] = { 0x1a, };
|
||||
static int jz4770_i2c0_pins[] = { 0x6e, 0x6f, };
|
||||
static int jz4770_i2c1_pins[] = { 0x8e, 0x8f, };
|
||||
static int jz4770_i2c2_pins[] = { 0xb0, 0xb1, };
|
||||
static int jz4770_i2c3_pins[] = { 0x6a, 0x6b, };
|
||||
static int jz4770_i2c4_e_pins[] = { 0x8c, 0x8d, };
|
||||
static int jz4770_i2c4_f_pins[] = { 0xb9, 0xb8, };
|
||||
static int jz4770_cim_pins[] = {
|
||||
0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
|
||||
};
|
||||
static int jz4770_lcd_32bit_pins[] = {
|
||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
||||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
|
||||
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
|
||||
0x58, 0x59, 0x51,
|
||||
};
|
||||
static int jz4770_pwm_pwm0_pins[] = { 0x80, };
|
||||
static int jz4770_pwm_pwm1_pins[] = { 0x81, };
|
||||
static int jz4770_pwm_pwm2_pins[] = { 0x82, };
|
||||
static int jz4770_pwm_pwm3_pins[] = { 0x83, };
|
||||
static int jz4770_pwm_pwm4_pins[] = { 0x84, };
|
||||
static int jz4770_pwm_pwm5_pins[] = { 0x85, };
|
||||
static int jz4770_pwm_pwm6_pins[] = { 0x6a, };
|
||||
static int jz4770_pwm_pwm7_pins[] = { 0x6b, };
|
||||
|
||||
static int jz4770_uart0_data_funcs[] = { 0, 0, };
|
||||
static int jz4770_uart0_hwflow_funcs[] = { 0, 0, };
|
||||
static int jz4770_uart1_data_funcs[] = { 0, 0, };
|
||||
static int jz4770_uart1_hwflow_funcs[] = { 0, 0, };
|
||||
static int jz4770_uart2_data_funcs[] = { 1, 1, };
|
||||
static int jz4770_uart2_hwflow_funcs[] = { 1, 1, };
|
||||
static int jz4770_uart3_data_funcs[] = { 0, 1, };
|
||||
static int jz4770_uart3_hwflow_funcs[] = { 0, 0, };
|
||||
static int jz4770_uart4_data_funcs[] = { 2, 2, };
|
||||
static int jz4770_mmc0_8bit_a_funcs[] = { 1, 1, 1, 1, 1, };
|
||||
static int jz4770_mmc0_4bit_a_funcs[] = { 1, 1, 1, };
|
||||
static int jz4770_mmc0_1bit_a_funcs[] = { 1, 1, 0, };
|
||||
static int jz4770_mmc0_4bit_e_funcs[] = { 0, 0, 0, };
|
||||
static int jz4770_mmc0_1bit_e_funcs[] = { 0, 0, 0, };
|
||||
static int jz4770_mmc1_4bit_d_funcs[] = { 0, 0, 0, };
|
||||
static int jz4770_mmc1_1bit_d_funcs[] = { 0, 0, 0, };
|
||||
static int jz4770_mmc1_4bit_e_funcs[] = { 1, 1, 1, };
|
||||
static int jz4770_mmc1_1bit_e_funcs[] = { 1, 1, 1, };
|
||||
static int jz4770_nemc_data_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, };
|
||||
static int jz4770_nemc_cle_ale_funcs[] = { 0, 0, };
|
||||
static int jz4770_nemc_addr_funcs[] = { 0, 0, 0, 0, };
|
||||
static int jz4770_nemc_rd_we_funcs[] = { 0, 0, };
|
||||
static int jz4770_nemc_frd_fwe_funcs[] = { 0, 0, };
|
||||
static int jz4770_nemc_cs1_funcs[] = { 0, };
|
||||
static int jz4770_nemc_cs2_funcs[] = { 0, };
|
||||
static int jz4770_nemc_cs3_funcs[] = { 0, };
|
||||
static int jz4770_nemc_cs4_funcs[] = { 0, };
|
||||
static int jz4770_nemc_cs5_funcs[] = { 0, };
|
||||
static int jz4770_nemc_cs6_funcs[] = { 0, };
|
||||
static int jz4770_i2c0_funcs[] = { 0, 0, };
|
||||
static int jz4770_i2c1_funcs[] = { 0, 0, };
|
||||
static int jz4770_i2c2_funcs[] = { 2, 2, };
|
||||
static int jz4770_i2c3_funcs[] = { 1, 1, };
|
||||
static int jz4770_i2c4_e_funcs[] = { 1, 1, };
|
||||
static int jz4770_i2c4_f_funcs[] = { 1, 1, };
|
||||
static int jz4770_cim_funcs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
|
||||
static int jz4770_lcd_32bit_funcs[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0,
|
||||
};
|
||||
static int jz4770_pwm_pwm0_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm1_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm2_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm3_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm4_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm5_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm6_funcs[] = { 0, };
|
||||
static int jz4770_pwm_pwm7_funcs[] = { 0, };
|
||||
|
||||
static const struct group_desc jz4770_groups[] = {
|
||||
INGENIC_PIN_GROUP("uart0-data", jz4770_uart0_data),
|
||||
INGENIC_PIN_GROUP("uart0-hwflow", jz4770_uart0_hwflow),
|
||||
INGENIC_PIN_GROUP("uart1-data", jz4770_uart1_data),
|
||||
INGENIC_PIN_GROUP("uart1-hwflow", jz4770_uart1_hwflow),
|
||||
INGENIC_PIN_GROUP("uart2-data", jz4770_uart2_data),
|
||||
INGENIC_PIN_GROUP("uart2-hwflow", jz4770_uart2_hwflow),
|
||||
INGENIC_PIN_GROUP("uart3-data", jz4770_uart3_data),
|
||||
INGENIC_PIN_GROUP("uart3-hwflow", jz4770_uart3_hwflow),
|
||||
INGENIC_PIN_GROUP("uart4-data", jz4770_uart4_data),
|
||||
INGENIC_PIN_GROUP("mmc0-8bit-a", jz4770_mmc0_8bit_a),
|
||||
INGENIC_PIN_GROUP("mmc0-4bit-a", jz4770_mmc0_4bit_a),
|
||||
INGENIC_PIN_GROUP("mmc0-1bit-a", jz4770_mmc0_1bit_a),
|
||||
INGENIC_PIN_GROUP("mmc0-4bit-e", jz4770_mmc0_4bit_e),
|
||||
INGENIC_PIN_GROUP("mmc0-1bit-e", jz4770_mmc0_1bit_e),
|
||||
INGENIC_PIN_GROUP("mmc1-4bit-d", jz4770_mmc1_4bit_d),
|
||||
INGENIC_PIN_GROUP("mmc1-1bit-d", jz4770_mmc1_1bit_d),
|
||||
INGENIC_PIN_GROUP("mmc1-4bit-e", jz4770_mmc1_4bit_e),
|
||||
INGENIC_PIN_GROUP("mmc1-1bit-e", jz4770_mmc1_1bit_e),
|
||||
INGENIC_PIN_GROUP("nemc-data", jz4770_nemc_data),
|
||||
INGENIC_PIN_GROUP("nemc-cle-ale", jz4770_nemc_cle_ale),
|
||||
INGENIC_PIN_GROUP("nemc-addr", jz4770_nemc_addr),
|
||||
INGENIC_PIN_GROUP("nemc-rd-we", jz4770_nemc_rd_we),
|
||||
INGENIC_PIN_GROUP("nemc-frd-fwe", jz4770_nemc_frd_fwe),
|
||||
INGENIC_PIN_GROUP("nemc-cs1", jz4770_nemc_cs1),
|
||||
INGENIC_PIN_GROUP("nemc-cs2", jz4770_nemc_cs2),
|
||||
INGENIC_PIN_GROUP("nemc-cs3", jz4770_nemc_cs3),
|
||||
INGENIC_PIN_GROUP("nemc-cs4", jz4770_nemc_cs4),
|
||||
INGENIC_PIN_GROUP("nemc-cs5", jz4770_nemc_cs5),
|
||||
INGENIC_PIN_GROUP("nemc-cs6", jz4770_nemc_cs6),
|
||||
INGENIC_PIN_GROUP("i2c0-data", jz4770_i2c0),
|
||||
INGENIC_PIN_GROUP("i2c1-data", jz4770_i2c1),
|
||||
INGENIC_PIN_GROUP("i2c2-data", jz4770_i2c2),
|
||||
INGENIC_PIN_GROUP("i2c3-data", jz4770_i2c3),
|
||||
INGENIC_PIN_GROUP("i2c4-data-e", jz4770_i2c4_e),
|
||||
INGENIC_PIN_GROUP("i2c4-data-f", jz4770_i2c4_f),
|
||||
INGENIC_PIN_GROUP("cim-data", jz4770_cim),
|
||||
INGENIC_PIN_GROUP("lcd-32bit", jz4770_lcd_32bit),
|
||||
{ "lcd-no-pins", },
|
||||
INGENIC_PIN_GROUP("pwm0", jz4770_pwm_pwm0),
|
||||
INGENIC_PIN_GROUP("pwm1", jz4770_pwm_pwm1),
|
||||
INGENIC_PIN_GROUP("pwm2", jz4770_pwm_pwm2),
|
||||
INGENIC_PIN_GROUP("pwm3", jz4770_pwm_pwm3),
|
||||
INGENIC_PIN_GROUP("pwm4", jz4770_pwm_pwm4),
|
||||
INGENIC_PIN_GROUP("pwm5", jz4770_pwm_pwm5),
|
||||
INGENIC_PIN_GROUP("pwm6", jz4770_pwm_pwm6),
|
||||
INGENIC_PIN_GROUP("pwm7", jz4770_pwm_pwm7),
|
||||
};
|
||||
|
||||
static const char *jz4770_uart0_groups[] = { "uart0-data", "uart0-hwflow", };
|
||||
static const char *jz4770_uart1_groups[] = { "uart1-data", "uart1-hwflow", };
|
||||
static const char *jz4770_uart2_groups[] = { "uart2-data", "uart2-hwflow", };
|
||||
static const char *jz4770_uart3_groups[] = { "uart3-data", "uart3-hwflow", };
|
||||
static const char *jz4770_uart4_groups[] = { "uart4-data", };
|
||||
static const char *jz4770_mmc0_groups[] = {
|
||||
"mmc0-8bit-a", "mmc0-4bit-a", "mmc0-1bit-a",
|
||||
"mmc0-1bit-e", "mmc0-4bit-e",
|
||||
};
|
||||
static const char *jz4770_mmc1_groups[] = {
|
||||
"mmc1-1bit-d", "mmc1-4bit-d", "mmc1-1bit-e", "mmc1-4bit-e",
|
||||
};
|
||||
static const char *jz4770_nemc_groups[] = {
|
||||
"nemc-data", "nemc-cle-ale", "nemc-addr", "nemc-rd-we", "nemc-frd-fwe",
|
||||
};
|
||||
static const char *jz4770_cs1_groups[] = { "nemc-cs1", };
|
||||
static const char *jz4770_cs6_groups[] = { "nemc-cs6", };
|
||||
static const char *jz4770_i2c0_groups[] = { "i2c0-data", };
|
||||
static const char *jz4770_i2c1_groups[] = { "i2c1-data", };
|
||||
static const char *jz4770_i2c2_groups[] = { "i2c2-data", };
|
||||
static const char *jz4770_i2c3_groups[] = { "i2c3-data", };
|
||||
static const char *jz4770_i2c4_groups[] = { "i2c4-data-e", "i2c4-data-f", };
|
||||
static const char *jz4770_cim_groups[] = { "cim-data", };
|
||||
static const char *jz4770_lcd_groups[] = { "lcd-32bit", "lcd-no-pins", };
|
||||
static const char *jz4770_pwm0_groups[] = { "pwm0", };
|
||||
static const char *jz4770_pwm1_groups[] = { "pwm1", };
|
||||
static const char *jz4770_pwm2_groups[] = { "pwm2", };
|
||||
static const char *jz4770_pwm3_groups[] = { "pwm3", };
|
||||
static const char *jz4770_pwm4_groups[] = { "pwm4", };
|
||||
static const char *jz4770_pwm5_groups[] = { "pwm5", };
|
||||
static const char *jz4770_pwm6_groups[] = { "pwm6", };
|
||||
static const char *jz4770_pwm7_groups[] = { "pwm7", };
|
||||
|
||||
static const struct function_desc jz4770_functions[] = {
|
||||
{ "uart0", jz4770_uart0_groups, ARRAY_SIZE(jz4770_uart0_groups), },
|
||||
{ "uart1", jz4770_uart1_groups, ARRAY_SIZE(jz4770_uart1_groups), },
|
||||
{ "uart2", jz4770_uart2_groups, ARRAY_SIZE(jz4770_uart2_groups), },
|
||||
{ "uart3", jz4770_uart3_groups, ARRAY_SIZE(jz4770_uart3_groups), },
|
||||
{ "uart4", jz4770_uart4_groups, ARRAY_SIZE(jz4770_uart4_groups), },
|
||||
{ "mmc0", jz4770_mmc0_groups, ARRAY_SIZE(jz4770_mmc0_groups), },
|
||||
{ "mmc1", jz4770_mmc1_groups, ARRAY_SIZE(jz4770_mmc1_groups), },
|
||||
{ "nemc", jz4770_nemc_groups, ARRAY_SIZE(jz4770_nemc_groups), },
|
||||
{ "nemc-cs1", jz4770_cs1_groups, ARRAY_SIZE(jz4770_cs1_groups), },
|
||||
{ "nemc-cs6", jz4770_cs6_groups, ARRAY_SIZE(jz4770_cs6_groups), },
|
||||
{ "i2c0", jz4770_i2c0_groups, ARRAY_SIZE(jz4770_i2c0_groups), },
|
||||
{ "i2c1", jz4770_i2c1_groups, ARRAY_SIZE(jz4770_i2c1_groups), },
|
||||
{ "i2c2", jz4770_i2c2_groups, ARRAY_SIZE(jz4770_i2c2_groups), },
|
||||
{ "i2c3", jz4770_i2c3_groups, ARRAY_SIZE(jz4770_i2c3_groups), },
|
||||
{ "i2c4", jz4770_i2c4_groups, ARRAY_SIZE(jz4770_i2c4_groups), },
|
||||
{ "cim", jz4770_cim_groups, ARRAY_SIZE(jz4770_cim_groups), },
|
||||
{ "lcd", jz4770_lcd_groups, ARRAY_SIZE(jz4770_lcd_groups), },
|
||||
{ "pwm0", jz4770_pwm0_groups, ARRAY_SIZE(jz4770_pwm0_groups), },
|
||||
{ "pwm1", jz4770_pwm1_groups, ARRAY_SIZE(jz4770_pwm1_groups), },
|
||||
{ "pwm2", jz4770_pwm2_groups, ARRAY_SIZE(jz4770_pwm2_groups), },
|
||||
{ "pwm3", jz4770_pwm3_groups, ARRAY_SIZE(jz4770_pwm3_groups), },
|
||||
{ "pwm4", jz4770_pwm4_groups, ARRAY_SIZE(jz4770_pwm4_groups), },
|
||||
{ "pwm5", jz4770_pwm5_groups, ARRAY_SIZE(jz4770_pwm5_groups), },
|
||||
{ "pwm6", jz4770_pwm6_groups, ARRAY_SIZE(jz4770_pwm6_groups), },
|
||||
{ "pwm7", jz4770_pwm7_groups, ARRAY_SIZE(jz4770_pwm7_groups), },
|
||||
};
|
||||
|
||||
static const struct ingenic_chip_info jz4770_chip_info = {
|
||||
.num_chips = 6,
|
||||
.groups = jz4770_groups,
|
||||
.num_groups = ARRAY_SIZE(jz4770_groups),
|
||||
.functions = jz4770_functions,
|
||||
.num_functions = ARRAY_SIZE(jz4770_functions),
|
||||
.pull_ups = jz4770_pull_ups,
|
||||
.pull_downs = jz4770_pull_downs,
|
||||
};
|
||||
|
||||
static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc,
|
||||
unsigned int pin, u8 reg, bool set)
|
||||
{
|
||||
unsigned int idx = pin % PINS_PER_GPIO_CHIP;
|
||||
unsigned int offt = pin / PINS_PER_GPIO_CHIP;
|
||||
|
||||
regmap_write(jzpc->map, offt * 0x100 +
|
||||
(set ? REG_SET(reg) : REG_CLEAR(reg)), BIT(idx));
|
||||
}
|
||||
|
||||
static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc,
|
||||
unsigned int pin, u8 reg)
|
||||
{
|
||||
unsigned int idx = pin % PINS_PER_GPIO_CHIP;
|
||||
unsigned int offt = pin / PINS_PER_GPIO_CHIP;
|
||||
unsigned int val;
|
||||
|
||||
regmap_read(jzpc->map, offt * 0x100 + reg, &val);
|
||||
|
||||
return val & BIT(idx);
|
||||
}
|
||||
|
||||
static struct pinctrl_ops ingenic_pctlops = {
|
||||
.get_groups_count = pinctrl_generic_get_group_count,
|
||||
.get_group_name = pinctrl_generic_get_group_name,
|
||||
.get_group_pins = pinctrl_generic_get_group_pins,
|
||||
.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
|
||||
.dt_free_map = pinconf_generic_dt_free_map,
|
||||
};
|
||||
|
||||
static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,
|
||||
int pin, int func)
|
||||
{
|
||||
unsigned int idx = pin % PINS_PER_GPIO_CHIP;
|
||||
unsigned int offt = pin / PINS_PER_GPIO_CHIP;
|
||||
|
||||
dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n",
|
||||
'A' + offt, idx, func);
|
||||
|
||||
if (jzpc->version >= ID_JZ4770) {
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_MSK, false);
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2);
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1);
|
||||
} else {
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true);
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2);
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func > 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ingenic_pinmux_set_mux(struct pinctrl_dev *pctldev,
|
||||
unsigned int selector, unsigned int group)
|
||||
{
|
||||
struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct function_desc *func;
|
||||
struct group_desc *grp;
|
||||
unsigned int i;
|
||||
|
||||
func = pinmux_generic_get_function(pctldev, selector);
|
||||
if (!func)
|
||||
return -EINVAL;
|
||||
|
||||
grp = pinctrl_generic_get_group(pctldev, group);
|
||||
if (!grp)
|
||||
return -EINVAL;
|
||||
|
||||
dev_dbg(pctldev->dev, "enable function %s group %s\n",
|
||||
func->name, grp->name);
|
||||
|
||||
for (i = 0; i < grp->num_pins; i++) {
|
||||
int *pin_modes = grp->data;
|
||||
|
||||
ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
struct pinctrl_gpio_range *range,
|
||||
unsigned int pin, bool input)
|
||||
{
|
||||
struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
|
||||
unsigned int idx = pin % PINS_PER_GPIO_CHIP;
|
||||
unsigned int offt = pin / PINS_PER_GPIO_CHIP;
|
||||
|
||||
dev_dbg(pctldev->dev, "set pin P%c%u to %sput\n",
|
||||
'A' + offt, idx, input ? "in" : "out");
|
||||
|
||||
if (jzpc->version >= ID_JZ4770) {
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false);
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_MSK, true);
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input);
|
||||
} else {
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false);
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, input);
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pinmux_ops ingenic_pmxops = {
|
||||
.get_functions_count = pinmux_generic_get_function_count,
|
||||
.get_function_name = pinmux_generic_get_function_name,
|
||||
.get_function_groups = pinmux_generic_get_function_groups,
|
||||
.set_mux = ingenic_pinmux_set_mux,
|
||||
.gpio_set_direction = ingenic_pinmux_gpio_set_direction,
|
||||
};
|
||||
|
||||
static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,
|
||||
unsigned int pin, unsigned long *config)
|
||||
{
|
||||
struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
|
||||
enum pin_config_param param = pinconf_to_config_param(*config);
|
||||
unsigned int idx = pin % PINS_PER_GPIO_CHIP;
|
||||
unsigned int offt = pin / PINS_PER_GPIO_CHIP;
|
||||
bool pull;
|
||||
|
||||
if (jzpc->version >= ID_JZ4770)
|
||||
pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN);
|
||||
else
|
||||
pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS);
|
||||
|
||||
switch (param) {
|
||||
case PIN_CONFIG_BIAS_DISABLE:
|
||||
if (pull)
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
if (!pull || !(jzpc->info->pull_ups[offt] & BIT(idx)))
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
if (!pull || !(jzpc->info->pull_downs[offt] & BIT(idx)))
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
*config = pinconf_to_config_packed(param, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,
|
||||
unsigned int pin, bool enabled)
|
||||
{
|
||||
if (jzpc->version >= ID_JZ4770)
|
||||
ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !enabled);
|
||||
else
|
||||
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !enabled);
|
||||
}
|
||||
|
||||
static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||
unsigned long *configs, unsigned int num_configs)
|
||||
{
|
||||
struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev);
|
||||
unsigned int idx = pin % PINS_PER_GPIO_CHIP;
|
||||
unsigned int offt = pin / PINS_PER_GPIO_CHIP;
|
||||
unsigned int cfg;
|
||||
|
||||
for (cfg = 0; cfg < num_configs; cfg++) {
|
||||
switch (pinconf_to_config_param(configs[cfg])) {
|
||||
case PIN_CONFIG_BIAS_DISABLE:
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
continue;
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
for (cfg = 0; cfg < num_configs; cfg++) {
|
||||
switch (pinconf_to_config_param(configs[cfg])) {
|
||||
case PIN_CONFIG_BIAS_DISABLE:
|
||||
dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n",
|
||||
'A' + offt, idx);
|
||||
ingenic_set_bias(jzpc, pin, false);
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
if (!(jzpc->info->pull_ups[offt] & BIT(idx)))
|
||||
return -EINVAL;
|
||||
dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n",
|
||||
'A' + offt, idx);
|
||||
ingenic_set_bias(jzpc, pin, true);
|
||||
break;
|
||||
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
if (!(jzpc->info->pull_downs[offt] & BIT(idx)))
|
||||
return -EINVAL;
|
||||
dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n",
|
||||
'A' + offt, idx);
|
||||
ingenic_set_bias(jzpc, pin, true);
|
||||
break;
|
||||
|
||||
default:
|
||||
unreachable();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ingenic_pinconf_group_get(struct pinctrl_dev *pctldev,
|
||||
unsigned int group, unsigned long *config)
|
||||
{
|
||||
const unsigned int *pins;
|
||||
unsigned int i, npins, old = 0;
|
||||
int ret;
|
||||
|
||||
ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < npins; i++) {
|
||||
if (ingenic_pinconf_get(pctldev, pins[i], config))
|
||||
return -ENOTSUPP;
|
||||
|
||||
/* configs do not match between two pins */
|
||||
if (i && (old != *config))
|
||||
return -ENOTSUPP;
|
||||
|
||||
old = *config;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ingenic_pinconf_group_set(struct pinctrl_dev *pctldev,
|
||||
unsigned int group, unsigned long *configs,
|
||||
unsigned int num_configs)
|
||||
{
|
||||
const unsigned int *pins;
|
||||
unsigned int i, npins;
|
||||
int ret;
|
||||
|
||||
ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < npins; i++) {
|
||||
ret = ingenic_pinconf_set(pctldev,
|
||||
pins[i], configs, num_configs);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pinconf_ops ingenic_confops = {
|
||||
.is_generic = true,
|
||||
.pin_config_get = ingenic_pinconf_get,
|
||||
.pin_config_set = ingenic_pinconf_set,
|
||||
.pin_config_group_get = ingenic_pinconf_group_get,
|
||||
.pin_config_group_set = ingenic_pinconf_group_set,
|
||||
};
|
||||
|
||||
static const struct regmap_config ingenic_pinctrl_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
};
|
||||
|
||||
static const struct of_device_id ingenic_pinctrl_of_match[] = {
|
||||
{ .compatible = "ingenic,jz4740-pinctrl", .data = (void *) ID_JZ4740 },
|
||||
{ .compatible = "ingenic,jz4770-pinctrl", .data = (void *) ID_JZ4770 },
|
||||
{ .compatible = "ingenic,jz4780-pinctrl", .data = (void *) ID_JZ4780 },
|
||||
{},
|
||||
};
|
||||
|
||||
int ingenic_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct ingenic_pinctrl *jzpc;
|
||||
struct pinctrl_desc *pctl_desc;
|
||||
void __iomem *base;
|
||||
const struct platform_device_id *id = platform_get_device_id(pdev);
|
||||
const struct of_device_id *of_id = of_match_device(
|
||||
ingenic_pinctrl_of_match, dev);
|
||||
const struct ingenic_chip_info *chip_info;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL);
|
||||
if (!jzpc)
|
||||
return -ENOMEM;
|
||||
|
||||
base = devm_ioremap_resource(dev,
|
||||
platform_get_resource(pdev, IORESOURCE_MEM, 0));
|
||||
if (IS_ERR(base)) {
|
||||
dev_err(dev, "Failed to ioremap registers\n");
|
||||
return PTR_ERR(base);
|
||||
}
|
||||
|
||||
jzpc->map = devm_regmap_init_mmio(dev, base,
|
||||
&ingenic_pinctrl_regmap_config);
|
||||
if (IS_ERR(jzpc->map)) {
|
||||
dev_err(dev, "Failed to create regmap\n");
|
||||
return PTR_ERR(jzpc->map);
|
||||
}
|
||||
|
||||
jzpc->dev = dev;
|
||||
|
||||
if (of_id)
|
||||
jzpc->version = (enum jz_version)of_id->data;
|
||||
else
|
||||
jzpc->version = (enum jz_version)id->driver_data;
|
||||
|
||||
if (jzpc->version >= ID_JZ4770)
|
||||
chip_info = &jz4770_chip_info;
|
||||
else
|
||||
chip_info = &jz4740_chip_info;
|
||||
jzpc->info = chip_info;
|
||||
|
||||
pctl_desc = devm_kzalloc(&pdev->dev, sizeof(*pctl_desc), GFP_KERNEL);
|
||||
if (!pctl_desc)
|
||||
return -ENOMEM;
|
||||
|
||||
/* fill in pinctrl_desc structure */
|
||||
pctl_desc->name = dev_name(dev);
|
||||
pctl_desc->owner = THIS_MODULE;
|
||||
pctl_desc->pctlops = &ingenic_pctlops;
|
||||
pctl_desc->pmxops = &ingenic_pmxops;
|
||||
pctl_desc->confops = &ingenic_confops;
|
||||
pctl_desc->npins = chip_info->num_chips * PINS_PER_GPIO_CHIP;
|
||||
pctl_desc->pins = jzpc->pdesc = devm_kzalloc(&pdev->dev,
|
||||
sizeof(*jzpc->pdesc) * pctl_desc->npins, GFP_KERNEL);
|
||||
if (!jzpc->pdesc)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < pctl_desc->npins; i++) {
|
||||
jzpc->pdesc[i].number = i;
|
||||
jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d",
|
||||
'A' + (i / PINS_PER_GPIO_CHIP),
|
||||
i % PINS_PER_GPIO_CHIP);
|
||||
}
|
||||
|
||||
jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc);
|
||||
if (IS_ERR(jzpc->pctl)) {
|
||||
dev_err(dev, "Failed to register pinctrl\n");
|
||||
return PTR_ERR(jzpc->pctl);
|
||||
}
|
||||
|
||||
for (i = 0; i < chip_info->num_groups; i++) {
|
||||
const struct group_desc *group = &chip_info->groups[i];
|
||||
|
||||
err = pinctrl_generic_add_group(jzpc->pctl, group->name,
|
||||
group->pins, group->num_pins, group->data);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to register group %s\n",
|
||||
group->name);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < chip_info->num_functions; i++) {
|
||||
const struct function_desc *func = &chip_info->functions[i];
|
||||
|
||||
err = pinmux_generic_add_function(jzpc->pctl, func->name,
|
||||
func->group_names, func->num_group_names,
|
||||
func->data);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to register function %s\n",
|
||||
func->name);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, jzpc->map);
|
||||
|
||||
if (dev->of_node) {
|
||||
err = of_platform_populate(dev->of_node, NULL, NULL, dev);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to probe GPIO devices\n");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct platform_device_id ingenic_pinctrl_ids[] = {
|
||||
{ "jz4740-pinctrl", ID_JZ4740 },
|
||||
{ "jz4770-pinctrl", ID_JZ4770 },
|
||||
{ "jz4780-pinctrl", ID_JZ4780 },
|
||||
{},
|
||||
};
|
||||
|
||||
static struct platform_driver ingenic_pinctrl_driver = {
|
||||
.driver = {
|
||||
.name = "pinctrl-ingenic",
|
||||
.of_match_table = of_match_ptr(ingenic_pinctrl_of_match),
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = ingenic_pinctrl_probe,
|
||||
.id_table = ingenic_pinctrl_ids,
|
||||
};
|
||||
|
||||
static int __init ingenic_pinctrl_drv_register(void)
|
||||
{
|
||||
return platform_driver_register(&ingenic_pinctrl_driver);
|
||||
}
|
||||
postcore_initcall(ingenic_pinctrl_drv_register);
|
||||
1194
drivers/pinctrl/pinctrl-mcp23s08.c
Normal file
1194
drivers/pinctrl/pinctrl-mcp23s08.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -143,6 +143,7 @@ struct rockchip_drv {
|
|||
* @gpio_chip: gpiolib chip
|
||||
* @grange: gpio range
|
||||
* @slock: spinlock for the gpio bank
|
||||
* @route_mask: bits describing the routing pins of per bank
|
||||
*/
|
||||
struct rockchip_pin_bank {
|
||||
void __iomem *reg_base;
|
||||
|
|
@ -165,6 +166,7 @@ struct rockchip_pin_bank {
|
|||
struct pinctrl_gpio_range grange;
|
||||
raw_spinlock_t slock;
|
||||
u32 toggle_edge_mode;
|
||||
u32 route_mask;
|
||||
};
|
||||
|
||||
#define PIN_BANK(id, pins, label) \
|
||||
|
|
@ -287,6 +289,22 @@ struct rockchip_pin_bank {
|
|||
.pull_type[3] = pull3, \
|
||||
}
|
||||
|
||||
/**
|
||||
* struct rockchip_mux_recalced_data: represent a pin iomux data.
|
||||
* @bank_num: bank number.
|
||||
* @pin: index at register or used to calc index.
|
||||
* @func: the min pin.
|
||||
* @route_offset: the max pin.
|
||||
* @route_val: the register offset.
|
||||
*/
|
||||
struct rockchip_mux_route_data {
|
||||
u8 bank_num;
|
||||
u8 pin;
|
||||
u8 func;
|
||||
u32 route_offset;
|
||||
u32 route_val;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
struct rockchip_pin_ctrl {
|
||||
|
|
@ -299,6 +317,8 @@ struct rockchip_pin_ctrl {
|
|||
int pmu_mux_offset;
|
||||
int grf_drv_offset;
|
||||
int pmu_drv_offset;
|
||||
struct rockchip_mux_route_data *iomux_routes;
|
||||
u32 niomux_routes;
|
||||
|
||||
void (*pull_calc_reg)(struct rockchip_pin_bank *bank,
|
||||
int pin_num, struct regmap **regmap,
|
||||
|
|
@ -580,6 +600,280 @@ static void rk3328_recalc_mux(u8 bank_num, int pin, int *reg,
|
|||
*bit = data->bit;
|
||||
}
|
||||
|
||||
static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
|
||||
{
|
||||
/* pwm0-0 */
|
||||
.bank_num = 0,
|
||||
.pin = 26,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16),
|
||||
}, {
|
||||
/* pwm0-1 */
|
||||
.bank_num = 3,
|
||||
.pin = 21,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16) | BIT(0),
|
||||
}, {
|
||||
/* pwm1-0 */
|
||||
.bank_num = 0,
|
||||
.pin = 27,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 1),
|
||||
}, {
|
||||
/* pwm1-1 */
|
||||
.bank_num = 0,
|
||||
.pin = 30,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 1) | BIT(1),
|
||||
}, {
|
||||
/* pwm2-0 */
|
||||
.bank_num = 0,
|
||||
.pin = 28,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 2),
|
||||
}, {
|
||||
/* pwm2-1 */
|
||||
.bank_num = 1,
|
||||
.pin = 12,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 2) | BIT(2),
|
||||
}, {
|
||||
/* pwm3-0 */
|
||||
.bank_num = 3,
|
||||
.pin = 26,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3),
|
||||
}, {
|
||||
/* pwm3-1 */
|
||||
.bank_num = 1,
|
||||
.pin = 11,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3) | BIT(3),
|
||||
}, {
|
||||
/* sdio-0_d0 */
|
||||
.bank_num = 1,
|
||||
.pin = 1,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 4),
|
||||
}, {
|
||||
/* sdio-1_d0 */
|
||||
.bank_num = 3,
|
||||
.pin = 2,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 4) | BIT(4),
|
||||
}, {
|
||||
/* spi-0_rx */
|
||||
.bank_num = 0,
|
||||
.pin = 13,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 5),
|
||||
}, {
|
||||
/* spi-1_rx */
|
||||
.bank_num = 2,
|
||||
.pin = 0,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 5) | BIT(5),
|
||||
}, {
|
||||
/* emmc-0_cmd */
|
||||
.bank_num = 1,
|
||||
.pin = 22,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 7),
|
||||
}, {
|
||||
/* emmc-1_cmd */
|
||||
.bank_num = 2,
|
||||
.pin = 4,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 7) | BIT(7),
|
||||
}, {
|
||||
/* uart2-0_rx */
|
||||
.bank_num = 1,
|
||||
.pin = 19,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 8),
|
||||
}, {
|
||||
/* uart2-1_rx */
|
||||
.bank_num = 1,
|
||||
.pin = 10,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 8) | BIT(8),
|
||||
}, {
|
||||
/* uart1-0_rx */
|
||||
.bank_num = 1,
|
||||
.pin = 10,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 11),
|
||||
}, {
|
||||
/* uart1-1_rx */
|
||||
.bank_num = 3,
|
||||
.pin = 13,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 11) | BIT(11),
|
||||
},
|
||||
};
|
||||
|
||||
static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
|
||||
{
|
||||
/* uart2dbg_rxm0 */
|
||||
.bank_num = 1,
|
||||
.pin = 1,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16) | BIT(16 + 1),
|
||||
}, {
|
||||
/* uart2dbg_rxm1 */
|
||||
.bank_num = 2,
|
||||
.pin = 1,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
|
||||
}, {
|
||||
/* gmac-m1-optimized_rxd0 */
|
||||
.bank_num = 1,
|
||||
.pin = 11,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 2) | BIT(16 + 10) | BIT(2) | BIT(10),
|
||||
}, {
|
||||
/* pdm_sdi0m0 */
|
||||
.bank_num = 2,
|
||||
.pin = 19,
|
||||
.func = 2,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3),
|
||||
}, {
|
||||
/* pdm_sdi0m1 */
|
||||
.bank_num = 1,
|
||||
.pin = 23,
|
||||
.func = 3,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 3) | BIT(3),
|
||||
}, {
|
||||
/* spi_rxdm2 */
|
||||
.bank_num = 3,
|
||||
.pin = 2,
|
||||
.func = 4,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 4) | BIT(16 + 5) | BIT(5),
|
||||
}, {
|
||||
/* i2s2_sdim0 */
|
||||
.bank_num = 1,
|
||||
.pin = 24,
|
||||
.func = 1,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 6),
|
||||
}, {
|
||||
/* i2s2_sdim1 */
|
||||
.bank_num = 3,
|
||||
.pin = 2,
|
||||
.func = 6,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 6) | BIT(6),
|
||||
}, {
|
||||
/* card_iom1 */
|
||||
.bank_num = 2,
|
||||
.pin = 22,
|
||||
.func = 3,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 7) | BIT(7),
|
||||
}, {
|
||||
/* tsp_d5m1 */
|
||||
.bank_num = 2,
|
||||
.pin = 16,
|
||||
.func = 3,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 8) | BIT(8),
|
||||
}, {
|
||||
/* cif_data5m1 */
|
||||
.bank_num = 2,
|
||||
.pin = 16,
|
||||
.func = 4,
|
||||
.route_offset = 0x50,
|
||||
.route_val = BIT(16 + 9) | BIT(9),
|
||||
},
|
||||
};
|
||||
|
||||
static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
|
||||
{
|
||||
/* uart2dbga_rx */
|
||||
.bank_num = 4,
|
||||
.pin = 8,
|
||||
.func = 2,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 10) | BIT(16 + 11),
|
||||
}, {
|
||||
/* uart2dbgb_rx */
|
||||
.bank_num = 4,
|
||||
.pin = 16,
|
||||
.func = 2,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
|
||||
}, {
|
||||
/* uart2dbgc_rx */
|
||||
.bank_num = 4,
|
||||
.pin = 19,
|
||||
.func = 1,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
|
||||
}, {
|
||||
/* pcie_clkreqn */
|
||||
.bank_num = 2,
|
||||
.pin = 26,
|
||||
.func = 2,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 14),
|
||||
}, {
|
||||
/* pcie_clkreqnb */
|
||||
.bank_num = 4,
|
||||
.pin = 24,
|
||||
.func = 1,
|
||||
.route_offset = 0xe21c,
|
||||
.route_val = BIT(16 + 14) | BIT(14),
|
||||
},
|
||||
};
|
||||
|
||||
static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
|
||||
int mux, u32 *reg, u32 *value)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
struct rockchip_pin_ctrl *ctrl = info->ctrl;
|
||||
struct rockchip_mux_route_data *data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ctrl->niomux_routes; i++) {
|
||||
data = &ctrl->iomux_routes[i];
|
||||
if ((data->bank_num == bank->bank_num) &&
|
||||
(data->pin == pin) && (data->func == mux))
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= ctrl->niomux_routes)
|
||||
return false;
|
||||
|
||||
*reg = data->route_offset;
|
||||
*value = data->route_val;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
|
||||
{
|
||||
struct rockchip_pinctrl *info = bank->drvdata;
|
||||
|
|
@ -678,7 +972,7 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
|||
struct regmap *regmap;
|
||||
int reg, ret, mask, mux_type;
|
||||
u8 bit;
|
||||
u32 data, rmask;
|
||||
u32 data, rmask, route_reg, route_val;
|
||||
|
||||
ret = rockchip_verify_mux(bank, pin, mux);
|
||||
if (ret < 0)
|
||||
|
|
@ -714,6 +1008,15 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
|
|||
if (ctrl->iomux_recalc && (mux_type & IOMUX_RECALCED))
|
||||
ctrl->iomux_recalc(bank->bank_num, pin, ®, &bit, &mask);
|
||||
|
||||
if (bank->route_mask & BIT(pin)) {
|
||||
if (rockchip_get_mux_route(bank, pin, mux, &route_reg,
|
||||
&route_val)) {
|
||||
ret = regmap_write(regmap, route_reg, route_val);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
data = (mask << (bit + 16));
|
||||
rmask = data | (data >> 16);
|
||||
data |= (mux & mask) << bit;
|
||||
|
|
@ -2549,6 +2852,16 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
|
|||
|
||||
bank_pins += 8;
|
||||
}
|
||||
|
||||
/* calculate the per-bank route_mask */
|
||||
for (j = 0; j < ctrl->niomux_routes; j++) {
|
||||
int pin = 0;
|
||||
|
||||
if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
|
||||
pin = ctrl->iomux_routes[j].pin;
|
||||
bank->route_mask |= BIT(pin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ctrl;
|
||||
|
|
@ -2799,6 +3112,8 @@ static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
|
|||
.label = "RK3228-GPIO",
|
||||
.type = RK3288,
|
||||
.grf_mux_offset = 0x0,
|
||||
.iomux_routes = rk3228_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3228_mux_route_data),
|
||||
.pull_calc_reg = rk3228_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3228_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
|
@ -2866,6 +3181,8 @@ static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
|
|||
.label = "RK3328-GPIO",
|
||||
.type = RK3288,
|
||||
.grf_mux_offset = 0x0,
|
||||
.iomux_routes = rk3328_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3328_mux_route_data),
|
||||
.pull_calc_reg = rk3228_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3228_calc_drv_reg_and_bit,
|
||||
.iomux_recalc = rk3328_recalc_mux,
|
||||
|
|
@ -2956,33 +3273,35 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
|
|||
.pmu_mux_offset = 0x0,
|
||||
.grf_drv_offset = 0xe100,
|
||||
.pmu_drv_offset = 0x80,
|
||||
.iomux_routes = rk3399_mux_route_data,
|
||||
.niomux_routes = ARRAY_SIZE(rk3399_mux_route_data),
|
||||
.pull_calc_reg = rk3399_calc_pull_reg_and_bit,
|
||||
.drv_calc_reg = rk3399_calc_drv_reg_and_bit,
|
||||
};
|
||||
|
||||
static const struct of_device_id rockchip_pinctrl_dt_match[] = {
|
||||
{ .compatible = "rockchip,rv1108-pinctrl",
|
||||
.data = (void *)&rv1108_pin_ctrl },
|
||||
.data = &rv1108_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk2928-pinctrl",
|
||||
.data = (void *)&rk2928_pin_ctrl },
|
||||
.data = &rk2928_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3036-pinctrl",
|
||||
.data = (void *)&rk3036_pin_ctrl },
|
||||
.data = &rk3036_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3066a-pinctrl",
|
||||
.data = (void *)&rk3066a_pin_ctrl },
|
||||
.data = &rk3066a_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3066b-pinctrl",
|
||||
.data = (void *)&rk3066b_pin_ctrl },
|
||||
.data = &rk3066b_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3188-pinctrl",
|
||||
.data = (void *)&rk3188_pin_ctrl },
|
||||
.data = &rk3188_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3228-pinctrl",
|
||||
.data = (void *)&rk3228_pin_ctrl },
|
||||
.data = &rk3228_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3288-pinctrl",
|
||||
.data = (void *)&rk3288_pin_ctrl },
|
||||
.data = &rk3288_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3328-pinctrl",
|
||||
.data = (void *)&rk3328_pin_ctrl },
|
||||
.data = &rk3328_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3368-pinctrl",
|
||||
.data = (void *)&rk3368_pin_ctrl },
|
||||
.data = &rk3368_pin_ctrl },
|
||||
{ .compatible = "rockchip,rk3399-pinctrl",
|
||||
.data = (void *)&rk3399_pin_ctrl },
|
||||
.data = &rk3399_pin_ctrl },
|
||||
{},
|
||||
};
|
||||
|
||||
|
|
|
|||
1308
drivers/pinctrl/pinctrl-rza1.c
Normal file
1308
drivers/pinctrl/pinctrl-rza1.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1270,8 +1270,6 @@ static void pcs_free_resources(struct pcs_device *pcs)
|
|||
#endif
|
||||
}
|
||||
|
||||
static const struct of_device_id pcs_of_match[];
|
||||
|
||||
static int pcs_add_gpio_func(struct device_node *node, struct pcs_device *pcs)
|
||||
{
|
||||
const char *propname = "pinctrl-single,gpio-range";
|
||||
|
|
@ -1637,15 +1635,14 @@ static int pcs_quirk_missing_pinctrl_cells(struct pcs_device *pcs,
|
|||
static int pcs_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct of_device_id *match;
|
||||
struct pcs_pdata *pdata;
|
||||
struct resource *res;
|
||||
struct pcs_device *pcs;
|
||||
const struct pcs_soc_data *soc;
|
||||
int ret;
|
||||
|
||||
match = of_match_device(pcs_of_match, &pdev->dev);
|
||||
if (!match)
|
||||
soc = of_device_get_match_data(&pdev->dev);
|
||||
if (WARN_ON(!soc))
|
||||
return -EINVAL;
|
||||
|
||||
pcs = devm_kzalloc(&pdev->dev, sizeof(*pcs), GFP_KERNEL);
|
||||
|
|
@ -1658,7 +1655,6 @@ static int pcs_probe(struct platform_device *pdev)
|
|||
raw_spin_lock_init(&pcs->lock);
|
||||
mutex_init(&pcs->mutex);
|
||||
INIT_LIST_HEAD(&pcs->gpiofuncs);
|
||||
soc = match->data;
|
||||
pcs->flags = soc->flags;
|
||||
memcpy(&pcs->socdata, soc, sizeof(*soc));
|
||||
|
||||
|
|
|
|||
|
|
@ -1028,7 +1028,7 @@ static const struct ltq_pin_group xrx200_grps[] = {
|
|||
GRP_MUX("spi_cs5", SPI, xrx200_pins_spi_cs5),
|
||||
GRP_MUX("spi_cs6", SPI, xrx200_pins_spi_cs6),
|
||||
GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_rx),
|
||||
GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_tx),
|
||||
GRP_MUX("usif uart_tx", USIF, xrx200_pins_usif_uart_tx),
|
||||
GRP_MUX("usif uart_rts", USIF, xrx200_pins_usif_uart_rts),
|
||||
GRP_MUX("usif uart_cts", USIF, xrx200_pins_usif_uart_cts),
|
||||
GRP_MUX("usif uart_dtr", USIF, xrx200_pins_usif_uart_dtr),
|
||||
|
|
|
|||
|
|
@ -39,6 +39,16 @@ config PINCTRL_IPQ8064
|
|||
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
|
||||
Qualcomm TLMM block found in the Qualcomm IPQ8064 platform.
|
||||
|
||||
config PINCTRL_IPQ8074
|
||||
tristate "Qualcomm Technologies, Inc. IPQ8074 pin controller driver"
|
||||
depends on GPIOLIB && OF
|
||||
select PINCTRL_MSM
|
||||
help
|
||||
This is the pinctrl, pinmux, pinconf and gpiolib driver for
|
||||
the Qualcomm Technologies Inc. TLMM block found on the
|
||||
Qualcomm Technologies Inc. IPQ8074 platform. Select this for
|
||||
IPQ8074.
|
||||
|
||||
config PINCTRL_MSM8660
|
||||
tristate "Qualcomm 8660 pin controller driver"
|
||||
depends on GPIOLIB && OF
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ obj-$(CONFIG_PINCTRL_APQ8064) += pinctrl-apq8064.o
|
|||
obj-$(CONFIG_PINCTRL_APQ8084) += pinctrl-apq8084.o
|
||||
obj-$(CONFIG_PINCTRL_IPQ4019) += pinctrl-ipq4019.o
|
||||
obj-$(CONFIG_PINCTRL_IPQ8064) += pinctrl-ipq8064.o
|
||||
obj-$(CONFIG_PINCTRL_IPQ8074) += pinctrl-ipq8074.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8660) += pinctrl-msm8660.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8960) += pinctrl-msm8960.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8X74) += pinctrl-msm8x74.o
|
||||
|
|
|
|||
1076
drivers/pinctrl/qcom/pinctrl-ipq8074.c
Normal file
1076
drivers/pinctrl/qcom/pinctrl-ipq8074.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -10,6 +10,16 @@ config PINCTRL_EXYNOS
|
|||
bool "Pinctrl driver data for Samsung EXYNOS SoCs other than 5440"
|
||||
depends on OF && GPIOLIB && (ARCH_EXYNOS || ARCH_S5PV210)
|
||||
select PINCTRL_SAMSUNG
|
||||
select PINCTRL_EXYNOS_ARM if ARM && (ARCH_EXYNOS || ARCH_S5PV210)
|
||||
select PINCTRL_EXYNOS_ARM64 if ARM64 && ARCH_EXYNOS
|
||||
|
||||
config PINCTRL_EXYNOS_ARM
|
||||
bool "ARMv7-specific pinctrl driver data for Exynos (except Exynos5440)" if COMPILE_TEST
|
||||
depends on PINCTRL_EXYNOS
|
||||
|
||||
config PINCTRL_EXYNOS_ARM64
|
||||
bool "ARMv8-specific pinctrl driver data for Exynos" if COMPILE_TEST
|
||||
depends on PINCTRL_EXYNOS
|
||||
|
||||
config PINCTRL_EXYNOS5440
|
||||
bool "Samsung EXYNOS5440 SoC pinctrl driver"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o
|
||||
obj-$(CONFIG_PINCTRL_EXYNOS) += pinctrl-exynos.o
|
||||
obj-$(CONFIG_PINCTRL_EXYNOS_ARM) += pinctrl-exynos-arm.o
|
||||
obj-$(CONFIG_PINCTRL_EXYNOS_ARM64) += pinctrl-exynos-arm64.o
|
||||
obj-$(CONFIG_PINCTRL_EXYNOS5440) += pinctrl-exynos5440.o
|
||||
obj-$(CONFIG_PINCTRL_S3C24XX) += pinctrl-s3c24xx.o
|
||||
obj-$(CONFIG_PINCTRL_S3C64XX) += pinctrl-s3c64xx.o
|
||||
|
|
|
|||
815
drivers/pinctrl/samsung/pinctrl-exynos-arm.c
Normal file
815
drivers/pinctrl/samsung/pinctrl-exynos-arm.c
Normal file
|
|
@ -0,0 +1,815 @@
|
|||
/*
|
||||
* Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2012 Linaro Ltd
|
||||
* http://www.linaro.org
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the Samsung Exynos specific information required by the
|
||||
* the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/soc/samsung/exynos-regs-pmu.h>
|
||||
|
||||
#include "pinctrl-samsung.h"
|
||||
#include "pinctrl-exynos.h"
|
||||
|
||||
static const struct samsung_pin_bank_type bank_type_off = {
|
||||
.fld_width = { 4, 1, 2, 2, 2, 2, },
|
||||
.reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
|
||||
};
|
||||
|
||||
static const struct samsung_pin_bank_type bank_type_alive = {
|
||||
.fld_width = { 4, 1, 2, 2, },
|
||||
.reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
|
||||
};
|
||||
|
||||
/* Retention control for S5PV210 are located at the end of clock controller */
|
||||
#define S5P_OTHERS 0xE000
|
||||
|
||||
#define S5P_OTHERS_RET_IO (1 << 31)
|
||||
#define S5P_OTHERS_RET_CF (1 << 30)
|
||||
#define S5P_OTHERS_RET_MMC (1 << 29)
|
||||
#define S5P_OTHERS_RET_UART (1 << 28)
|
||||
|
||||
static void s5pv210_retention_disable(struct samsung_pinctrl_drv_data *drvdata)
|
||||
{
|
||||
void __iomem *clk_base = (void __iomem *)drvdata->retention_ctrl->priv;
|
||||
u32 tmp;
|
||||
|
||||
tmp = __raw_readl(clk_base + S5P_OTHERS);
|
||||
tmp |= (S5P_OTHERS_RET_IO | S5P_OTHERS_RET_CF | S5P_OTHERS_RET_MMC |
|
||||
S5P_OTHERS_RET_UART);
|
||||
__raw_writel(tmp, clk_base + S5P_OTHERS);
|
||||
}
|
||||
|
||||
static struct samsung_retention_ctrl *
|
||||
s5pv210_retention_init(struct samsung_pinctrl_drv_data *drvdata,
|
||||
const struct samsung_retention_data *data)
|
||||
{
|
||||
struct samsung_retention_ctrl *ctrl;
|
||||
struct device_node *np;
|
||||
void __iomem *clk_base;
|
||||
|
||||
ctrl = devm_kzalloc(drvdata->dev, sizeof(*ctrl), GFP_KERNEL);
|
||||
if (!ctrl)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "samsung,s5pv210-clock");
|
||||
if (!np) {
|
||||
pr_err("%s: failed to find clock controller DT node\n",
|
||||
__func__);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
clk_base = of_iomap(np, 0);
|
||||
if (!clk_base) {
|
||||
pr_err("%s: failed to map clock registers\n", __func__);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
ctrl->priv = (void __force *)clk_base;
|
||||
ctrl->disable = s5pv210_retention_disable;
|
||||
|
||||
return ctrl;
|
||||
}
|
||||
|
||||
static const struct samsung_retention_data s5pv210_retention_data __initconst = {
|
||||
.init = s5pv210_retention_init,
|
||||
};
|
||||
|
||||
/* pin banks of s5pv210 pin-controller */
|
||||
static const struct samsung_pin_bank_data s5pv210_pin_bank[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
|
||||
EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
|
||||
EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
|
||||
};
|
||||
|
||||
const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = s5pv210_pin_bank,
|
||||
.nr_banks = ARRAY_SIZE(s5pv210_pin_bank),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &s5pv210_retention_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* Pad retention control code for accessing PMU regmap */
|
||||
static atomic_t exynos_shared_retention_refcnt;
|
||||
|
||||
/* pin banks of exynos3250 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos3250_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
|
||||
};
|
||||
|
||||
/* pin banks of exynos3250 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos3250_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
|
||||
EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/*
|
||||
* PMU pad retention groups for Exynos3250 doesn't match pin banks, so handle
|
||||
* them all together
|
||||
*/
|
||||
static const u32 exynos3250_retention_regs[] = {
|
||||
S5P_PAD_RET_MAUDIO_OPTION,
|
||||
S5P_PAD_RET_GPIO_OPTION,
|
||||
S5P_PAD_RET_UART_OPTION,
|
||||
S5P_PAD_RET_MMCA_OPTION,
|
||||
S5P_PAD_RET_MMCB_OPTION,
|
||||
S5P_PAD_RET_EBIA_OPTION,
|
||||
S5P_PAD_RET_EBIB_OPTION,
|
||||
S5P_PAD_RET_MMC2_OPTION,
|
||||
S5P_PAD_RET_SPI_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos3250_retention_data __initconst = {
|
||||
.regs = exynos3250_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos3250_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.refcnt = &exynos_shared_retention_refcnt,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
|
||||
* two gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos3250_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos3250_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos3250_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos3250_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos3250_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos3250_retention_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos4210 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos4210 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos4210_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
|
||||
EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos4210 pin-controller 2 */
|
||||
static const struct samsung_pin_bank_data exynos4210_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
|
||||
};
|
||||
|
||||
/* PMU pad retention groups registers for Exynos4 (without audio) */
|
||||
static const u32 exynos4_retention_regs[] = {
|
||||
S5P_PAD_RET_GPIO_OPTION,
|
||||
S5P_PAD_RET_UART_OPTION,
|
||||
S5P_PAD_RET_MMCA_OPTION,
|
||||
S5P_PAD_RET_MMCB_OPTION,
|
||||
S5P_PAD_RET_EBIA_OPTION,
|
||||
S5P_PAD_RET_EBIB_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos4_retention_data __initconst = {
|
||||
.regs = exynos4_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos4_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.refcnt = &exynos_shared_retention_refcnt,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/* PMU retention control for audio pins can be tied to audio pin bank */
|
||||
static const u32 exynos4_audio_retention_regs[] = {
|
||||
S5P_PAD_RET_MAUDIO_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos4_audio_retention_data __initconst = {
|
||||
.regs = exynos4_audio_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos4_audio_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
|
||||
* three gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos4210_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos4210_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos4210_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos4210_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos4210_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos4210_pin_banks2),
|
||||
.retention_data = &exynos4_audio_retention_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos4x12 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
|
||||
};
|
||||
|
||||
/* pin banks of exynos4x12 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos4x12_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
|
||||
EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos4x12 pin-controller 2 */
|
||||
static const struct samsung_pin_bank_data exynos4x12_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos4x12 pin-controller 3 */
|
||||
static const struct samsung_pin_bank_data exynos4x12_pin_banks3[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
|
||||
* four gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos4x12_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos4x12_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos4x12_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos4x12_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos4x12_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos4x12_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_audio_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 3 data */
|
||||
.pin_banks = exynos4x12_pin_banks3,
|
||||
.nr_banks = ARRAY_SIZE(exynos4x12_pin_banks3),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos5250 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
|
||||
EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5250 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos5250_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5250 pin-controller 2 */
|
||||
static const struct samsung_pin_bank_data exynos5250_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5250 pin-controller 3 */
|
||||
static const struct samsung_pin_bank_data exynos5250_pin_banks3[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
|
||||
* four gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos5250_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos5250_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos5250_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos5250_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos5250_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos5250_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
}, {
|
||||
/* pin-controller instance 3 data */
|
||||
.pin_banks = exynos5250_pin_banks3,
|
||||
.nr_banks = ARRAY_SIZE(exynos5250_pin_banks3),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos4_audio_retention_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos5260 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5260 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos5260_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5260 pin-controller 2 */
|
||||
static const struct samsung_pin_bank_data exynos5260_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
|
||||
* three gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos5260_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos5260_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos5260_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos5260_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos5260_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos5260_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos5410 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc3", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc1", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc2", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTN(2, 0x160, "gpm5"),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpe0", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x1C0, "gpe1", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf0", 0x38),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x200, "gpf1", 0x3c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x220, "gpg0", 0x40),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpg1", 0x44),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x260, "gpg2", 0x48),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x280, "gph0", 0x4c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x2A0, "gph1", 0x50),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x2C0, "gpm7"),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x2E0, "gpy0"),
|
||||
EXYNOS_PIN_BANK_EINTN(4, 0x300, "gpy1"),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x320, "gpy2"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x340, "gpy3"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x360, "gpy4"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x380, "gpy5"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x3A0, "gpy6"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x3C0, "gpy7"),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5410 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos5410_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpj0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpj1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpj2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpj3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpj4", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpk0", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpk1", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0E0, "gpk2", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x100, "gpk3", 0x20),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5410 pin-controller 2 */
|
||||
static const struct samsung_pin_bank_data exynos5410_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5410 pin-controller 3 */
|
||||
static const struct samsung_pin_bank_data exynos5410_pin_banks3[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes
|
||||
* four gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos5410_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos5410_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos5410_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos5410_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos5410_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos5410_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
}, {
|
||||
/* pin-controller instance 3 data */
|
||||
.pin_banks = exynos5410_pin_banks3,
|
||||
.nr_banks = ARRAY_SIZE(exynos5410_pin_banks3),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos5420 pin-controller 0 */
|
||||
static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5420 pin-controller 1 */
|
||||
static const struct samsung_pin_bank_data exynos5420_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
|
||||
EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
|
||||
EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
|
||||
EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5420 pin-controller 2 */
|
||||
static const struct samsung_pin_bank_data exynos5420_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5420 pin-controller 3 */
|
||||
static const struct samsung_pin_bank_data exynos5420_pin_banks3[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5420 pin-controller 4 */
|
||||
static const struct samsung_pin_bank_data exynos5420_pin_banks4[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
|
||||
};
|
||||
|
||||
/* PMU pad retention groups registers for Exynos5420 (without audio) */
|
||||
static const u32 exynos5420_retention_regs[] = {
|
||||
EXYNOS_PAD_RET_DRAM_OPTION,
|
||||
EXYNOS_PAD_RET_JTAG_OPTION,
|
||||
EXYNOS5420_PAD_RET_GPIO_OPTION,
|
||||
EXYNOS5420_PAD_RET_UART_OPTION,
|
||||
EXYNOS5420_PAD_RET_MMCA_OPTION,
|
||||
EXYNOS5420_PAD_RET_MMCB_OPTION,
|
||||
EXYNOS5420_PAD_RET_MMCC_OPTION,
|
||||
EXYNOS5420_PAD_RET_HSI_OPTION,
|
||||
EXYNOS_PAD_RET_EBIA_OPTION,
|
||||
EXYNOS_PAD_RET_EBIB_OPTION,
|
||||
EXYNOS5420_PAD_RET_SPI_OPTION,
|
||||
EXYNOS5420_PAD_RET_DRAM_COREBLK_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos5420_retention_data __initconst = {
|
||||
.regs = exynos5420_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos5420_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.refcnt = &exynos_shared_retention_refcnt,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
|
||||
* four gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos5420_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos5420_pin_banks0),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.retention_data = &exynos5420_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos5420_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos5420_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.retention_data = &exynos5420_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos5420_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos5420_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.retention_data = &exynos5420_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 3 data */
|
||||
.pin_banks = exynos5420_pin_banks3,
|
||||
.nr_banks = ARRAY_SIZE(exynos5420_pin_banks3),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.retention_data = &exynos5420_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 4 data */
|
||||
.pin_banks = exynos5420_pin_banks4,
|
||||
.nr_banks = ARRAY_SIZE(exynos5420_pin_banks4),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.retention_data = &exynos4_audio_retention_data,
|
||||
},
|
||||
};
|
||||
399
drivers/pinctrl/samsung/pinctrl-exynos-arm64.c
Normal file
399
drivers/pinctrl/samsung/pinctrl-exynos-arm64.c
Normal file
|
|
@ -0,0 +1,399 @@
|
|||
/*
|
||||
* Exynos ARMv8 specific support for Samsung pinctrl/gpiolib driver
|
||||
* with eint support.
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2012 Linaro Ltd
|
||||
* http://www.linaro.org
|
||||
* Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the Samsung Exynos specific information required by the
|
||||
* the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/soc/samsung/exynos-regs-pmu.h>
|
||||
|
||||
#include "pinctrl-samsung.h"
|
||||
#include "pinctrl-exynos.h"
|
||||
|
||||
static const struct samsung_pin_bank_type bank_type_off = {
|
||||
.fld_width = { 4, 1, 2, 2, 2, 2, },
|
||||
.reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
|
||||
};
|
||||
|
||||
static const struct samsung_pin_bank_type bank_type_alive = {
|
||||
.fld_width = { 4, 1, 2, 2, },
|
||||
.reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
|
||||
};
|
||||
|
||||
/* Exynos5433 has the 4bit widths for PINCFG_TYPE_DRV bitfields. */
|
||||
static const struct samsung_pin_bank_type exynos5433_bank_type_off = {
|
||||
.fld_width = { 4, 1, 2, 4, 2, 2, },
|
||||
.reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
|
||||
};
|
||||
|
||||
static const struct samsung_pin_bank_type exynos5433_bank_type_alive = {
|
||||
.fld_width = { 4, 1, 2, 4, },
|
||||
.reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
|
||||
};
|
||||
|
||||
/* Pad retention control code for accessing PMU regmap */
|
||||
static atomic_t exynos_shared_retention_refcnt;
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - ALIVE */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks0[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS5433_PIN_BANK_EINTW(8, 0x020, "gpa1", 0x04),
|
||||
EXYNOS5433_PIN_BANK_EINTW(8, 0x040, "gpa2", 0x08),
|
||||
EXYNOS5433_PIN_BANK_EINTW(8, 0x060, "gpa3", 0x0c),
|
||||
EXYNOS5433_PIN_BANK_EINTW_EXT(8, 0x020, "gpf1", 0x1004, 1),
|
||||
EXYNOS5433_PIN_BANK_EINTW_EXT(4, 0x040, "gpf2", 0x1008, 1),
|
||||
EXYNOS5433_PIN_BANK_EINTW_EXT(4, 0x060, "gpf3", 0x100c, 1),
|
||||
EXYNOS5433_PIN_BANK_EINTW_EXT(8, 0x080, "gpf4", 0x1010, 1),
|
||||
EXYNOS5433_PIN_BANK_EINTW_EXT(8, 0x0a0, "gpf5", 0x1014, 1),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - AUD */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks1[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
|
||||
EXYNOS5433_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - CPIF */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks2[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(2, 0x000, "gpv6", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - eSE */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks3[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(3, 0x000, "gpj2", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - FINGER */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks4[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(4, 0x000, "gpd5", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - FSYS */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks5[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(6, 0x000, "gph1", 0x00),
|
||||
EXYNOS5433_PIN_BANK_EINTG(7, 0x020, "gpr4", 0x04),
|
||||
EXYNOS5433_PIN_BANK_EINTG(5, 0x040, "gpr0", 0x08),
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x060, "gpr1", 0x0c),
|
||||
EXYNOS5433_PIN_BANK_EINTG(2, 0x080, "gpr2", 0x10),
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x0a0, "gpr3", 0x14),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - IMEM */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks6[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x000, "gpf0", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - NFC */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks7[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(3, 0x000, "gpj0", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - PERIC */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks8[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(6, 0x000, "gpv7", 0x00),
|
||||
EXYNOS5433_PIN_BANK_EINTG(5, 0x020, "gpb0", 0x04),
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x040, "gpc0", 0x08),
|
||||
EXYNOS5433_PIN_BANK_EINTG(2, 0x060, "gpc1", 0x0c),
|
||||
EXYNOS5433_PIN_BANK_EINTG(6, 0x080, "gpc2", 0x10),
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x0a0, "gpc3", 0x14),
|
||||
EXYNOS5433_PIN_BANK_EINTG(2, 0x0c0, "gpg0", 0x18),
|
||||
EXYNOS5433_PIN_BANK_EINTG(4, 0x0e0, "gpd0", 0x1c),
|
||||
EXYNOS5433_PIN_BANK_EINTG(6, 0x100, "gpd1", 0x20),
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x120, "gpd2", 0x24),
|
||||
EXYNOS5433_PIN_BANK_EINTG(5, 0x140, "gpd4", 0x28),
|
||||
EXYNOS5433_PIN_BANK_EINTG(2, 0x160, "gpd8", 0x2c),
|
||||
EXYNOS5433_PIN_BANK_EINTG(7, 0x180, "gpd6", 0x30),
|
||||
EXYNOS5433_PIN_BANK_EINTG(3, 0x1a0, "gpd7", 0x34),
|
||||
EXYNOS5433_PIN_BANK_EINTG(5, 0x1c0, "gpg1", 0x38),
|
||||
EXYNOS5433_PIN_BANK_EINTG(2, 0x1e0, "gpg2", 0x3c),
|
||||
EXYNOS5433_PIN_BANK_EINTG(8, 0x200, "gpg3", 0x40),
|
||||
};
|
||||
|
||||
/* pin banks of exynos5433 pin-controller - TOUCH */
|
||||
static const struct samsung_pin_bank_data exynos5433_pin_banks9[] __initconst = {
|
||||
EXYNOS5433_PIN_BANK_EINTG(3, 0x000, "gpj1", 0x00),
|
||||
};
|
||||
|
||||
/* PMU pin retention groups registers for Exynos5433 (without audio & fsys) */
|
||||
static const u32 exynos5433_retention_regs[] = {
|
||||
EXYNOS5433_PAD_RETENTION_TOP_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_UART_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_EBIA_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_EBIB_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_SPI_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_MIF_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_USBXTI_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_UFS_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos5433_retention_data __initconst = {
|
||||
.regs = exynos5433_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos5433_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.refcnt = &exynos_shared_retention_refcnt,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/* PMU retention control for audio pins can be tied to audio pin bank */
|
||||
static const u32 exynos5433_audio_retention_regs[] = {
|
||||
EXYNOS5433_PAD_RETENTION_AUD_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos5433_audio_retention_data __initconst = {
|
||||
.regs = exynos5433_audio_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos5433_audio_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/* PMU retention control for mmc pins can be tied to fsys pin bank */
|
||||
static const u32 exynos5433_fsys_retention_regs[] = {
|
||||
EXYNOS5433_PAD_RETENTION_MMC0_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_MMC1_OPTION,
|
||||
EXYNOS5433_PAD_RETENTION_MMC2_OPTION,
|
||||
};
|
||||
|
||||
static const struct samsung_retention_data exynos5433_fsys_retention_data __initconst = {
|
||||
.regs = exynos5433_fsys_retention_regs,
|
||||
.nr_regs = ARRAY_SIZE(exynos5433_fsys_retention_regs),
|
||||
.value = EXYNOS_WAKEUP_FROM_LOWPWR,
|
||||
.init = exynos_retention_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes
|
||||
* ten gpio/pin-mux/pinconfig controllers.
|
||||
*/
|
||||
const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 data */
|
||||
.pin_banks = exynos5433_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks0),
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.nr_ext_resources = 1,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 1 data */
|
||||
.pin_banks = exynos5433_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_audio_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 2 data */
|
||||
.pin_banks = exynos5433_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 3 data */
|
||||
.pin_banks = exynos5433_pin_banks3,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks3),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 4 data */
|
||||
.pin_banks = exynos5433_pin_banks4,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks4),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 5 data */
|
||||
.pin_banks = exynos5433_pin_banks5,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks5),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_fsys_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 6 data */
|
||||
.pin_banks = exynos5433_pin_banks6,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks6),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 7 data */
|
||||
.pin_banks = exynos5433_pin_banks7,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks7),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 8 data */
|
||||
.pin_banks = exynos5433_pin_banks8,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks8),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
}, {
|
||||
/* pin-controller instance 9 data */
|
||||
.pin_banks = exynos5433_pin_banks9,
|
||||
.nr_banks = ARRAY_SIZE(exynos5433_pin_banks9),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
.suspend = exynos_pinctrl_suspend,
|
||||
.resume = exynos_pinctrl_resume,
|
||||
.retention_data = &exynos5433_retention_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - ALIVE */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks0[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0x020, "gpa1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0x040, "gpa2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTW(8, 0x060, "gpa3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - BUS0 */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks1[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpb0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc0", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x040, "gpc1", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x060, "gpc2", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpc3", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpd2", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpd4", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x120, "gpd5", 0x24),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x140, "gpd6", 0x28),
|
||||
EXYNOS_PIN_BANK_EINTG(3, 0x160, "gpd7", 0x2c),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x180, "gpd8", 0x30),
|
||||
EXYNOS_PIN_BANK_EINTG(2, 0x1a0, "gpg0", 0x34),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpg3", 0x38),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - NFC */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks2[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpj0", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - TOUCH */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks3[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(3, 0x000, "gpj1", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - FF */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks4[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpg4", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - ESE */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks5[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpv7", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - FSYS0 */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks6[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpr4", 0x00),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - FSYS1 */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks7[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpr0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpr1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x040, "gpr2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpr3", 0x0c),
|
||||
};
|
||||
|
||||
/* pin banks of exynos7 pin-controller - BUS1 */
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks8[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpf0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpf1", 0x04),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf2", 0x08),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpf3", 0x0c),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0a0, "gpf4", 0x10),
|
||||
EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpf5", 0x14),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x0e0, "gpg1", 0x18),
|
||||
EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpg2", 0x1c),
|
||||
EXYNOS_PIN_BANK_EINTG(6, 0x120, "gph1", 0x20),
|
||||
EXYNOS_PIN_BANK_EINTG(3, 0x140, "gpv6", 0x24),
|
||||
};
|
||||
|
||||
static const struct samsung_pin_bank_data exynos7_pin_banks9[] __initconst = {
|
||||
EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
|
||||
EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
|
||||
};
|
||||
|
||||
const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = {
|
||||
{
|
||||
/* pin-controller instance 0 Alive data */
|
||||
.pin_banks = exynos7_pin_banks0,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks0),
|
||||
.eint_wkup_init = exynos_eint_wkup_init,
|
||||
}, {
|
||||
/* pin-controller instance 1 BUS0 data */
|
||||
.pin_banks = exynos7_pin_banks1,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks1),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 2 NFC data */
|
||||
.pin_banks = exynos7_pin_banks2,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks2),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 3 TOUCH data */
|
||||
.pin_banks = exynos7_pin_banks3,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks3),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 4 FF data */
|
||||
.pin_banks = exynos7_pin_banks4,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks4),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 5 ESE data */
|
||||
.pin_banks = exynos7_pin_banks5,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks5),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 6 FSYS0 data */
|
||||
.pin_banks = exynos7_pin_banks6,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks6),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 7 FSYS1 data */
|
||||
.pin_banks = exynos7_pin_banks7,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks7),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 8 BUS1 data */
|
||||
.pin_banks = exynos7_pin_banks8,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks8),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
}, {
|
||||
/* pin-controller instance 9 AUD data */
|
||||
.pin_banks = exynos7_pin_banks9,
|
||||
.nr_banks = ARRAY_SIZE(exynos7_pin_banks9),
|
||||
.eint_gpio_init = exynos_eint_gpio_init,
|
||||
},
|
||||
};
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -17,6 +17,9 @@
|
|||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __PINCTRL_SAMSUNG_EXYNOS_H
|
||||
#define __PINCTRL_SAMSUNG_EXYNOS_H
|
||||
|
||||
/* External GPIO and wakeup interrupt related definitions */
|
||||
#define EXYNOS_GPIO_ECON_OFFSET 0x700
|
||||
#define EXYNOS_GPIO_EFLTCON_OFFSET 0x800
|
||||
|
|
@ -131,3 +134,13 @@ struct exynos_muxed_weint_data {
|
|||
unsigned int nr_banks;
|
||||
struct samsung_pin_bank *banks[];
|
||||
};
|
||||
|
||||
int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d);
|
||||
int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d);
|
||||
void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata);
|
||||
void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata);
|
||||
struct samsung_retention_ctrl *
|
||||
exynos_retention_init(struct samsung_pinctrl_drv_data *drvdata,
|
||||
const struct samsung_retention_data *data);
|
||||
|
||||
#endif /* __PINCTRL_SAMSUNG_EXYNOS_H */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
/*
|
||||
* pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
|
|
@ -10,7 +12,7 @@
|
|||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
@ -991,7 +993,6 @@ static const struct of_device_id exynos5440_pinctrl_dt_match[] = {
|
|||
{ .compatible = "samsung,exynos5440-pinctrl" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, exynos5440_pinctrl_dt_match);
|
||||
|
||||
static struct platform_driver exynos5440_pinctrl_driver = {
|
||||
.probe = exynos5440_pinctrl_probe,
|
||||
|
|
@ -1007,13 +1008,3 @@ static int __init exynos5440_pinctrl_drv_register(void)
|
|||
return platform_driver_register(&exynos5440_pinctrl_driver);
|
||||
}
|
||||
postcore_initcall(exynos5440_pinctrl_drv_register);
|
||||
|
||||
static void __exit exynos5440_pinctrl_drv_unregister(void)
|
||||
{
|
||||
platform_driver_unregister(&exynos5440_pinctrl_driver);
|
||||
}
|
||||
module_exit(exynos5440_pinctrl_drv_unregister);
|
||||
|
||||
MODULE_AUTHOR("Thomas Abraham <[email protected]>");
|
||||
MODULE_DESCRIPTION("Samsung EXYNOS5440 SoC pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irqdomain.h>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irqdomain.h>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
* and wakeup interrupts can be hooked to.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
@ -1183,27 +1183,29 @@ static int __maybe_unused samsung_pinctrl_resume(struct device *dev)
|
|||
}
|
||||
|
||||
static const struct of_device_id samsung_pinctrl_dt_match[] = {
|
||||
#ifdef CONFIG_PINCTRL_EXYNOS
|
||||
#ifdef CONFIG_PINCTRL_EXYNOS_ARM
|
||||
{ .compatible = "samsung,exynos3250-pinctrl",
|
||||
.data = (void *)exynos3250_pin_ctrl },
|
||||
.data = exynos3250_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos4210-pinctrl",
|
||||
.data = (void *)exynos4210_pin_ctrl },
|
||||
.data = exynos4210_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos4x12-pinctrl",
|
||||
.data = (void *)exynos4x12_pin_ctrl },
|
||||
.data = exynos4x12_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos5250-pinctrl",
|
||||
.data = (void *)exynos5250_pin_ctrl },
|
||||
.data = exynos5250_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos5260-pinctrl",
|
||||
.data = (void *)exynos5260_pin_ctrl },
|
||||
.data = exynos5260_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos5410-pinctrl",
|
||||
.data = (void *)exynos5410_pin_ctrl },
|
||||
.data = exynos5410_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos5420-pinctrl",
|
||||
.data = (void *)exynos5420_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos5433-pinctrl",
|
||||
.data = (void *)exynos5433_pin_ctrl },
|
||||
.data = exynos5420_pin_ctrl },
|
||||
{ .compatible = "samsung,s5pv210-pinctrl",
|
||||
.data = (void *)s5pv210_pin_ctrl },
|
||||
.data = s5pv210_pin_ctrl },
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_EXYNOS_ARM64
|
||||
{ .compatible = "samsung,exynos5433-pinctrl",
|
||||
.data = exynos5433_pin_ctrl },
|
||||
{ .compatible = "samsung,exynos7-pinctrl",
|
||||
.data = (void *)exynos7_pin_ctrl },
|
||||
.data = exynos7_pin_ctrl },
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_S3C64XX
|
||||
{ .compatible = "samsung,s3c64xx-pinctrl",
|
||||
|
|
@ -1221,7 +1223,6 @@ static const struct of_device_id samsung_pinctrl_dt_match[] = {
|
|||
#endif
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match);
|
||||
|
||||
static const struct dev_pm_ops samsung_pinctrl_pm_ops = {
|
||||
SET_LATE_SYSTEM_SLEEP_PM_OPS(samsung_pinctrl_suspend,
|
||||
|
|
@ -1243,13 +1244,3 @@ static int __init samsung_pinctrl_drv_register(void)
|
|||
return platform_driver_register(&samsung_pinctrl_driver);
|
||||
}
|
||||
postcore_initcall(samsung_pinctrl_drv_register);
|
||||
|
||||
static void __exit samsung_pinctrl_drv_unregister(void)
|
||||
{
|
||||
platform_driver_unregister(&samsung_pinctrl_driver);
|
||||
}
|
||||
module_exit(samsung_pinctrl_drv_unregister);
|
||||
|
||||
MODULE_AUTHOR("Thomas Abraham <[email protected]>");
|
||||
MODULE_DESCRIPTION("Samsung pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -34,6 +34,16 @@ config PINCTRL_PFC_R8A7740
|
|||
depends on ARCH_R8A7740
|
||||
select PINCTRL_SH_PFC_GPIO
|
||||
|
||||
config PINCTRL_PFC_R8A7743
|
||||
def_bool y
|
||||
depends on ARCH_R8A7743
|
||||
select PINCTRL_SH_PFC
|
||||
|
||||
config PINCTRL_PFC_R8A7745
|
||||
def_bool y
|
||||
depends on ARCH_R8A7745
|
||||
select PINCTRL_SH_PFC
|
||||
|
||||
config PINCTRL_PFC_R8A7778
|
||||
def_bool y
|
||||
depends on ARCH_R8A7778
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ obj-$(CONFIG_PINCTRL_SH_PFC_GPIO) += gpio.o
|
|||
obj-$(CONFIG_PINCTRL_PFC_EMEV2) += pfc-emev2.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A73A4) += pfc-r8a73a4.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7740) += pfc-r8a7740.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7743) += pfc-r8a7791.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7745) += pfc-r8a7794.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7778) += pfc-r8a7778.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7779) += pfc-r8a7779.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7790) += pfc-r8a7790.o
|
||||
|
|
|
|||
|
|
@ -485,6 +485,18 @@ static const struct of_device_id sh_pfc_of_table[] = {
|
|||
.data = &r8a7740_pinmux_info,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_PFC_R8A7743
|
||||
{
|
||||
.compatible = "renesas,pfc-r8a7743",
|
||||
.data = &r8a7743_pinmux_info,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_PFC_R8A7745
|
||||
{
|
||||
.compatible = "renesas,pfc-r8a7745",
|
||||
.data = &r8a7745_pinmux_info,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_PFC_R8A7778
|
||||
{
|
||||
.compatible = "renesas,pfc-r8a7778",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1137,6 +1137,43 @@ static const unsigned int scif0_ctrl_pins[] = {
|
|||
static const unsigned int scif0_ctrl_mux[] = {
|
||||
RTS0_N_MARK, CTS0_N_MARK,
|
||||
};
|
||||
/* - SCIF1 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif1_data_pins[] = {
|
||||
/* RX, TX */
|
||||
RCAR_GP_PIN(10, 19), RCAR_GP_PIN(10, 18),
|
||||
};
|
||||
static const unsigned int scif1_data_mux[] = {
|
||||
RX1_MARK, TX1_MARK,
|
||||
};
|
||||
static const unsigned int scif1_clk_pins[] = {
|
||||
/* SCK */
|
||||
RCAR_GP_PIN(10, 15),
|
||||
};
|
||||
static const unsigned int scif1_clk_mux[] = {
|
||||
SCK1_MARK,
|
||||
};
|
||||
static const unsigned int scif1_ctrl_pins[] = {
|
||||
/* RTS, CTS */
|
||||
RCAR_GP_PIN(10, 17), RCAR_GP_PIN(10, 16),
|
||||
};
|
||||
static const unsigned int scif1_ctrl_mux[] = {
|
||||
RTS1_N_MARK, CTS1_N_MARK,
|
||||
};
|
||||
/* - SCIF2 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif2_data_pins[] = {
|
||||
/* RX, TX */
|
||||
RCAR_GP_PIN(10, 22), RCAR_GP_PIN(10, 21),
|
||||
};
|
||||
static const unsigned int scif2_data_mux[] = {
|
||||
RX2_MARK, TX2_MARK,
|
||||
};
|
||||
static const unsigned int scif2_clk_pins[] = {
|
||||
/* SCK */
|
||||
RCAR_GP_PIN(10, 20),
|
||||
};
|
||||
static const unsigned int scif2_clk_mux[] = {
|
||||
SCK2_MARK,
|
||||
};
|
||||
/* - SCIF3 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif3_data_pins[] = {
|
||||
/* RX, TX */
|
||||
|
|
@ -1680,6 +1717,11 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
|||
SH_PFC_PIN_GROUP(scif0_data),
|
||||
SH_PFC_PIN_GROUP(scif0_clk),
|
||||
SH_PFC_PIN_GROUP(scif0_ctrl),
|
||||
SH_PFC_PIN_GROUP(scif1_data),
|
||||
SH_PFC_PIN_GROUP(scif1_clk),
|
||||
SH_PFC_PIN_GROUP(scif1_ctrl),
|
||||
SH_PFC_PIN_GROUP(scif2_data),
|
||||
SH_PFC_PIN_GROUP(scif2_clk),
|
||||
SH_PFC_PIN_GROUP(scif3_data),
|
||||
SH_PFC_PIN_GROUP(scif3_clk),
|
||||
SH_PFC_PIN_GROUP(sdhi0_data1),
|
||||
|
|
@ -1826,6 +1868,17 @@ static const char * const scif0_groups[] = {
|
|||
"scif0_ctrl",
|
||||
};
|
||||
|
||||
static const char * const scif1_groups[] = {
|
||||
"scif1_data",
|
||||
"scif1_clk",
|
||||
"scif1_ctrl",
|
||||
};
|
||||
|
||||
static const char * const scif2_groups[] = {
|
||||
"scif2_data",
|
||||
"scif2_clk",
|
||||
};
|
||||
|
||||
static const char * const scif3_groups[] = {
|
||||
"scif3_data",
|
||||
"scif3_clk",
|
||||
|
|
@ -1924,6 +1977,8 @@ static const struct sh_pfc_function pinmux_functions[] = {
|
|||
SH_PFC_FUNCTION(msiof1),
|
||||
SH_PFC_FUNCTION(qspi),
|
||||
SH_PFC_FUNCTION(scif0),
|
||||
SH_PFC_FUNCTION(scif1),
|
||||
SH_PFC_FUNCTION(scif2),
|
||||
SH_PFC_FUNCTION(scif3),
|
||||
SH_PFC_FUNCTION(sdhi0),
|
||||
SH_PFC_FUNCTION(vin0),
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -192,8 +192,8 @@
|
|||
#define GPSR6_9 F_(SSI_WS4, IP14_27_24)
|
||||
#define GPSR6_8 F_(SSI_SCK4, IP14_23_20)
|
||||
#define GPSR6_7 F_(SSI_SDATA3, IP14_19_16)
|
||||
#define GPSR6_6 F_(SSI_WS34, IP14_15_12)
|
||||
#define GPSR6_5 F_(SSI_SCK34, IP14_11_8)
|
||||
#define GPSR6_6 F_(SSI_WS349, IP14_15_12)
|
||||
#define GPSR6_5 F_(SSI_SCK349, IP14_11_8)
|
||||
#define GPSR6_4 F_(SSI_SDATA2_A, IP14_7_4)
|
||||
#define GPSR6_3 F_(SSI_SDATA1_A, IP14_3_0)
|
||||
#define GPSR6_2 F_(SSI_SDATA0, IP13_31_28)
|
||||
|
|
@ -328,8 +328,8 @@
|
|||
#define IP13_31_28 FM(SSI_SDATA0) F_(0, 0) FM(MSIOF1_SS2_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_3_0 FM(SSI_SDATA1_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_7_4 FM(SSI_SDATA2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(SSI_SCK1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_11_8 FM(SSI_SCK34) F_(0, 0) FM(MSIOF1_SS1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_OPWM_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_15_12 FM(SSI_WS34) FM(HCTS2_N_A) FM(MSIOF1_SS2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_IVCXO27_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_11_8 FM(SSI_SCK349) F_(0, 0) FM(MSIOF1_SS1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_OPWM_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_15_12 FM(SSI_WS349) FM(HCTS2_N_A) FM(MSIOF1_SS2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_IVCXO27_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_19_16 FM(SSI_SDATA3) FM(HRTS2_N_A) FM(MSIOF1_TXD_A) F_(0, 0) F_(0, 0) FM(TS_SCK0_A) FM(STP_ISCLK_0_A) FM(RIF0_D1_A) FM(RIF2_D0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_23_20 FM(SSI_SCK4) FM(HRX2_A) FM(MSIOF1_SCK_A) F_(0, 0) F_(0, 0) FM(TS_SDAT0_A) FM(STP_ISD_0_A) FM(RIF0_CLK_A) FM(RIF2_CLK_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_27_24 FM(SSI_WS4) FM(HTX2_A) FM(MSIOF1_SYNC_A) F_(0, 0) F_(0, 0) FM(TS_SDEN0_A) FM(STP_ISEN_0_A) FM(RIF0_SYNC_A) FM(RIF2_SYNC_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
|
|
@ -1256,11 +1256,11 @@ static const u16 pinmux_data[] = {
|
|||
PINMUX_IPSR_MSEL(IP14_7_4, SSI_SDATA2_A, SEL_SSI_0),
|
||||
PINMUX_IPSR_MSEL(IP14_7_4, SSI_SCK1_B, SEL_SSI_1),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP14_11_8, SSI_SCK34),
|
||||
PINMUX_IPSR_GPSR(IP14_11_8, SSI_SCK349),
|
||||
PINMUX_IPSR_MSEL(IP14_11_8, MSIOF1_SS1_A, SEL_MSIOF1_0),
|
||||
PINMUX_IPSR_MSEL(IP14_11_8, STP_OPWM_0_A, SEL_SSP1_0_0),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP14_15_12, SSI_WS34),
|
||||
PINMUX_IPSR_GPSR(IP14_15_12, SSI_WS349),
|
||||
PINMUX_IPSR_MSEL(IP14_15_12, HCTS2_N_A, SEL_HSCIF2_0),
|
||||
PINMUX_IPSR_MSEL(IP14_15_12, MSIOF1_SS2_A, SEL_MSIOF1_0),
|
||||
PINMUX_IPSR_MSEL(IP14_15_12, STP_IVCXO27_0_A, SEL_SSP1_0_0),
|
||||
|
|
@ -3650,12 +3650,12 @@ static const unsigned int ssi3_data_pins[] = {
|
|||
static const unsigned int ssi3_data_mux[] = {
|
||||
SSI_SDATA3_MARK,
|
||||
};
|
||||
static const unsigned int ssi34_ctrl_pins[] = {
|
||||
static const unsigned int ssi349_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 5), RCAR_GP_PIN(6, 6),
|
||||
};
|
||||
static const unsigned int ssi34_ctrl_mux[] = {
|
||||
SSI_SCK34_MARK, SSI_WS34_MARK,
|
||||
static const unsigned int ssi349_ctrl_mux[] = {
|
||||
SSI_SCK349_MARK, SSI_WS349_MARK,
|
||||
};
|
||||
static const unsigned int ssi4_data_pins[] = {
|
||||
/* SDATA */
|
||||
|
|
@ -4063,7 +4063,7 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
|||
SH_PFC_PIN_GROUP(ssi2_ctrl_a),
|
||||
SH_PFC_PIN_GROUP(ssi2_ctrl_b),
|
||||
SH_PFC_PIN_GROUP(ssi3_data),
|
||||
SH_PFC_PIN_GROUP(ssi34_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi349_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi4_data),
|
||||
SH_PFC_PIN_GROUP(ssi4_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi5_data),
|
||||
|
|
@ -4509,7 +4509,7 @@ static const char * const ssi_groups[] = {
|
|||
"ssi2_ctrl_a",
|
||||
"ssi2_ctrl_b",
|
||||
"ssi3_data",
|
||||
"ssi34_ctrl",
|
||||
"ssi349_ctrl",
|
||||
"ssi4_data",
|
||||
"ssi4_ctrl",
|
||||
"ssi5_data",
|
||||
|
|
@ -5356,8 +5356,8 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
|
|||
{ RCAR_GP_PIN(6, 2), 24, 3 }, /* SSI_SDATA0 */
|
||||
{ RCAR_GP_PIN(6, 3), 20, 3 }, /* SSI_SDATA1 */
|
||||
{ RCAR_GP_PIN(6, 4), 16, 3 }, /* SSI_SDATA2 */
|
||||
{ RCAR_GP_PIN(6, 5), 12, 3 }, /* SSI_SCK34 */
|
||||
{ RCAR_GP_PIN(6, 6), 8, 3 }, /* SSI_WS34 */
|
||||
{ RCAR_GP_PIN(6, 5), 12, 3 }, /* SSI_SCK349 */
|
||||
{ RCAR_GP_PIN(6, 6), 8, 3 }, /* SSI_WS349 */
|
||||
{ RCAR_GP_PIN(6, 7), 4, 3 }, /* SSI_SDATA3 */
|
||||
{ RCAR_GP_PIN(6, 8), 0, 3 }, /* SSI_SCK4 */
|
||||
} },
|
||||
|
|
@ -5604,8 +5604,8 @@ static const struct sh_pfc_bias_info bias_info[] = {
|
|||
{ RCAR_GP_PIN(6, 9), PU5, 16 }, /* SSI_WS4 */
|
||||
{ RCAR_GP_PIN(6, 8), PU5, 15 }, /* SSI_SCK4 */
|
||||
{ RCAR_GP_PIN(6, 7), PU5, 14 }, /* SSI_SDATA3 */
|
||||
{ RCAR_GP_PIN(6, 6), PU5, 13 }, /* SSI_WS34 */
|
||||
{ RCAR_GP_PIN(6, 5), PU5, 12 }, /* SSI_SCK34 */
|
||||
{ RCAR_GP_PIN(6, 6), PU5, 13 }, /* SSI_WS349 */
|
||||
{ RCAR_GP_PIN(6, 5), PU5, 12 }, /* SSI_SCK349 */
|
||||
{ RCAR_GP_PIN(6, 4), PU5, 11 }, /* SSI_SDATA2_A */
|
||||
{ RCAR_GP_PIN(6, 3), PU5, 10 }, /* SSI_SDATA1_A */
|
||||
{ RCAR_GP_PIN(6, 2), PU5, 9 }, /* SSI_SDATA0 */
|
||||
|
|
|
|||
|
|
@ -193,8 +193,8 @@
|
|||
#define GPSR6_9 F_(SSI_WS4, IP15_27_24)
|
||||
#define GPSR6_8 F_(SSI_SCK4, IP15_23_20)
|
||||
#define GPSR6_7 F_(SSI_SDATA3, IP15_19_16)
|
||||
#define GPSR6_6 F_(SSI_WS34, IP15_15_12)
|
||||
#define GPSR6_5 F_(SSI_SCK34, IP15_11_8)
|
||||
#define GPSR6_6 F_(SSI_WS349, IP15_15_12)
|
||||
#define GPSR6_5 F_(SSI_SCK349, IP15_11_8)
|
||||
#define GPSR6_4 F_(SSI_SDATA2_A, IP15_7_4)
|
||||
#define GPSR6_3 F_(SSI_SDATA1_A, IP15_3_0)
|
||||
#define GPSR6_2 F_(SSI_SDATA0, IP14_31_28)
|
||||
|
|
@ -339,8 +339,8 @@
|
|||
#define IP14_31_28 FM(SSI_SDATA0) F_(0, 0) FM(MSIOF1_SS2_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_3_0 FM(SSI_SDATA1_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_7_4 FM(SSI_SDATA2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(SSI_SCK1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_11_8 FM(SSI_SCK34) F_(0, 0) FM(MSIOF1_SS1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_OPWM_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_15_12 FM(SSI_WS34) FM(HCTS2_N_A) FM(MSIOF1_SS2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_IVCXO27_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_11_8 FM(SSI_SCK349) F_(0, 0) FM(MSIOF1_SS1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_OPWM_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_15_12 FM(SSI_WS349) FM(HCTS2_N_A) FM(MSIOF1_SS2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_IVCXO27_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_19_16 FM(SSI_SDATA3) FM(HRTS2_N_A) FM(MSIOF1_TXD_A) F_(0, 0) F_(0, 0) FM(TS_SCK0_A) FM(STP_ISCLK_0_A) FM(RIF0_D1_A) FM(RIF2_D0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_23_20 FM(SSI_SCK4) FM(HRX2_A) FM(MSIOF1_SCK_A) F_(0, 0) F_(0, 0) FM(TS_SDAT0_A) FM(STP_ISD_0_A) FM(RIF0_CLK_A) FM(RIF2_CLK_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_27_24 FM(SSI_WS4) FM(HTX2_A) FM(MSIOF1_SYNC_A) F_(0, 0) F_(0, 0) FM(TS_SDEN0_A) FM(STP_ISEN_0_A) FM(RIF0_SYNC_A) FM(RIF2_SYNC_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
|
|
@ -1315,11 +1315,11 @@ static const u16 pinmux_data[] = {
|
|||
PINMUX_IPSR_MSEL(IP15_7_4, SSI_SDATA2_A, SEL_SSI_0),
|
||||
PINMUX_IPSR_MSEL(IP15_7_4, SSI_SCK1_B, SEL_SSI_1),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP15_11_8, SSI_SCK34),
|
||||
PINMUX_IPSR_GPSR(IP15_11_8, SSI_SCK349),
|
||||
PINMUX_IPSR_MSEL(IP15_11_8, MSIOF1_SS1_A, SEL_MSIOF1_0),
|
||||
PINMUX_IPSR_MSEL(IP15_11_8, STP_OPWM_0_A, SEL_SSP1_0_0),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP15_15_12, SSI_WS34),
|
||||
PINMUX_IPSR_GPSR(IP15_15_12, SSI_WS349),
|
||||
PINMUX_IPSR_MSEL(IP15_15_12, HCTS2_N_A, SEL_HSCIF2_0),
|
||||
PINMUX_IPSR_MSEL(IP15_15_12, MSIOF1_SS2_A, SEL_MSIOF1_0),
|
||||
PINMUX_IPSR_MSEL(IP15_15_12, STP_IVCXO27_0_A, SEL_SSP1_0_0),
|
||||
|
|
@ -1576,6 +1576,273 @@ static const struct sh_pfc_pin pinmux_pins[] = {
|
|||
SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('T'), 30, ASEBRK, CFG_FLAGS),
|
||||
};
|
||||
|
||||
/* - EtherAVB --------------------------------------------------------------- */
|
||||
static const unsigned int avb_link_pins[] = {
|
||||
/* AVB_LINK */
|
||||
RCAR_GP_PIN(2, 12),
|
||||
};
|
||||
static const unsigned int avb_link_mux[] = {
|
||||
AVB_LINK_MARK,
|
||||
};
|
||||
static const unsigned int avb_magic_pins[] = {
|
||||
/* AVB_MAGIC_ */
|
||||
RCAR_GP_PIN(2, 10),
|
||||
};
|
||||
static const unsigned int avb_magic_mux[] = {
|
||||
AVB_MAGIC_MARK,
|
||||
};
|
||||
static const unsigned int avb_phy_int_pins[] = {
|
||||
/* AVB_PHY_INT */
|
||||
RCAR_GP_PIN(2, 11),
|
||||
};
|
||||
static const unsigned int avb_phy_int_mux[] = {
|
||||
AVB_PHY_INT_MARK,
|
||||
};
|
||||
static const unsigned int avb_mdc_pins[] = {
|
||||
/* AVB_MDC, AVB_MDIO */
|
||||
RCAR_GP_PIN(2, 9), PIN_NUMBER('A', 9),
|
||||
};
|
||||
static const unsigned int avb_mdc_mux[] = {
|
||||
AVB_MDC_MARK, AVB_MDIO_MARK,
|
||||
};
|
||||
static const unsigned int avb_mii_pins[] = {
|
||||
/*
|
||||
* AVB_TX_CTL, AVB_TXC, AVB_TD0,
|
||||
* AVB_TD1, AVB_TD2, AVB_TD3,
|
||||
* AVB_RX_CTL, AVB_RXC, AVB_RD0,
|
||||
* AVB_RD1, AVB_RD2, AVB_RD3,
|
||||
* AVB_TXCREFCLK
|
||||
*/
|
||||
PIN_NUMBER('A', 8), PIN_NUMBER('A', 19), PIN_NUMBER('A', 18),
|
||||
PIN_NUMBER('B', 18), PIN_NUMBER('A', 17), PIN_NUMBER('B', 17),
|
||||
PIN_NUMBER('A', 16), PIN_NUMBER('B', 19), PIN_NUMBER('A', 13),
|
||||
PIN_NUMBER('B', 13), PIN_NUMBER('A', 14), PIN_NUMBER('B', 14),
|
||||
PIN_NUMBER('A', 12),
|
||||
|
||||
};
|
||||
static const unsigned int avb_mii_mux[] = {
|
||||
AVB_TX_CTL_MARK, AVB_TXC_MARK, AVB_TD0_MARK,
|
||||
AVB_TD1_MARK, AVB_TD2_MARK, AVB_TD3_MARK,
|
||||
AVB_RX_CTL_MARK, AVB_RXC_MARK, AVB_RD0_MARK,
|
||||
AVB_RD1_MARK, AVB_RD2_MARK, AVB_RD3_MARK,
|
||||
AVB_TXCREFCLK_MARK,
|
||||
};
|
||||
static const unsigned int avb_avtp_pps_pins[] = {
|
||||
/* AVB_AVTP_PPS */
|
||||
RCAR_GP_PIN(2, 6),
|
||||
};
|
||||
static const unsigned int avb_avtp_pps_mux[] = {
|
||||
AVB_AVTP_PPS_MARK,
|
||||
};
|
||||
static const unsigned int avb_avtp_match_a_pins[] = {
|
||||
/* AVB_AVTP_MATCH_A */
|
||||
RCAR_GP_PIN(2, 13),
|
||||
};
|
||||
static const unsigned int avb_avtp_match_a_mux[] = {
|
||||
AVB_AVTP_MATCH_A_MARK,
|
||||
};
|
||||
static const unsigned int avb_avtp_capture_a_pins[] = {
|
||||
/* AVB_AVTP_CAPTURE_A */
|
||||
RCAR_GP_PIN(2, 14),
|
||||
};
|
||||
static const unsigned int avb_avtp_capture_a_mux[] = {
|
||||
AVB_AVTP_CAPTURE_A_MARK,
|
||||
};
|
||||
static const unsigned int avb_avtp_match_b_pins[] = {
|
||||
/* AVB_AVTP_MATCH_B */
|
||||
RCAR_GP_PIN(1, 8),
|
||||
};
|
||||
static const unsigned int avb_avtp_match_b_mux[] = {
|
||||
AVB_AVTP_MATCH_B_MARK,
|
||||
};
|
||||
static const unsigned int avb_avtp_capture_b_pins[] = {
|
||||
/* AVB_AVTP_CAPTURE_B */
|
||||
RCAR_GP_PIN(1, 11),
|
||||
};
|
||||
static const unsigned int avb_avtp_capture_b_mux[] = {
|
||||
AVB_AVTP_CAPTURE_B_MARK,
|
||||
};
|
||||
|
||||
/* - DU --------------------------------------------------------------------- */
|
||||
static const unsigned int du_rgb666_pins[] = {
|
||||
/* R[7:2], G[7:2], B[7:2] */
|
||||
RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 13),
|
||||
RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
|
||||
RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13),
|
||||
RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
|
||||
RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 5),
|
||||
RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 3), RCAR_GP_PIN(1, 2),
|
||||
};
|
||||
static const unsigned int du_rgb666_mux[] = {
|
||||
DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK, DU_DR4_MARK,
|
||||
DU_DR3_MARK, DU_DR2_MARK,
|
||||
DU_DG7_MARK, DU_DG6_MARK, DU_DG5_MARK, DU_DG4_MARK,
|
||||
DU_DG3_MARK, DU_DG2_MARK,
|
||||
DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK, DU_DB4_MARK,
|
||||
DU_DB3_MARK, DU_DB2_MARK,
|
||||
};
|
||||
static const unsigned int du_rgb888_pins[] = {
|
||||
/* R[7:0], G[7:0], B[7:0] */
|
||||
RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 13),
|
||||
RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
|
||||
RCAR_GP_PIN(0, 9), RCAR_GP_PIN(0, 8),
|
||||
RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13),
|
||||
RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
|
||||
RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 16),
|
||||
RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 5),
|
||||
RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 3), RCAR_GP_PIN(1, 2),
|
||||
RCAR_GP_PIN(1, 1), RCAR_GP_PIN(1, 0),
|
||||
};
|
||||
static const unsigned int du_rgb888_mux[] = {
|
||||
DU_DR7_MARK, DU_DR6_MARK, DU_DR5_MARK, DU_DR4_MARK,
|
||||
DU_DR3_MARK, DU_DR2_MARK, DU_DR1_MARK, DU_DR0_MARK,
|
||||
DU_DG7_MARK, DU_DG6_MARK, DU_DG5_MARK, DU_DG4_MARK,
|
||||
DU_DG3_MARK, DU_DG2_MARK, DU_DG1_MARK, DU_DG0_MARK,
|
||||
DU_DB7_MARK, DU_DB6_MARK, DU_DB5_MARK, DU_DB4_MARK,
|
||||
DU_DB3_MARK, DU_DB2_MARK, DU_DB1_MARK, DU_DB0_MARK,
|
||||
};
|
||||
static const unsigned int du_clk_out_0_pins[] = {
|
||||
/* CLKOUT */
|
||||
RCAR_GP_PIN(1, 27),
|
||||
};
|
||||
static const unsigned int du_clk_out_0_mux[] = {
|
||||
DU_DOTCLKOUT0_MARK
|
||||
};
|
||||
static const unsigned int du_clk_out_1_pins[] = {
|
||||
/* CLKOUT */
|
||||
RCAR_GP_PIN(2, 3),
|
||||
};
|
||||
static const unsigned int du_clk_out_1_mux[] = {
|
||||
DU_DOTCLKOUT1_MARK
|
||||
};
|
||||
static const unsigned int du_sync_pins[] = {
|
||||
/* EXVSYNC/VSYNC, EXHSYNC/HSYNC */
|
||||
RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 4),
|
||||
};
|
||||
static const unsigned int du_sync_mux[] = {
|
||||
DU_EXVSYNC_DU_VSYNC_MARK, DU_EXHSYNC_DU_HSYNC_MARK
|
||||
};
|
||||
static const unsigned int du_oddf_pins[] = {
|
||||
/* EXDISP/EXODDF/EXCDE */
|
||||
RCAR_GP_PIN(2, 2),
|
||||
};
|
||||
static const unsigned int du_oddf_mux[] = {
|
||||
DU_EXODDF_DU_ODDF_DISP_CDE_MARK,
|
||||
};
|
||||
static const unsigned int du_cde_pins[] = {
|
||||
/* CDE */
|
||||
RCAR_GP_PIN(2, 0),
|
||||
};
|
||||
static const unsigned int du_cde_mux[] = {
|
||||
DU_CDE_MARK,
|
||||
};
|
||||
static const unsigned int du_disp_pins[] = {
|
||||
/* DISP */
|
||||
RCAR_GP_PIN(2, 1),
|
||||
};
|
||||
static const unsigned int du_disp_mux[] = {
|
||||
DU_DISP_MARK,
|
||||
};
|
||||
|
||||
/* - PWM0 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm0_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 6),
|
||||
};
|
||||
static const unsigned int pwm0_mux[] = {
|
||||
PWM0_MARK,
|
||||
};
|
||||
/* - PWM1 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm1_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 7),
|
||||
};
|
||||
static const unsigned int pwm1_a_mux[] = {
|
||||
PWM1_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm1_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 8),
|
||||
};
|
||||
static const unsigned int pwm1_b_mux[] = {
|
||||
PWM1_B_MARK,
|
||||
};
|
||||
/* - PWM2 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm2_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 8),
|
||||
};
|
||||
static const unsigned int pwm2_a_mux[] = {
|
||||
PWM2_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm2_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 11),
|
||||
};
|
||||
static const unsigned int pwm2_b_mux[] = {
|
||||
PWM2_B_MARK,
|
||||
};
|
||||
/* - PWM3 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm3_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 0),
|
||||
};
|
||||
static const unsigned int pwm3_a_mux[] = {
|
||||
PWM3_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm3_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 2),
|
||||
};
|
||||
static const unsigned int pwm3_b_mux[] = {
|
||||
PWM3_B_MARK,
|
||||
};
|
||||
/* - PWM4 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm4_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 1),
|
||||
};
|
||||
static const unsigned int pwm4_a_mux[] = {
|
||||
PWM4_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm4_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 3),
|
||||
};
|
||||
static const unsigned int pwm4_b_mux[] = {
|
||||
PWM4_B_MARK,
|
||||
};
|
||||
/* - PWM5 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm5_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 2),
|
||||
};
|
||||
static const unsigned int pwm5_a_mux[] = {
|
||||
PWM5_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm5_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 4),
|
||||
};
|
||||
static const unsigned int pwm5_b_mux[] = {
|
||||
PWM5_B_MARK,
|
||||
};
|
||||
/* - PWM6 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm6_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 3),
|
||||
};
|
||||
static const unsigned int pwm6_a_mux[] = {
|
||||
PWM6_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm6_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 5),
|
||||
};
|
||||
static const unsigned int pwm6_b_mux[] = {
|
||||
PWM6_B_MARK,
|
||||
};
|
||||
|
||||
/* - SCIF0 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif0_data_pins[] = {
|
||||
/* RX, TX */
|
||||
|
|
@ -1790,6 +2057,37 @@ static const unsigned int scif_clk_b_mux[] = {
|
|||
};
|
||||
|
||||
static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(avb_link),
|
||||
SH_PFC_PIN_GROUP(avb_magic),
|
||||
SH_PFC_PIN_GROUP(avb_phy_int),
|
||||
SH_PFC_PIN_GROUP(avb_mdc),
|
||||
SH_PFC_PIN_GROUP(avb_mii),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_pps),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_match_a),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_capture_a),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_match_b),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_capture_b),
|
||||
SH_PFC_PIN_GROUP(du_rgb666),
|
||||
SH_PFC_PIN_GROUP(du_rgb888),
|
||||
SH_PFC_PIN_GROUP(du_clk_out_0),
|
||||
SH_PFC_PIN_GROUP(du_clk_out_1),
|
||||
SH_PFC_PIN_GROUP(du_sync),
|
||||
SH_PFC_PIN_GROUP(du_oddf),
|
||||
SH_PFC_PIN_GROUP(du_cde),
|
||||
SH_PFC_PIN_GROUP(du_disp),
|
||||
SH_PFC_PIN_GROUP(pwm0),
|
||||
SH_PFC_PIN_GROUP(pwm1_a),
|
||||
SH_PFC_PIN_GROUP(pwm1_b),
|
||||
SH_PFC_PIN_GROUP(pwm2_a),
|
||||
SH_PFC_PIN_GROUP(pwm2_b),
|
||||
SH_PFC_PIN_GROUP(pwm3_a),
|
||||
SH_PFC_PIN_GROUP(pwm3_b),
|
||||
SH_PFC_PIN_GROUP(pwm4_a),
|
||||
SH_PFC_PIN_GROUP(pwm4_b),
|
||||
SH_PFC_PIN_GROUP(pwm5_a),
|
||||
SH_PFC_PIN_GROUP(pwm5_b),
|
||||
SH_PFC_PIN_GROUP(pwm6_a),
|
||||
SH_PFC_PIN_GROUP(pwm6_b),
|
||||
SH_PFC_PIN_GROUP(scif0_data),
|
||||
SH_PFC_PIN_GROUP(scif0_clk),
|
||||
SH_PFC_PIN_GROUP(scif0_ctrl),
|
||||
|
|
@ -1821,6 +2119,64 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
|||
SH_PFC_PIN_GROUP(scif_clk_b),
|
||||
};
|
||||
|
||||
static const char * const avb_groups[] = {
|
||||
"avb_link",
|
||||
"avb_magic",
|
||||
"avb_phy_int",
|
||||
"avb_mdc",
|
||||
"avb_mii",
|
||||
"avb_avtp_pps",
|
||||
"avb_avtp_match_a",
|
||||
"avb_avtp_capture_a",
|
||||
"avb_avtp_match_b",
|
||||
"avb_avtp_capture_b",
|
||||
};
|
||||
|
||||
static const char * const du_groups[] = {
|
||||
"du_rgb666",
|
||||
"du_rgb888",
|
||||
"du_clk_out_0",
|
||||
"du_clk_out_1",
|
||||
"du_sync",
|
||||
"du_oddf",
|
||||
"du_cde",
|
||||
"du_disp",
|
||||
};
|
||||
|
||||
static const char * const pwm0_groups[] = {
|
||||
"pwm0",
|
||||
};
|
||||
|
||||
static const char * const pwm1_groups[] = {
|
||||
"pwm1_a",
|
||||
"pwm1_b",
|
||||
};
|
||||
|
||||
static const char * const pwm2_groups[] = {
|
||||
"pwm2_a",
|
||||
"pwm2_b",
|
||||
};
|
||||
|
||||
static const char * const pwm3_groups[] = {
|
||||
"pwm3_a",
|
||||
"pwm3_b",
|
||||
};
|
||||
|
||||
static const char * const pwm4_groups[] = {
|
||||
"pwm4_a",
|
||||
"pwm4_b",
|
||||
};
|
||||
|
||||
static const char * const pwm5_groups[] = {
|
||||
"pwm5_a",
|
||||
"pwm5_b",
|
||||
};
|
||||
|
||||
static const char * const pwm6_groups[] = {
|
||||
"pwm6_a",
|
||||
"pwm6_b",
|
||||
};
|
||||
|
||||
static const char * const scif0_groups[] = {
|
||||
"scif0_data",
|
||||
"scif0_clk",
|
||||
|
|
@ -1872,6 +2228,15 @@ static const char * const scif_clk_groups[] = {
|
|||
};
|
||||
|
||||
static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(avb),
|
||||
SH_PFC_FUNCTION(du),
|
||||
SH_PFC_FUNCTION(pwm0),
|
||||
SH_PFC_FUNCTION(pwm1),
|
||||
SH_PFC_FUNCTION(pwm2),
|
||||
SH_PFC_FUNCTION(pwm3),
|
||||
SH_PFC_FUNCTION(pwm4),
|
||||
SH_PFC_FUNCTION(pwm5),
|
||||
SH_PFC_FUNCTION(pwm6),
|
||||
SH_PFC_FUNCTION(scif0),
|
||||
SH_PFC_FUNCTION(scif1),
|
||||
SH_PFC_FUNCTION(scif2),
|
||||
|
|
@ -2653,8 +3018,8 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
|
|||
{ RCAR_GP_PIN(6, 2), 24, 3 }, /* SSI_SDATA0 */
|
||||
{ RCAR_GP_PIN(6, 3), 20, 3 }, /* SSI_SDATA1 */
|
||||
{ RCAR_GP_PIN(6, 4), 16, 3 }, /* SSI_SDATA2 */
|
||||
{ RCAR_GP_PIN(6, 5), 12, 3 }, /* SSI_SCK34 */
|
||||
{ RCAR_GP_PIN(6, 6), 8, 3 }, /* SSI_WS34 */
|
||||
{ RCAR_GP_PIN(6, 5), 12, 3 }, /* SSI_SCK349 */
|
||||
{ RCAR_GP_PIN(6, 6), 8, 3 }, /* SSI_WS349 */
|
||||
{ RCAR_GP_PIN(6, 7), 4, 3 }, /* SSI_SDATA3 */
|
||||
{ RCAR_GP_PIN(6, 8), 0, 3 }, /* SSI_SCK4 */
|
||||
} },
|
||||
|
|
@ -2900,8 +3265,8 @@ static const struct sh_pfc_bias_info bias_info[] = {
|
|||
{ RCAR_GP_PIN(6, 9), PU5, 16 }, /* SSI_WS4 */
|
||||
{ RCAR_GP_PIN(6, 8), PU5, 15 }, /* SSI_SCK4 */
|
||||
{ RCAR_GP_PIN(6, 7), PU5, 14 }, /* SSI_SDATA3 */
|
||||
{ RCAR_GP_PIN(6, 6), PU5, 13 }, /* SSI_WS34 */
|
||||
{ RCAR_GP_PIN(6, 5), PU5, 12 }, /* SSI_SCK34 */
|
||||
{ RCAR_GP_PIN(6, 6), PU5, 13 }, /* SSI_WS349 */
|
||||
{ RCAR_GP_PIN(6, 5), PU5, 12 }, /* SSI_SCK349 */
|
||||
{ RCAR_GP_PIN(6, 4), PU5, 11 }, /* SSI_SDATA2_A */
|
||||
{ RCAR_GP_PIN(6, 3), PU5, 10 }, /* SSI_SDATA1_A */
|
||||
{ RCAR_GP_PIN(6, 2), PU5, 9 }, /* SSI_SDATA0 */
|
||||
|
|
|
|||
|
|
@ -199,13 +199,13 @@
|
|||
#define GPSR6_9 F_(SSI_WS4, IP15_27_24)
|
||||
#define GPSR6_8 F_(SSI_SCK4, IP15_23_20)
|
||||
#define GPSR6_7 F_(SSI_SDATA3, IP15_19_16)
|
||||
#define GPSR6_6 F_(SSI_WS34, IP15_15_12)
|
||||
#define GPSR6_5 F_(SSI_SCK34, IP15_11_8)
|
||||
#define GPSR6_6 F_(SSI_WS349, IP15_15_12)
|
||||
#define GPSR6_5 F_(SSI_SCK349, IP15_11_8)
|
||||
#define GPSR6_4 F_(SSI_SDATA2_A, IP15_7_4)
|
||||
#define GPSR6_3 F_(SSI_SDATA1_A, IP15_3_0)
|
||||
#define GPSR6_2 F_(SSI_SDATA0, IP14_31_28)
|
||||
#define GPSR6_1 F_(SSI_WS0129, IP14_27_24)
|
||||
#define GPSR6_0 F_(SSI_SCK0129, IP14_23_20)
|
||||
#define GPSR6_1 F_(SSI_WS01239, IP14_27_24)
|
||||
#define GPSR6_0 F_(SSI_SCK01239, IP14_23_20)
|
||||
|
||||
/* GPSR7 */
|
||||
#define GPSR7_3 FM(GP7_03)
|
||||
|
|
@ -338,15 +338,15 @@
|
|||
#define IP14_11_8 FM(MLB_CLK) F_(0, 0) FM(MSIOF1_SCK_F) F_(0, 0) FM(SCL1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_15_12 FM(MLB_SIG) FM(RX1_B) FM(MSIOF1_SYNC_F) F_(0, 0) FM(SDA1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_19_16 FM(MLB_DAT) FM(TX1_B) FM(MSIOF1_RXD_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_23_20 FM(SSI_SCK0129) F_(0, 0) FM(MSIOF1_TXD_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_27_24 FM(SSI_WS0129) F_(0, 0) FM(MSIOF1_SS1_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_23_20 FM(SSI_SCK01239) F_(0, 0) FM(MSIOF1_TXD_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP14_27_24 FM(SSI_WS01239) F_(0, 0) FM(MSIOF1_SS1_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
|
||||
/* IPSRx */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ /* 8 */ /* 9 */ /* A */ /* B */ /* C - F */
|
||||
#define IP14_31_28 FM(SSI_SDATA0) F_(0, 0) FM(MSIOF1_SS2_F) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_3_0 FM(SSI_SDATA1_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_7_4 FM(SSI_SDATA2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(SSI_SCK1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_11_8 FM(SSI_SCK34) F_(0, 0) FM(MSIOF1_SS1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_OPWM_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_15_12 FM(SSI_WS34) FM(HCTS2_N_A) FM(MSIOF1_SS2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_IVCXO27_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_11_8 FM(SSI_SCK349) F_(0, 0) FM(MSIOF1_SS1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_OPWM_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_15_12 FM(SSI_WS349) FM(HCTS2_N_A) FM(MSIOF1_SS2_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(STP_IVCXO27_0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_19_16 FM(SSI_SDATA3) FM(HRTS2_N_A) FM(MSIOF1_TXD_A) F_(0, 0) F_(0, 0) FM(TS_SCK0_A) FM(STP_ISCLK_0_A) FM(RIF0_D1_A) FM(RIF2_D0_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_23_20 FM(SSI_SCK4) FM(HRX2_A) FM(MSIOF1_SCK_A) F_(0, 0) F_(0, 0) FM(TS_SDAT0_A) FM(STP_ISD_0_A) FM(RIF0_CLK_A) FM(RIF2_CLK_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP15_27_24 FM(SSI_WS4) FM(HTX2_A) FM(MSIOF1_SYNC_A) F_(0, 0) F_(0, 0) FM(TS_SDEN0_A) FM(STP_ISEN_0_A) FM(RIF0_SYNC_A) FM(RIF2_SYNC_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
|
|
@ -1304,10 +1304,10 @@ static const u16 pinmux_data[] = {
|
|||
PINMUX_IPSR_MSEL(IP14_19_16, TX1_B, SEL_SCIF1_1),
|
||||
PINMUX_IPSR_MSEL(IP14_19_16, MSIOF1_RXD_F, SEL_MSIOF1_5),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP14_23_20, SSI_SCK0129),
|
||||
PINMUX_IPSR_GPSR(IP14_23_20, SSI_SCK01239),
|
||||
PINMUX_IPSR_MSEL(IP14_23_20, MSIOF1_TXD_F, SEL_MSIOF1_5),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP14_27_24, SSI_WS0129),
|
||||
PINMUX_IPSR_GPSR(IP14_27_24, SSI_WS01239),
|
||||
PINMUX_IPSR_MSEL(IP14_27_24, MSIOF1_SS1_F, SEL_MSIOF1_5),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP14_31_28, SSI_SDATA0),
|
||||
|
|
@ -1319,11 +1319,11 @@ static const u16 pinmux_data[] = {
|
|||
PINMUX_IPSR_MSEL(IP15_7_4, SSI_SDATA2_A, SEL_SSI_0),
|
||||
PINMUX_IPSR_MSEL(IP15_7_4, SSI_SCK1_B, SEL_SSI_1),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP15_11_8, SSI_SCK34),
|
||||
PINMUX_IPSR_GPSR(IP15_11_8, SSI_SCK349),
|
||||
PINMUX_IPSR_MSEL(IP15_11_8, MSIOF1_SS1_A, SEL_MSIOF1_0),
|
||||
PINMUX_IPSR_MSEL(IP15_11_8, STP_OPWM_0_A, SEL_SSP1_0_0),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP15_15_12, SSI_WS34),
|
||||
PINMUX_IPSR_GPSR(IP15_15_12, SSI_WS349),
|
||||
PINMUX_IPSR_MSEL(IP15_15_12, HCTS2_N_A, SEL_HSCIF2_0),
|
||||
PINMUX_IPSR_MSEL(IP15_15_12, MSIOF1_SS2_A, SEL_MSIOF1_0),
|
||||
PINMUX_IPSR_MSEL(IP15_15_12, STP_IVCXO27_0_A, SEL_SSP1_0_0),
|
||||
|
|
@ -1582,6 +1582,128 @@ static const struct sh_pfc_pin pinmux_pins[] = {
|
|||
SH_PFC_PIN_NAMED_CFG(ROW_GROUP_A('T'), 30, ASEBRK, CFG_FLAGS),
|
||||
};
|
||||
|
||||
/* - AUDIO CLOCK ------------------------------------------------------------ */
|
||||
static const unsigned int audio_clk_a_a_pins[] = {
|
||||
/* CLK A */
|
||||
RCAR_GP_PIN(6, 22),
|
||||
};
|
||||
static const unsigned int audio_clk_a_a_mux[] = {
|
||||
AUDIO_CLKA_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clk_a_b_pins[] = {
|
||||
/* CLK A */
|
||||
RCAR_GP_PIN(5, 4),
|
||||
};
|
||||
static const unsigned int audio_clk_a_b_mux[] = {
|
||||
AUDIO_CLKA_B_MARK,
|
||||
};
|
||||
static const unsigned int audio_clk_a_c_pins[] = {
|
||||
/* CLK A */
|
||||
RCAR_GP_PIN(5, 19),
|
||||
};
|
||||
static const unsigned int audio_clk_a_c_mux[] = {
|
||||
AUDIO_CLKA_C_MARK,
|
||||
};
|
||||
static const unsigned int audio_clk_b_a_pins[] = {
|
||||
/* CLK B */
|
||||
RCAR_GP_PIN(5, 12),
|
||||
};
|
||||
static const unsigned int audio_clk_b_a_mux[] = {
|
||||
AUDIO_CLKB_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clk_b_b_pins[] = {
|
||||
/* CLK B */
|
||||
RCAR_GP_PIN(6, 23),
|
||||
};
|
||||
static const unsigned int audio_clk_b_b_mux[] = {
|
||||
AUDIO_CLKB_B_MARK,
|
||||
};
|
||||
static const unsigned int audio_clk_c_a_pins[] = {
|
||||
/* CLK C */
|
||||
RCAR_GP_PIN(5, 21),
|
||||
};
|
||||
static const unsigned int audio_clk_c_a_mux[] = {
|
||||
AUDIO_CLKC_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clk_c_b_pins[] = {
|
||||
/* CLK C */
|
||||
RCAR_GP_PIN(5, 0),
|
||||
};
|
||||
static const unsigned int audio_clk_c_b_mux[] = {
|
||||
AUDIO_CLKC_B_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout_a_pins[] = {
|
||||
/* CLKOUT */
|
||||
RCAR_GP_PIN(5, 18),
|
||||
};
|
||||
static const unsigned int audio_clkout_a_mux[] = {
|
||||
AUDIO_CLKOUT_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout_b_pins[] = {
|
||||
/* CLKOUT */
|
||||
RCAR_GP_PIN(6, 28),
|
||||
};
|
||||
static const unsigned int audio_clkout_b_mux[] = {
|
||||
AUDIO_CLKOUT_B_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout_c_pins[] = {
|
||||
/* CLKOUT */
|
||||
RCAR_GP_PIN(5, 3),
|
||||
};
|
||||
static const unsigned int audio_clkout_c_mux[] = {
|
||||
AUDIO_CLKOUT_C_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout_d_pins[] = {
|
||||
/* CLKOUT */
|
||||
RCAR_GP_PIN(5, 21),
|
||||
};
|
||||
static const unsigned int audio_clkout_d_mux[] = {
|
||||
AUDIO_CLKOUT_D_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout1_a_pins[] = {
|
||||
/* CLKOUT1 */
|
||||
RCAR_GP_PIN(5, 15),
|
||||
};
|
||||
static const unsigned int audio_clkout1_a_mux[] = {
|
||||
AUDIO_CLKOUT1_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout1_b_pins[] = {
|
||||
/* CLKOUT1 */
|
||||
RCAR_GP_PIN(6, 29),
|
||||
};
|
||||
static const unsigned int audio_clkout1_b_mux[] = {
|
||||
AUDIO_CLKOUT1_B_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout2_a_pins[] = {
|
||||
/* CLKOUT2 */
|
||||
RCAR_GP_PIN(5, 16),
|
||||
};
|
||||
static const unsigned int audio_clkout2_a_mux[] = {
|
||||
AUDIO_CLKOUT2_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout2_b_pins[] = {
|
||||
/* CLKOUT2 */
|
||||
RCAR_GP_PIN(6, 30),
|
||||
};
|
||||
static const unsigned int audio_clkout2_b_mux[] = {
|
||||
AUDIO_CLKOUT2_B_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int audio_clkout3_a_pins[] = {
|
||||
/* CLKOUT3 */
|
||||
RCAR_GP_PIN(5, 19),
|
||||
};
|
||||
static const unsigned int audio_clkout3_a_mux[] = {
|
||||
AUDIO_CLKOUT3_A_MARK,
|
||||
};
|
||||
static const unsigned int audio_clkout3_b_pins[] = {
|
||||
/* CLKOUT3 */
|
||||
RCAR_GP_PIN(6, 31),
|
||||
};
|
||||
static const unsigned int audio_clkout3_b_mux[] = {
|
||||
AUDIO_CLKOUT3_B_MARK,
|
||||
};
|
||||
|
||||
/* - EtherAVB --------------------------------------------------------------- */
|
||||
static const unsigned int avb_link_pins[] = {
|
||||
/* AVB_LINK */
|
||||
|
|
@ -1605,11 +1727,33 @@ static const unsigned int avb_phy_int_mux[] = {
|
|||
AVB_PHY_INT_MARK,
|
||||
};
|
||||
static const unsigned int avb_mdc_pins[] = {
|
||||
/* AVB_MDC */
|
||||
RCAR_GP_PIN(2, 9),
|
||||
/* AVB_MDC, AVB_MDIO */
|
||||
RCAR_GP_PIN(2, 9), PIN_NUMBER('A', 9),
|
||||
};
|
||||
static const unsigned int avb_mdc_mux[] = {
|
||||
AVB_MDC_MARK,
|
||||
AVB_MDC_MARK, AVB_MDIO_MARK,
|
||||
};
|
||||
static const unsigned int avb_mii_pins[] = {
|
||||
/*
|
||||
* AVB_TX_CTL, AVB_TXC, AVB_TD0,
|
||||
* AVB_TD1, AVB_TD2, AVB_TD3,
|
||||
* AVB_RX_CTL, AVB_RXC, AVB_RD0,
|
||||
* AVB_RD1, AVB_RD2, AVB_RD3,
|
||||
* AVB_TXCREFCLK
|
||||
*/
|
||||
PIN_NUMBER('A', 8), PIN_NUMBER('A', 19), PIN_NUMBER('A', 18),
|
||||
PIN_NUMBER('B', 18), PIN_NUMBER('A', 17), PIN_NUMBER('B', 17),
|
||||
PIN_NUMBER('A', 16), PIN_NUMBER('B', 19), PIN_NUMBER('A', 13),
|
||||
PIN_NUMBER('B', 13), PIN_NUMBER('A', 14), PIN_NUMBER('B', 14),
|
||||
PIN_NUMBER('A', 12),
|
||||
|
||||
};
|
||||
static const unsigned int avb_mii_mux[] = {
|
||||
AVB_TX_CTL_MARK, AVB_TXC_MARK, AVB_TD0_MARK,
|
||||
AVB_TD1_MARK, AVB_TD2_MARK, AVB_TD3_MARK,
|
||||
AVB_RX_CTL_MARK, AVB_RXC_MARK, AVB_RD0_MARK,
|
||||
AVB_RD1_MARK, AVB_RD2_MARK, AVB_RD3_MARK,
|
||||
AVB_TXCREFCLK_MARK,
|
||||
};
|
||||
static const unsigned int avb_avtp_pps_pins[] = {
|
||||
/* AVB_AVTP_PPS */
|
||||
|
|
@ -2955,6 +3099,105 @@ static const unsigned int msiof3_rxd_e_mux[] = {
|
|||
MSIOF3_RXD_E_MARK,
|
||||
};
|
||||
|
||||
/* - PWM0 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm0_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 6),
|
||||
};
|
||||
static const unsigned int pwm0_mux[] = {
|
||||
PWM0_MARK,
|
||||
};
|
||||
/* - PWM1 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm1_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 7),
|
||||
};
|
||||
static const unsigned int pwm1_a_mux[] = {
|
||||
PWM1_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm1_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 8),
|
||||
};
|
||||
static const unsigned int pwm1_b_mux[] = {
|
||||
PWM1_B_MARK,
|
||||
};
|
||||
/* - PWM2 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm2_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 8),
|
||||
};
|
||||
static const unsigned int pwm2_a_mux[] = {
|
||||
PWM2_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm2_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 11),
|
||||
};
|
||||
static const unsigned int pwm2_b_mux[] = {
|
||||
PWM2_B_MARK,
|
||||
};
|
||||
/* - PWM3 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm3_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 0),
|
||||
};
|
||||
static const unsigned int pwm3_a_mux[] = {
|
||||
PWM3_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm3_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 2),
|
||||
};
|
||||
static const unsigned int pwm3_b_mux[] = {
|
||||
PWM3_B_MARK,
|
||||
};
|
||||
/* - PWM4 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm4_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 1),
|
||||
};
|
||||
static const unsigned int pwm4_a_mux[] = {
|
||||
PWM4_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm4_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 3),
|
||||
};
|
||||
static const unsigned int pwm4_b_mux[] = {
|
||||
PWM4_B_MARK,
|
||||
};
|
||||
/* - PWM5 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm5_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 2),
|
||||
};
|
||||
static const unsigned int pwm5_a_mux[] = {
|
||||
PWM5_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm5_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 4),
|
||||
};
|
||||
static const unsigned int pwm5_b_mux[] = {
|
||||
PWM5_B_MARK,
|
||||
};
|
||||
/* - PWM6 --------------------------------------------------------------------*/
|
||||
static const unsigned int pwm6_a_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(1, 3),
|
||||
};
|
||||
static const unsigned int pwm6_a_mux[] = {
|
||||
PWM6_A_MARK,
|
||||
};
|
||||
static const unsigned int pwm6_b_pins[] = {
|
||||
/* PWM */
|
||||
RCAR_GP_PIN(2, 5),
|
||||
};
|
||||
static const unsigned int pwm6_b_mux[] = {
|
||||
PWM6_B_MARK,
|
||||
};
|
||||
|
||||
/* - SCIF0 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif0_data_pins[] = {
|
||||
/* RX, TX */
|
||||
|
|
@ -3376,11 +3619,206 @@ static const unsigned int sdhi3_ds_mux[] = {
|
|||
SD3_DS_MARK,
|
||||
};
|
||||
|
||||
/* - SSI -------------------------------------------------------------------- */
|
||||
static const unsigned int ssi0_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 2),
|
||||
};
|
||||
static const unsigned int ssi0_data_mux[] = {
|
||||
SSI_SDATA0_MARK,
|
||||
};
|
||||
static const unsigned int ssi01239_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 0), RCAR_GP_PIN(6, 1),
|
||||
};
|
||||
static const unsigned int ssi01239_ctrl_mux[] = {
|
||||
SSI_SCK01239_MARK, SSI_WS01239_MARK,
|
||||
};
|
||||
static const unsigned int ssi1_data_a_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 3),
|
||||
};
|
||||
static const unsigned int ssi1_data_a_mux[] = {
|
||||
SSI_SDATA1_A_MARK,
|
||||
};
|
||||
static const unsigned int ssi1_data_b_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(5, 12),
|
||||
};
|
||||
static const unsigned int ssi1_data_b_mux[] = {
|
||||
SSI_SDATA1_B_MARK,
|
||||
};
|
||||
static const unsigned int ssi1_ctrl_a_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27),
|
||||
};
|
||||
static const unsigned int ssi1_ctrl_a_mux[] = {
|
||||
SSI_SCK1_A_MARK, SSI_WS1_A_MARK,
|
||||
};
|
||||
static const unsigned int ssi1_ctrl_b_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 4), RCAR_GP_PIN(6, 21),
|
||||
};
|
||||
static const unsigned int ssi1_ctrl_b_mux[] = {
|
||||
SSI_SCK1_B_MARK, SSI_WS1_B_MARK,
|
||||
};
|
||||
static const unsigned int ssi2_data_a_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 4),
|
||||
};
|
||||
static const unsigned int ssi2_data_a_mux[] = {
|
||||
SSI_SDATA2_A_MARK,
|
||||
};
|
||||
static const unsigned int ssi2_data_b_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(5, 13),
|
||||
};
|
||||
static const unsigned int ssi2_data_b_mux[] = {
|
||||
SSI_SDATA2_B_MARK,
|
||||
};
|
||||
static const unsigned int ssi2_ctrl_a_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(5, 19), RCAR_GP_PIN(5, 21),
|
||||
};
|
||||
static const unsigned int ssi2_ctrl_a_mux[] = {
|
||||
SSI_SCK2_A_MARK, SSI_WS2_A_MARK,
|
||||
};
|
||||
static const unsigned int ssi2_ctrl_b_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29),
|
||||
};
|
||||
static const unsigned int ssi2_ctrl_b_mux[] = {
|
||||
SSI_SCK2_B_MARK, SSI_WS2_B_MARK,
|
||||
};
|
||||
static const unsigned int ssi3_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 7),
|
||||
};
|
||||
static const unsigned int ssi3_data_mux[] = {
|
||||
SSI_SDATA3_MARK,
|
||||
};
|
||||
static const unsigned int ssi349_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 5), RCAR_GP_PIN(6, 6),
|
||||
};
|
||||
static const unsigned int ssi349_ctrl_mux[] = {
|
||||
SSI_SCK349_MARK, SSI_WS349_MARK,
|
||||
};
|
||||
static const unsigned int ssi4_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 10),
|
||||
};
|
||||
static const unsigned int ssi4_data_mux[] = {
|
||||
SSI_SDATA4_MARK,
|
||||
};
|
||||
static const unsigned int ssi4_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9),
|
||||
};
|
||||
static const unsigned int ssi4_ctrl_mux[] = {
|
||||
SSI_SCK4_MARK, SSI_WS4_MARK,
|
||||
};
|
||||
static const unsigned int ssi5_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 13),
|
||||
};
|
||||
static const unsigned int ssi5_data_mux[] = {
|
||||
SSI_SDATA5_MARK,
|
||||
};
|
||||
static const unsigned int ssi5_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 11), RCAR_GP_PIN(6, 12),
|
||||
};
|
||||
static const unsigned int ssi5_ctrl_mux[] = {
|
||||
SSI_SCK5_MARK, SSI_WS5_MARK,
|
||||
};
|
||||
static const unsigned int ssi6_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 16),
|
||||
};
|
||||
static const unsigned int ssi6_data_mux[] = {
|
||||
SSI_SDATA6_MARK,
|
||||
};
|
||||
static const unsigned int ssi6_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 14), RCAR_GP_PIN(6, 15),
|
||||
};
|
||||
static const unsigned int ssi6_ctrl_mux[] = {
|
||||
SSI_SCK6_MARK, SSI_WS6_MARK,
|
||||
};
|
||||
static const unsigned int ssi7_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 19),
|
||||
};
|
||||
static const unsigned int ssi7_data_mux[] = {
|
||||
SSI_SDATA7_MARK,
|
||||
};
|
||||
static const unsigned int ssi78_ctrl_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18),
|
||||
};
|
||||
static const unsigned int ssi78_ctrl_mux[] = {
|
||||
SSI_SCK78_MARK, SSI_WS78_MARK,
|
||||
};
|
||||
static const unsigned int ssi8_data_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 20),
|
||||
};
|
||||
static const unsigned int ssi8_data_mux[] = {
|
||||
SSI_SDATA8_MARK,
|
||||
};
|
||||
static const unsigned int ssi9_data_a_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(6, 21),
|
||||
};
|
||||
static const unsigned int ssi9_data_a_mux[] = {
|
||||
SSI_SDATA9_A_MARK,
|
||||
};
|
||||
static const unsigned int ssi9_data_b_pins[] = {
|
||||
/* SDATA */
|
||||
RCAR_GP_PIN(5, 14),
|
||||
};
|
||||
static const unsigned int ssi9_data_b_mux[] = {
|
||||
SSI_SDATA9_B_MARK,
|
||||
};
|
||||
static const unsigned int ssi9_ctrl_a_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(5, 15), RCAR_GP_PIN(5, 16),
|
||||
};
|
||||
static const unsigned int ssi9_ctrl_a_mux[] = {
|
||||
SSI_SCK9_A_MARK, SSI_WS9_A_MARK,
|
||||
};
|
||||
static const unsigned int ssi9_ctrl_b_pins[] = {
|
||||
/* SCK, WS */
|
||||
RCAR_GP_PIN(6, 30), RCAR_GP_PIN(6, 31),
|
||||
};
|
||||
static const unsigned int ssi9_ctrl_b_mux[] = {
|
||||
SSI_SCK9_B_MARK, SSI_WS9_B_MARK,
|
||||
};
|
||||
|
||||
static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(audio_clk_a_a),
|
||||
SH_PFC_PIN_GROUP(audio_clk_a_b),
|
||||
SH_PFC_PIN_GROUP(audio_clk_a_c),
|
||||
SH_PFC_PIN_GROUP(audio_clk_b_a),
|
||||
SH_PFC_PIN_GROUP(audio_clk_b_b),
|
||||
SH_PFC_PIN_GROUP(audio_clk_c_a),
|
||||
SH_PFC_PIN_GROUP(audio_clk_c_b),
|
||||
SH_PFC_PIN_GROUP(audio_clkout_a),
|
||||
SH_PFC_PIN_GROUP(audio_clkout_b),
|
||||
SH_PFC_PIN_GROUP(audio_clkout_c),
|
||||
SH_PFC_PIN_GROUP(audio_clkout_d),
|
||||
SH_PFC_PIN_GROUP(audio_clkout1_a),
|
||||
SH_PFC_PIN_GROUP(audio_clkout1_b),
|
||||
SH_PFC_PIN_GROUP(audio_clkout2_a),
|
||||
SH_PFC_PIN_GROUP(audio_clkout2_b),
|
||||
SH_PFC_PIN_GROUP(audio_clkout3_a),
|
||||
SH_PFC_PIN_GROUP(audio_clkout3_b),
|
||||
SH_PFC_PIN_GROUP(avb_link),
|
||||
SH_PFC_PIN_GROUP(avb_magic),
|
||||
SH_PFC_PIN_GROUP(avb_phy_int),
|
||||
SH_PFC_PIN_GROUP(avb_mdc),
|
||||
SH_PFC_PIN_GROUP(avb_mii),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_pps),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_match_a),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_capture_a),
|
||||
|
|
@ -3565,6 +4003,19 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
|||
SH_PFC_PIN_GROUP(msiof3_ss2_e),
|
||||
SH_PFC_PIN_GROUP(msiof3_txd_e),
|
||||
SH_PFC_PIN_GROUP(msiof3_rxd_e),
|
||||
SH_PFC_PIN_GROUP(pwm0),
|
||||
SH_PFC_PIN_GROUP(pwm1_a),
|
||||
SH_PFC_PIN_GROUP(pwm1_b),
|
||||
SH_PFC_PIN_GROUP(pwm2_a),
|
||||
SH_PFC_PIN_GROUP(pwm2_b),
|
||||
SH_PFC_PIN_GROUP(pwm3_a),
|
||||
SH_PFC_PIN_GROUP(pwm3_b),
|
||||
SH_PFC_PIN_GROUP(pwm4_a),
|
||||
SH_PFC_PIN_GROUP(pwm4_b),
|
||||
SH_PFC_PIN_GROUP(pwm5_a),
|
||||
SH_PFC_PIN_GROUP(pwm5_b),
|
||||
SH_PFC_PIN_GROUP(pwm6_a),
|
||||
SH_PFC_PIN_GROUP(pwm6_b),
|
||||
SH_PFC_PIN_GROUP(scif0_data),
|
||||
SH_PFC_PIN_GROUP(scif0_clk),
|
||||
SH_PFC_PIN_GROUP(scif0_ctrl),
|
||||
|
|
@ -3620,6 +4071,51 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
|||
SH_PFC_PIN_GROUP(sdhi3_cd),
|
||||
SH_PFC_PIN_GROUP(sdhi3_wp),
|
||||
SH_PFC_PIN_GROUP(sdhi3_ds),
|
||||
SH_PFC_PIN_GROUP(ssi0_data),
|
||||
SH_PFC_PIN_GROUP(ssi01239_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi1_data_a),
|
||||
SH_PFC_PIN_GROUP(ssi1_data_b),
|
||||
SH_PFC_PIN_GROUP(ssi1_ctrl_a),
|
||||
SH_PFC_PIN_GROUP(ssi1_ctrl_b),
|
||||
SH_PFC_PIN_GROUP(ssi2_data_a),
|
||||
SH_PFC_PIN_GROUP(ssi2_data_b),
|
||||
SH_PFC_PIN_GROUP(ssi2_ctrl_a),
|
||||
SH_PFC_PIN_GROUP(ssi2_ctrl_b),
|
||||
SH_PFC_PIN_GROUP(ssi3_data),
|
||||
SH_PFC_PIN_GROUP(ssi349_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi4_data),
|
||||
SH_PFC_PIN_GROUP(ssi4_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi5_data),
|
||||
SH_PFC_PIN_GROUP(ssi5_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi6_data),
|
||||
SH_PFC_PIN_GROUP(ssi6_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi7_data),
|
||||
SH_PFC_PIN_GROUP(ssi78_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi8_data),
|
||||
SH_PFC_PIN_GROUP(ssi9_data_a),
|
||||
SH_PFC_PIN_GROUP(ssi9_data_b),
|
||||
SH_PFC_PIN_GROUP(ssi9_ctrl_a),
|
||||
SH_PFC_PIN_GROUP(ssi9_ctrl_b),
|
||||
};
|
||||
|
||||
static const char * const audio_clk_groups[] = {
|
||||
"audio_clk_a_a",
|
||||
"audio_clk_a_b",
|
||||
"audio_clk_a_c",
|
||||
"audio_clk_b_a",
|
||||
"audio_clk_b_b",
|
||||
"audio_clk_c_a",
|
||||
"audio_clk_c_b",
|
||||
"audio_clkout_a",
|
||||
"audio_clkout_b",
|
||||
"audio_clkout_c",
|
||||
"audio_clkout_d",
|
||||
"audio_clkout1_a",
|
||||
"audio_clkout1_b",
|
||||
"audio_clkout2_a",
|
||||
"audio_clkout2_b",
|
||||
"audio_clkout3_a",
|
||||
"audio_clkout3_b",
|
||||
};
|
||||
|
||||
static const char * const avb_groups[] = {
|
||||
|
|
@ -3627,6 +4123,7 @@ static const char * const avb_groups[] = {
|
|||
"avb_magic",
|
||||
"avb_phy_int",
|
||||
"avb_mdc",
|
||||
"avb_mii",
|
||||
"avb_avtp_pps",
|
||||
"avb_avtp_match_a",
|
||||
"avb_avtp_capture_a",
|
||||
|
|
@ -3879,6 +4376,40 @@ static const char * const msiof3_groups[] = {
|
|||
"msiof3_rxd_e",
|
||||
};
|
||||
|
||||
static const char * const pwm0_groups[] = {
|
||||
"pwm0",
|
||||
};
|
||||
|
||||
static const char * const pwm1_groups[] = {
|
||||
"pwm1_a",
|
||||
"pwm1_b",
|
||||
};
|
||||
|
||||
static const char * const pwm2_groups[] = {
|
||||
"pwm2_a",
|
||||
"pwm2_b",
|
||||
};
|
||||
|
||||
static const char * const pwm3_groups[] = {
|
||||
"pwm3_a",
|
||||
"pwm3_b",
|
||||
};
|
||||
|
||||
static const char * const pwm4_groups[] = {
|
||||
"pwm4_a",
|
||||
"pwm4_b",
|
||||
};
|
||||
|
||||
static const char * const pwm5_groups[] = {
|
||||
"pwm5_a",
|
||||
"pwm5_b",
|
||||
};
|
||||
|
||||
static const char * const pwm6_groups[] = {
|
||||
"pwm6_a",
|
||||
"pwm6_b",
|
||||
};
|
||||
|
||||
static const char * const scif0_groups[] = {
|
||||
"scif0_data",
|
||||
"scif0_clk",
|
||||
|
|
@ -3967,7 +4498,36 @@ static const char * const sdhi3_groups[] = {
|
|||
"sdhi3_ds",
|
||||
};
|
||||
|
||||
static const char * const ssi_groups[] = {
|
||||
"ssi0_data",
|
||||
"ssi01239_ctrl",
|
||||
"ssi1_data_a",
|
||||
"ssi1_data_b",
|
||||
"ssi1_ctrl_a",
|
||||
"ssi1_ctrl_b",
|
||||
"ssi2_data_a",
|
||||
"ssi2_data_b",
|
||||
"ssi2_ctrl_a",
|
||||
"ssi2_ctrl_b",
|
||||
"ssi3_data",
|
||||
"ssi349_ctrl",
|
||||
"ssi4_data",
|
||||
"ssi4_ctrl",
|
||||
"ssi5_data",
|
||||
"ssi5_ctrl",
|
||||
"ssi6_data",
|
||||
"ssi6_ctrl",
|
||||
"ssi7_data",
|
||||
"ssi78_ctrl",
|
||||
"ssi8_data",
|
||||
"ssi9_data_a",
|
||||
"ssi9_data_b",
|
||||
"ssi9_ctrl_a",
|
||||
"ssi9_ctrl_b",
|
||||
};
|
||||
|
||||
static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(audio_clk),
|
||||
SH_PFC_FUNCTION(avb),
|
||||
SH_PFC_FUNCTION(can0),
|
||||
SH_PFC_FUNCTION(can1),
|
||||
|
|
@ -3991,6 +4551,13 @@ static const struct sh_pfc_function pinmux_functions[] = {
|
|||
SH_PFC_FUNCTION(msiof1),
|
||||
SH_PFC_FUNCTION(msiof2),
|
||||
SH_PFC_FUNCTION(msiof3),
|
||||
SH_PFC_FUNCTION(pwm0),
|
||||
SH_PFC_FUNCTION(pwm1),
|
||||
SH_PFC_FUNCTION(pwm2),
|
||||
SH_PFC_FUNCTION(pwm3),
|
||||
SH_PFC_FUNCTION(pwm4),
|
||||
SH_PFC_FUNCTION(pwm5),
|
||||
SH_PFC_FUNCTION(pwm6),
|
||||
SH_PFC_FUNCTION(scif0),
|
||||
SH_PFC_FUNCTION(scif1),
|
||||
SH_PFC_FUNCTION(scif2),
|
||||
|
|
@ -4002,6 +4569,7 @@ static const struct sh_pfc_function pinmux_functions[] = {
|
|||
SH_PFC_FUNCTION(sdhi1),
|
||||
SH_PFC_FUNCTION(sdhi2),
|
||||
SH_PFC_FUNCTION(sdhi3),
|
||||
SH_PFC_FUNCTION(ssi),
|
||||
};
|
||||
|
||||
static const struct pinmux_cfg_reg pinmux_config_regs[] = {
|
||||
|
|
@ -4775,8 +5343,8 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
|
|||
{ RCAR_GP_PIN(6, 2), 24, 3 }, /* SSI_SDATA0 */
|
||||
{ RCAR_GP_PIN(6, 3), 20, 3 }, /* SSI_SDATA1 */
|
||||
{ RCAR_GP_PIN(6, 4), 16, 3 }, /* SSI_SDATA2 */
|
||||
{ RCAR_GP_PIN(6, 5), 12, 3 }, /* SSI_SCK34 */
|
||||
{ RCAR_GP_PIN(6, 6), 8, 3 }, /* SSI_WS34 */
|
||||
{ RCAR_GP_PIN(6, 5), 12, 3 }, /* SSI_SCK349 */
|
||||
{ RCAR_GP_PIN(6, 6), 8, 3 }, /* SSI_WS349 */
|
||||
{ RCAR_GP_PIN(6, 7), 4, 3 }, /* SSI_SDATA3 */
|
||||
{ RCAR_GP_PIN(6, 8), 0, 3 }, /* SSI_SCK4 */
|
||||
} },
|
||||
|
|
@ -5022,8 +5590,8 @@ static const struct sh_pfc_bias_info bias_info[] = {
|
|||
{ RCAR_GP_PIN(6, 9), PU5, 16 }, /* SSI_WS4 */
|
||||
{ RCAR_GP_PIN(6, 8), PU5, 15 }, /* SSI_SCK4 */
|
||||
{ RCAR_GP_PIN(6, 7), PU5, 14 }, /* SSI_SDATA3 */
|
||||
{ RCAR_GP_PIN(6, 6), PU5, 13 }, /* SSI_WS34 */
|
||||
{ RCAR_GP_PIN(6, 5), PU5, 12 }, /* SSI_SCK34 */
|
||||
{ RCAR_GP_PIN(6, 6), PU5, 13 }, /* SSI_WS349 */
|
||||
{ RCAR_GP_PIN(6, 5), PU5, 12 }, /* SSI_SCK349 */
|
||||
{ RCAR_GP_PIN(6, 4), PU5, 11 }, /* SSI_SDATA2_A */
|
||||
{ RCAR_GP_PIN(6, 3), PU5, 10 }, /* SSI_SDATA1_A */
|
||||
{ RCAR_GP_PIN(6, 2), PU5, 9 }, /* SSI_SDATA0 */
|
||||
|
|
|
|||
|
|
@ -259,6 +259,8 @@ struct sh_pfc_soc_info {
|
|||
extern const struct sh_pfc_soc_info emev2_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a73a4_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7740_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7743_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7745_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7778_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7779_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7790_pinmux_info;
|
||||
|
|
|
|||
|
|
@ -209,6 +209,24 @@ static int stm32_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
|
|||
return irq_create_fwspec_mapping(&fwspec);
|
||||
}
|
||||
|
||||
static int stm32_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
struct stm32_gpio_bank *bank = gpiochip_get_data(chip);
|
||||
int pin = stm32_gpio_pin(offset);
|
||||
int ret;
|
||||
u32 mode, alt;
|
||||
|
||||
stm32_pmx_get_mode(bank, pin, &mode, &alt);
|
||||
if ((alt == 0) && (mode == 0))
|
||||
ret = 1;
|
||||
else if ((alt == 0) && (mode == 1))
|
||||
ret = 0;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct gpio_chip stm32_gpio_template = {
|
||||
.request = stm32_gpio_request,
|
||||
.free = stm32_gpio_free,
|
||||
|
|
@ -217,14 +235,44 @@ static const struct gpio_chip stm32_gpio_template = {
|
|||
.direction_input = stm32_gpio_direction_input,
|
||||
.direction_output = stm32_gpio_direction_output,
|
||||
.to_irq = stm32_gpio_to_irq,
|
||||
.get_direction = stm32_gpio_get_direction,
|
||||
};
|
||||
|
||||
static int stm32_gpio_irq_request_resources(struct irq_data *irq_data)
|
||||
{
|
||||
struct stm32_gpio_bank *bank = irq_data->domain->host_data;
|
||||
struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent);
|
||||
int ret;
|
||||
|
||||
ret = stm32_gpio_direction_input(&bank->gpio_chip, irq_data->hwirq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = gpiochip_lock_as_irq(&bank->gpio_chip, irq_data->hwirq);
|
||||
if (ret) {
|
||||
dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n",
|
||||
irq_data->hwirq);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stm32_gpio_irq_release_resources(struct irq_data *irq_data)
|
||||
{
|
||||
struct stm32_gpio_bank *bank = irq_data->domain->host_data;
|
||||
|
||||
gpiochip_unlock_as_irq(&bank->gpio_chip, irq_data->hwirq);
|
||||
}
|
||||
|
||||
static struct irq_chip stm32_gpio_irq_chip = {
|
||||
.name = "stm32gpio",
|
||||
.irq_eoi = irq_chip_eoi_parent,
|
||||
.irq_mask = irq_chip_mask_parent,
|
||||
.irq_unmask = irq_chip_unmask_parent,
|
||||
.irq_set_type = irq_chip_set_type_parent,
|
||||
.irq_request_resources = stm32_gpio_irq_request_resources,
|
||||
.irq_release_resources = stm32_gpio_irq_release_resources,
|
||||
};
|
||||
|
||||
static int stm32_gpio_domain_translate(struct irq_domain *d,
|
||||
|
|
@ -248,15 +296,6 @@ static void stm32_gpio_domain_activate(struct irq_domain *d,
|
|||
struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent);
|
||||
|
||||
regmap_field_write(pctl->irqmux[irq_data->hwirq], bank->bank_nr);
|
||||
gpiochip_lock_as_irq(&bank->gpio_chip, irq_data->hwirq);
|
||||
}
|
||||
|
||||
static void stm32_gpio_domain_deactivate(struct irq_domain *d,
|
||||
struct irq_data *irq_data)
|
||||
{
|
||||
struct stm32_gpio_bank *bank = d->host_data;
|
||||
|
||||
gpiochip_unlock_as_irq(&bank->gpio_chip, irq_data->hwirq);
|
||||
}
|
||||
|
||||
static int stm32_gpio_domain_alloc(struct irq_domain *d,
|
||||
|
|
@ -285,7 +324,6 @@ static const struct irq_domain_ops stm32_gpio_domain_ops = {
|
|||
.alloc = stm32_gpio_domain_alloc,
|
||||
.free = irq_domain_free_irqs_common,
|
||||
.activate = stm32_gpio_domain_activate,
|
||||
.deactivate = stm32_gpio_domain_deactivate,
|
||||
};
|
||||
|
||||
/* Pinctrl functions */
|
||||
|
|
@ -411,11 +449,6 @@ static int stm32_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
|
|||
pin = STM32_GET_PIN_NO(pinfunc);
|
||||
func = STM32_GET_PIN_FUNC(pinfunc);
|
||||
|
||||
if (pin >= pctl->match_data->npins) {
|
||||
dev_err(pctl->dev, "invalid pin number.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!stm32_pctrl_is_function_valid(pctl, pin, func)) {
|
||||
dev_err(pctl->dev, "invalid function.\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -558,8 +591,8 @@ static void stm32_pmx_set_mode(struct stm32_gpio_bank *bank,
|
|||
clk_disable(bank->clk);
|
||||
}
|
||||
|
||||
static void stm32_pmx_get_mode(struct stm32_gpio_bank *bank,
|
||||
int pin, u32 *mode, u32 *alt)
|
||||
void stm32_pmx_get_mode(struct stm32_gpio_bank *bank, int pin, u32 *mode,
|
||||
u32 *alt)
|
||||
{
|
||||
u32 val;
|
||||
int alt_shift = (pin % 8) * 4;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,10 @@ struct stm32_pinctrl_match_data {
|
|||
const unsigned int npins;
|
||||
};
|
||||
|
||||
int stm32_pctl_probe(struct platform_device *pdev);
|
||||
struct stm32_gpio_bank;
|
||||
|
||||
int stm32_pctl_probe(struct platform_device *pdev);
|
||||
void stm32_pmx_get_mode(struct stm32_gpio_bank *bank,
|
||||
int pin, u32 *mode, u32 *alt);
|
||||
#endif /* __PINCTRL_STM32_H */
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ config PINCTRL_SUNXI
|
|||
select GPIOLIB
|
||||
|
||||
config PINCTRL_SUN4I_A10
|
||||
def_bool MACH_SUN4I
|
||||
def_bool MACH_SUN4I || MACH_SUN7I
|
||||
select PINCTRL_SUNXI
|
||||
|
||||
config PINCTRL_SUN5I
|
||||
|
|
@ -23,10 +23,6 @@ config PINCTRL_SUN6I_A31_R
|
|||
depends on RESET_CONTROLLER
|
||||
select PINCTRL_SUNXI
|
||||
|
||||
config PINCTRL_SUN7I_A20
|
||||
def_bool MACH_SUN7I
|
||||
select PINCTRL_SUNXI
|
||||
|
||||
config PINCTRL_SUN8I_A23
|
||||
def_bool MACH_SUN8I
|
||||
select PINCTRL_SUNXI
|
||||
|
|
@ -39,6 +35,10 @@ config PINCTRL_SUN8I_A83T
|
|||
def_bool MACH_SUN8I
|
||||
select PINCTRL_SUNXI
|
||||
|
||||
config PINCTRL_SUN8I_A83T_R
|
||||
def_bool MACH_SUN8I
|
||||
select PINCTRL_SUNXI
|
||||
|
||||
config PINCTRL_SUN8I_A23_R
|
||||
def_bool MACH_SUN8I
|
||||
depends on RESET_CONTROLLER
|
||||
|
|
|
|||
|
|
@ -6,13 +6,13 @@ obj-$(CONFIG_PINCTRL_SUN4I_A10) += pinctrl-sun4i-a10.o
|
|||
obj-$(CONFIG_PINCTRL_SUN5I) += pinctrl-sun5i.o
|
||||
obj-$(CONFIG_PINCTRL_SUN6I_A31) += pinctrl-sun6i-a31.o
|
||||
obj-$(CONFIG_PINCTRL_SUN6I_A31_R) += pinctrl-sun6i-a31-r.o
|
||||
obj-$(CONFIG_PINCTRL_SUN7I_A20) += pinctrl-sun7i-a20.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_A23) += pinctrl-sun8i-a23.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_A23_R) += pinctrl-sun8i-a23-r.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_A33) += pinctrl-sun8i-a33.o
|
||||
obj-$(CONFIG_PINCTRL_SUN50I_A64) += pinctrl-sun50i-a64.o
|
||||
obj-$(CONFIG_PINCTRL_SUN50I_A64_R) += pinctrl-sun50i-a64-r.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_A83T) += pinctrl-sun8i-a83t.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_A83T_R) += pinctrl-sun8i-a83t-r.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_H3) += pinctrl-sun8i-h3.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_H3_R) += pinctrl-sun8i-h3-r.o
|
||||
obj-$(CONFIG_PINCTRL_SUN8I_V3S) += pinctrl-sun8i-v3s.o
|
||||
|
|
|
|||
|
|
@ -24,101 +24,147 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXD3 */
|
||||
SUNXI_FUNCTION(0x3, "spi1"), /* CS0 */
|
||||
SUNXI_FUNCTION(0x4, "uart2")), /* RTS */
|
||||
SUNXI_FUNCTION(0x4, "uart2"), /* RTS */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GRXD3 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 1),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXD2 */
|
||||
SUNXI_FUNCTION(0x3, "spi1"), /* CLK */
|
||||
SUNXI_FUNCTION(0x4, "uart2")), /* CTS */
|
||||
SUNXI_FUNCTION(0x4, "uart2"), /* CTS */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GRXD2 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 2),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXD1 */
|
||||
SUNXI_FUNCTION(0x3, "spi1"), /* MOSI */
|
||||
SUNXI_FUNCTION(0x4, "uart2")), /* TX */
|
||||
SUNXI_FUNCTION(0x4, "uart2"), /* TX */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GRXD1 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 3),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXD0 */
|
||||
SUNXI_FUNCTION(0x3, "spi1"), /* MISO */
|
||||
SUNXI_FUNCTION(0x4, "uart2")), /* RX */
|
||||
SUNXI_FUNCTION(0x4, "uart2"), /* RX */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GRXD0 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 4),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXD3 */
|
||||
SUNXI_FUNCTION(0x3, "spi1")), /* CS1 */
|
||||
SUNXI_FUNCTION(0x3, "spi1"), /* CS1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GTXD3 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 5),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXD2 */
|
||||
SUNXI_FUNCTION(0x3, "spi3")), /* CS0 */
|
||||
SUNXI_FUNCTION(0x3, "spi3"), /* CS0 */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GTXD2 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 6),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXD1 */
|
||||
SUNXI_FUNCTION(0x3, "spi3")), /* CLK */
|
||||
SUNXI_FUNCTION(0x3, "spi3"), /* CLK */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GTXD1 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 7),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXD0 */
|
||||
SUNXI_FUNCTION(0x3, "spi3")), /* MOSI */
|
||||
SUNXI_FUNCTION(0x3, "spi3"), /* MOSI */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GTXD0 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 8),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXCK */
|
||||
SUNXI_FUNCTION(0x3, "spi3")), /* MISO */
|
||||
SUNXI_FUNCTION(0x3, "spi3"), /* MISO */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GRXCK */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 9),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXERR */
|
||||
SUNXI_FUNCTION(0x3, "spi3")), /* CS1 */
|
||||
SUNXI_FUNCTION(0x3, "spi3"), /* CS1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GNULL / ERXERR */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_VARIANT(0x6, "i2s1", /* MCLK */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 10),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ERXDV */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* TX */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* TX */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GRXDV */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 11),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* EMDC */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* RX */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* RX */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* EMDC */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 12),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* EMDIO */
|
||||
SUNXI_FUNCTION(0x3, "uart6"), /* TX */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* RTS */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* RTS */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* EMDIO */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 13),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXEN */
|
||||
SUNXI_FUNCTION(0x3, "uart6"), /* RX */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* CTS */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* CTS */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GTXCTL / ETXEN */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 14),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXCK */
|
||||
SUNXI_FUNCTION(0x3, "uart7"), /* TX */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* DTR */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* DTR */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GNULL / ETXCK */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_VARIANT(0x6, "i2s1", /* BCLK */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 15),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ECRS */
|
||||
SUNXI_FUNCTION(0x3, "uart7"), /* RX */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* DSR */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* DSR */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GTXCK / ECRS */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_VARIANT(0x6, "i2s1", /* LRCK */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 16),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ECOL */
|
||||
SUNXI_FUNCTION(0x3, "can"), /* TX */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* DCD */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* DCD */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GCLKIN / ECOL */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_VARIANT(0x6, "i2s1", /* DO */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 17),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "emac"), /* ETXERR */
|
||||
SUNXI_FUNCTION(0x3, "can"), /* RX */
|
||||
SUNXI_FUNCTION(0x4, "uart1")), /* RING */
|
||||
SUNXI_FUNCTION(0x4, "uart1"), /* RING */
|
||||
SUNXI_FUNCTION_VARIANT(0x5, "gmac", /* GNULL / ETXERR */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_VARIANT(0x6, "i2s1", /* DI */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
/* Hole */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
|
|
@ -150,47 +196,77 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s"), /* MCLK */
|
||||
/*
|
||||
* On A10 there's only one I2S controller and the pin group
|
||||
* is simply named "i2s". On A20 there's two and thus it's
|
||||
* renamed to "i2s0". Deal with these name here, in order
|
||||
* to satisfy existing device trees.
|
||||
*/
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* MCLK */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* MCLK */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x3, "ac97")), /* MCLK */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 6),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s"), /* BCLK */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* BCLK */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* BCLK */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x3, "ac97")), /* BCLK */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 7),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s"), /* LRCK */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* LRCK */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* LRCK */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x3, "ac97")), /* SYNC */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 8),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s"), /* DO0 */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* DO0 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* DO0 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x3, "ac97")), /* DO */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 9),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s")), /* DO1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* DO1 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* DO1 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 10),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s")), /* DO2 */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* DO2 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* DO2 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 11),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s")), /* DO3 */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* DO3 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* DO3 */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 12),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "i2s"), /* DI */
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s", /* DI */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x2, "i2s0", /* DI */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x3, "ac97"), /* DI */
|
||||
/* Undocumented mux function - See SPDIF MCLK above */
|
||||
/* Undocumented mux function on A10 - See SPDIF MCLK above */
|
||||
SUNXI_FUNCTION(0x4, "spdif")), /* SPDIF IN */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 13),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "spi2"), /* CS1 */
|
||||
/* Undocumented mux function - See SPDIF MCLK above */
|
||||
/* Undocumented mux function on A10 - See SPDIF MCLK above */
|
||||
SUNXI_FUNCTION(0x4, "spdif")), /* SPDIF OUT */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 14),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
|
|
@ -672,7 +748,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D0 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAA0 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAA0 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart3"), /* TX */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 0), /* EINT0 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D0 */
|
||||
|
|
@ -680,7 +757,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D1 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAA1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAA1 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart3"), /* RX */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 1), /* EINT1 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D1 */
|
||||
|
|
@ -688,7 +766,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D2 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAA2 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAA2 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart3"), /* RTS */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 2), /* EINT2 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D2 */
|
||||
|
|
@ -696,7 +775,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D3 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAIRQ */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAIRQ */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart3"), /* CTS */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 3), /* EINT3 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D3 */
|
||||
|
|
@ -704,7 +784,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D4 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD0 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD0 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart4"), /* TX */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 4), /* EINT4 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D4 */
|
||||
|
|
@ -712,7 +793,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D5 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD1 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart4"), /* RX */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 5), /* EINT5 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D5 */
|
||||
|
|
@ -720,7 +802,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D6 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD2 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD2 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart5"), /* TX */
|
||||
SUNXI_FUNCTION(0x5, "ms"), /* BS */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 6), /* EINT6 */
|
||||
|
|
@ -729,7 +812,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D7 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD3 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD3 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "uart5"), /* RX */
|
||||
SUNXI_FUNCTION(0x5, "ms"), /* CLK */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 7), /* EINT7 */
|
||||
|
|
@ -738,7 +822,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D8 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD4 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD4 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXD3 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN0 */
|
||||
SUNXI_FUNCTION(0x5, "ms"), /* D0 */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 8), /* EINT8 */
|
||||
|
|
@ -747,7 +834,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D9 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD5 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD5 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXD2 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN1 */
|
||||
SUNXI_FUNCTION(0x5, "ms"), /* D1 */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 9), /* EINT9 */
|
||||
|
|
@ -756,7 +846,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D10 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD6 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD6 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXD1 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN2 */
|
||||
SUNXI_FUNCTION(0x5, "ms"), /* D2 */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 10), /* EINT10 */
|
||||
|
|
@ -765,7 +858,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D11 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD7 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD7 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXD0 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN3 */
|
||||
SUNXI_FUNCTION(0x5, "ms"), /* D3 */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 11), /* EINT11 */
|
||||
|
|
@ -774,7 +870,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D12 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD8 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD8 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "ps2"), /* SCK1 */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 12), /* EINT12 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D12 */
|
||||
|
|
@ -782,7 +879,8 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D13 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD9 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD9 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION(0x4, "ps2"), /* SDA1 */
|
||||
SUNXI_FUNCTION(0x5, "sim"), /* RST */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 13), /* EINT13 */
|
||||
|
|
@ -791,7 +889,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D14 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD10 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD10 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXD3 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN4 */
|
||||
SUNXI_FUNCTION(0x5, "sim"), /* VPPEN */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 14), /* EINT14 */
|
||||
|
|
@ -800,7 +901,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D15 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD11 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD11 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXD2 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN5 */
|
||||
SUNXI_FUNCTION(0x5, "sim"), /* VPPPP */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 15), /* EINT15 */
|
||||
|
|
@ -809,7 +913,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D16 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD12 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD12 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXD1 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN6 */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 16), /* EINT16 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D16 */
|
||||
|
|
@ -817,7 +924,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D17 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD13 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD13 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXD0 */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* IN7 */
|
||||
SUNXI_FUNCTION(0x5, "sim"), /* VCCEN */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 17), /* EINT17 */
|
||||
|
|
@ -826,7 +936,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D18 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD14 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD14 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXCK */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT0 */
|
||||
SUNXI_FUNCTION(0x5, "sim"), /* SCK */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 18), /* EINT18 */
|
||||
|
|
@ -835,7 +948,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D19 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAD15 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAD15 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXERR */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT1 */
|
||||
SUNXI_FUNCTION(0x5, "sim"), /* SDA */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 19), /* EINT19 */
|
||||
|
|
@ -844,7 +960,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D20 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAOE */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAOE */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ERXDV */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "can"), /* TX */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 20), /* EINT20 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D20 */
|
||||
|
|
@ -852,7 +971,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D21 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATADREQ */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATADREQ */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* EMDC */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "can"), /* RX */
|
||||
SUNXI_FUNCTION_IRQ(0x6, 21), /* EINT21 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D21 */
|
||||
|
|
@ -860,7 +982,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D22 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATADACK */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATADACK */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* EMDIO */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT2 */
|
||||
SUNXI_FUNCTION(0x5, "mmc1"), /* CMD */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D22 */
|
||||
|
|
@ -868,7 +993,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* D23 */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATACS0 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATACS0 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXEN */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT3 */
|
||||
SUNXI_FUNCTION(0x5, "mmc1"), /* CLK */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* D23 */
|
||||
|
|
@ -876,7 +1004,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* CLK */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATACS1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATACS1 */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXCK */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT4 */
|
||||
SUNXI_FUNCTION(0x5, "mmc1"), /* D0 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* PCLK */
|
||||
|
|
@ -884,7 +1015,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* DE */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAIORDY */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAIORDY */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ECRS */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT5 */
|
||||
SUNXI_FUNCTION(0x5, "mmc1"), /* D1 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* FIELD */
|
||||
|
|
@ -892,7 +1026,10 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* HSYNC */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAIOR */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAIOR */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ECOL */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT6 */
|
||||
SUNXI_FUNCTION(0x5, "mmc1"), /* D2 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* HSYNC */
|
||||
|
|
@ -900,24 +1037,35 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "lcd1"), /* VSYNC */
|
||||
SUNXI_FUNCTION(0x3, "pata"), /* ATAIOW */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "pata", /* ATAIOW */
|
||||
PINCTRL_SUN4I_A10),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "emac", /* ETXERR */
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION(0x4, "keypad"), /* OUT7 */
|
||||
SUNXI_FUNCTION(0x5, "mmc1"), /* D3 */
|
||||
SUNXI_FUNCTION(0x7, "csi1")), /* VSYNC */
|
||||
/* Hole */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 0),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out")),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "i2c3", /* SCK */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 1),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out")),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "i2c3", /* SDA */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 2),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out")),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "i2c4", /* SCK */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 3),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "pwm")), /* PWM1 */
|
||||
SUNXI_FUNCTION(0x2, "pwm"), /* PWM1 */
|
||||
SUNXI_FUNCTION_VARIANT(0x3, "i2c3", /* SDA */
|
||||
PINCTRL_SUN7I_A20)),
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 4),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
|
|
@ -959,12 +1107,16 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
|
|||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "spi0"), /* MOSI */
|
||||
SUNXI_FUNCTION(0x3, "uart6"), /* TX */
|
||||
SUNXI_FUNCTION_VARIANT(0x4, "clk_out_a",
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_IRQ(0x6, 24)), /* EINT24 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 13),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "spi0"), /* MISO */
|
||||
SUNXI_FUNCTION(0x3, "uart6"), /* RX */
|
||||
SUNXI_FUNCTION_VARIANT(0x4, "clk_out_b",
|
||||
PINCTRL_SUN7I_A20),
|
||||
SUNXI_FUNCTION_IRQ(0x6, 25)), /* EINT25 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 14),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
|
|
@ -1027,12 +1179,21 @@ static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = {
|
|||
|
||||
static int sun4i_a10_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
return sunxi_pinctrl_init(pdev,
|
||||
&sun4i_a10_pinctrl_data);
|
||||
unsigned long variant = (unsigned long)of_device_get_match_data(&pdev->dev);
|
||||
|
||||
return sunxi_pinctrl_init_with_variant(pdev, &sun4i_a10_pinctrl_data,
|
||||
variant);
|
||||
}
|
||||
|
||||
static const struct of_device_id sun4i_a10_pinctrl_match[] = {
|
||||
{ .compatible = "allwinner,sun4i-a10-pinctrl", },
|
||||
{
|
||||
.compatible = "allwinner,sun4i-a10-pinctrl",
|
||||
.data = (void *)PINCTRL_SUN4I_A10
|
||||
},
|
||||
{
|
||||
.compatible = "allwinner,sun7i-a20-pinctrl",
|
||||
.data = (void *)PINCTRL_SUN7I_A20
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
128
drivers/pinctrl/sunxi/pinctrl-sun8i-a83t-r.c
Normal file
128
drivers/pinctrl/sunxi/pinctrl-sun8i-a83t-r.c
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* Allwinner A83T SoCs special pins pinctrl driver.
|
||||
*
|
||||
* Copyright (C) 2017 Chen-Yu Tsai
|
||||
* Chen-Yu Tsai <wens@csie.org>
|
||||
*
|
||||
* Based on pinctrl-sun50i-a64-r.c
|
||||
*
|
||||
* Copyright (C) 2016 Icenowy Zheng
|
||||
* Icenowy Zheng <icenowy@aosc.xyz>
|
||||
*
|
||||
* Copyright (C) 2014 Chen-Yu Tsai
|
||||
* Chen-Yu Tsai <wens@csie.org>
|
||||
*
|
||||
* Copyright (C) 2014 Boris Brezillon
|
||||
* Boris Brezillon <boris.brezillon@free-electrons.com>
|
||||
*
|
||||
* Copyright (C) 2014 Maxime Ripard
|
||||
* Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include "pinctrl-sunxi.h"
|
||||
|
||||
static const struct sunxi_desc_pin sun8i_a83t_r_pins[] = {
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_rsb"), /* SCK */
|
||||
SUNXI_FUNCTION(0x3, "s_i2c"), /* SCK */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)), /* PL_EINT0 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_rsb"), /* SDA */
|
||||
SUNXI_FUNCTION(0x3, "s_i2c"), /* SDA */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)), /* PL_EINT1 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_uart"), /* TX */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)), /* PL_EINT2 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_uart"), /* RX */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)), /* PL_EINT3 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_jtag"), /* MS */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)), /* PL_EINT4 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_jtag"), /* CK */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)), /* PL_EINT5 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_jtag"), /* DO */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)), /* PL_EINT6 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_jtag"), /* DI */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)), /* PL_EINT7 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_i2c"), /* SCK */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)), /* PL_EINT8 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_i2c"), /* SDA */
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)), /* PL_EINT9 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 10),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_pwm"),
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)), /* PL_EINT10 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 11),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 11)), /* PL_EINT11 */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 12),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x2, "s_cir_rx"),
|
||||
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 12)), /* PL_EINT12 */
|
||||
};
|
||||
|
||||
static const struct sunxi_pinctrl_desc sun8i_a83t_r_pinctrl_data = {
|
||||
.pins = sun8i_a83t_r_pins,
|
||||
.npins = ARRAY_SIZE(sun8i_a83t_r_pins),
|
||||
.pin_base = PL_BASE,
|
||||
.irq_banks = 1,
|
||||
};
|
||||
|
||||
static int sun8i_a83t_r_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
return sunxi_pinctrl_init(pdev,
|
||||
&sun8i_a83t_r_pinctrl_data);
|
||||
}
|
||||
|
||||
static const struct of_device_id sun8i_a83t_r_pinctrl_match[] = {
|
||||
{ .compatible = "allwinner,sun8i-a83t-r-pinctrl", },
|
||||
{}
|
||||
};
|
||||
|
||||
static struct platform_driver sun8i_a83t_r_pinctrl_driver = {
|
||||
.probe = sun8i_a83t_r_pinctrl_probe,
|
||||
.driver = {
|
||||
.name = "sun8i-a83t-r-pinctrl",
|
||||
.of_match_table = sun8i_a83t_r_pinctrl_match,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(sun8i_a83t_r_pinctrl_driver);
|
||||
|
|
@ -979,7 +979,7 @@ static int sunxi_pinctrl_irq_of_xlate(struct irq_domain *d,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_domain_ops sunxi_pinctrl_irq_domain_ops = {
|
||||
static const struct irq_domain_ops sunxi_pinctrl_irq_domain_ops = {
|
||||
.xlate = sunxi_pinctrl_irq_of_xlate,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -87,6 +87,9 @@
|
|||
#define PINCTRL_SUN5I_GR8 BIT(3)
|
||||
#define PINCTRL_SUN6I_A31 BIT(4)
|
||||
#define PINCTRL_SUN6I_A31S BIT(5)
|
||||
#define PINCTRL_SUN4I_A10 BIT(6)
|
||||
#define PINCTRL_SUN7I_A20 BIT(7)
|
||||
#define PINCTRL_SUN8I_R40 BIT(8)
|
||||
|
||||
struct sunxi_desc_function {
|
||||
unsigned long variant;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
/*
|
||||
* Pinctrl data for the NVIDIA Tegra114 pinmux
|
||||
*
|
||||
* Author: Pritesh Raithatha <praithatha@nvidia.com>
|
||||
*
|
||||
* Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
|
@ -13,7 +15,7 @@
|
|||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -1857,7 +1859,6 @@ static const struct of_device_id tegra114_pinctrl_of_match[] = {
|
|||
{ .compatible = "nvidia,tegra114-pinmux", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra114_pinctrl_of_match);
|
||||
|
||||
static struct platform_driver tegra114_pinctrl_driver = {
|
||||
.driver = {
|
||||
|
|
@ -1866,8 +1867,4 @@ static struct platform_driver tegra114_pinctrl_driver = {
|
|||
},
|
||||
.probe = tegra114_pinctrl_probe,
|
||||
};
|
||||
module_platform_driver(tegra114_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Pritesh Raithatha <[email protected]>");
|
||||
MODULE_DESCRIPTION("NVIDIA Tegra114 pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
builtin_platform_driver(tegra114_pinctrl_driver);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
/*
|
||||
* Pinctrl data for the NVIDIA Tegra124 pinmux
|
||||
*
|
||||
* Author: Ashwini Ghuge <aghuge@nvidia.com>
|
||||
*
|
||||
* Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
|
@ -13,7 +15,7 @@
|
|||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -2069,7 +2071,6 @@ static const struct of_device_id tegra124_pinctrl_of_match[] = {
|
|||
{ .compatible = "nvidia,tegra124-pinmux", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra124_pinctrl_of_match);
|
||||
|
||||
static struct platform_driver tegra124_pinctrl_driver = {
|
||||
.driver = {
|
||||
|
|
@ -2078,8 +2079,4 @@ static struct platform_driver tegra124_pinctrl_driver = {
|
|||
},
|
||||
.probe = tegra124_pinctrl_probe,
|
||||
};
|
||||
module_platform_driver(tegra124_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Ashwini Ghuge <[email protected]>");
|
||||
MODULE_DESCRIPTION("NVIDIA Tegra124 pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
builtin_platform_driver(tegra124_pinctrl_driver);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
/*
|
||||
* Pinctrl data for the NVIDIA Tegra20 pinmux
|
||||
*
|
||||
* Author: Stephen Warren <swarren@nvidia.com>
|
||||
*
|
||||
* Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Derived from code:
|
||||
|
|
@ -17,7 +19,7 @@
|
|||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -2246,9 +2248,4 @@ static struct platform_driver tegra20_pinctrl_driver = {
|
|||
},
|
||||
.probe = tegra20_pinctrl_probe,
|
||||
};
|
||||
module_platform_driver(tegra20_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Stephen Warren <[email protected]>");
|
||||
MODULE_DESCRIPTION("NVIDIA Tegra20 pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DEVICE_TABLE(of, tegra20_pinctrl_of_match);
|
||||
builtin_platform_driver(tegra20_pinctrl_driver);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -1573,7 +1573,6 @@ static const struct of_device_id tegra210_pinctrl_of_match[] = {
|
|||
{ .compatible = "nvidia,tegra210-pinmux", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra210_pinctrl_of_match);
|
||||
|
||||
static struct platform_driver tegra210_pinctrl_driver = {
|
||||
.driver = {
|
||||
|
|
@ -1582,8 +1581,4 @@ static struct platform_driver tegra210_pinctrl_driver = {
|
|||
},
|
||||
.probe = tegra210_pinctrl_probe,
|
||||
};
|
||||
module_platform_driver(tegra210_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("NVIDIA");
|
||||
MODULE_DESCRIPTION("NVIDIA Tegra210 pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
builtin_platform_driver(tegra210_pinctrl_driver);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
/*
|
||||
* Pinctrl data for the NVIDIA Tegra30 pinmux
|
||||
*
|
||||
* Author: Stephen Warren <swarren@nvidia.com>
|
||||
*
|
||||
* Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
|
@ -13,7 +15,7 @@
|
|||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
|
@ -2492,7 +2494,6 @@ static const struct of_device_id tegra30_pinctrl_of_match[] = {
|
|||
{ .compatible = "nvidia,tegra30-pinmux", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tegra30_pinctrl_of_match);
|
||||
|
||||
static struct platform_driver tegra30_pinctrl_driver = {
|
||||
.driver = {
|
||||
|
|
@ -2501,8 +2502,4 @@ static struct platform_driver tegra30_pinctrl_driver = {
|
|||
},
|
||||
.probe = tegra30_pinctrl_probe,
|
||||
};
|
||||
module_platform_driver(tegra30_pinctrl_driver);
|
||||
|
||||
MODULE_AUTHOR("Stephen Warren <[email protected]>");
|
||||
MODULE_DESCRIPTION("NVIDIA Tegra30 pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
builtin_platform_driver(tegra30_pinctrl_driver);
|
||||
|
|
|
|||
|
|
@ -508,57 +508,71 @@ static const unsigned usb1_pins[] = {48, 49};
|
|||
static const int usb1_muxvals[] = {0, 0};
|
||||
static const unsigned usb2_pins[] = {50, 51};
|
||||
static const int usb2_muxvals[] = {0, 0};
|
||||
static const unsigned port_range_pins[] = {
|
||||
static const unsigned port_range0_pins[] = {
|
||||
159, 160, 161, 162, 163, 164, 165, 166, /* PORT0x */
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* PORT1x */
|
||||
8, 9, 10, 11, 12, 13, 14, 15, /* PORT2x */
|
||||
16, 17, 18, -1, -1, -1, -1, -1, /* PORT3x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT4x */
|
||||
-1, -1, -1, 46, 47, 48, 49, 50, /* PORT5x */
|
||||
51, -1, -1, 54, 55, 56, 57, 58, /* PORT6x */
|
||||
16, 17, 18, /* PORT30-32 */
|
||||
};
|
||||
static const int port_range0_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT0x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT1x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT2x */
|
||||
15, 15, 15, /* PORT30-32 */
|
||||
};
|
||||
static const unsigned port_range1_pins[] = {
|
||||
46, 47, 48, 49, 50, /* PORT53-57 */
|
||||
51, /* PORT60 */
|
||||
};
|
||||
static const int port_range1_muxvals[] = {
|
||||
15, 15, 15, 15, 15, /* PORT53-57 */
|
||||
15, /* PORT60 */
|
||||
};
|
||||
static const unsigned port_range2_pins[] = {
|
||||
54, 55, 56, 57, 58, /* PORT63-67 */
|
||||
59, 60, 69, 70, 71, 72, 73, 74, /* PORT7x */
|
||||
75, 76, 77, 78, 79, 80, 81, 82, /* PORT8x */
|
||||
83, 84, 85, 86, 87, 88, 89, 90, /* PORT9x */
|
||||
91, 92, 93, 94, 95, 96, 97, 98, /* PORT10x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT11x */
|
||||
99, 100, 101, 102, 103, 104, 105, 106, /* PORT12x */
|
||||
107, 108, 109, 110, 111, 112, 113, 114, /* PORT13x */
|
||||
115, 116, 117, 118, 119, 120, 121, 122, /* PORT14x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT15x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT16x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT17x */
|
||||
61, 62, 63, 64, 65, 66, 67, 68, /* PORT18x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT19x */
|
||||
123, 124, 125, 126, 127, 128, 129, 130, /* PORT20x */
|
||||
131, 132, 133, 134, 135, 136, 137, 138, /* PORT21x */
|
||||
139, 140, 141, 142, -1, -1, -1, -1, /* PORT22x */
|
||||
147, 148, 149, 150, 151, 152, 153, 154, /* PORT23x */
|
||||
155, 156, 157, 143, 144, 145, 146, 158, /* PORT24x */
|
||||
};
|
||||
static const int port_range_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT0x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT1x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT2x */
|
||||
15, 15, 15, -1, -1, -1, -1, -1, /* PORT3x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT4x */
|
||||
-1, -1, -1, 15, 15, 15, 15, 15, /* PORT5x */
|
||||
15, -1, -1, 15, 15, 15, 15, 15, /* PORT6x */
|
||||
static const int port_range2_muxvals[] = {
|
||||
15, 15, 15, 15, 15, /* PORT63-67 */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT7x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT8x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT9x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT10x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT11x */
|
||||
};
|
||||
static const unsigned port_range3_pins[] = {
|
||||
99, 100, 101, 102, 103, 104, 105, 106, /* PORT12x */
|
||||
107, 108, 109, 110, 111, 112, 113, 114, /* PORT13x */
|
||||
115, 116, 117, 118, 119, 120, 121, 122, /* PORT14x */
|
||||
};
|
||||
static const int port_range3_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT12x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT13x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT14x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT15x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT16x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT17x */
|
||||
};
|
||||
static const unsigned port_range4_pins[] = {
|
||||
61, 62, 63, 64, 65, 66, 67, 68, /* PORT18x */
|
||||
};
|
||||
static const int port_range4_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT18x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT19x */
|
||||
};
|
||||
static const unsigned port_range5_pins[] = {
|
||||
123, 124, 125, 126, 127, 128, 129, 130, /* PORT20x */
|
||||
131, 132, 133, 134, 135, 136, 137, 138, /* PORT21x */
|
||||
139, 140, 141, 142, /* PORT220-223 */
|
||||
};
|
||||
static const int port_range5_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT20x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT21x */
|
||||
15, 15, 15, 15, -1, -1, -1, -1, /* PORT22x */
|
||||
15, 15, 15, 15, /* PORT220-223 */
|
||||
};
|
||||
static const unsigned port_range6_pins[] = {
|
||||
147, 148, 149, 150, 151, 152, 153, 154, /* PORT23x */
|
||||
155, 156, 157, 143, 144, 145, 146, 158, /* PORT24x */
|
||||
};
|
||||
static const int port_range6_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT23x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT24x */
|
||||
};
|
||||
|
|
@ -607,147 +621,153 @@ static const struct uniphier_pinctrl_group uniphier_ld11_groups[] = {
|
|||
UNIPHIER_PINCTRL_GROUP(usb0),
|
||||
UNIPHIER_PINCTRL_GROUP(usb1),
|
||||
UNIPHIER_PINCTRL_GROUP(usb2),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range0),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range1),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range2),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range3),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range4),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range5),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range6),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ(xirq),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ(xirq_alternatives),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port00, port_range, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port01, port_range, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port02, port_range, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port03, port_range, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port04, port_range, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port05, port_range, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port06, port_range, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port07, port_range, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port10, port_range, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port11, port_range, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port12, port_range, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port13, port_range, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port14, port_range, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port15, port_range, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port16, port_range, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port17, port_range, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port20, port_range, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port21, port_range, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port22, port_range, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port23, port_range, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port24, port_range, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port25, port_range, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port26, port_range, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port27, port_range, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port30, port_range, 24),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port31, port_range, 25),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port32, port_range, 26),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port53, port_range, 43),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port54, port_range, 44),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port55, port_range, 45),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port56, port_range, 46),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port57, port_range, 47),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port60, port_range, 48),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port63, port_range, 51),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port64, port_range, 52),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port65, port_range, 53),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port66, port_range, 54),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port67, port_range, 55),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port70, port_range, 56),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port71, port_range, 57),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port72, port_range, 58),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port73, port_range, 59),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port74, port_range, 60),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port75, port_range, 61),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port76, port_range, 62),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port77, port_range, 63),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port80, port_range, 64),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port81, port_range, 65),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port82, port_range, 66),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port83, port_range, 67),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port84, port_range, 68),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port85, port_range, 69),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port86, port_range, 70),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port87, port_range, 71),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port90, port_range, 72),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port91, port_range, 73),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port92, port_range, 74),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port93, port_range, 75),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port94, port_range, 76),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port95, port_range, 77),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port96, port_range, 78),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port97, port_range, 79),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port100, port_range, 80),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port101, port_range, 81),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port102, port_range, 82),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port103, port_range, 83),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port104, port_range, 84),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port105, port_range, 85),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port106, port_range, 86),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port107, port_range, 87),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port120, port_range, 96),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port121, port_range, 97),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port122, port_range, 98),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port123, port_range, 99),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port124, port_range, 100),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port125, port_range, 101),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port126, port_range, 102),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port127, port_range, 103),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port130, port_range, 104),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port131, port_range, 105),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port132, port_range, 106),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port133, port_range, 107),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port134, port_range, 108),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port135, port_range, 109),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port136, port_range, 110),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port137, port_range, 111),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port140, port_range, 112),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port141, port_range, 113),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port142, port_range, 114),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port143, port_range, 115),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port144, port_range, 116),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port145, port_range, 117),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port146, port_range, 118),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port147, port_range, 119),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port180, port_range, 144),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port181, port_range, 145),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port182, port_range, 146),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port183, port_range, 147),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port184, port_range, 148),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port185, port_range, 149),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port186, port_range, 150),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port187, port_range, 151),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port200, port_range, 160),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port201, port_range, 161),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port202, port_range, 162),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port203, port_range, 163),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port204, port_range, 164),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port205, port_range, 165),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port206, port_range, 166),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port207, port_range, 167),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port210, port_range, 168),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port211, port_range, 169),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port212, port_range, 170),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port213, port_range, 171),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port214, port_range, 172),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port215, port_range, 173),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port216, port_range, 174),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port217, port_range, 175),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port220, port_range, 176),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port221, port_range, 177),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port222, port_range, 178),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port223, port_range, 179),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port230, port_range, 184),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port231, port_range, 185),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port232, port_range, 186),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port233, port_range, 187),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port234, port_range, 188),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port235, port_range, 189),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port236, port_range, 190),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port237, port_range, 191),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port240, port_range, 192),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port241, port_range, 193),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port242, port_range, 194),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port243, port_range, 195),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port244, port_range, 196),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port245, port_range, 197),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port246, port_range, 198),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port247, port_range, 199),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port00, port_range0, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port01, port_range0, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port02, port_range0, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port03, port_range0, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port04, port_range0, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port05, port_range0, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port06, port_range0, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port07, port_range0, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port10, port_range0, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port11, port_range0, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port12, port_range0, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port13, port_range0, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port14, port_range0, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port15, port_range0, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port16, port_range0, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port17, port_range0, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port20, port_range0, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port21, port_range0, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port22, port_range0, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port23, port_range0, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port24, port_range0, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port25, port_range0, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port26, port_range0, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port27, port_range0, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port30, port_range0, 24),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port31, port_range0, 25),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port32, port_range0, 26),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port53, port_range1, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port54, port_range1, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port55, port_range1, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port56, port_range1, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port57, port_range1, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port60, port_range1, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port63, port_range2, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port64, port_range2, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port65, port_range2, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port66, port_range2, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port67, port_range2, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port70, port_range2, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port71, port_range2, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port72, port_range2, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port73, port_range2, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port74, port_range2, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port75, port_range2, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port76, port_range2, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port77, port_range2, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port80, port_range2, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port81, port_range2, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port82, port_range2, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port83, port_range2, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port84, port_range2, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port85, port_range2, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port86, port_range2, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port87, port_range2, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port90, port_range2, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port91, port_range2, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port92, port_range2, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port93, port_range2, 24),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port94, port_range2, 25),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port95, port_range2, 26),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port96, port_range2, 27),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port97, port_range2, 28),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port100, port_range2, 29),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port101, port_range2, 30),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port102, port_range2, 31),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port103, port_range2, 32),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port104, port_range2, 33),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port105, port_range2, 34),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port106, port_range2, 35),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port107, port_range2, 36),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port120, port_range3, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port121, port_range3, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port122, port_range3, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port123, port_range3, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port124, port_range3, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port125, port_range3, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port126, port_range3, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port127, port_range3, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port130, port_range3, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port131, port_range3, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port132, port_range3, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port133, port_range3, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port134, port_range3, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port135, port_range3, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port136, port_range3, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port137, port_range3, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port140, port_range3, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port141, port_range3, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port142, port_range3, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port143, port_range3, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port144, port_range3, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port145, port_range3, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port146, port_range3, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port147, port_range3, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port180, port_range4, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port181, port_range4, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port182, port_range4, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port183, port_range4, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port184, port_range4, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port185, port_range4, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port186, port_range4, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port187, port_range4, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port200, port_range5, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port201, port_range5, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port202, port_range5, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port203, port_range5, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port204, port_range5, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port205, port_range5, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port206, port_range5, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port207, port_range5, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port210, port_range5, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port211, port_range5, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port212, port_range5, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port213, port_range5, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port214, port_range5, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port215, port_range5, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port216, port_range5, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port217, port_range5, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port220, port_range5, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port221, port_range5, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port222, port_range5, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port223, port_range5, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port230, port_range6, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port231, port_range6, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port232, port_range6, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port233, port_range6, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port234, port_range6, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port235, port_range6, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port236, port_range6, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port237, port_range6, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port240, port_range6, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port241, port_range6, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port242, port_range6, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port243, port_range6, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port244, port_range6, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port245, port_range6, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port246, port_range6, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port247, port_range6, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(xirq0, xirq, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(xirq1, xirq, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(xirq2, xirq, 2),
|
||||
|
|
|
|||
|
|
@ -597,7 +597,7 @@ static const unsigned usb2_pins[] = {50, 51};
|
|||
static const int usb2_muxvals[] = {0, 0};
|
||||
static const unsigned usb3_pins[] = {52, 53};
|
||||
static const int usb3_muxvals[] = {0, 0};
|
||||
static const unsigned port_range_pins[] = {
|
||||
static const unsigned port_range0_pins[] = {
|
||||
168, 169, 170, 171, 172, 173, 174, 175, /* PORT0x */
|
||||
0, 1, 2, 3, 4, 5, 6, 7, /* PORT1x */
|
||||
8, 9, 10, 11, 12, 13, 14, 15, /* PORT2x */
|
||||
|
|
@ -609,23 +609,8 @@ static const unsigned port_range_pins[] = {
|
|||
75, 76, 77, 78, 79, 80, 81, 82, /* PORT8x */
|
||||
83, 84, 85, 86, 87, 88, 89, 90, /* PORT9x */
|
||||
91, 92, 93, 94, 95, 96, 97, 98, /* PORT10x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT11x */
|
||||
99, 100, 101, 102, 103, 104, 105, 106, /* PORT12x */
|
||||
107, 108, 109, 110, 111, 112, 113, 114, /* PORT13x */
|
||||
115, 116, 117, 118, 119, 120, 121, 122, /* PORT14x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT15x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT16x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT17x */
|
||||
61, 62, 63, 64, 65, 66, 67, 68, /* PORT18x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT19x */
|
||||
123, 124, 125, 126, 127, 128, 129, 130, /* PORT20x */
|
||||
131, 132, 133, 134, 135, 136, 137, 138, /* PORT21x */
|
||||
139, 140, 141, 142, 143, 144, 145, 146, /* PORT22x */
|
||||
147, 148, 149, 150, 151, 152, 153, 154, /* PORT23x */
|
||||
155, 156, 157, 158, 159, 160, 161, 162, /* PORT24x */
|
||||
163, 164, 165, 166, 167, /* PORT25x */
|
||||
};
|
||||
static const int port_range_muxvals[] = {
|
||||
static const int port_range0_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT0x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT1x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT2x */
|
||||
|
|
@ -637,21 +622,38 @@ static const int port_range_muxvals[] = {
|
|||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT8x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT9x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT10x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT11x */
|
||||
};
|
||||
static const unsigned port_range1_pins[] = {
|
||||
99, 100, 101, 102, 103, 104, 105, 106, /* PORT12x */
|
||||
107, 108, 109, 110, 111, 112, 113, 114, /* PORT13x */
|
||||
115, 116, 117, 118, 119, 120, 121, 122, /* PORT14x */
|
||||
};
|
||||
static const int port_range1_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT12x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT13x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT14x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT15x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT16x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT17x */
|
||||
};
|
||||
static const unsigned port_range2_pins[] = {
|
||||
61, 62, 63, 64, 65, 66, 67, 68, /* PORT18x */
|
||||
};
|
||||
static const int port_range2_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT18x */
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, /* PORT19x */
|
||||
};
|
||||
static const unsigned port_range3_pins[] = {
|
||||
123, 124, 125, 126, 127, 128, 129, 130, /* PORT20x */
|
||||
131, 132, 133, 134, 135, 136, 137, 138, /* PORT21x */
|
||||
139, 140, 141, 142, 143, 144, 145, 146, /* PORT22x */
|
||||
147, 148, 149, 150, 151, 152, 153, 154, /* PORT23x */
|
||||
155, 156, 157, 158, 159, 160, 161, 162, /* PORT24x */
|
||||
163, 164, 165, 166, 167, /* PORT250-254 */
|
||||
};
|
||||
static const int port_range3_muxvals[] = {
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT20x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT21x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT22x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT23x */
|
||||
15, 15, 15, 15, 15, 15, 15, 15, /* PORT24x */
|
||||
15, 15, 15, 15, 15, /* PORT25x */
|
||||
15, 15, 15, 15, 15, /* PORT250-254 */
|
||||
};
|
||||
static const unsigned xirq_pins[] = {
|
||||
149, 150, 151, 152, 153, 154, 155, 156, /* XIRQ0-7 */
|
||||
|
|
@ -695,174 +697,177 @@ static const struct uniphier_pinctrl_group uniphier_ld20_groups[] = {
|
|||
UNIPHIER_PINCTRL_GROUP(usb1),
|
||||
UNIPHIER_PINCTRL_GROUP(usb2),
|
||||
UNIPHIER_PINCTRL_GROUP(usb3),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range0),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range1),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range2),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_PORT(port_range3),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ(xirq),
|
||||
UNIPHIER_PINCTRL_GROUP_GPIO_RANGE_IRQ(xirq_alternatives),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port00, port_range, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port01, port_range, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port02, port_range, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port03, port_range, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port04, port_range, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port05, port_range, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port06, port_range, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port07, port_range, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port10, port_range, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port11, port_range, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port12, port_range, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port13, port_range, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port14, port_range, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port15, port_range, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port16, port_range, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port17, port_range, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port20, port_range, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port21, port_range, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port22, port_range, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port23, port_range, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port24, port_range, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port25, port_range, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port26, port_range, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port27, port_range, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port30, port_range, 24),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port31, port_range, 25),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port32, port_range, 26),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port33, port_range, 27),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port34, port_range, 28),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port35, port_range, 29),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port36, port_range, 30),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port37, port_range, 31),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port40, port_range, 32),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port41, port_range, 33),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port42, port_range, 34),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port43, port_range, 35),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port44, port_range, 36),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port45, port_range, 37),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port46, port_range, 38),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port47, port_range, 39),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port50, port_range, 40),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port51, port_range, 41),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port52, port_range, 42),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port53, port_range, 43),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port54, port_range, 44),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port55, port_range, 45),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port56, port_range, 46),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port57, port_range, 47),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port60, port_range, 48),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port61, port_range, 49),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port62, port_range, 50),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port63, port_range, 51),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port64, port_range, 52),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port65, port_range, 53),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port66, port_range, 54),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port67, port_range, 55),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port70, port_range, 56),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port71, port_range, 57),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port72, port_range, 58),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port73, port_range, 59),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port74, port_range, 60),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port75, port_range, 61),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port76, port_range, 62),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port77, port_range, 63),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port80, port_range, 64),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port81, port_range, 65),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port82, port_range, 66),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port83, port_range, 67),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port84, port_range, 68),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port85, port_range, 69),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port86, port_range, 70),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port87, port_range, 71),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port90, port_range, 72),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port91, port_range, 73),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port92, port_range, 74),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port93, port_range, 75),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port94, port_range, 76),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port95, port_range, 77),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port96, port_range, 78),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port97, port_range, 79),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port100, port_range, 80),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port101, port_range, 81),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port102, port_range, 82),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port103, port_range, 83),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port104, port_range, 84),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port105, port_range, 85),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port106, port_range, 86),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port107, port_range, 87),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port120, port_range, 96),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port121, port_range, 97),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port122, port_range, 98),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port123, port_range, 99),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port124, port_range, 100),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port125, port_range, 101),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port126, port_range, 102),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port127, port_range, 103),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port130, port_range, 104),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port131, port_range, 105),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port132, port_range, 106),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port133, port_range, 107),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port134, port_range, 108),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port135, port_range, 109),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port136, port_range, 110),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port137, port_range, 111),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port140, port_range, 112),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port141, port_range, 113),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port142, port_range, 114),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port143, port_range, 115),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port144, port_range, 116),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port145, port_range, 117),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port146, port_range, 118),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port147, port_range, 119),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port180, port_range, 144),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port181, port_range, 145),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port182, port_range, 146),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port183, port_range, 147),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port184, port_range, 148),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port185, port_range, 149),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port186, port_range, 150),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port187, port_range, 151),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port200, port_range, 160),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port201, port_range, 161),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port202, port_range, 162),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port203, port_range, 163),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port204, port_range, 164),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port205, port_range, 165),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port206, port_range, 166),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port207, port_range, 167),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port210, port_range, 168),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port211, port_range, 169),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port212, port_range, 170),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port213, port_range, 171),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port214, port_range, 172),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port215, port_range, 173),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port216, port_range, 174),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port217, port_range, 175),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port220, port_range, 176),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port221, port_range, 177),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port222, port_range, 178),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port223, port_range, 179),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port224, port_range, 180),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port225, port_range, 181),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port226, port_range, 182),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port227, port_range, 183),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port230, port_range, 184),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port231, port_range, 185),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port232, port_range, 186),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port233, port_range, 187),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port234, port_range, 188),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port235, port_range, 189),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port236, port_range, 190),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port237, port_range, 191),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port240, port_range, 192),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port241, port_range, 193),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port242, port_range, 194),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port243, port_range, 195),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port244, port_range, 196),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port245, port_range, 197),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port246, port_range, 198),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port247, port_range, 199),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port250, port_range, 200),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port251, port_range, 201),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port252, port_range, 202),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port253, port_range, 203),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port254, port_range, 204),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port00, port_range0, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port01, port_range0, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port02, port_range0, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port03, port_range0, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port04, port_range0, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port05, port_range0, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port06, port_range0, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port07, port_range0, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port10, port_range0, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port11, port_range0, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port12, port_range0, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port13, port_range0, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port14, port_range0, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port15, port_range0, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port16, port_range0, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port17, port_range0, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port20, port_range0, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port21, port_range0, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port22, port_range0, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port23, port_range0, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port24, port_range0, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port25, port_range0, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port26, port_range0, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port27, port_range0, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port30, port_range0, 24),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port31, port_range0, 25),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port32, port_range0, 26),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port33, port_range0, 27),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port34, port_range0, 28),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port35, port_range0, 29),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port36, port_range0, 30),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port37, port_range0, 31),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port40, port_range0, 32),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port41, port_range0, 33),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port42, port_range0, 34),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port43, port_range0, 35),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port44, port_range0, 36),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port45, port_range0, 37),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port46, port_range0, 38),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port47, port_range0, 39),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port50, port_range0, 40),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port51, port_range0, 41),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port52, port_range0, 42),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port53, port_range0, 43),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port54, port_range0, 44),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port55, port_range0, 45),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port56, port_range0, 46),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port57, port_range0, 47),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port60, port_range0, 48),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port61, port_range0, 49),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port62, port_range0, 50),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port63, port_range0, 51),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port64, port_range0, 52),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port65, port_range0, 53),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port66, port_range0, 54),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port67, port_range0, 55),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port70, port_range0, 56),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port71, port_range0, 57),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port72, port_range0, 58),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port73, port_range0, 59),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port74, port_range0, 60),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port75, port_range0, 61),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port76, port_range0, 62),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port77, port_range0, 63),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port80, port_range0, 64),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port81, port_range0, 65),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port82, port_range0, 66),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port83, port_range0, 67),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port84, port_range0, 68),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port85, port_range0, 69),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port86, port_range0, 70),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port87, port_range0, 71),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port90, port_range0, 72),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port91, port_range0, 73),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port92, port_range0, 74),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port93, port_range0, 75),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port94, port_range0, 76),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port95, port_range0, 77),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port96, port_range0, 78),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port97, port_range0, 79),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port100, port_range0, 80),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port101, port_range0, 81),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port102, port_range0, 82),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port103, port_range0, 83),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port104, port_range0, 84),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port105, port_range0, 85),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port106, port_range0, 86),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port107, port_range0, 87),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port120, port_range1, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port121, port_range1, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port122, port_range1, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port123, port_range1, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port124, port_range1, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port125, port_range1, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port126, port_range1, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port127, port_range1, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port130, port_range1, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port131, port_range1, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port132, port_range1, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port133, port_range1, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port134, port_range1, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port135, port_range1, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port136, port_range1, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port137, port_range1, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port140, port_range1, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port141, port_range1, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port142, port_range1, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port143, port_range1, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port144, port_range1, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port145, port_range1, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port146, port_range1, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port147, port_range1, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port180, port_range2, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port181, port_range2, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port182, port_range2, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port183, port_range2, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port184, port_range2, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port185, port_range2, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port186, port_range2, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port187, port_range2, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port200, port_range3, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port201, port_range3, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port202, port_range3, 2),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port203, port_range3, 3),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port204, port_range3, 4),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port205, port_range3, 5),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port206, port_range3, 6),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port207, port_range3, 7),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port210, port_range3, 8),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port211, port_range3, 9),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port212, port_range3, 10),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port213, port_range3, 11),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port214, port_range3, 12),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port215, port_range3, 13),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port216, port_range3, 14),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port217, port_range3, 15),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port220, port_range3, 16),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port221, port_range3, 17),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port222, port_range3, 18),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port223, port_range3, 19),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port224, port_range3, 20),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port225, port_range3, 21),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port226, port_range3, 22),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port227, port_range3, 23),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port230, port_range3, 24),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port231, port_range3, 25),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port232, port_range3, 26),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port233, port_range3, 27),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port234, port_range3, 28),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port235, port_range3, 29),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port236, port_range3, 30),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port237, port_range3, 31),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port240, port_range3, 32),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port241, port_range3, 33),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port242, port_range3, 34),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port243, port_range3, 35),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port244, port_range3, 36),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port245, port_range3, 37),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port246, port_range3, 38),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port247, port_range3, 39),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port250, port_range3, 40),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port251, port_range3, 41),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port252, port_range3, 42),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port253, port_range3, 43),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(port254, port_range3, 44),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(xirq0, xirq, 0),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(xirq1, xirq, 1),
|
||||
UNIPHIER_PINCTRL_GROUP_SINGLE(xirq2, xirq, 2),
|
||||
|
|
|
|||
13
drivers/pinctrl/zte/Kconfig
Normal file
13
drivers/pinctrl/zte/Kconfig
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
config PINCTRL_ZX
|
||||
bool
|
||||
select PINMUX
|
||||
select GENERIC_PINCONF
|
||||
select GENERIC_PINCTRL_GROUPS
|
||||
select GENERIC_PINMUX_FUNCTIONS
|
||||
|
||||
config PINCTRL_ZX296718
|
||||
bool "ZTE ZX296718 pinctrl driver"
|
||||
depends on OF && ARCH_ZX
|
||||
select PINCTRL_ZX
|
||||
help
|
||||
Say Y here to enable the ZX296718 pinctrl driver
|
||||
2
drivers/pinctrl/zte/Makefile
Normal file
2
drivers/pinctrl/zte/Makefile
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
obj-$(CONFIG_PINCTRL_ZX) += pinctrl-zx.o
|
||||
obj-$(CONFIG_PINCTRL_ZX296718) += pinctrl-zx296718.o
|
||||
445
drivers/pinctrl/zte/pinctrl-zx.c
Normal file
445
drivers/pinctrl/zte/pinctrl-zx.c
Normal file
|
|
@ -0,0 +1,445 @@
|
|||
/*
|
||||
* Copyright (C) 2017 Sanechips Technology Co., Ltd.
|
||||
* Copyright 2017 Linaro Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "../core.h"
|
||||
#include "../pinctrl-utils.h"
|
||||
#include "../pinmux.h"
|
||||
#include "pinctrl-zx.h"
|
||||
|
||||
#define ZX_PULL_DOWN BIT(0)
|
||||
#define ZX_PULL_UP BIT(1)
|
||||
#define ZX_INPUT_ENABLE BIT(3)
|
||||
#define ZX_DS_SHIFT 4
|
||||
#define ZX_DS_MASK (0x7 << ZX_DS_SHIFT)
|
||||
#define ZX_DS_VALUE(x) (((x) << ZX_DS_SHIFT) & ZX_DS_MASK)
|
||||
#define ZX_SLEW BIT(8)
|
||||
|
||||
struct zx_pinctrl {
|
||||
struct pinctrl_dev *pctldev;
|
||||
struct device *dev;
|
||||
void __iomem *base;
|
||||
void __iomem *aux_base;
|
||||
spinlock_t lock;
|
||||
struct zx_pinctrl_soc_info *info;
|
||||
};
|
||||
|
||||
static int zx_dt_node_to_map(struct pinctrl_dev *pctldev,
|
||||
struct device_node *np_config,
|
||||
struct pinctrl_map **map, u32 *num_maps)
|
||||
{
|
||||
return pinconf_generic_dt_node_to_map(pctldev, np_config, map,
|
||||
num_maps, PIN_MAP_TYPE_INVALID);
|
||||
}
|
||||
|
||||
static const struct pinctrl_ops zx_pinctrl_ops = {
|
||||
.dt_node_to_map = zx_dt_node_to_map,
|
||||
.dt_free_map = pinctrl_utils_free_map,
|
||||
.get_groups_count = pinctrl_generic_get_group_count,
|
||||
.get_group_name = pinctrl_generic_get_group_name,
|
||||
.get_group_pins = pinctrl_generic_get_group_pins,
|
||||
};
|
||||
|
||||
#define NONAON_MVAL 2
|
||||
|
||||
static int zx_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
|
||||
unsigned int group_selector)
|
||||
{
|
||||
struct zx_pinctrl *zpctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct zx_pinctrl_soc_info *info = zpctl->info;
|
||||
const struct pinctrl_pin_desc *pindesc = info->pins + group_selector;
|
||||
struct zx_pin_data *data = pindesc->drv_data;
|
||||
struct zx_mux_desc *mux = data->muxes;
|
||||
u32 mask = (1 << data->width) - 1;
|
||||
u32 offset = data->offset;
|
||||
u32 bitpos = data->bitpos;
|
||||
struct function_desc *func;
|
||||
unsigned long flags;
|
||||
u32 val, mval;
|
||||
|
||||
/* Skip reserved pin */
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
func = pinmux_generic_get_function(pctldev, func_selector);
|
||||
if (!func)
|
||||
return -EINVAL;
|
||||
|
||||
while (mux->name) {
|
||||
if (strcmp(mux->name, func->name) == 0)
|
||||
break;
|
||||
mux++;
|
||||
}
|
||||
|
||||
/* Found mux value to be written */
|
||||
mval = mux->muxval;
|
||||
|
||||
spin_lock_irqsave(&zpctl->lock, flags);
|
||||
|
||||
if (data->aon_pin) {
|
||||
/*
|
||||
* It's an AON pin, whose mux register offset and bit position
|
||||
* can be caluculated from pin number. Each register covers 16
|
||||
* pins, and each pin occupies 2 bits.
|
||||
*/
|
||||
u16 aoffset = pindesc->number / 16 * 4;
|
||||
u16 abitpos = (pindesc->number % 16) * 2;
|
||||
|
||||
if (mval & AON_MUX_FLAG) {
|
||||
/*
|
||||
* This is a mux value that needs to be written into
|
||||
* AON pinmux register. Write it and then we're done.
|
||||
*/
|
||||
val = readl(zpctl->aux_base + aoffset);
|
||||
val &= ~(0x3 << abitpos);
|
||||
val |= (mval & 0x3) << abitpos;
|
||||
writel(val, zpctl->aux_base + aoffset);
|
||||
} else {
|
||||
/*
|
||||
* It's a mux value that needs to be written into TOP
|
||||
* pinmux register.
|
||||
*/
|
||||
val = readl(zpctl->base + offset);
|
||||
val &= ~(mask << bitpos);
|
||||
val |= (mval & mask) << bitpos;
|
||||
writel(val, zpctl->base + offset);
|
||||
|
||||
/*
|
||||
* In this case, the AON pinmux register needs to be
|
||||
* set up to select non-AON function.
|
||||
*/
|
||||
val = readl(zpctl->aux_base + aoffset);
|
||||
val &= ~(0x3 << abitpos);
|
||||
val |= NONAON_MVAL << abitpos;
|
||||
writel(val, zpctl->aux_base + aoffset);
|
||||
}
|
||||
|
||||
} else {
|
||||
/*
|
||||
* This is a TOP pin, and we only need to set up TOP pinmux
|
||||
* register and then we're done with it.
|
||||
*/
|
||||
val = readl(zpctl->base + offset);
|
||||
val &= ~(mask << bitpos);
|
||||
val |= (mval & mask) << bitpos;
|
||||
writel(val, zpctl->base + offset);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&zpctl->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pinmux_ops zx_pinmux_ops = {
|
||||
.get_functions_count = pinmux_generic_get_function_count,
|
||||
.get_function_name = pinmux_generic_get_function_name,
|
||||
.get_function_groups = pinmux_generic_get_function_groups,
|
||||
.set_mux = zx_set_mux,
|
||||
};
|
||||
|
||||
static int zx_pin_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||
unsigned long *config)
|
||||
{
|
||||
struct zx_pinctrl *zpctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct zx_pinctrl_soc_info *info = zpctl->info;
|
||||
const struct pinctrl_pin_desc *pindesc = info->pins + pin;
|
||||
struct zx_pin_data *data = pindesc->drv_data;
|
||||
enum pin_config_param param = pinconf_to_config_param(*config);
|
||||
u32 val;
|
||||
|
||||
/* Skip reserved pin */
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
val = readl(zpctl->aux_base + data->coffset);
|
||||
val = val >> data->cbitpos;
|
||||
|
||||
switch (param) {
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
val &= ZX_PULL_DOWN;
|
||||
val = !!val;
|
||||
if (val == 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
val &= ZX_PULL_UP;
|
||||
val = !!val;
|
||||
if (val == 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case PIN_CONFIG_INPUT_ENABLE:
|
||||
val &= ZX_INPUT_ENABLE;
|
||||
val = !!val;
|
||||
if (val == 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case PIN_CONFIG_DRIVE_STRENGTH:
|
||||
val &= ZX_DS_MASK;
|
||||
val = val >> ZX_DS_SHIFT;
|
||||
break;
|
||||
case PIN_CONFIG_SLEW_RATE:
|
||||
val &= ZX_SLEW;
|
||||
val = !!val;
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
*config = pinconf_to_config_packed(param, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int zx_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||
unsigned long *configs, unsigned int num_configs)
|
||||
{
|
||||
struct zx_pinctrl *zpctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct zx_pinctrl_soc_info *info = zpctl->info;
|
||||
const struct pinctrl_pin_desc *pindesc = info->pins + pin;
|
||||
struct zx_pin_data *data = pindesc->drv_data;
|
||||
enum pin_config_param param;
|
||||
u32 val, arg;
|
||||
int i;
|
||||
|
||||
/* Skip reserved pin */
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
val = readl(zpctl->aux_base + data->coffset);
|
||||
|
||||
for (i = 0; i < num_configs; i++) {
|
||||
param = pinconf_to_config_param(configs[i]);
|
||||
arg = pinconf_to_config_argument(configs[i]);
|
||||
|
||||
switch (param) {
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
val |= ZX_PULL_DOWN << data->cbitpos;
|
||||
break;
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
val |= ZX_PULL_UP << data->cbitpos;
|
||||
break;
|
||||
case PIN_CONFIG_INPUT_ENABLE:
|
||||
val |= ZX_INPUT_ENABLE << data->cbitpos;
|
||||
break;
|
||||
case PIN_CONFIG_DRIVE_STRENGTH:
|
||||
val &= ~(ZX_DS_MASK << data->cbitpos);
|
||||
val |= ZX_DS_VALUE(arg) << data->cbitpos;
|
||||
break;
|
||||
case PIN_CONFIG_SLEW_RATE:
|
||||
if (arg)
|
||||
val |= ZX_SLEW << data->cbitpos;
|
||||
else
|
||||
val &= ~ZX_SLEW << data->cbitpos;
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
writel(val, zpctl->aux_base + data->coffset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pinconf_ops zx_pinconf_ops = {
|
||||
.pin_config_set = zx_pin_config_set,
|
||||
.pin_config_get = zx_pin_config_get,
|
||||
.is_generic = true,
|
||||
};
|
||||
|
||||
static int zx_pinctrl_build_state(struct platform_device *pdev)
|
||||
{
|
||||
struct zx_pinctrl *zpctl = platform_get_drvdata(pdev);
|
||||
struct zx_pinctrl_soc_info *info = zpctl->info;
|
||||
struct pinctrl_dev *pctldev = zpctl->pctldev;
|
||||
struct function_desc *functions;
|
||||
int nfunctions;
|
||||
struct group_desc *groups;
|
||||
int ngroups;
|
||||
int i;
|
||||
|
||||
/* Every single pin composes a group */
|
||||
ngroups = info->npins;
|
||||
groups = devm_kzalloc(&pdev->dev, ngroups * sizeof(*groups),
|
||||
GFP_KERNEL);
|
||||
if (!groups)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ngroups; i++) {
|
||||
const struct pinctrl_pin_desc *pindesc = info->pins + i;
|
||||
struct group_desc *group = groups + i;
|
||||
|
||||
group->name = pindesc->name;
|
||||
group->pins = (int *) &pindesc->number;
|
||||
group->num_pins = 1;
|
||||
radix_tree_insert(&pctldev->pin_group_tree, i, group);
|
||||
}
|
||||
|
||||
pctldev->num_groups = ngroups;
|
||||
|
||||
/* Build function list from pin mux functions */
|
||||
functions = devm_kzalloc(&pdev->dev, info->npins * sizeof(*functions),
|
||||
GFP_KERNEL);
|
||||
if (!functions)
|
||||
return -ENOMEM;
|
||||
|
||||
nfunctions = 0;
|
||||
for (i = 0; i < info->npins; i++) {
|
||||
const struct pinctrl_pin_desc *pindesc = info->pins + i;
|
||||
struct zx_pin_data *data = pindesc->drv_data;
|
||||
struct zx_mux_desc *mux;
|
||||
|
||||
/* Reserved pins do not have a drv_data at all */
|
||||
if (!data)
|
||||
continue;
|
||||
|
||||
/* Loop over all muxes for the pin */
|
||||
mux = data->muxes;
|
||||
while (mux->name) {
|
||||
struct function_desc *func = functions;
|
||||
|
||||
/* Search function list for given mux */
|
||||
while (func->name) {
|
||||
if (strcmp(mux->name, func->name) == 0) {
|
||||
/* Function exists */
|
||||
func->num_group_names++;
|
||||
break;
|
||||
}
|
||||
func++;
|
||||
}
|
||||
|
||||
if (!func->name) {
|
||||
/* New function */
|
||||
func->name = mux->name;
|
||||
func->num_group_names = 1;
|
||||
radix_tree_insert(&pctldev->pin_function_tree,
|
||||
nfunctions++, func);
|
||||
}
|
||||
|
||||
mux++;
|
||||
}
|
||||
}
|
||||
|
||||
pctldev->num_functions = nfunctions;
|
||||
functions = krealloc(functions, nfunctions * sizeof(*functions),
|
||||
GFP_KERNEL);
|
||||
|
||||
/* Find pin groups for every single function */
|
||||
for (i = 0; i < info->npins; i++) {
|
||||
const struct pinctrl_pin_desc *pindesc = info->pins + i;
|
||||
struct zx_pin_data *data = pindesc->drv_data;
|
||||
struct zx_mux_desc *mux;
|
||||
|
||||
if (!data)
|
||||
continue;
|
||||
|
||||
mux = data->muxes;
|
||||
while (mux->name) {
|
||||
struct function_desc *func;
|
||||
const char **group;
|
||||
int j;
|
||||
|
||||
/* Find function for given mux */
|
||||
for (j = 0; j < nfunctions; j++)
|
||||
if (strcmp(functions[j].name, mux->name) == 0)
|
||||
break;
|
||||
|
||||
func = functions + j;
|
||||
if (!func->group_names) {
|
||||
func->group_names = devm_kzalloc(&pdev->dev,
|
||||
func->num_group_names *
|
||||
sizeof(*func->group_names),
|
||||
GFP_KERNEL);
|
||||
if (!func->group_names)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
group = func->group_names;
|
||||
while (*group)
|
||||
group++;
|
||||
*group = pindesc->name;
|
||||
|
||||
mux++;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int zx_pinctrl_init(struct platform_device *pdev,
|
||||
struct zx_pinctrl_soc_info *info)
|
||||
{
|
||||
struct pinctrl_desc *pctldesc;
|
||||
struct zx_pinctrl *zpctl;
|
||||
struct device_node *np;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
zpctl = devm_kzalloc(&pdev->dev, sizeof(*zpctl), GFP_KERNEL);
|
||||
if (!zpctl)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&zpctl->lock);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
zpctl->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(zpctl->base))
|
||||
return PTR_ERR(zpctl->base);
|
||||
|
||||
np = of_parse_phandle(pdev->dev.of_node, "zte,auxiliary-controller", 0);
|
||||
if (!np) {
|
||||
dev_err(&pdev->dev, "failed to find auxiliary controller\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
zpctl->aux_base = of_iomap(np, 0);
|
||||
if (!zpctl->aux_base)
|
||||
return -ENOMEM;
|
||||
|
||||
zpctl->dev = &pdev->dev;
|
||||
zpctl->info = info;
|
||||
|
||||
pctldesc = devm_kzalloc(&pdev->dev, sizeof(*pctldesc), GFP_KERNEL);
|
||||
if (!pctldesc)
|
||||
return -ENOMEM;
|
||||
|
||||
pctldesc->name = dev_name(&pdev->dev);
|
||||
pctldesc->owner = THIS_MODULE;
|
||||
pctldesc->pins = info->pins;
|
||||
pctldesc->npins = info->npins;
|
||||
pctldesc->pctlops = &zx_pinctrl_ops;
|
||||
pctldesc->pmxops = &zx_pinmux_ops;
|
||||
pctldesc->confops = &zx_pinconf_ops;
|
||||
|
||||
zpctl->pctldev = devm_pinctrl_register(&pdev->dev, pctldesc, zpctl);
|
||||
if (IS_ERR(zpctl->pctldev)) {
|
||||
ret = PTR_ERR(zpctl->pctldev);
|
||||
dev_err(&pdev->dev, "failed to register pinctrl: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, zpctl);
|
||||
|
||||
ret = zx_pinctrl_build_state(pdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to build state: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "initialized pinctrl driver\n");
|
||||
return 0;
|
||||
}
|
||||
105
drivers/pinctrl/zte/pinctrl-zx.h
Normal file
105
drivers/pinctrl/zte/pinctrl-zx.h
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* Copyright (C) 2017 Sanechips Technology Co., Ltd.
|
||||
* Copyright 2017 Linaro Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __PINCTRL_ZX_H
|
||||
#define __PINCTRL_ZX_H
|
||||
|
||||
/**
|
||||
* struct zx_mux_desc - hardware mux descriptor
|
||||
* @name: mux function name
|
||||
* @muxval: mux register bit value
|
||||
*/
|
||||
struct zx_mux_desc {
|
||||
const char *name;
|
||||
u8 muxval;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct zx_pin_data - hardware per-pin data
|
||||
* @aon_pin: whether it's an AON pin
|
||||
* @offset: register offset within TOP pinmux controller
|
||||
* @bitpos: bit position within TOP pinmux register
|
||||
* @width: bit width within TOP pinmux register
|
||||
* @coffset: pinconf register offset within AON controller
|
||||
* @cbitpos: pinconf bit position within AON register
|
||||
* @muxes: available mux function names and corresponding register values
|
||||
*
|
||||
* Unlike TOP pinmux and AON pinconf registers which are arranged pretty
|
||||
* arbitrarily, AON pinmux register bits are well organized per pin id, and
|
||||
* each pin occupies two bits, so that we can calculate the AON register offset
|
||||
* and bit position from pin id. Thus, we only need to define TOP pinmux and
|
||||
* AON pinconf register data for the pin.
|
||||
*/
|
||||
struct zx_pin_data {
|
||||
bool aon_pin;
|
||||
u16 offset;
|
||||
u16 bitpos;
|
||||
u16 width;
|
||||
u16 coffset;
|
||||
u16 cbitpos;
|
||||
struct zx_mux_desc *muxes;
|
||||
};
|
||||
|
||||
struct zx_pinctrl_soc_info {
|
||||
const struct pinctrl_pin_desc *pins;
|
||||
unsigned int npins;
|
||||
};
|
||||
|
||||
#define TOP_PIN(pin, off, bp, wd, coff, cbp, ...) { \
|
||||
.number = pin, \
|
||||
.name = #pin, \
|
||||
.drv_data = &(struct zx_pin_data) { \
|
||||
.aon_pin = false, \
|
||||
.offset = off, \
|
||||
.bitpos = bp, \
|
||||
.width = wd, \
|
||||
.coffset = coff, \
|
||||
.cbitpos = cbp, \
|
||||
.muxes = (struct zx_mux_desc[]) { \
|
||||
__VA_ARGS__, { } }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define AON_PIN(pin, off, bp, wd, coff, cbp, ...) { \
|
||||
.number = pin, \
|
||||
.name = #pin, \
|
||||
.drv_data = &(struct zx_pin_data) { \
|
||||
.aon_pin = true, \
|
||||
.offset = off, \
|
||||
.bitpos = bp, \
|
||||
.width = wd, \
|
||||
.coffset = coff, \
|
||||
.cbitpos = cbp, \
|
||||
.muxes = (struct zx_mux_desc[]) { \
|
||||
__VA_ARGS__, { } }, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define ZX_RESERVED(pin) PINCTRL_PIN(pin, #pin)
|
||||
|
||||
#define TOP_MUX(_val, _name) { \
|
||||
.name = _name, \
|
||||
.muxval = _val, \
|
||||
}
|
||||
|
||||
/*
|
||||
* When the flag is set, it's a mux configuration for an AON pin that sits in
|
||||
* AON register. Otherwise, it's one for AON pin but sitting in TOP register.
|
||||
*/
|
||||
#define AON_MUX_FLAG BIT(7)
|
||||
|
||||
#define AON_MUX(_val, _name) { \
|
||||
.name = _name, \
|
||||
.muxval = _val | AON_MUX_FLAG, \
|
||||
}
|
||||
|
||||
int zx_pinctrl_init(struct platform_device *pdev,
|
||||
struct zx_pinctrl_soc_info *info);
|
||||
|
||||
#endif /* __PINCTRL_ZX_H */
|
||||
1027
drivers/pinctrl/zte/pinctrl-zx296718.c
Normal file
1027
drivers/pinctrl/zte/pinctrl-zx296718.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue