diff options
Diffstat (limited to 'drivers/pinctrl')
119 files changed, 31376 insertions, 9517 deletions
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index b6e864e8c9e..0042ccb46b9 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig @@ -49,12 +49,44 @@ config PINCTRL_AB8505  	bool "AB8505 pin controller driver"  	depends on PINCTRL_ABX500 && ARCH_U8500 +config PINCTRL_ADI2 +	bool "ADI pin controller driver" +	depends on BLACKFIN +	select PINMUX +	select IRQ_DOMAIN +	help +	  This is the pin controller and gpio driver for ADI BF54x, BF60x and +	  future processors. This option is selected automatically when specific +	  machine and arch are selected to build. + +config PINCTRL_AS3722 +	bool "Pinctrl and GPIO driver for ams AS3722 PMIC" +	depends on MFD_AS3722 && GPIOLIB +	select PINMUX +	select GENERIC_PINCONF +	help +	  AS3722 device supports the configuration of GPIO pins for different +	  functionality. This driver supports the pinmux, push-pull and +	  open drain configuration for the GPIO pins of AS3722 devices. It also +	  supports the GPIO functionality through gpiolib. + +config PINCTRL_BF54x +	def_bool y if BF54x +	select PINCTRL_ADI2 + +config PINCTRL_BF60x +	def_bool y if BF60x +	select PINCTRL_ADI2 +  config PINCTRL_AT91  	bool "AT91 pinctrl driver"  	depends on OF  	depends on ARCH_AT91  	select PINMUX  	select PINCONF +	select GPIOLIB +	select OF_GPIO +	select GPIOLIB_IRQCHIP  	help  	  Say Y here to enable the at91 pinctrl driver @@ -75,22 +107,61 @@ config PINCTRL_BCM2835  	select PINMUX  	select PINCONF +config PINCTRL_BCM281XX +	bool "Broadcom BCM281xx pinctrl driver" +	depends on OF +	select PINMUX +	select PINCONF +	select GENERIC_PINCONF +	select REGMAP_MMIO +	help +	  Say Y here to support Broadcom BCM281xx pinctrl driver, which is used +	  for the BCM281xx SoC family, including BCM11130, BCM11140, BCM11351, +	  BCM28145, and BCM28155 SoCs.  This driver requires the pinctrl +	  framework.  GPIO is provided by a separate GPIO driver. +  config PINCTRL_IMX  	bool  	select PINMUX  	select PINCONF +config PINCTRL_IMX1_CORE +	bool +	select PINMUX +	select PINCONF + +config PINCTRL_IMX27 +	bool "IMX27 pinctrl driver" +	depends on SOC_IMX27 +	select PINCTRL_IMX1_CORE +	help +	  Say Y here to enable the imx27 pinctrl driver + + +config PINCTRL_IMX25 +        bool "IMX25 pinctrl driver" +        depends on OF +        depends on SOC_IMX25 +        select PINCTRL_IMX +        help +          Say Y here to enable the imx25 pinctrl driver +  config PINCTRL_IMX35  	bool "IMX35 pinctrl driver" -	depends on OF  	depends on SOC_IMX35  	select PINCTRL_IMX  	help  	  Say Y here to enable the imx35 pinctrl driver +config PINCTRL_IMX50 +	bool "IMX50 pinctrl driver" +	depends on SOC_IMX50 +	select PINCTRL_IMX +	help +	  Say Y here to enable the imx50 pinctrl driver +  config PINCTRL_IMX51  	bool "IMX51 pinctrl driver" -	depends on OF  	depends on SOC_IMX51  	select PINCTRL_IMX  	help @@ -98,7 +169,6 @@ config PINCTRL_IMX51  config PINCTRL_IMX53  	bool "IMX53 pinctrl driver" -	depends on OF  	depends on SOC_IMX53  	select PINCTRL_IMX  	help @@ -106,7 +176,6 @@ config PINCTRL_IMX53  config PINCTRL_IMX6Q  	bool "IMX6Q/DL pinctrl driver" -	depends on OF  	depends on SOC_IMX6Q  	select PINCTRL_IMX  	help @@ -114,15 +183,20 @@ config PINCTRL_IMX6Q  config PINCTRL_IMX6SL  	bool "IMX6SL pinctrl driver" -	depends on OF  	depends on SOC_IMX6SL  	select PINCTRL_IMX  	help  	  Say Y here to enable the imx6sl pinctrl driver +config PINCTRL_IMX6SX +	bool "IMX6SX pinctrl driver" +	depends on SOC_IMX6SX +	select PINCTRL_IMX +	help +	  Say Y here to enable the imx6sx pinctrl driver +  config PINCTRL_VF610  	bool "Freescale Vybrid VF610 pinctrl driver" -	depends on OF  	depends on SOC_VF610  	select PINCTRL_IMX  	help @@ -152,11 +226,45 @@ config PINCTRL_IMX28  	bool  	select PINCTRL_MXS +config PINCTRL_MSM +	bool +	select PINMUX +	select PINCONF +	select GENERIC_PINCONF +	select GPIOLIB_IRQCHIP + +config PINCTRL_APQ8064 +	tristate "Qualcomm APQ8064 pin controller driver" +	depends on GPIOLIB && OF +	select PINCTRL_MSM +	help +	  This is the pinctrl, pinmux, pinconf and gpiolib driver for the +	  Qualcomm TLMM block found in the Qualcomm APQ8064 platform. + +config PINCTRL_IPQ8064 +	tristate "Qualcomm IPQ8064 pin controller driver" +	depends on GPIOLIB && OF +	select PINCTRL_MSM +	help +	  This is the pinctrl, pinmux, pinconf and gpiolib driver for the +	  Qualcomm TLMM block found in the Qualcomm IPQ8064 platform. + +config PINCTRL_MSM8X74 +	tristate "Qualcomm 8x74 pin controller driver" +	depends on GPIOLIB && OF && (ARCH_QCOM || COMPILE_TEST) +	select PINCTRL_MSM +	help +	  This is the pinctrl, pinmux, pinconf and gpiolib driver for the +	  Qualcomm TLMM block found in the Qualcomm 8974 platform. +  config PINCTRL_NOMADIK  	bool "Nomadik pin controller driver"  	depends on ARCH_U8500 || ARCH_NOMADIK  	select PINMUX  	select PINCONF +	select GPIOLIB +	select OF_GPIO +	select GPIOLIB_IRQCHIP  config PINCTRL_STN8815  	bool "STN8815 pin controller driver" @@ -175,6 +283,7 @@ config PINCTRL_ROCKCHIP  	select PINMUX  	select GENERIC_PINCONF  	select GENERIC_IRQ_CHIP +	select MFD_SYSCON  config PINCTRL_SINGLE  	tristate "One-register-per-pin type device tree based pinctrl driver" @@ -189,17 +298,14 @@ config PINCTRL_SIRF  	bool "CSR SiRFprimaII/SiRFmarco pin controller driver"  	depends on ARCH_SIRF  	select PINMUX - -config PINCTRL_SUNXI -	bool -	select PINMUX -	select GENERIC_PINCONF +	select GPIOLIB_IRQCHIP  config PINCTRL_ST  	bool  	depends on OF  	select PINMUX  	select PINCONF +	select GPIOLIB_IRQCHIP  config PINCTRL_TEGRA  	bool @@ -218,6 +324,10 @@ config PINCTRL_TEGRA114  	bool  	select PINCTRL_TEGRA +config PINCTRL_TEGRA124 +	bool +	select PINCTRL_TEGRA +  config PINCTRL_TZ1090  	bool "Toumaz Xenif TZ1090 pin control driver"  	depends on SOC_TZ1090 @@ -239,6 +349,7 @@ config PINCTRL_U300  config PINCTRL_COH901  	bool "ST-Ericsson U300 COH 901 335/571 GPIO"  	depends on GPIOLIB && ARCH_U300 && PINCTRL_U300 +	select GPIOLIB_IRQCHIP  	help  	  Say yes here to support GPIO interface on ST-Ericsson U300.  	  The names of the two IP block variants supported are @@ -282,9 +393,11 @@ config PINCTRL_S3C64XX  	depends on ARCH_S3C64XX  	select PINCTRL_SAMSUNG +source "drivers/pinctrl/berlin/Kconfig"  source "drivers/pinctrl/mvebu/Kconfig"  source "drivers/pinctrl/sh-pfc/Kconfig"  source "drivers/pinctrl/spear/Kconfig" +source "drivers/pinctrl/sunxi/Kconfig"  source "drivers/pinctrl/vt8500/Kconfig"  config PINCTRL_XWAY @@ -292,6 +405,10 @@ config PINCTRL_XWAY  	depends on SOC_TYPE_XWAY  	depends on PINCTRL_LANTIQ +config PINCTRL_TB10X +	bool +	depends on ARC_PLAT_TB10X +  endmenu  endif diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index 496d9bf9e1b..c4b5d405b8f 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile @@ -14,20 +14,34 @@ obj-$(CONFIG_PINCTRL_AB8500)	+= pinctrl-ab8500.o  obj-$(CONFIG_PINCTRL_AB8540)	+= pinctrl-ab8540.o  obj-$(CONFIG_PINCTRL_AB9540)	+= pinctrl-ab9540.o  obj-$(CONFIG_PINCTRL_AB8505)	+= pinctrl-ab8505.o +obj-$(CONFIG_PINCTRL_ADI2)	+= pinctrl-adi2.o +obj-$(CONFIG_PINCTRL_AS3722)	+= pinctrl-as3722.o +obj-$(CONFIG_PINCTRL_BF54x)	+= pinctrl-adi2-bf54x.o +obj-$(CONFIG_PINCTRL_BF60x)	+= pinctrl-adi2-bf60x.o  obj-$(CONFIG_PINCTRL_AT91)	+= pinctrl-at91.o  obj-$(CONFIG_PINCTRL_BCM2835)	+= pinctrl-bcm2835.o  obj-$(CONFIG_PINCTRL_BAYTRAIL)	+= pinctrl-baytrail.o +obj-$(CONFIG_PINCTRL_BCM281XX)	+= pinctrl-bcm281xx.o  obj-$(CONFIG_PINCTRL_IMX)	+= pinctrl-imx.o +obj-$(CONFIG_PINCTRL_IMX1_CORE)	+= pinctrl-imx1-core.o +obj-$(CONFIG_PINCTRL_IMX27)	+= pinctrl-imx27.o  obj-$(CONFIG_PINCTRL_IMX35)	+= pinctrl-imx35.o +obj-$(CONFIG_PINCTRL_IMX50)	+= pinctrl-imx50.o  obj-$(CONFIG_PINCTRL_IMX51)	+= pinctrl-imx51.o  obj-$(CONFIG_PINCTRL_IMX53)	+= pinctrl-imx53.o  obj-$(CONFIG_PINCTRL_IMX6Q)	+= pinctrl-imx6q.o  obj-$(CONFIG_PINCTRL_IMX6Q)	+= pinctrl-imx6dl.o  obj-$(CONFIG_PINCTRL_IMX6SL)	+= pinctrl-imx6sl.o +obj-$(CONFIG_PINCTRL_IMX6SX)	+= pinctrl-imx6sx.o  obj-$(CONFIG_PINCTRL_FALCON)	+= pinctrl-falcon.o  obj-$(CONFIG_PINCTRL_MXS)	+= pinctrl-mxs.o  obj-$(CONFIG_PINCTRL_IMX23)	+= pinctrl-imx23.o +obj-$(CONFIG_PINCTRL_IMX25)	+= pinctrl-imx25.o  obj-$(CONFIG_PINCTRL_IMX28)	+= pinctrl-imx28.o +obj-$(CONFIG_PINCTRL_MSM)	+= pinctrl-msm.o +obj-$(CONFIG_PINCTRL_APQ8064)	+= pinctrl-apq8064.o +obj-$(CONFIG_PINCTRL_IPQ8064)	+= pinctrl-ipq8064.o +obj-$(CONFIG_PINCTRL_MSM8X74)	+= pinctrl-msm8x74.o  obj-$(CONFIG_PINCTRL_NOMADIK)	+= pinctrl-nomadik.o  obj-$(CONFIG_PINCTRL_STN8815)	+= pinctrl-nomadik-stn8815.o  obj-$(CONFIG_PINCTRL_DB8500)	+= pinctrl-nomadik-db8500.o @@ -36,11 +50,11 @@ obj-$(CONFIG_PINCTRL_PALMAS)	+= pinctrl-palmas.o  obj-$(CONFIG_PINCTRL_ROCKCHIP)	+= pinctrl-rockchip.o  obj-$(CONFIG_PINCTRL_SINGLE)	+= pinctrl-single.o  obj-$(CONFIG_PINCTRL_SIRF)	+= sirf/ -obj-$(CONFIG_PINCTRL_SUNXI)	+= pinctrl-sunxi.o  obj-$(CONFIG_PINCTRL_TEGRA)	+= pinctrl-tegra.o  obj-$(CONFIG_PINCTRL_TEGRA20)	+= pinctrl-tegra20.o  obj-$(CONFIG_PINCTRL_TEGRA30)	+= pinctrl-tegra30.o  obj-$(CONFIG_PINCTRL_TEGRA114)	+= pinctrl-tegra114.o +obj-$(CONFIG_PINCTRL_TEGRA124)	+= pinctrl-tegra124.o  obj-$(CONFIG_PINCTRL_TZ1090)	+= pinctrl-tz1090.o  obj-$(CONFIG_PINCTRL_TZ1090_PDC)	+= pinctrl-tz1090-pdc.o  obj-$(CONFIG_PINCTRL_U300)	+= pinctrl-u300.o @@ -52,11 +66,14 @@ obj-$(CONFIG_PINCTRL_S3C24XX)	+= pinctrl-s3c24xx.o  obj-$(CONFIG_PINCTRL_S3C64XX)	+= pinctrl-s3c64xx.o  obj-$(CONFIG_PINCTRL_XWAY)	+= pinctrl-xway.o  obj-$(CONFIG_PINCTRL_LANTIQ)	+= pinctrl-lantiq.o +obj-$(CONFIG_PINCTRL_TB10X)	+= pinctrl-tb10x.o  obj-$(CONFIG_PINCTRL_ST) 	+= pinctrl-st.o  obj-$(CONFIG_PINCTRL_VF610)	+= pinctrl-vf610.o +obj-$(CONFIG_ARCH_BERLIN)	+= berlin/  obj-$(CONFIG_PLAT_ORION)        += mvebu/  obj-$(CONFIG_ARCH_SHMOBILE)	+= sh-pfc/  obj-$(CONFIG_SUPERH)		+= sh-pfc/  obj-$(CONFIG_PLAT_SPEAR)	+= spear/  obj-$(CONFIG_ARCH_VT8500)	+= vt8500/ +obj-$(CONFIG_ARCH_SUNXI)	+= sunxi/ diff --git a/drivers/pinctrl/berlin/Kconfig b/drivers/pinctrl/berlin/Kconfig new file mode 100644 index 00000000000..b18322bc7bf --- /dev/null +++ b/drivers/pinctrl/berlin/Kconfig @@ -0,0 +1,20 @@ +if ARCH_BERLIN + +config PINCTRL_BERLIN +	bool +	select PINMUX +	select REGMAP_MMIO + +config PINCTRL_BERLIN_BG2 +	bool +	select PINCTRL_BERLIN + +config PINCTRL_BERLIN_BG2CD +	bool +	select PINCTRL_BERLIN + +config PINCTRL_BERLIN_BG2Q +	bool +	select PINCTRL_BERLIN + +endif diff --git a/drivers/pinctrl/berlin/Makefile b/drivers/pinctrl/berlin/Makefile new file mode 100644 index 00000000000..deb0c6baf31 --- /dev/null +++ b/drivers/pinctrl/berlin/Makefile @@ -0,0 +1,4 @@ +obj-$(CONFIG_PINCTRL_BERLIN)		+= berlin.o +obj-$(CONFIG_PINCTRL_BERLIN_BG2)	+= berlin-bg2.o +obj-$(CONFIG_PINCTRL_BERLIN_BG2CD)	+= berlin-bg2cd.o +obj-$(CONFIG_PINCTRL_BERLIN_BG2Q)	+= berlin-bg2q.o diff --git a/drivers/pinctrl/berlin/berlin-bg2.c b/drivers/pinctrl/berlin/berlin-bg2.c new file mode 100644 index 00000000000..dcd4f6a4fc5 --- /dev/null +++ b/drivers/pinctrl/berlin/berlin-bg2.c @@ -0,0 +1,274 @@ +/* + * Marvell Berlin BG2 pinctrl driver. + * + * Copyright (C) 2014 Marvell Technology Group Ltd. + * + * Antoine Ténart <antoine.tenart@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/module.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> + +#include "berlin.h" + +static const struct berlin_desc_group berlin2_soc_pinctrl_groups[] = { +	/* G */ +	BERLIN_PINCTRL_GROUP("G0", 0x00, 0x1, 0x00, +		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G1", 0x00, 0x2, 0x01, +		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "usb1")), +	BERLIN_PINCTRL_GROUP("G2", 0x00, 0x2, 0x02, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x2, "pwm"), +		BERLIN_PINCTRL_FUNCTION(0x3, "i2s0")), +	BERLIN_PINCTRL_GROUP("G3", 0x00, 0x2, 0x04, +		BERLIN_PINCTRL_FUNCTION(0x0, "soc"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x3, "i2s1")), +	BERLIN_PINCTRL_GROUP("G4", 0x00, 0x2, 0x06, +		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "pwm")), +	BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x08, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), +		BERLIN_PINCTRL_FUNCTION(0x2, "et"), +		/* +		 * Mode 0x3 mux i2s2 mclk *and* i2s3 mclk: +		 * add two functions so it can be used with other groups +		 * within the same subnode in the device tree +		 */ +		BERLIN_PINCTRL_FUNCTION(0x3, "i2s2"), +		BERLIN_PINCTRL_FUNCTION(0x3, "i2s3")), +	BERLIN_PINCTRL_GROUP("G6", 0x00, 0x2, 0x0b, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "et")), +	BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x0d, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "et"), +		BERLIN_PINCTRL_FUNCTION(0x3, "vdac")), +	BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x10, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "et"), +		BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x4, "sata_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x13, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "et"), +		BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x4, "sata_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x16, +		BERLIN_PINCTRL_FUNCTION(0x0, "soc"), +		BERLIN_PINCTRL_FUNCTION(0x1, "twsi0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x3, "ptp")), +	BERLIN_PINCTRL_GROUP("G11", 0x00, 0x2, 0x18, +		BERLIN_PINCTRL_FUNCTION(0x0, "soc"), +		BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"), +		BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x3, "eddc")), +	BERLIN_PINCTRL_GROUP("G12", 0x00, 0x3, 0x1a, +		BERLIN_PINCTRL_FUNCTION(0x0, "sts2"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sata"), +		BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), +		BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x00, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sata"), +		BERLIN_PINCTRL_FUNCTION(0x2, "sd1"), +		BERLIN_PINCTRL_FUNCTION(0x3, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x03, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G15", 0x04, 0x2, 0x04, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "et"), +		BERLIN_PINCTRL_FUNCTION(0x3, "osco")), +	BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x06, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "fp")), +	BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x09, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "fp")), +	BERLIN_PINCTRL_GROUP("G18", 0x04, 0x1, 0x0c, +		BERLIN_PINCTRL_FUNCTION(0x0, "pll"), +		BERLIN_PINCTRL_FUNCTION(0x1, "i2s0")), +	BERLIN_PINCTRL_GROUP("G19", 0x04, 0x1, 0x0d, +		BERLIN_PINCTRL_FUNCTION(0x0, "i2s0"), +		BERLIN_PINCTRL_FUNCTION(0x1, "pwm")), +	BERLIN_PINCTRL_GROUP("G20", 0x04, 0x1, 0x0e, +		BERLIN_PINCTRL_FUNCTION(0x0, "spdif"), +		BERLIN_PINCTRL_FUNCTION(0x1, "arc")), +	BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x0f, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +		BERLIN_PINCTRL_FUNCTION(0x3, "adac_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x4, "pdm_a"),	/* gpio17..19,pdm */ +		BERLIN_PINCTRL_FUNCTION(0x7, "pdm_b")),	/* gpio12..14,pdm */ +	BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x12, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "dv0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +		BERLIN_PINCTRL_FUNCTION(0x3, "twsi0"), +		BERLIN_PINCTRL_FUNCTION(0x4, "pwm")), +	BERLIN_PINCTRL_GROUP("G23", 0x04, 0x3, 0x15, +		BERLIN_PINCTRL_FUNCTION(0x0, "vclki"), +		BERLIN_PINCTRL_FUNCTION(0x1, "dv0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +		BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"), +		BERLIN_PINCTRL_FUNCTION(0x4, "pwm"), +		BERLIN_PINCTRL_FUNCTION(0x7, "pdm")), +	BERLIN_PINCTRL_GROUP("G24", 0x04, 0x2, 0x18, +		BERLIN_PINCTRL_FUNCTION(0x0, "i2s2"), +		BERLIN_PINCTRL_FUNCTION(0x1, "i2s1")), +	BERLIN_PINCTRL_GROUP("G25", 0x04, 0x2, 0x1a, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "nand"), +		BERLIN_PINCTRL_FUNCTION(0x2, "i2s2")), +	BERLIN_PINCTRL_GROUP("G26", 0x04, 0x1, 0x1c, +		BERLIN_PINCTRL_FUNCTION(0x0, "nand"), +		BERLIN_PINCTRL_FUNCTION(0x1, "emmc")), +	BERLIN_PINCTRL_GROUP("G27", 0x04, 0x1, 0x1d, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "nand")), +	BERLIN_PINCTRL_GROUP("G28", 0x04, 0x2, 0x1e, +		BERLIN_PINCTRL_FUNCTION(0x0, "dvo"), +		BERLIN_PINCTRL_FUNCTION(0x2, "sp")), +}; + +static const struct berlin_desc_group berlin2_sysmgr_pinctrl_groups[] = { +	/* GSM */ +	BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +		BERLIN_PINCTRL_FUNCTION(0x2, "eth1")), +	BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +		BERLIN_PINCTRL_FUNCTION(0x2, "eth1")), +	BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04, +		BERLIN_PINCTRL_FUNCTION(0x0, "twsi2"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi2")), +	BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "uart0"),	/* CTS/RTS */ +		BERLIN_PINCTRL_FUNCTION(0x2, "uart2"),	/* RX/TX */ +		BERLIN_PINCTRL_FUNCTION(0x3, "twsi2")), +	BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08, +		BERLIN_PINCTRL_FUNCTION(0x0, "uart0"),	/* RX/TX */ +		BERLIN_PINCTRL_FUNCTION(0x1, "irda0")), +	BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "uart1"),	/* RX/TX */ +		BERLIN_PINCTRL_FUNCTION(0x2, "irda1"), +		BERLIN_PINCTRL_FUNCTION(0x3, "twsi3")), +	BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +		BERLIN_PINCTRL_FUNCTION(0x1, "clki")), +	BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "led")), +	BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "led")), +	BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "led")), +}; + +static const struct berlin_pinctrl_desc berlin2_soc_pinctrl_data = { +	.groups = berlin2_soc_pinctrl_groups, +	.ngroups = ARRAY_SIZE(berlin2_soc_pinctrl_groups), +}; + +static const struct berlin_pinctrl_desc berlin2_sysmgr_pinctrl_data = { +	.groups = berlin2_sysmgr_pinctrl_groups, +	.ngroups = ARRAY_SIZE(berlin2_sysmgr_pinctrl_groups), +}; + +static const struct of_device_id berlin2_pinctrl_match[] = { +	{ +		.compatible = "marvell,berlin2-chip-ctrl", +		.data = &berlin2_soc_pinctrl_data +	}, +	{ +		.compatible = "marvell,berlin2-system-ctrl", +		.data = &berlin2_sysmgr_pinctrl_data +	}, +	{} +}; +MODULE_DEVICE_TABLE(of, berlin2_pinctrl_match); + +static int berlin2_pinctrl_probe(struct platform_device *pdev) +{ +	const struct of_device_id *match = +		of_match_device(berlin2_pinctrl_match, &pdev->dev); +	struct regmap_config *rmconfig; +	struct regmap *regmap; +	struct resource *res; +	void __iomem *base; + +	rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL); +	if (!rmconfig) +		return -ENOMEM; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(base)) +		return PTR_ERR(base); + +	rmconfig->reg_bits = 32, +	rmconfig->val_bits = 32, +	rmconfig->reg_stride = 4, +	rmconfig->max_register = resource_size(res); + +	regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig); +	if (IS_ERR(regmap)) +		return PTR_ERR(regmap); + +	return berlin_pinctrl_probe(pdev, match->data); +} + +static struct platform_driver berlin2_pinctrl_driver = { +	.probe	= berlin2_pinctrl_probe, +	.driver	= { +		.name = "berlin-bg2-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = berlin2_pinctrl_match, +	}, +}; +module_platform_driver(berlin2_pinctrl_driver); + +MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>"); +MODULE_DESCRIPTION("Marvell Berlin BG2 pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/berlin/berlin-bg2cd.c b/drivers/pinctrl/berlin/berlin-bg2cd.c new file mode 100644 index 00000000000..89d585ef7da --- /dev/null +++ b/drivers/pinctrl/berlin/berlin-bg2cd.c @@ -0,0 +1,217 @@ +/* + * Marvell Berlin BG2CD pinctrl driver. + * + * Copyright (C) 2014 Marvell Technology Group Ltd. + * + * Antoine Ténart <antoine.tenart@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/module.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> + +#include "berlin.h" + +static const struct berlin_desc_group berlin2cd_soc_pinctrl_groups[] = { +	/* G */ +	BERLIN_PINCTRL_GROUP("G0", 0x00, 0x1, 0x00, +		BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x2, "led"), +		BERLIN_PINCTRL_FUNCTION(0x3, "pwm")), +	BERLIN_PINCTRL_GROUP("G1", 0x00, 0x2, 0x01, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G2", 0x00, 0x2, 0x02, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "fe"), +		BERLIN_PINCTRL_FUNCTION(0x3, "pll"), +		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G3", 0x00, 0x2, 0x04, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "twsi2"), +		BERLIN_PINCTRL_FUNCTION(0x3, "pll"), +		BERLIN_PINCTRL_FUNCTION(0x4, "fe"), +		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G4", 0x00, 0x2, 0x06, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"), +		BERLIN_PINCTRL_FUNCTION(0x3, "pll"), +		BERLIN_PINCTRL_FUNCTION(0x4, "pwm"), +		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G5", 0x00, 0x3, 0x08, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +		BERLIN_PINCTRL_FUNCTION(0x2, "twsi3"), +		BERLIN_PINCTRL_FUNCTION(0x3, "arc"), +		BERLIN_PINCTRL_FUNCTION(0x4, "pwm"), +		BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G6", 0x00, 0x2, 0x0b, +		BERLIN_PINCTRL_FUNCTION(0x0, "uart0"),	/* RX/TX */ +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G7", 0x00, 0x3, 0x0d, +		BERLIN_PINCTRL_FUNCTION(0x0, "eddc"), +		BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"), +		BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G8", 0x00, 0x3, 0x10, +		BERLIN_PINCTRL_FUNCTION(0x0, "ss0"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G9", 0x00, 0x3, 0x13, +		BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +		BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x2, "twsi0")), +	BERLIN_PINCTRL_GROUP("G10", 0x00, 0x2, 0x16, +		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G11", 0x00, 0x2, 0x18, +		BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G12", 0x00, 0x3, 0x1a, +		BERLIN_PINCTRL_FUNCTION(0x0, "usb1"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G13", 0x04, 0x3, 0x00, +		BERLIN_PINCTRL_FUNCTION(0x0, "nand"), +		BERLIN_PINCTRL_FUNCTION(0x1, "usb0_dbg"), +		BERLIN_PINCTRL_FUNCTION(0x2, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G14", 0x04, 0x1, 0x03, +		BERLIN_PINCTRL_FUNCTION(0x0, "nand"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G15", 0x04, 0x2, 0x04, +		BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), +		BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G16", 0x04, 0x3, 0x06, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G17", 0x04, 0x3, 0x09, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G18", 0x04, 0x1, 0x0c, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G19", 0x04, 0x1, 0x0d, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G20", 0x04, 0x1, 0x0e, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G21", 0x04, 0x3, 0x0f, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G22", 0x04, 0x3, 0x12, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G23", 0x04, 0x3, 0x15, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G24", 0x04, 0x2, 0x18, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G25", 0x04, 0x2, 0x1a, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G26", 0x04, 0x1, 0x1c, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G27", 0x04, 0x1, 0x1d, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("G28", 0x04, 0x2, 0x1e, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +}; + +static const struct berlin_desc_group berlin2cd_sysmgr_pinctrl_groups[] = { +	/* GSM */ +	BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x2, 0x08, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x2, 0x0a, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x2, 0x0c, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0e, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0f, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x10, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x11, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +	BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x12, +		BERLIN_PINCTRL_FUNCTION_UNKNOWN), +}; + +static const struct berlin_pinctrl_desc berlin2cd_soc_pinctrl_data = { +	.groups = berlin2cd_soc_pinctrl_groups, +	.ngroups = ARRAY_SIZE(berlin2cd_soc_pinctrl_groups), +}; + +static const struct berlin_pinctrl_desc berlin2cd_sysmgr_pinctrl_data = { +	.groups = berlin2cd_sysmgr_pinctrl_groups, +	.ngroups = ARRAY_SIZE(berlin2cd_sysmgr_pinctrl_groups), +}; + +static const struct of_device_id berlin2cd_pinctrl_match[] = { +	{ +		.compatible = "marvell,berlin2cd-chip-ctrl", +		.data = &berlin2cd_soc_pinctrl_data +	}, +	{ +		.compatible = "marvell,berlin2cd-system-ctrl", +		.data = &berlin2cd_sysmgr_pinctrl_data +	}, +	{} +}; +MODULE_DEVICE_TABLE(of, berlin2cd_pinctrl_match); + +static int berlin2cd_pinctrl_probe(struct platform_device *pdev) +{ +	const struct of_device_id *match = +		of_match_device(berlin2cd_pinctrl_match, &pdev->dev); +	struct regmap_config *rmconfig; +	struct regmap *regmap; +	struct resource *res; +	void __iomem *base; + +	rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL); +	if (!rmconfig) +		return -ENOMEM; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(base)) +		return PTR_ERR(base); + +	rmconfig->reg_bits = 32, +	rmconfig->val_bits = 32, +	rmconfig->reg_stride = 4, +	rmconfig->max_register = resource_size(res); + +	regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig); +	if (IS_ERR(regmap)) +		return PTR_ERR(regmap); + +	return berlin_pinctrl_probe(pdev, match->data); +} + +static struct platform_driver berlin2cd_pinctrl_driver = { +	.probe	= berlin2cd_pinctrl_probe, +	.driver	= { +		.name = "berlin-bg2cd-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = berlin2cd_pinctrl_match, +	}, +}; +module_platform_driver(berlin2cd_pinctrl_driver); + +MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>"); +MODULE_DESCRIPTION("Marvell Berlin BG2CD pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/berlin/berlin-bg2q.c b/drivers/pinctrl/berlin/berlin-bg2q.c new file mode 100644 index 00000000000..9fcf9836045 --- /dev/null +++ b/drivers/pinctrl/berlin/berlin-bg2q.c @@ -0,0 +1,436 @@ +/* + * Marvell Berlin BG2Q pinctrl driver + * + * Copyright (C) 2014 Marvell Technology Group Ltd. + * + * Antoine Ténart <antoine.tenart@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/module.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> + +#include "berlin.h" + +static const struct berlin_desc_group berlin2q_soc_pinctrl_groups[] = { +	/* G */ +	BERLIN_PINCTRL_GROUP("G0", 0x18, 0x3, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "nand"), +			BERLIN_PINCTRL_FUNCTION(0x1, "mmc"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G1", 0x18, 0x3, 0x03, +			BERLIN_PINCTRL_FUNCTION(0x0, "nand"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G2", 0x18, 0x3, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "arc"), +			BERLIN_PINCTRL_FUNCTION(0x3, "lvds")), +	BERLIN_PINCTRL_GROUP("G3", 0x18, 0x3, 0x09, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "i2s2"), +			BERLIN_PINCTRL_FUNCTION(0x3, "lvds")), +	BERLIN_PINCTRL_GROUP("G4", 0x18, 0x3, 0x0c, +			BERLIN_PINCTRL_FUNCTION(0x0, "pll"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"), +			BERLIN_PINCTRL_FUNCTION(0x3, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x5, "sata_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G5", 0x18, 0x3, 0x0f, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sd0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"), +			BERLIN_PINCTRL_FUNCTION(0x5, "sata_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G6", 0x18, 0x3, 0x12, +			BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), +			BERLIN_PINCTRL_FUNCTION(0x1, "twsi0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G7", 0x18, 0x3, 0x15, +			BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), +			BERLIN_PINCTRL_FUNCTION(0x1, "twsi1"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "eddc")), +	BERLIN_PINCTRL_GROUP("G8", 0x18, 0x3, 0x18, +			BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +			BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G9", 0x18, 0x3, 0x1b, +			BERLIN_PINCTRL_FUNCTION(0x0, "spi1"), +			BERLIN_PINCTRL_FUNCTION(0x1, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x5, "sata")), +	BERLIN_PINCTRL_GROUP("G10", 0x1c, 0x3, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"), +			BERLIN_PINCTRL_FUNCTION(0x4, "pwm"), +			BERLIN_PINCTRL_FUNCTION(0x5, "sata")), +	BERLIN_PINCTRL_GROUP("G11", 0x1c, 0x3, 0x03, +			BERLIN_PINCTRL_FUNCTION(0x0, "jtag"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spi1"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s1"), +			BERLIN_PINCTRL_FUNCTION(0x4, "pwm"), +			BERLIN_PINCTRL_FUNCTION(0x5, "sata")), +	BERLIN_PINCTRL_GROUP("G12", 0x1c, 0x3, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "agc"), +			BERLIN_PINCTRL_FUNCTION(0x1, "gpio")), +	BERLIN_PINCTRL_GROUP("G13", 0x1c, 0x3, 0x09, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sts1"), +			BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G14", 0x1c, 0x3, 0x0c, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), +			BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G15", 0x1c, 0x3, 0x0f, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), +			BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +			BERLIN_PINCTRL_FUNCTION(0x5, "vdac"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G16", 0x1c, 0x3, 0x12, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sts0"), +			BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +			BERLIN_PINCTRL_FUNCTION(0x5, "osco"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G17", 0x1c, 0x3, 0x15, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"), +			BERLIN_PINCTRL_FUNCTION(0x3, "spdif"), +			BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +			BERLIN_PINCTRL_FUNCTION(0x6, "usb0_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x7, "usb1_dbg")), +	BERLIN_PINCTRL_GROUP("G18", 0x1c, 0x3, 0x18, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s2"), +			BERLIN_PINCTRL_FUNCTION(0x4, "sts1")), +	BERLIN_PINCTRL_GROUP("G19", 0x1c, 0x3, 0x1b, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "rgmii"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s3"), +			BERLIN_PINCTRL_FUNCTION(0x4, "sts1"), +			BERLIN_PINCTRL_FUNCTION(0x5, "osco")), +	BERLIN_PINCTRL_GROUP("G20", 0x20, 0x3, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "demod"), +			/* +			 * Mode 0x4 mux usb2_dbg *and* usb3_dbg: +			 * add two functions so it can be used with other groups +			 * within the same subnode in the device tree +			 */ +			BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg"), +			BERLIN_PINCTRL_FUNCTION(0x4, "usb3_dbg")), +	BERLIN_PINCTRL_GROUP("G21", 0x20, 0x3, 0x03, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sts2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "demod")), +	BERLIN_PINCTRL_GROUP("G22", 0x20, 0x3, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G23", 0x20, 0x3, 0x09, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "avif"), +			BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")), +	BERLIN_PINCTRL_GROUP("G24", 0x20, 0x3, 0x0c, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "demod"), +			BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")), +	BERLIN_PINCTRL_GROUP("G25", 0x20, 0x3, 0x0f, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "vga"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "avif"), +			BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")), +	BERLIN_PINCTRL_GROUP("G26", 0x20, 0x3, 0x12, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "lvds"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G27", 0x20, 0x3, 0x15, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "agc"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G28", 0x20, 0x3, 0x18, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x3, "avif"), +			BERLIN_PINCTRL_FUNCTION(0x4, "usb2_dbg")), +	BERLIN_PINCTRL_GROUP("G29", 0x20, 0x3, 0x1b, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G30", 0x24, 0x3, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "scrd1"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G31", 0x24, 0x3, 0x03, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sd1"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("G32", 0x24, 0x3, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "cam"), +			BERLIN_PINCTRL_FUNCTION(0x1, "sd1"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	/* GAV */ +	BERLIN_PINCTRL_GROUP("GAV0", 0x24, 0x3, 0x09, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "lvds")), +	BERLIN_PINCTRL_GROUP("GAV1", 0x24, 0x3, 0x0c, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "vga")), +	BERLIN_PINCTRL_GROUP("GAV2", 0x24, 0x3, 0x0f, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s3"), +			BERLIN_PINCTRL_FUNCTION(0x4, "pdm"), +			BERLIN_PINCTRL_FUNCTION(0x6, "adac")), +	BERLIN_PINCTRL_GROUP("GAV3", 0x24, 0x3, 0x12, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s3"), +			BERLIN_PINCTRL_FUNCTION(0x6, "adac")), +	BERLIN_PINCTRL_GROUP("GAV4", 0x24, 0x3, 0x15, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "i2s1"), +			BERLIN_PINCTRL_FUNCTION(0x6, "adac")), +	BERLIN_PINCTRL_GROUP("GAV5", 0x24, 0x3, 0x18, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "spdif")), +	BERLIN_PINCTRL_GROUP("GAV6", 0x24, 0x3, 0x1b, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "i2s2")), +	BERLIN_PINCTRL_GROUP("GAV7", 0x28, 0x3, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dvio"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "i2s3")), +	BERLIN_PINCTRL_GROUP("GAV8", 0x28, 0x3, 0x03, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dv0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "pwm")), +	BERLIN_PINCTRL_GROUP("GAV9", 0x28, 0x3, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dv0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "pwm")), +	BERLIN_PINCTRL_GROUP("GAV10", 0x28, 0x3, 0x09, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dv0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x4, "agc")), +	BERLIN_PINCTRL_GROUP("GAV11", 0x28, 0x3, 0x0c, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "dv0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "fp"), +			BERLIN_PINCTRL_FUNCTION(0x3, "i2s0"), +			BERLIN_PINCTRL_FUNCTION(0x4, "pwm"), +			BERLIN_PINCTRL_FUNCTION(0x5, "vclki")), +	BERLIN_PINCTRL_GROUP("GAV12", 0x28, 0x3, 0x0f, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "i2s1")), +	BERLIN_PINCTRL_GROUP("GAV13", 0x28, 0x3, 0x12, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2")), +	BERLIN_PINCTRL_GROUP("GAV14", 0x28, 0x3, 0x15, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "i2s1")), +	BERLIN_PINCTRL_GROUP("GAV15", 0x28, 0x3, 0x18, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s1"), +			BERLIN_PINCTRL_FUNCTION(0x6, "dac_dbg")), +	BERLIN_PINCTRL_GROUP("GAV16", 0x28, 0x3, 0x1b, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "i2s1"), +			BERLIN_PINCTRL_FUNCTION(0x4, "i2s3"), +			BERLIN_PINCTRL_FUNCTION(0x5, "pdm"), +			BERLIN_PINCTRL_FUNCTION(0x6, "dac_dbg")), +	BERLIN_PINCTRL_GROUP("GAV17", 0x2c, 0x3, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "i2s0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "i2s1"), +			BERLIN_PINCTRL_FUNCTION(0x3, "pwm"), +			BERLIN_PINCTRL_FUNCTION(0x4, "i2s3"), +			BERLIN_PINCTRL_FUNCTION(0x5, "pdm"), +			BERLIN_PINCTRL_FUNCTION(0x6, "dac_dbg")), +	BERLIN_PINCTRL_GROUP("GAV18", 0x2c, 0x3, 0x03, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spdif"), +			BERLIN_PINCTRL_FUNCTION(0x2, "arc")), +	BERLIN_PINCTRL_GROUP("GAV19", 0x2c, 0x3, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "avio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spdif"), +			BERLIN_PINCTRL_FUNCTION(0x4, "i2s3"), +			BERLIN_PINCTRL_FUNCTION(0x5, "pdm")), +}; + +static const struct berlin_desc_group berlin2q_sysmgr_pinctrl_groups[] = { +	/* GSM */ +	BERLIN_PINCTRL_GROUP("GSM0", 0x40, 0x2, 0x00, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "eth1")), +	BERLIN_PINCTRL_GROUP("GSM1", 0x40, 0x2, 0x02, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "eth1")), +	BERLIN_PINCTRL_GROUP("GSM2", 0x40, 0x2, 0x04, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "eddc")), +	BERLIN_PINCTRL_GROUP("GSM3", 0x40, 0x2, 0x06, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "spi2"), +			BERLIN_PINCTRL_FUNCTION(0x2, "eddc")), +	BERLIN_PINCTRL_GROUP("GSM4", 0x40, 0x1, 0x08, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM5", 0x40, 0x1, 0x09, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM6", 0x40, 0x1, 0x0a, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM7", 0x40, 0x1, 0x0b, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM8", 0x40, 0x1, 0x0c, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM9", 0x40, 0x1, 0x0d, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "hdmi")), +	BERLIN_PINCTRL_GROUP("GSM10", 0x40, 0x1, 0x0e, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "led")), +	BERLIN_PINCTRL_GROUP("GSM11", 0x40, 0x1, 0x0f, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "led")), +	BERLIN_PINCTRL_GROUP("GSM12", 0x40, 0x2, 0x10, +			BERLIN_PINCTRL_FUNCTION(0x0, "uart0"), /* RX/TX */ +			BERLIN_PINCTRL_FUNCTION(0x1, "irda0"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("GSM13", 0x40, 0x2, 0x12, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "uart0"), /* CTS/RTS */ +			BERLIN_PINCTRL_FUNCTION(0x2, "uart1"), /* RX/TX */ +			BERLIN_PINCTRL_FUNCTION(0x3, "twsi2")), +	BERLIN_PINCTRL_GROUP("GSM14", 0x40, 0x2, 0x14, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "uart1"), /* RX/TX */ +			BERLIN_PINCTRL_FUNCTION(0x2, "irda1"), +			BERLIN_PINCTRL_FUNCTION(0x3, "twsi3")), +	BERLIN_PINCTRL_GROUP("GSM15", 0x40, 0x2, 0x16, +			BERLIN_PINCTRL_FUNCTION(0x0, "pwr"), +			BERLIN_PINCTRL_FUNCTION(0x1, "led"), +			BERLIN_PINCTRL_FUNCTION(0x2, "gpio")), +	BERLIN_PINCTRL_GROUP("GSM16", 0x40, 0x1, 0x18, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "eddc")), +	BERLIN_PINCTRL_GROUP("GSM17", 0x40, 0x1, 0x19, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "eddc")), +	BERLIN_PINCTRL_GROUP("GSM18", 0x40, 0x1, 0x1a, +			BERLIN_PINCTRL_FUNCTION(0x0, "gpio"), +			BERLIN_PINCTRL_FUNCTION(0x1, "eddc")), +}; + +static const struct berlin_pinctrl_desc berlin2q_soc_pinctrl_data = { +	.groups = berlin2q_soc_pinctrl_groups, +	.ngroups = ARRAY_SIZE(berlin2q_soc_pinctrl_groups), +}; + +static const struct berlin_pinctrl_desc berlin2q_sysmgr_pinctrl_data = { +	.groups = berlin2q_sysmgr_pinctrl_groups, +	.ngroups = ARRAY_SIZE(berlin2q_sysmgr_pinctrl_groups), +}; + +static const struct of_device_id berlin2q_pinctrl_match[] = { +	{ +		.compatible = "marvell,berlin2q-chip-ctrl", +		.data = &berlin2q_soc_pinctrl_data, +	}, +	{ +		.compatible = "marvell,berlin2q-system-ctrl", +		.data = &berlin2q_sysmgr_pinctrl_data, +	}, +	{} +}; +MODULE_DEVICE_TABLE(of, berlin2q_pinctrl_match); + +static int berlin2q_pinctrl_probe(struct platform_device *pdev) +{ +	const struct of_device_id *match = +		of_match_device(berlin2q_pinctrl_match, &pdev->dev); +	struct regmap_config *rmconfig; +	struct regmap *regmap; +	struct resource *res; +	void __iomem *base; + +	rmconfig = devm_kzalloc(&pdev->dev, sizeof(*rmconfig), GFP_KERNEL); +	if (!rmconfig) +		return -ENOMEM; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(base)) +		return PTR_ERR(base); + +	rmconfig->reg_bits = 32, +	rmconfig->val_bits = 32, +	rmconfig->reg_stride = 4, +	rmconfig->max_register = resource_size(res); + +	regmap = devm_regmap_init_mmio(&pdev->dev, base, rmconfig); +	if (IS_ERR(regmap)) +		return PTR_ERR(regmap); + +	return berlin_pinctrl_probe(pdev, match->data); +} + +static struct platform_driver berlin2q_pinctrl_driver = { +	.probe	= berlin2q_pinctrl_probe, +	.driver	= { +		.name = "berlin-bg2q-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = berlin2q_pinctrl_match, +	}, +}; +module_platform_driver(berlin2q_pinctrl_driver); + +MODULE_AUTHOR("Antoine Ténart <antoine.tenart@free-electrons.com>"); +MODULE_DESCRIPTION("Marvell Berlin BG2Q pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/berlin/berlin.c b/drivers/pinctrl/berlin/berlin.c new file mode 100644 index 00000000000..86db2235ab0 --- /dev/null +++ b/drivers/pinctrl/berlin/berlin.c @@ -0,0 +1,348 @@ +/* + * Marvell Berlin SoC pinctrl core driver + * + * Copyright (C) 2014 Marvell Technology Group Ltd. + * + * Antoine Ténart <antoine.tenart@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/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/slab.h> + +#include "../core.h" +#include "../pinctrl-utils.h" +#include "berlin.h" + +struct berlin_pinctrl { +	struct regmap *regmap; +	struct device *dev; +	const struct berlin_pinctrl_desc *desc; +	struct berlin_pinctrl_function *functions; +	unsigned nfunctions; +	struct pinctrl_dev *pctrl_dev; +}; + +static int berlin_pinctrl_get_group_count(struct pinctrl_dev *pctrl_dev) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); + +	return pctrl->desc->ngroups; +} + +static const char *berlin_pinctrl_get_group_name(struct pinctrl_dev *pctrl_dev, +						 unsigned group) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); + +	return pctrl->desc->groups[group].name; +} + +static int berlin_pinctrl_dt_node_to_map(struct pinctrl_dev *pctrl_dev, +					 struct device_node *node, +					 struct pinctrl_map **map, +					 unsigned *num_maps) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); +	struct property *prop; +	const char *function_name, *group_name; +	unsigned reserved_maps = 0; +	int ret, ngroups; + +	*map = NULL; +	*num_maps = 0; + +	ret = of_property_read_string(node, "function", &function_name); +	if (ret) { +		dev_err(pctrl->dev, +			"missing function property in node %s\n", +			node->name); +		return -EINVAL; +	} + +	ngroups = of_property_count_strings(node, "groups"); +	if (ngroups < 0) { +		dev_err(pctrl->dev, +			"missing groups property in node %s\n", +			node->name); +		return -EINVAL; +	} + +	ret = pinctrl_utils_reserve_map(pctrl_dev, map, &reserved_maps, +					num_maps, ngroups); +	if (ret) { +		dev_err(pctrl->dev, "can't reserve map: %d\n", ret); +		return ret; +	} + +	of_property_for_each_string(node, "groups", prop, group_name) { +		ret = pinctrl_utils_add_map_mux(pctrl_dev, map, &reserved_maps, +						num_maps, group_name, +						function_name); +		if (ret) { +			dev_err(pctrl->dev, "can't add map: %d\n", ret); +			return ret; +		} +	} + +	return 0; +} + +static void berlin_pinctrl_dt_free_map(struct pinctrl_dev *pctrl_dev, +				       struct pinctrl_map *map, +				       unsigned nmaps) +{ +	int i; + +	for (i = 0; i < nmaps; i++) { +		if (map[i].type == PIN_MAP_TYPE_MUX_GROUP) { +			kfree(map[i].data.mux.group); + +			/* a function can be applied to multiple groups */ +			if (i == 0) +				kfree(map[i].data.mux.function); +		} +	} + +	kfree(map); +} + +static const struct pinctrl_ops berlin_pinctrl_ops = { +	.get_groups_count	= &berlin_pinctrl_get_group_count, +	.get_group_name		= &berlin_pinctrl_get_group_name, +	.dt_node_to_map		= &berlin_pinctrl_dt_node_to_map, +	.dt_free_map		= &berlin_pinctrl_dt_free_map, +}; + +static int berlin_pinmux_get_functions_count(struct pinctrl_dev *pctrl_dev) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); + +	return pctrl->nfunctions; +} + +static const char *berlin_pinmux_get_function_name(struct pinctrl_dev *pctrl_dev, +						   unsigned function) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); + +	return pctrl->functions[function].name; +} + +static int berlin_pinmux_get_function_groups(struct pinctrl_dev *pctrl_dev, +					     unsigned function, +					     const char * const **groups, +					     unsigned * const num_groups) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); + +	*groups = pctrl->functions[function].groups; +	*num_groups = pctrl->functions[function].ngroups; + +	return 0; +} + +static struct berlin_desc_function * +berlin_pinctrl_find_function_by_name(struct berlin_pinctrl *pctrl, +				     const struct berlin_desc_group *group, +				     const char *fname) +{ +	struct berlin_desc_function *function = group->functions; + +	while (function->name) { +		if (!strcmp(function->name, fname)) +			return function; + +		function++; +	} + +	return NULL; +} + +static int berlin_pinmux_enable(struct pinctrl_dev *pctrl_dev, +				unsigned function, +				unsigned group) +{ +	struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); +	const struct berlin_desc_group *group_desc = pctrl->desc->groups + group; +	struct berlin_pinctrl_function *func = pctrl->functions + function; +	struct berlin_desc_function *function_desc = +		berlin_pinctrl_find_function_by_name(pctrl, group_desc, +						     func->name); +	u32 mask, val; + +	if (!function_desc) +		return -EINVAL; + +	mask = GENMASK(group_desc->lsb + group_desc->bit_width - 1, +		       group_desc->lsb); +	val = function_desc->muxval << group_desc->lsb; +	regmap_update_bits(pctrl->regmap, group_desc->offset, mask, val); + +	return 0; +} + +static const struct pinmux_ops berlin_pinmux_ops = { +	.get_functions_count	= &berlin_pinmux_get_functions_count, +	.get_function_name	= &berlin_pinmux_get_function_name, +	.get_function_groups	= &berlin_pinmux_get_function_groups, +	.enable			= &berlin_pinmux_enable, +}; + +static int berlin_pinctrl_add_function(struct berlin_pinctrl *pctrl, +				       const char *name) +{ +	struct berlin_pinctrl_function *function = pctrl->functions; + +	while (function->name) { +		if (!strcmp(function->name, name)) { +			function->ngroups++; +			return -EEXIST; +		} +		function++; +	} + +	function->name = name; +	function->ngroups = 1; + +	pctrl->nfunctions++; + +	return 0; +} + +static int berlin_pinctrl_build_state(struct platform_device *pdev) +{ +	struct berlin_pinctrl *pctrl = platform_get_drvdata(pdev); +	struct berlin_desc_group const *desc_group; +	struct berlin_desc_function const *desc_function; +	int i, max_functions = 0; + +	pctrl->nfunctions = 0; + +	for (i = 0; i < pctrl->desc->ngroups; i++) { +		desc_group = pctrl->desc->groups + i; +		/* compute the maxiumum number of functions a group can have */ +		max_functions += 1 << (desc_group->bit_width + 1); +	} + +	/* we will reallocate later */ +	pctrl->functions = devm_kzalloc(&pdev->dev, +					max_functions * sizeof(*pctrl->functions), +					GFP_KERNEL); +	if (!pctrl->functions) +		return -ENOMEM; + +	/* register all functions */ +	for (i = 0; i < pctrl->desc->ngroups; i++) { +		desc_group = pctrl->desc->groups + i; +		desc_function = desc_group->functions; + +		while (desc_function->name) { +			berlin_pinctrl_add_function(pctrl, desc_function->name); +			desc_function++; +		} +	} + +	pctrl->functions = krealloc(pctrl->functions, +				    pctrl->nfunctions * sizeof(*pctrl->functions), +				    GFP_KERNEL); + +	/* map functions to theirs groups */ +	for (i = 0; i < pctrl->desc->ngroups; i++) { +		desc_group = pctrl->desc->groups + i; +		desc_function = desc_group->functions; + +		while (desc_function->name) { +			struct berlin_pinctrl_function +				*function = pctrl->functions; +			const char **groups; +			bool found = false; + +			while (function->name) { +				if (!strcmp(desc_function->name, function->name)) { +					found = true; +					break; +				} +				function++; +			} + +			if (!found) +				return -EINVAL; + +			if (!function->groups) { +				function->groups = +					devm_kzalloc(&pdev->dev, +						     function->ngroups * sizeof(char *), +						     GFP_KERNEL); + +				if (!function->groups) +					return -ENOMEM; +			} + +			groups = function->groups; +			while (*groups) +				groups++; + +			*groups = desc_group->name; + +			desc_function++; +		} +	} + +	return 0; +} + +static struct pinctrl_desc berlin_pctrl_desc = { +	.name		= "berlin-pinctrl", +	.pctlops	= &berlin_pinctrl_ops, +	.pmxops		= &berlin_pinmux_ops, +	.owner		= THIS_MODULE, +}; + +int berlin_pinctrl_probe(struct platform_device *pdev, +			 const struct berlin_pinctrl_desc *desc) +{ +	struct device *dev = &pdev->dev; +	struct berlin_pinctrl *pctrl; +	struct regmap *regmap; +	int ret; + +	regmap = dev_get_regmap(&pdev->dev, NULL); +	if (!regmap) +		return -ENODEV; + +	pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL); +	if (!pctrl) +		return -ENOMEM; + +	platform_set_drvdata(pdev, pctrl); + +	pctrl->regmap = regmap; +	pctrl->dev = &pdev->dev; +	pctrl->desc = desc; + +	ret = berlin_pinctrl_build_state(pdev); +	if (ret) { +		dev_err(dev, "cannot build driver state: %d\n", ret); +		return ret; +	} + +	pctrl->pctrl_dev = pinctrl_register(&berlin_pctrl_desc, dev, pctrl); +	if (!pctrl->pctrl_dev) { +		dev_err(dev, "failed to register pinctrl driver\n"); +		return -EINVAL; +	} + +	return 0; +} diff --git a/drivers/pinctrl/berlin/berlin.h b/drivers/pinctrl/berlin/berlin.h new file mode 100644 index 00000000000..e1aa8414519 --- /dev/null +++ b/drivers/pinctrl/berlin/berlin.h @@ -0,0 +1,61 @@ +/* + * Marvell Berlin SoC pinctrl driver. + * + * Copyright (C) 2014 Marvell Technology Group Ltd. + * + * Antoine Ténart <antoine.tenart@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. + */ + +#ifndef __PINCTRL_BERLIN_H +#define __PINCTRL_BERLIN_H + +struct berlin_desc_function { +	const char	*name; +	u8		muxval; +}; + +struct berlin_desc_group { +	const char			*name; +	u8				offset; +	u8				bit_width; +	u8				lsb; +	struct berlin_desc_function	*functions; +}; + +struct berlin_pinctrl_desc { +	const struct berlin_desc_group	*groups; +	unsigned			ngroups; +}; + +struct berlin_pinctrl_function { +	const char	*name; +	const char	**groups; +	unsigned	ngroups; +}; + +#define BERLIN_PINCTRL_GROUP(_name, _offset, _width, _lsb, ...)		\ +	{								\ +		.name = _name,						\ +		.offset = _offset,					\ +		.bit_width = _width,					\ +		.lsb = _lsb,						\ +		.functions = (struct berlin_desc_function[]){		\ +			__VA_ARGS__, { } },				\ +	} + +#define BERLIN_PINCTRL_FUNCTION(_muxval, _name)		\ +	{						\ +		.name = _name,				\ +		.muxval = _muxval,			\ +	} + +#define BERLIN_PINCTRL_FUNCTION_UNKNOWN		{} + +int berlin_pinctrl_probe(struct platform_device *pdev, +			 const struct berlin_pinctrl_desc *desc); + +#endif /* __PINCTRL_BERLIN_H */ diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 92f86ab30a1..e09474ecde2 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -462,6 +462,23 @@ struct pinctrl_dev *pinctrl_find_and_add_gpio_range(const char *devname,  }  EXPORT_SYMBOL_GPL(pinctrl_find_and_add_gpio_range); +int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group, +				const unsigned **pins, unsigned *num_pins) +{ +	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; +	int gs; + +	if (!pctlops->get_group_pins) +		return -EINVAL; + +	gs = pinctrl_get_group_selector(pctldev, pin_group); +	if (gs < 0) +		return gs; + +	return pctlops->get_group_pins(pctldev, gs, pins, num_pins); +} +EXPORT_SYMBOL_GPL(pinctrl_get_group_pins); +  /**   * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin   * @pctldev: the pin controller device to look in @@ -837,7 +854,9 @@ static struct pinctrl *create_pinctrl(struct device *dev)  	kref_init(&p->users);  	/* Add the pinctrl handle to the global list */ +	mutex_lock(&pinctrl_list_mutex);  	list_add_tail(&p->node, &pinctrl_list); +	mutex_unlock(&pinctrl_list_mutex);  	return p;  } @@ -1346,15 +1365,16 @@ static int pinctrl_groups_show(struct seq_file *s, void *what)  	seq_puts(s, "registered pin groups:\n");  	while (selector < ngroups) { -		const unsigned *pins; -		unsigned num_pins; +		const unsigned *pins = NULL; +		unsigned num_pins = 0;  		const char *gname = ops->get_group_name(pctldev, selector);  		const char *pname; -		int ret; +		int ret = 0;  		int i; -		ret = ops->get_group_pins(pctldev, selector, -					  &pins, &num_pins); +		if (ops->get_group_pins) +			ret = ops->get_group_pins(pctldev, selector, +						  &pins, &num_pins);  		if (ret)  			seq_printf(s, "%s [ERROR GETTING PINS]\n",  				   gname); @@ -1628,8 +1648,10 @@ static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)  			    device_root, pctldev, &pinctrl_groups_ops);  	debugfs_create_file("gpio-ranges", S_IFREG | S_IRUGO,  			    device_root, pctldev, &pinctrl_gpioranges_ops); -	pinmux_init_device_debugfs(device_root, pctldev); -	pinconf_init_device_debugfs(device_root, pctldev); +	if (pctldev->desc->pmxops) +		pinmux_init_device_debugfs(device_root, pctldev); +	if (pctldev->desc->confops) +		pinconf_init_device_debugfs(device_root, pctldev);  }  static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) @@ -1676,8 +1698,7 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev)  	if (!ops ||  	    !ops->get_groups_count || -	    !ops->get_group_name || -	    !ops->get_group_pins) +	    !ops->get_group_name)  		return -EINVAL;  	if (ops->dt_node_to_map && !ops->dt_free_map) diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c index 340fb4e6c60..eda13de2e7c 100644 --- a/drivers/pinctrl/devicetree.c +++ b/drivers/pinctrl/devicetree.c @@ -186,7 +186,9 @@ int pinctrl_dt_to_map(struct pinctrl *p)  	/* CONFIG_OF enabled, p->dev not instantiated from DT */  	if (!np) { -		dev_dbg(p->dev, "no of_node; not parsing pinctrl DT\n"); +		if (of_have_populated_dt()) +			dev_dbg(p->dev, +				"no of_node; not parsing pinctrl DT\n");  		return 0;  	} diff --git a/drivers/pinctrl/mvebu/Kconfig b/drivers/pinctrl/mvebu/Kconfig index 366fa541ee9..d6dd8358a6f 100644 --- a/drivers/pinctrl/mvebu/Kconfig +++ b/drivers/pinctrl/mvebu/Kconfig @@ -8,6 +8,7 @@ config PINCTRL_MVEBU  config PINCTRL_DOVE  	bool  	select PINCTRL_MVEBU +	select MFD_SYSCON  config PINCTRL_KIRKWOOD  	bool @@ -17,8 +18,20 @@ config PINCTRL_ARMADA_370  	bool  	select PINCTRL_MVEBU +config PINCTRL_ARMADA_375 +	bool +	select PINCTRL_MVEBU + +config PINCTRL_ARMADA_38X +	bool +	select PINCTRL_MVEBU +  config PINCTRL_ARMADA_XP  	bool  	select PINCTRL_MVEBU +config PINCTRL_ORION +	bool +	select PINCTRL_MVEBU +  endif diff --git a/drivers/pinctrl/mvebu/Makefile b/drivers/pinctrl/mvebu/Makefile index 37c253297af..a0818e96374 100644 --- a/drivers/pinctrl/mvebu/Makefile +++ b/drivers/pinctrl/mvebu/Makefile @@ -2,4 +2,7 @@ obj-$(CONFIG_PINCTRL_MVEBU)	+= pinctrl-mvebu.o  obj-$(CONFIG_PINCTRL_DOVE)	+= pinctrl-dove.o  obj-$(CONFIG_PINCTRL_KIRKWOOD)	+= pinctrl-kirkwood.o  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_XP)  += pinctrl-armada-xp.o +obj-$(CONFIG_PINCTRL_ORION)  += pinctrl-orion.o diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-370.c b/drivers/pinctrl/mvebu/pinctrl-armada-370.c index 48e21a22948..670e5b01c67 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-370.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-370.c @@ -23,6 +23,18 @@  #include "pinctrl-mvebu.h" +static void __iomem *mpp_base; + +static int armada_370_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	return default_mpp_ctrl_get(mpp_base, pid, config); +} + +static int armada_370_mpp_ctrl_set(unsigned pid, unsigned long config) +{ +	return default_mpp_ctrl_set(mpp_base, pid, config); +} +  static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = {  	MPP_MODE(0,  	   MPP_FUNCTION(0x0, "gpio", NULL), @@ -373,7 +385,7 @@ static struct of_device_id armada_370_pinctrl_of_match[] = {  };  static struct mvebu_mpp_ctrl mv88f6710_mpp_controls[] = { -	MPP_REG_CTRL(0, 65), +	MPP_FUNC_CTRL(0, 65, NULL, armada_370_mpp_ctrl),  };  static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = { @@ -385,6 +397,12 @@ static struct pinctrl_gpio_range mv88f6710_mpp_gpio_ranges[] = {  static int armada_370_pinctrl_probe(struct platform_device *pdev)  {  	struct mvebu_pinctrl_soc_info *soc = &armada_370_pinctrl_info; +	struct resource *res; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base);  	soc->variant = 0; /* no variants for Armada 370 */  	soc->controls = mv88f6710_mpp_controls; @@ -408,7 +426,7 @@ static struct platform_driver armada_370_pinctrl_driver = {  	.driver = {  		.name = "armada-370-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(armada_370_pinctrl_of_match), +		.of_match_table = armada_370_pinctrl_of_match,  	},  	.probe = armada_370_pinctrl_probe,  	.remove = armada_370_pinctrl_remove, diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-375.c b/drivers/pinctrl/mvebu/pinctrl-armada-375.c new file mode 100644 index 00000000000..db078fe7ace --- /dev/null +++ b/drivers/pinctrl/mvebu/pinctrl-armada-375.c @@ -0,0 +1,459 @@ +/* + * Marvell Armada 375 pinctrl driver based on mvebu pinctrl core + * + * Copyright (C) 2012 Marvell + * + * Thomas Petazzoni <thomas.petazzoni@free-electrons.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/module.h> +#include <linux/platform_device.h> +#include <linux/clk.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-mvebu.h" + +static void __iomem *mpp_base; + +static int armada_375_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	return default_mpp_ctrl_get(mpp_base, pid, config); +} + +static int armada_375_mpp_ctrl_set(unsigned pid, unsigned long config) +{ +	return default_mpp_ctrl_set(mpp_base, pid, config); +} + +static struct mvebu_mpp_mode mv88f6720_mpp_modes[] = { +	MPP_MODE(0, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad2"), +		 MPP_FUNCTION(0x2, "spi0", "cs1"), +		 MPP_FUNCTION(0x3, "spi1", "cs1"), +		 MPP_FUNCTION(0x5, "nand", "io2")), +	MPP_MODE(1, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad3"), +		 MPP_FUNCTION(0x2, "spi0", "mosi"), +		 MPP_FUNCTION(0x3, "spi1", "mosi"), +		 MPP_FUNCTION(0x5, "nand", "io3")), +	MPP_MODE(2, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad4"), +		 MPP_FUNCTION(0x2, "ptp", "eventreq"), +		 MPP_FUNCTION(0x3, "led", "c0"), +		 MPP_FUNCTION(0x4, "audio", "sdi"), +		 MPP_FUNCTION(0x5, "nand", "io4"), +		 MPP_FUNCTION(0x6, "spi1", "mosi")), +	MPP_MODE(3, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad5"), +		 MPP_FUNCTION(0x2, "ptp", "triggen"), +		 MPP_FUNCTION(0x3, "led", "p3"), +		 MPP_FUNCTION(0x4, "audio", "mclk"), +		 MPP_FUNCTION(0x5, "nand", "io5"), +		 MPP_FUNCTION(0x6, "spi1", "miso")), +	MPP_MODE(4, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad6"), +		 MPP_FUNCTION(0x2, "spi0", "miso"), +		 MPP_FUNCTION(0x3, "spi1", "miso"), +		 MPP_FUNCTION(0x5, "nand", "io6")), +	MPP_MODE(5, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad7"), +		 MPP_FUNCTION(0x2, "spi0", "cs2"), +		 MPP_FUNCTION(0x3, "spi1", "cs2"), +		 MPP_FUNCTION(0x5, "nand", "io7"), +		 MPP_FUNCTION(0x6, "spi1", "miso")), +	MPP_MODE(6, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad0"), +		 MPP_FUNCTION(0x3, "led", "p1"), +		 MPP_FUNCTION(0x4, "audio", "rclk"), +		 MPP_FUNCTION(0x5, "nand", "io0")), +	MPP_MODE(7, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "ad1"), +		 MPP_FUNCTION(0x2, "ptp", "clk"), +		 MPP_FUNCTION(0x3, "led", "p2"), +		 MPP_FUNCTION(0x4, "audio", "extclk"), +		 MPP_FUNCTION(0x5, "nand", "io1")), +	MPP_MODE(8, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev ", "bootcs"), +		 MPP_FUNCTION(0x2, "spi0", "cs0"), +		 MPP_FUNCTION(0x3, "spi1", "cs0"), +		 MPP_FUNCTION(0x5, "nand", "ce")), +	MPP_MODE(9, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "nf", "wen"), +		 MPP_FUNCTION(0x2, "spi0", "sck"), +		 MPP_FUNCTION(0x3, "spi1", "sck"), +		 MPP_FUNCTION(0x5, "nand", "we")), +	MPP_MODE(10, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "nf", "ren"), +		 MPP_FUNCTION(0x2, "dram", "vttctrl"), +		 MPP_FUNCTION(0x3, "led", "c1"), +		 MPP_FUNCTION(0x5, "nand", "re"), +		 MPP_FUNCTION(0x6, "spi1", "sck")), +	MPP_MODE(11, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "a0"), +		 MPP_FUNCTION(0x3, "led", "c2"), +		 MPP_FUNCTION(0x4, "audio", "sdo"), +		 MPP_FUNCTION(0x5, "nand", "cle")), +	MPP_MODE(12, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "a1"), +		 MPP_FUNCTION(0x4, "audio", "bclk"), +		 MPP_FUNCTION(0x5, "nand", "ale")), +	MPP_MODE(13, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "dev", "readyn"), +		 MPP_FUNCTION(0x2, "pcie0", "rstoutn"), +		 MPP_FUNCTION(0x3, "pcie1", "rstoutn"), +		 MPP_FUNCTION(0x5, "nand", "rb"), +		 MPP_FUNCTION(0x6, "spi1", "mosi")), +	MPP_MODE(14, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "i2c0", "sda"), +		 MPP_FUNCTION(0x3, "uart1", "txd")), +	MPP_MODE(15, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "i2c0", "sck"), +		 MPP_FUNCTION(0x3, "uart1", "rxd")), +	MPP_MODE(16, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "uart0", "txd")), +	MPP_MODE(17, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "uart0", "rxd")), +	MPP_MODE(18, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "tdm", "intn")), +	MPP_MODE(19, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "tdm", "rstn")), +	MPP_MODE(20, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "tdm", "pclk")), +	MPP_MODE(21, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "tdm", "fsync")), +	MPP_MODE(22, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "tdm", "drx")), +	MPP_MODE(23, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "tdm", "dtx")), +	MPP_MODE(24, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p0"), +		 MPP_FUNCTION(0x2, "ge1", "rxd0"), +		 MPP_FUNCTION(0x3, "sd", "cmd"), +		 MPP_FUNCTION(0x4, "uart0", "rts"), +		 MPP_FUNCTION(0x5, "spi0", "cs0"), +		 MPP_FUNCTION(0x6, "dev", "cs1")), +	MPP_MODE(25, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p2"), +		 MPP_FUNCTION(0x2, "ge1", "rxd1"), +		 MPP_FUNCTION(0x3, "sd", "d0"), +		 MPP_FUNCTION(0x4, "uart0", "cts"), +		 MPP_FUNCTION(0x5, "spi0", "mosi"), +		 MPP_FUNCTION(0x6, "dev", "cs2")), +	MPP_MODE(26, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie0", "clkreq"), +		 MPP_FUNCTION(0x2, "ge1", "rxd2"), +		 MPP_FUNCTION(0x3, "sd", "d2"), +		 MPP_FUNCTION(0x4, "uart1", "rts"), +		 MPP_FUNCTION(0x5, "spi0", "cs1"), +		 MPP_FUNCTION(0x6, "led", "c1")), +	MPP_MODE(27, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie1", "clkreq"), +		 MPP_FUNCTION(0x2, "ge1", "rxd3"), +		 MPP_FUNCTION(0x3, "sd", "d1"), +		 MPP_FUNCTION(0x4, "uart1", "cts"), +		 MPP_FUNCTION(0x5, "spi0", "miso"), +		 MPP_FUNCTION(0x6, "led", "c2")), +	MPP_MODE(28, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p3"), +		 MPP_FUNCTION(0x2, "ge1", "txctl"), +		 MPP_FUNCTION(0x3, "sd", "clk"), +		 MPP_FUNCTION(0x5, "dram", "vttctrl")), +	MPP_MODE(29, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie1", "clkreq"), +		 MPP_FUNCTION(0x2, "ge1", "rxclk"), +		 MPP_FUNCTION(0x3, "sd", "d3"), +		 MPP_FUNCTION(0x5, "spi0", "sck"), +		 MPP_FUNCTION(0x6, "pcie0", "rstoutn")), +	MPP_MODE(30, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge1", "txd0"), +		 MPP_FUNCTION(0x3, "spi1", "cs0"), +		 MPP_FUNCTION(0x5, "led", "p3"), +		 MPP_FUNCTION(0x6, "ptp", "eventreq")), +	MPP_MODE(31, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge1", "txd1"), +		 MPP_FUNCTION(0x3, "spi1", "mosi"), +		 MPP_FUNCTION(0x5, "led", "p0")), +	MPP_MODE(32, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge1", "txd2"), +		 MPP_FUNCTION(0x3, "spi1", "sck"), +		 MPP_FUNCTION(0x4, "ptp", "triggen"), +		 MPP_FUNCTION(0x5, "led", "c0")), +	MPP_MODE(33, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge1", "txd3"), +		 MPP_FUNCTION(0x3, "spi1", "miso"), +		 MPP_FUNCTION(0x5, "led", "p2")), +	MPP_MODE(34, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge1", "txclkout"), +		 MPP_FUNCTION(0x3, "spi1", "sck"), +		 MPP_FUNCTION(0x5, "led", "c1")), +	MPP_MODE(35, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge1", "rxctl"), +		 MPP_FUNCTION(0x3, "spi1", "cs1"), +		 MPP_FUNCTION(0x4, "spi0", "cs2"), +		 MPP_FUNCTION(0x5, "led", "p1")), +	MPP_MODE(36, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie0", "clkreq"), +		 MPP_FUNCTION(0x5, "led", "c2")), +	MPP_MODE(37, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie0", "clkreq"), +		 MPP_FUNCTION(0x2, "tdm", "intn"), +		 MPP_FUNCTION(0x4, "ge", "mdc")), +	MPP_MODE(38, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie1", "clkreq"), +		 MPP_FUNCTION(0x4, "ge", "mdio")), +	MPP_MODE(39, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x4, "ref", "clkout"), +		 MPP_FUNCTION(0x5, "led", "p3")), +	MPP_MODE(40, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x4, "uart1", "txd"), +		 MPP_FUNCTION(0x5, "led", "p0")), +	MPP_MODE(41, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x4, "uart1", "rxd"), +		 MPP_FUNCTION(0x5, "led", "p1")), +	MPP_MODE(42, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x3, "spi1", "cs2"), +		 MPP_FUNCTION(0x4, "led", "c0"), +		 MPP_FUNCTION(0x6, "ptp", "clk")), +	MPP_MODE(43, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "sata0", "prsnt"), +		 MPP_FUNCTION(0x4, "dram", "vttctrl"), +		 MPP_FUNCTION(0x5, "led", "c1")), +	MPP_MODE(44, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x4, "sata0", "prsnt")), +	MPP_MODE(45, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "spi0", "cs2"), +		 MPP_FUNCTION(0x4, "pcie0", "rstoutn"), +		 MPP_FUNCTION(0x5, "led", "c2"), +		 MPP_FUNCTION(0x6, "spi1", "cs2")), +	MPP_MODE(46, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p0"), +		 MPP_FUNCTION(0x2, "ge0", "txd0"), +		 MPP_FUNCTION(0x3, "ge1", "txd0"), +		 MPP_FUNCTION(0x6, "dev", "wen1")), +	MPP_MODE(47, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p1"), +		 MPP_FUNCTION(0x2, "ge0", "txd1"), +		 MPP_FUNCTION(0x3, "ge1", "txd1"), +		 MPP_FUNCTION(0x5, "ptp", "triggen"), +		 MPP_FUNCTION(0x6, "dev", "ale0")), +	MPP_MODE(48, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p2"), +		 MPP_FUNCTION(0x2, "ge0", "txd2"), +		 MPP_FUNCTION(0x3, "ge1", "txd2"), +		 MPP_FUNCTION(0x6, "dev", "ale1")), +	MPP_MODE(49, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "p3"), +		 MPP_FUNCTION(0x2, "ge0", "txd3"), +		 MPP_FUNCTION(0x3, "ge1", "txd3"), +		 MPP_FUNCTION(0x6, "dev", "a2")), +	MPP_MODE(50, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "c0"), +		 MPP_FUNCTION(0x2, "ge0", "rxd0"), +		 MPP_FUNCTION(0x3, "ge1", "rxd0"), +		 MPP_FUNCTION(0x5, "ptp", "eventreq"), +		 MPP_FUNCTION(0x6, "dev", "ad12")), +	MPP_MODE(51, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "c1"), +		 MPP_FUNCTION(0x2, "ge0", "rxd1"), +		 MPP_FUNCTION(0x3, "ge1", "rxd1"), +		 MPP_FUNCTION(0x6, "dev", "ad8")), +	MPP_MODE(52, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "led", "c2"), +		 MPP_FUNCTION(0x2, "ge0", "rxd2"), +		 MPP_FUNCTION(0x3, "ge1", "rxd2"), +		 MPP_FUNCTION(0x5, "i2c0", "sda"), +		 MPP_FUNCTION(0x6, "dev", "ad9")), +	MPP_MODE(53, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie1", "rstoutn"), +		 MPP_FUNCTION(0x2, "ge0", "rxd3"), +		 MPP_FUNCTION(0x3, "ge1", "rxd3"), +		 MPP_FUNCTION(0x5, "i2c0", "sck"), +		 MPP_FUNCTION(0x6, "dev", "ad10")), +	MPP_MODE(54, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "pcie0", "rstoutn"), +		 MPP_FUNCTION(0x2, "ge0", "rxctl"), +		 MPP_FUNCTION(0x3, "ge1", "rxctl"), +		 MPP_FUNCTION(0x6, "dev", "ad11")), +	MPP_MODE(55, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge0", "rxclk"), +		 MPP_FUNCTION(0x3, "ge1", "rxclk"), +		 MPP_FUNCTION(0x6, "dev", "cs0")), +	MPP_MODE(56, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge0", "txclkout"), +		 MPP_FUNCTION(0x3, "ge1", "txclkout"), +		 MPP_FUNCTION(0x6, "dev", "oe")), +	MPP_MODE(57, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ge0", "txctl"), +		 MPP_FUNCTION(0x3, "ge1", "txctl"), +		 MPP_FUNCTION(0x6, "dev", "wen0")), +	MPP_MODE(58, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x4, "led", "c0")), +	MPP_MODE(59, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x4, "led", "c1")), +	MPP_MODE(60, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "uart1", "txd"), +		 MPP_FUNCTION(0x4, "led", "c2"), +		 MPP_FUNCTION(0x6, "dev", "ad13")), +	MPP_MODE(61, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "i2c1", "sda"), +		 MPP_FUNCTION(0x2, "uart1", "rxd"), +		 MPP_FUNCTION(0x3, "spi1", "cs2"), +		 MPP_FUNCTION(0x4, "led", "p0"), +		 MPP_FUNCTION(0x6, "dev", "ad14")), +	MPP_MODE(62, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "i2c1", "sck"), +		 MPP_FUNCTION(0x4, "led", "p1"), +		 MPP_FUNCTION(0x6, "dev", "ad15")), +	MPP_MODE(63, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ptp", "triggen"), +		 MPP_FUNCTION(0x4, "led", "p2"), +		 MPP_FUNCTION(0x6, "dev", "burst")), +	MPP_MODE(64, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "dram", "vttctrl"), +		 MPP_FUNCTION(0x4, "led", "p3")), +	MPP_MODE(65, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x1, "sata1", "prsnt")), +	MPP_MODE(66, +		 MPP_FUNCTION(0x0, "gpio", NULL), +		 MPP_FUNCTION(0x2, "ptp", "eventreq"), +		 MPP_FUNCTION(0x4, "spi1", "cs3"), +		 MPP_FUNCTION(0x5, "pcie0", "rstoutn"), +		 MPP_FUNCTION(0x6, "dev", "cs3")), +}; + +static struct mvebu_pinctrl_soc_info armada_375_pinctrl_info; + +static struct of_device_id armada_375_pinctrl_of_match[] = { +	{ .compatible = "marvell,mv88f6720-pinctrl" }, +	{ }, +}; + +static struct mvebu_mpp_ctrl mv88f6720_mpp_controls[] = { +	MPP_FUNC_CTRL(0, 69, NULL, armada_375_mpp_ctrl), +}; + +static struct pinctrl_gpio_range mv88f6720_mpp_gpio_ranges[] = { +	MPP_GPIO_RANGE(0,   0,  0, 32), +	MPP_GPIO_RANGE(1,  32, 32, 32), +	MPP_GPIO_RANGE(2,  64, 64,  3), +}; + +static int armada_375_pinctrl_probe(struct platform_device *pdev) +{ +	struct mvebu_pinctrl_soc_info *soc = &armada_375_pinctrl_info; +	struct resource *res; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base); + +	soc->variant = 0; /* no variants for Armada 375 */ +	soc->controls = mv88f6720_mpp_controls; +	soc->ncontrols = ARRAY_SIZE(mv88f6720_mpp_controls); +	soc->modes = mv88f6720_mpp_modes; +	soc->nmodes = ARRAY_SIZE(mv88f6720_mpp_modes); +	soc->gpioranges = mv88f6720_mpp_gpio_ranges; +	soc->ngpioranges = ARRAY_SIZE(mv88f6720_mpp_gpio_ranges); + +	pdev->dev.platform_data = soc; + +	return mvebu_pinctrl_probe(pdev); +} + +static int armada_375_pinctrl_remove(struct platform_device *pdev) +{ +	return mvebu_pinctrl_remove(pdev); +} + +static struct platform_driver armada_375_pinctrl_driver = { +	.driver = { +		.name = "armada-375-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(armada_375_pinctrl_of_match), +	}, +	.probe = armada_375_pinctrl_probe, +	.remove = armada_375_pinctrl_remove, +}; + +module_platform_driver(armada_375_pinctrl_driver); + +MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>"); +MODULE_DESCRIPTION("Marvell Armada 375 pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-38x.c b/drivers/pinctrl/mvebu/pinctrl-armada-38x.c new file mode 100644 index 00000000000..1049f82fb62 --- /dev/null +++ b/drivers/pinctrl/mvebu/pinctrl-armada-38x.c @@ -0,0 +1,462 @@ +/* + * Marvell Armada 380/385 pinctrl driver based on mvebu pinctrl core + * + * Copyright (C) 2013 Marvell + * + * Thomas Petazzoni <thomas.petazzoni@free-electrons.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/module.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 void __iomem *mpp_base; + +static int armada_38x_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	return default_mpp_ctrl_get(mpp_base, pid, config); +} + +static int armada_38x_mpp_ctrl_set(unsigned pid, unsigned long config) +{ +	return default_mpp_ctrl_set(mpp_base, pid, config); +} + +enum { +	V_88F6810 = BIT(0), +	V_88F6820 = BIT(1), +	V_88F6828 = BIT(2), +	V_88F6810_PLUS = (V_88F6810 | V_88F6820 | V_88F6828), +	V_88F6820_PLUS = (V_88F6820 | V_88F6828), +}; + +static struct mvebu_mpp_mode armada_38x_mpp_modes[] = { +	MPP_MODE(0, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ua0",   "rxd",        V_88F6810_PLUS)), +	MPP_MODE(1, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ua0",   "txd",        V_88F6810_PLUS)), +	MPP_MODE(2, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "i2c0",  "sck",        V_88F6810_PLUS)), +	MPP_MODE(3, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "i2c0",  "sda",        V_88F6810_PLUS)), +	MPP_MODE(4, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge",    "mdc",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ua1",   "txd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua0",   "rts",        V_88F6810_PLUS)), +	MPP_MODE(5, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge",    "mdio",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ua1",   "rxd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua0",   "cts",        V_88F6810_PLUS)), +	MPP_MODE(6, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txclkout",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge0",   "crs",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "cs3",        V_88F6810_PLUS)), +	MPP_MODE(7, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txd0",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad9",        V_88F6810_PLUS)), +	MPP_MODE(8, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txd1",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad10",       V_88F6810_PLUS)), +	MPP_MODE(9, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txd2",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad11",       V_88F6810_PLUS)), +	MPP_MODE(10, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txd3",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad12",       V_88F6810_PLUS)), +	MPP_MODE(11, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txctl",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad13",       V_88F6810_PLUS)), +	MPP_MODE(12, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxd0",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "cs1",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad14",       V_88F6810_PLUS)), +	MPP_MODE(13, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxd1",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "pcie0", "clkreq",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "clkreq",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "cs2",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad15",       V_88F6810_PLUS)), +	MPP_MODE(14, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxd2",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ptp",   "clk",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "m",     "vtt_ctrl",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "cs3",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "wen1",       V_88F6810_PLUS)), +	MPP_MODE(15, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxd3",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge",    "mdc slave",  V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "mosi",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "pcie1", "rstout",     V_88F6820_PLUS)), +	MPP_MODE(16, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxctl",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge",    "mdio slave", V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "m",     "decc_err",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "miso",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "pcie0", "clkreq",     V_88F6810_PLUS)), +	MPP_MODE(17, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxclk",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ptp",   "clk",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua1",   "rxd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "sck",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sata1", "prsnt",      V_88F6810_PLUS)), +	MPP_MODE(18, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "rxerr",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ptp",   "trig_gen",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua1",   "txd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi0",  "cs0",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "pcie1", "rstout",     V_88F6820_PLUS)), +	MPP_MODE(19, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "col",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ptp",   "event_req",  V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie0", "clkreq",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sata1", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "ua0",   "cts",        V_88F6810_PLUS)), +	MPP_MODE(20, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ge0",   "txclk",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ptp",   "clk",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "ua0",   "rts",        V_88F6810_PLUS)), +	MPP_MODE(21, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "cs1",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "rxd0",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "cmd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "bootcs",     V_88F6810_PLUS)), +	MPP_MODE(22, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "mosi",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad0",        V_88F6810_PLUS)), +	MPP_MODE(23, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "sck",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad2",        V_88F6810_PLUS)), +	MPP_MODE(24, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "miso",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ua0",   "cts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua1",   "rxd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d4",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ready",      V_88F6810_PLUS)), +	MPP_MODE(25, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "cs0",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ua0",   "rts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua1",   "txd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d5",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "cs0",        V_88F6810_PLUS)), +	MPP_MODE(26, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "cs2",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "i2c1",  "sck",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d6",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "cs1",        V_88F6810_PLUS)), +	MPP_MODE(27, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "spi0",  "cs3",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "txclkout",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "i2c1",  "sda",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d7",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "cs2",        V_88F6810_PLUS)), +	MPP_MODE(28, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "txd0",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "clk",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad5",        V_88F6810_PLUS)), +	MPP_MODE(29, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "txd1",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ale0",       V_88F6810_PLUS)), +	MPP_MODE(30, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "txd2",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "oen",        V_88F6810_PLUS)), +	MPP_MODE(31, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "txd3",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ale1",       V_88F6810_PLUS)), +	MPP_MODE(32, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "txctl",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "wen0",       V_88F6810_PLUS)), +	MPP_MODE(33, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "m",     "decc_err",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad3",        V_88F6810_PLUS)), +	MPP_MODE(34, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad1",        V_88F6810_PLUS)), +	MPP_MODE(35, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ref",   "clk_out1",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "a1",         V_88F6810_PLUS)), +	MPP_MODE(36, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ptp",   "trig_gen",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "a0",         V_88F6810_PLUS)), +	MPP_MODE(37, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ptp",   "clk",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "rxclk",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d3",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad8",        V_88F6810_PLUS)), +	MPP_MODE(38, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ptp",   "event_req",  V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "rxd1",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ref",   "clk_out0",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d0",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad4",        V_88F6810_PLUS)), +	MPP_MODE(39, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "i2c1",  "sck",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "rxd2",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua0",   "cts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d1",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "a2",         V_88F6810_PLUS)), +	MPP_MODE(40, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "i2c1",  "sda",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "rxd3",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua0",   "rts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "sd0",   "d2",         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad6",        V_88F6810_PLUS)), +	MPP_MODE(41, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ua1",   "rxd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge1",   "rxctl",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua0",   "cts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi1",  "cs3",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "burst/last", V_88F6810_PLUS)), +	MPP_MODE(42, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ua1",   "txd",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "ua0",   "rts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "ad7",        V_88F6810_PLUS)), +	MPP_MODE(43, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "pcie0", "clkreq",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "m",     "vtt_ctrl",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "m",     "decc_err",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "dev",   "clkout",     V_88F6810_PLUS)), +	MPP_MODE(44, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "sata1", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "sata2", "prsnt",      V_88F6828), +		 MPP_VAR_FUNCTION(4, "sata3", "prsnt",      V_88F6828), +		 MPP_VAR_FUNCTION(5, "pcie0", "rstout",     V_88F6810_PLUS)), +	MPP_MODE(45, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ref",   "clk_out0",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "pcie2", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "pcie3", "rstout",     V_88F6810_PLUS)), +	MPP_MODE(46, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ref",   "clk_out1",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "pcie2", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "pcie3", "rstout",     V_88F6810_PLUS)), +	MPP_MODE(47, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "sata1", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "sata2", "prsnt",      V_88F6828), +		 MPP_VAR_FUNCTION(4, "spi1",  "cs2",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sata3", "prsnt",      V_88F6828)), +	MPP_MODE(48, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "m",     "vtt_ctrl",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "tdm2c", "pclk",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "audio", "mclk",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d4",         V_88F6810_PLUS)), +	MPP_MODE(49, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "sata2", "prsnt",      V_88F6828), +		 MPP_VAR_FUNCTION(2, "sata3", "prsnt",      V_88F6828), +		 MPP_VAR_FUNCTION(3, "tdm2c", "fsync",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "audio", "lrclk",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d5",         V_88F6810_PLUS)), +	MPP_MODE(50, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(3, "tdm2c", "drx",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "audio", "extclk",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "cmd",        V_88F6810_PLUS)), +	MPP_MODE(51, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "tdm2c", "dtx",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "audio", "sdo",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "m",     "decc_err",   V_88F6810_PLUS)), +	MPP_MODE(52, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(3, "tdm2c", "intn",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "audio", "sdi",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d6",         V_88F6810_PLUS)), +	MPP_MODE(53, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "sata1", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "tdm2c", "rstn",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "audio", "bclk",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d7",         V_88F6810_PLUS)), +	MPP_MODE(54, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "sata0", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "sata1", "prsnt",      V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d3",         V_88F6810_PLUS)), +	MPP_MODE(55, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ua1",   "cts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge",    "mdio",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "clkreq",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "spi1",  "cs1",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d0",         V_88F6810_PLUS)), +	MPP_MODE(56, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "ua1",   "rts",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "ge",    "mdc",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "m",     "decc_err",   V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi1",  "mosi",       V_88F6810_PLUS)), +	MPP_MODE(57, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi1",  "sck",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "clk",        V_88F6810_PLUS)), +	MPP_MODE(58, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "pcie1", "clkreq",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(2, "i2c1",  "sck",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie2", "clkreq",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(4, "spi1",  "miso",       V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d1",         V_88F6810_PLUS)), +	MPP_MODE(59, +		 MPP_VAR_FUNCTION(0, "gpio",  NULL,         V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(1, "pcie0", "rstout",     V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(2, "i2c1",  "sda",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(3, "pcie1", "rstout",     V_88F6820_PLUS), +		 MPP_VAR_FUNCTION(4, "spi1",  "cs0",        V_88F6810_PLUS), +		 MPP_VAR_FUNCTION(5, "sd0",   "d2",         V_88F6810_PLUS)), +}; + +static struct mvebu_pinctrl_soc_info armada_38x_pinctrl_info; + +static struct of_device_id armada_38x_pinctrl_of_match[] = { +	{ +		.compatible = "marvell,mv88f6810-pinctrl", +		.data       = (void *) V_88F6810, +	}, +	{ +		.compatible = "marvell,mv88f6820-pinctrl", +		.data       = (void *) V_88F6820, +	}, +	{ +		.compatible = "marvell,mv88f6828-pinctrl", +		.data       = (void *) V_88F6828, +	}, +	{ }, +}; + +static struct mvebu_mpp_ctrl armada_38x_mpp_controls[] = { +	MPP_FUNC_CTRL(0, 59, NULL, armada_38x_mpp_ctrl), +}; + +static struct pinctrl_gpio_range armada_38x_mpp_gpio_ranges[] = { +	MPP_GPIO_RANGE(0,   0,  0, 32), +	MPP_GPIO_RANGE(1,  32, 32, 27), +}; + +static int armada_38x_pinctrl_probe(struct platform_device *pdev) +{ +	struct mvebu_pinctrl_soc_info *soc = &armada_38x_pinctrl_info; +	const struct of_device_id *match = +		of_match_device(armada_38x_pinctrl_of_match, &pdev->dev); +	struct resource *res; + +	if (!match) +		return -ENODEV; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base); + +	soc->variant = (unsigned) match->data & 0xff; +	soc->controls = armada_38x_mpp_controls; +	soc->ncontrols = ARRAY_SIZE(armada_38x_mpp_controls); +	soc->gpioranges = armada_38x_mpp_gpio_ranges; +	soc->ngpioranges = ARRAY_SIZE(armada_38x_mpp_gpio_ranges); +	soc->modes = armada_38x_mpp_modes; +	soc->nmodes = armada_38x_mpp_controls[0].npins; + +	pdev->dev.platform_data = soc; + +	return mvebu_pinctrl_probe(pdev); +} + +static int armada_38x_pinctrl_remove(struct platform_device *pdev) +{ +	return mvebu_pinctrl_remove(pdev); +} + +static struct platform_driver armada_38x_pinctrl_driver = { +	.driver = { +		.name = "armada-38x-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(armada_38x_pinctrl_of_match), +	}, +	.probe = armada_38x_pinctrl_probe, +	.remove = armada_38x_pinctrl_remove, +}; + +module_platform_driver(armada_38x_pinctrl_driver); + +MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>"); +MODULE_DESCRIPTION("Marvell Armada 38x pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c index ab5dc04b3e8..de311129f7a 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c @@ -33,6 +33,18 @@  #include "pinctrl-mvebu.h" +static void __iomem *mpp_base; + +static int armada_xp_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	return default_mpp_ctrl_get(mpp_base, pid, config); +} + +static int armada_xp_mpp_ctrl_set(unsigned pid, unsigned long config) +{ +	return default_mpp_ctrl_set(mpp_base, pid, config); +} +  enum armada_xp_variant {  	V_MV78230	= BIT(0),  	V_MV78260	= BIT(1), @@ -366,7 +378,7 @@ static struct of_device_id armada_xp_pinctrl_of_match[] = {  };  static struct mvebu_mpp_ctrl mv78230_mpp_controls[] = { -	MPP_REG_CTRL(0, 48), +	MPP_FUNC_CTRL(0, 48, NULL, armada_xp_mpp_ctrl),  };  static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = { @@ -375,7 +387,7 @@ static struct pinctrl_gpio_range mv78230_mpp_gpio_ranges[] = {  };  static struct mvebu_mpp_ctrl mv78260_mpp_controls[] = { -	MPP_REG_CTRL(0, 66), +	MPP_FUNC_CTRL(0, 66, NULL, armada_xp_mpp_ctrl),  };  static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = { @@ -385,7 +397,7 @@ static struct pinctrl_gpio_range mv78260_mpp_gpio_ranges[] = {  };  static struct mvebu_mpp_ctrl mv78460_mpp_controls[] = { -	MPP_REG_CTRL(0, 66), +	MPP_FUNC_CTRL(0, 66, NULL, armada_xp_mpp_ctrl),  };  static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { @@ -399,10 +411,16 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev)  	struct mvebu_pinctrl_soc_info *soc = &armada_xp_pinctrl_info;  	const struct of_device_id *match =  		of_match_device(armada_xp_pinctrl_of_match, &pdev->dev); +	struct resource *res;  	if (!match)  		return -ENODEV; +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base); +  	soc->variant = (unsigned) match->data & 0xff;  	switch (soc->variant) { @@ -455,7 +473,7 @@ static struct platform_driver armada_xp_pinctrl_driver = {  	.driver = {  		.name = "armada-xp-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(armada_xp_pinctrl_of_match), +		.of_match_table = armada_xp_pinctrl_of_match,  	},  	.probe = armada_xp_pinctrl_probe,  	.remove = armada_xp_pinctrl_remove, diff --git a/drivers/pinctrl/mvebu/pinctrl-dove.c b/drivers/pinctrl/mvebu/pinctrl-dove.c index 29f7e4fc7ca..3b022178a56 100644 --- a/drivers/pinctrl/mvebu/pinctrl-dove.c +++ b/drivers/pinctrl/mvebu/pinctrl-dove.c @@ -18,107 +18,122 @@  #include <linux/clk.h>  #include <linux/of.h>  #include <linux/of_device.h> +#include <linux/mfd/syscon.h>  #include <linux/pinctrl/pinctrl.h> +#include <linux/regmap.h>  #include "pinctrl-mvebu.h" -#define DOVE_SB_REGS_VIRT_BASE		IOMEM(0xfde00000) -#define DOVE_MPP_VIRT_BASE		(DOVE_SB_REGS_VIRT_BASE + 0xd0200) -#define DOVE_PMU_MPP_GENERAL_CTRL	(DOVE_MPP_VIRT_BASE + 0x10) -#define  DOVE_AU0_AC97_SEL		BIT(16) -#define DOVE_PMU_SIGNAL_SELECT_0	(DOVE_SB_REGS_VIRT_BASE + 0xd802C) -#define DOVE_PMU_SIGNAL_SELECT_1	(DOVE_SB_REGS_VIRT_BASE + 0xd8030) -#define DOVE_GLOBAL_CONFIG_1		(DOVE_SB_REGS_VIRT_BASE + 0xe802C) -#define DOVE_GLOBAL_CONFIG_1		(DOVE_SB_REGS_VIRT_BASE + 0xe802C) -#define  DOVE_TWSI_ENABLE_OPTION1	BIT(7) -#define DOVE_GLOBAL_CONFIG_2		(DOVE_SB_REGS_VIRT_BASE + 0xe8030) -#define  DOVE_TWSI_ENABLE_OPTION2	BIT(20) -#define  DOVE_TWSI_ENABLE_OPTION3	BIT(21) -#define  DOVE_TWSI_OPTION3_GPIO		BIT(22) -#define DOVE_SSP_CTRL_STATUS_1		(DOVE_SB_REGS_VIRT_BASE + 0xe8034) -#define  DOVE_SSP_ON_AU1		BIT(0) -#define DOVE_MPP_GENERAL_VIRT_BASE	(DOVE_SB_REGS_VIRT_BASE + 0xe803c) -#define  DOVE_AU1_SPDIFO_GPIO_EN	BIT(1) -#define  DOVE_NAND_GPIO_EN		BIT(0) -#define DOVE_GPIO_LO_VIRT_BASE		(DOVE_SB_REGS_VIRT_BASE + 0xd0400) -#define DOVE_MPP_CTRL4_VIRT_BASE	(DOVE_GPIO_LO_VIRT_BASE + 0x40) -#define  DOVE_SPI_GPIO_SEL		BIT(5) -#define  DOVE_UART1_GPIO_SEL		BIT(4) -#define  DOVE_AU1_GPIO_SEL		BIT(3) -#define  DOVE_CAM_GPIO_SEL		BIT(2) -#define  DOVE_SD1_GPIO_SEL		BIT(1) -#define  DOVE_SD0_GPIO_SEL		BIT(0) - -#define MPPS_PER_REG	8 -#define MPP_BITS	4 -#define MPP_MASK	0xf +/* Internal registers can be configured at any 1 MiB aligned address */ +#define INT_REGS_MASK		~(SZ_1M - 1) +#define MPP4_REGS_OFFS		0xd0440 +#define PMU_REGS_OFFS		0xd802c +#define GC_REGS_OFFS		0xe802c + +/* MPP Base registers */ +#define PMU_MPP_GENERAL_CTRL	0x10 +#define  AU0_AC97_SEL		BIT(16) + +/* MPP Control 4 register */ +#define SPI_GPIO_SEL		BIT(5) +#define UART1_GPIO_SEL		BIT(4) +#define AU1_GPIO_SEL		BIT(3) +#define CAM_GPIO_SEL		BIT(2) +#define SD1_GPIO_SEL		BIT(1) +#define SD0_GPIO_SEL		BIT(0) + +/* PMU Signal Select registers */ +#define PMU_SIGNAL_SELECT_0	0x00 +#define PMU_SIGNAL_SELECT_1	0x04 + +/* Global Config regmap registers */ +#define GLOBAL_CONFIG_1		0x00 +#define  TWSI_ENABLE_OPTION1	BIT(7) +#define GLOBAL_CONFIG_2		0x04 +#define  TWSI_ENABLE_OPTION2	BIT(20) +#define  TWSI_ENABLE_OPTION3	BIT(21) +#define  TWSI_OPTION3_GPIO	BIT(22) +#define SSP_CTRL_STATUS_1	0x08 +#define  SSP_ON_AU1		BIT(0) +#define MPP_GENERAL_CONFIG	0x10 +#define  AU1_SPDIFO_GPIO_EN	BIT(1) +#define  NAND_GPIO_EN		BIT(0)  #define CONFIG_PMU	BIT(4) -static int dove_pmu_mpp_ctrl_get(struct mvebu_mpp_ctrl *ctrl, -				 unsigned long *config) +static void __iomem *mpp_base; +static void __iomem *mpp4_base; +static void __iomem *pmu_base; +static struct regmap *gconfmap; + +static int dove_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	return default_mpp_ctrl_get(mpp_base, pid, config); +} + +static int dove_mpp_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned off = (ctrl->pid / MPPS_PER_REG) * MPP_BITS; -	unsigned shift = (ctrl->pid % MPPS_PER_REG) * MPP_BITS; -	unsigned long pmu = readl(DOVE_PMU_MPP_GENERAL_CTRL); +	return default_mpp_ctrl_set(mpp_base, pid, config); +} + +static int dove_pmu_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL);  	unsigned long func; -	if (pmu & (1 << ctrl->pid)) { -		func = readl(DOVE_PMU_SIGNAL_SELECT_0 + off); -		*config = (func >> shift) & MPP_MASK; -		*config |= CONFIG_PMU; -	} else { -		func = readl(DOVE_MPP_VIRT_BASE + off); -		*config = (func >> shift) & MPP_MASK; -	} +	if ((pmu & BIT(pid)) == 0) +		return default_mpp_ctrl_get(mpp_base, pid, config); + +	func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off); +	*config = (func >> shift) & MVEBU_MPP_MASK; +	*config |= CONFIG_PMU; +  	return 0;  } -static int dove_pmu_mpp_ctrl_set(struct mvebu_mpp_ctrl *ctrl, -				 unsigned long config) +static int dove_pmu_mpp_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned off = (ctrl->pid / MPPS_PER_REG) * MPP_BITS; -	unsigned shift = (ctrl->pid % MPPS_PER_REG) * MPP_BITS; -	unsigned long pmu = readl(DOVE_PMU_MPP_GENERAL_CTRL); +	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL);  	unsigned long func; -	if (config & CONFIG_PMU) { -		writel(pmu | (1 << ctrl->pid), DOVE_PMU_MPP_GENERAL_CTRL); -		func = readl(DOVE_PMU_SIGNAL_SELECT_0 + off); -		func &= ~(MPP_MASK << shift); -		func |= (config & MPP_MASK) << shift; -		writel(func, DOVE_PMU_SIGNAL_SELECT_0 + off); -	} else { -		writel(pmu & ~(1 << ctrl->pid), DOVE_PMU_MPP_GENERAL_CTRL); -		func = readl(DOVE_MPP_VIRT_BASE + off); -		func &= ~(MPP_MASK << shift); -		func |= (config & MPP_MASK) << shift; -		writel(func, DOVE_MPP_VIRT_BASE + off); +	if ((config & CONFIG_PMU) == 0) { +		writel(pmu & ~BIT(pid), mpp_base + PMU_MPP_GENERAL_CTRL); +		return default_mpp_ctrl_set(mpp_base, pid, config);  	} + +	writel(pmu | BIT(pid), mpp_base + PMU_MPP_GENERAL_CTRL); +	func = readl(pmu_base + PMU_SIGNAL_SELECT_0 + off); +	func &= ~(MVEBU_MPP_MASK << shift); +	func |= (config & MVEBU_MPP_MASK) << shift; +	writel(func, pmu_base + PMU_SIGNAL_SELECT_0 + off); +  	return 0;  } -static int dove_mpp4_ctrl_get(struct mvebu_mpp_ctrl *ctrl, -			      unsigned long *config) +static int dove_mpp4_ctrl_get(unsigned pid, unsigned long *config)  { -	unsigned long mpp4 = readl(DOVE_MPP_CTRL4_VIRT_BASE); +	unsigned long mpp4 = readl(mpp4_base);  	unsigned long mask; -	switch (ctrl->pid) { +	switch (pid) {  	case 24: /* mpp_camera */ -		mask = DOVE_CAM_GPIO_SEL; +		mask = CAM_GPIO_SEL;  		break;  	case 40: /* mpp_sdio0 */ -		mask = DOVE_SD0_GPIO_SEL; +		mask = SD0_GPIO_SEL;  		break;  	case 46: /* mpp_sdio1 */ -		mask = DOVE_SD1_GPIO_SEL; +		mask = SD1_GPIO_SEL;  		break;  	case 58: /* mpp_spi0 */ -		mask = DOVE_SPI_GPIO_SEL; +		mask = SPI_GPIO_SEL;  		break;  	case 62: /* mpp_uart1 */ -		mask = DOVE_UART1_GPIO_SEL; +		mask = UART1_GPIO_SEL;  		break;  	default:  		return -EINVAL; @@ -129,27 +144,26 @@ static int dove_mpp4_ctrl_get(struct mvebu_mpp_ctrl *ctrl,  	return 0;  } -static int dove_mpp4_ctrl_set(struct mvebu_mpp_ctrl *ctrl, -			      unsigned long config) +static int dove_mpp4_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned long mpp4 = readl(DOVE_MPP_CTRL4_VIRT_BASE); +	unsigned long mpp4 = readl(mpp4_base);  	unsigned long mask; -	switch (ctrl->pid) { +	switch (pid) {  	case 24: /* mpp_camera */ -		mask = DOVE_CAM_GPIO_SEL; +		mask = CAM_GPIO_SEL;  		break;  	case 40: /* mpp_sdio0 */ -		mask = DOVE_SD0_GPIO_SEL; +		mask = SD0_GPIO_SEL;  		break;  	case 46: /* mpp_sdio1 */ -		mask = DOVE_SD1_GPIO_SEL; +		mask = SD1_GPIO_SEL;  		break;  	case 58: /* mpp_spi0 */ -		mask = DOVE_SPI_GPIO_SEL; +		mask = SPI_GPIO_SEL;  		break;  	case 62: /* mpp_uart1 */ -		mask = DOVE_UART1_GPIO_SEL; +		mask = UART1_GPIO_SEL;  		break;  	default:  		return -EINVAL; @@ -159,74 +173,69 @@ static int dove_mpp4_ctrl_set(struct mvebu_mpp_ctrl *ctrl,  	if (config)  		mpp4 |= mask; -	writel(mpp4, DOVE_MPP_CTRL4_VIRT_BASE); +	writel(mpp4, mpp4_base);  	return 0;  } -static int dove_nand_ctrl_get(struct mvebu_mpp_ctrl *ctrl, -			      unsigned long *config) +static int dove_nand_ctrl_get(unsigned pid, unsigned long *config)  { -	unsigned long gmpp = readl(DOVE_MPP_GENERAL_VIRT_BASE); +	unsigned int gmpp; -	*config = ((gmpp & DOVE_NAND_GPIO_EN) != 0); +	regmap_read(gconfmap, MPP_GENERAL_CONFIG, &gmpp); +	*config = ((gmpp & NAND_GPIO_EN) != 0);  	return 0;  } -static int dove_nand_ctrl_set(struct mvebu_mpp_ctrl *ctrl, -			      unsigned long config) +static int dove_nand_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned long gmpp = readl(DOVE_MPP_GENERAL_VIRT_BASE); - -	gmpp &= ~DOVE_NAND_GPIO_EN; -	if (config) -		gmpp |= DOVE_NAND_GPIO_EN; - -	writel(gmpp, DOVE_MPP_GENERAL_VIRT_BASE); - +	regmap_update_bits(gconfmap, MPP_GENERAL_CONFIG, +			   NAND_GPIO_EN, +			   (config) ? NAND_GPIO_EN : 0);  	return 0;  } -static int dove_audio0_ctrl_get(struct mvebu_mpp_ctrl *ctrl, -				unsigned long *config) +static int dove_audio0_ctrl_get(unsigned pid, unsigned long *config)  { -	unsigned long pmu = readl(DOVE_PMU_MPP_GENERAL_CTRL); +	unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL); -	*config = ((pmu & DOVE_AU0_AC97_SEL) != 0); +	*config = ((pmu & AU0_AC97_SEL) != 0);  	return 0;  } -static int dove_audio0_ctrl_set(struct mvebu_mpp_ctrl *ctrl, -				unsigned long config) +static int dove_audio0_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned long pmu = readl(DOVE_PMU_MPP_GENERAL_CTRL); +	unsigned long pmu = readl(mpp_base + PMU_MPP_GENERAL_CTRL); -	pmu &= ~DOVE_AU0_AC97_SEL; +	pmu &= ~AU0_AC97_SEL;  	if (config) -		pmu |= DOVE_AU0_AC97_SEL; -	writel(pmu, DOVE_PMU_MPP_GENERAL_CTRL); +		pmu |= AU0_AC97_SEL; +	writel(pmu, mpp_base + PMU_MPP_GENERAL_CTRL);  	return 0;  } -static int dove_audio1_ctrl_get(struct mvebu_mpp_ctrl *ctrl, -				unsigned long *config) +static int dove_audio1_ctrl_get(unsigned pid, unsigned long *config)  { -	unsigned long mpp4 = readl(DOVE_MPP_CTRL4_VIRT_BASE); -	unsigned long sspc1 = readl(DOVE_SSP_CTRL_STATUS_1); -	unsigned long gmpp = readl(DOVE_MPP_GENERAL_VIRT_BASE); -	unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); +	unsigned int mpp4 = readl(mpp4_base); +	unsigned int sspc1; +	unsigned int gmpp; +	unsigned int gcfg2; + +	regmap_read(gconfmap, SSP_CTRL_STATUS_1, &sspc1); +	regmap_read(gconfmap, MPP_GENERAL_CONFIG, &gmpp); +	regmap_read(gconfmap, GLOBAL_CONFIG_2, &gcfg2);  	*config = 0; -	if (mpp4 & DOVE_AU1_GPIO_SEL) +	if (mpp4 & AU1_GPIO_SEL)  		*config |= BIT(3); -	if (sspc1 & DOVE_SSP_ON_AU1) +	if (sspc1 & SSP_ON_AU1)  		*config |= BIT(2); -	if (gmpp & DOVE_AU1_SPDIFO_GPIO_EN) +	if (gmpp & AU1_SPDIFO_GPIO_EN)  		*config |= BIT(1); -	if (gcfg2 & DOVE_TWSI_OPTION3_GPIO) +	if (gcfg2 & TWSI_OPTION3_GPIO)  		*config |= BIT(0);  	/* SSP/TWSI only if I2S1 not set*/ @@ -238,35 +247,24 @@ static int dove_audio1_ctrl_get(struct mvebu_mpp_ctrl *ctrl,  	return 0;  } -static int dove_audio1_ctrl_set(struct mvebu_mpp_ctrl *ctrl, -				unsigned long config) +static int dove_audio1_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned long mpp4 = readl(DOVE_MPP_CTRL4_VIRT_BASE); -	unsigned long sspc1 = readl(DOVE_SSP_CTRL_STATUS_1); -	unsigned long gmpp = readl(DOVE_MPP_GENERAL_VIRT_BASE); -	unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); +	unsigned int mpp4 = readl(mpp4_base); -	/* -	 * clear all audio1 related bits before configure -	 */ -	gcfg2 &= ~DOVE_TWSI_OPTION3_GPIO; -	gmpp &= ~DOVE_AU1_SPDIFO_GPIO_EN; -	sspc1 &= ~DOVE_SSP_ON_AU1; -	mpp4 &= ~DOVE_AU1_GPIO_SEL; - -	if (config & BIT(0)) -		gcfg2 |= DOVE_TWSI_OPTION3_GPIO; -	if (config & BIT(1)) -		gmpp |= DOVE_AU1_SPDIFO_GPIO_EN; -	if (config & BIT(2)) -		sspc1 |= DOVE_SSP_ON_AU1; +	mpp4 &= ~AU1_GPIO_SEL;  	if (config & BIT(3)) -		mpp4 |= DOVE_AU1_GPIO_SEL; - -	writel(mpp4, DOVE_MPP_CTRL4_VIRT_BASE); -	writel(sspc1, DOVE_SSP_CTRL_STATUS_1); -	writel(gmpp, DOVE_MPP_GENERAL_VIRT_BASE); -	writel(gcfg2, DOVE_GLOBAL_CONFIG_2); +		mpp4 |= AU1_GPIO_SEL; +	writel(mpp4, mpp4_base); + +	regmap_update_bits(gconfmap, SSP_CTRL_STATUS_1, +			   SSP_ON_AU1, +			   (config & BIT(2)) ? SSP_ON_AU1 : 0); +	regmap_update_bits(gconfmap, MPP_GENERAL_CONFIG, +			   AU1_SPDIFO_GPIO_EN, +			   (config & BIT(1)) ? AU1_SPDIFO_GPIO_EN : 0); +	regmap_update_bits(gconfmap, GLOBAL_CONFIG_2, +			   TWSI_OPTION3_GPIO, +			   (config & BIT(0)) ? TWSI_OPTION3_GPIO : 0);  	return 0;  } @@ -276,11 +274,11 @@ static int dove_audio1_ctrl_set(struct mvebu_mpp_ctrl *ctrl,   * break other functions. If you require all mpps as gpio   * enforce gpio setting by pinctrl mapping.   */ -static int dove_audio1_ctrl_gpio_req(struct mvebu_mpp_ctrl *ctrl, u8 pid) +static int dove_audio1_ctrl_gpio_req(unsigned pid)  {  	unsigned long config; -	dove_audio1_ctrl_get(ctrl, &config); +	dove_audio1_ctrl_get(pid, &config);  	switch (config) {  	case 0x02: /* i2s1 : gpio[56:57] */ @@ -303,76 +301,62 @@ static int dove_audio1_ctrl_gpio_req(struct mvebu_mpp_ctrl *ctrl, u8 pid)  }  /* mpp[52:57] has gpio pins capable of in and out */ -static int dove_audio1_ctrl_gpio_dir(struct mvebu_mpp_ctrl *ctrl, u8 pid, -				bool input) +static int dove_audio1_ctrl_gpio_dir(unsigned pid, bool input)  {  	if (pid < 52 || pid > 57)  		return -ENOTSUPP;  	return 0;  } -static int dove_twsi_ctrl_get(struct mvebu_mpp_ctrl *ctrl, -			      unsigned long *config) +static int dove_twsi_ctrl_get(unsigned pid, unsigned long *config)  { -	unsigned long gcfg1 = readl(DOVE_GLOBAL_CONFIG_1); -	unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); +	unsigned int gcfg1; +	unsigned int gcfg2; + +	regmap_read(gconfmap, GLOBAL_CONFIG_1, &gcfg1); +	regmap_read(gconfmap, GLOBAL_CONFIG_2, &gcfg2);  	*config = 0; -	if (gcfg1 & DOVE_TWSI_ENABLE_OPTION1) +	if (gcfg1 & TWSI_ENABLE_OPTION1)  		*config = 1; -	else if (gcfg2 & DOVE_TWSI_ENABLE_OPTION2) +	else if (gcfg2 & TWSI_ENABLE_OPTION2)  		*config = 2; -	else if (gcfg2 & DOVE_TWSI_ENABLE_OPTION3) +	else if (gcfg2 & TWSI_ENABLE_OPTION3)  		*config = 3;  	return 0;  } -static int dove_twsi_ctrl_set(struct mvebu_mpp_ctrl *ctrl, -				unsigned long config) +static int dove_twsi_ctrl_set(unsigned pid, unsigned long config)  { -	unsigned long gcfg1 = readl(DOVE_GLOBAL_CONFIG_1); -	unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); - -	gcfg1 &= ~DOVE_TWSI_ENABLE_OPTION1; -	gcfg2 &= ~(DOVE_TWSI_ENABLE_OPTION2 | DOVE_TWSI_ENABLE_OPTION2); +	unsigned int gcfg1 = 0; +	unsigned int gcfg2 = 0;  	switch (config) {  	case 1: -		gcfg1 |= DOVE_TWSI_ENABLE_OPTION1; +		gcfg1 = TWSI_ENABLE_OPTION1;  		break;  	case 2: -		gcfg2 |= DOVE_TWSI_ENABLE_OPTION2; +		gcfg2 = TWSI_ENABLE_OPTION2;  		break;  	case 3: -		gcfg2 |= DOVE_TWSI_ENABLE_OPTION3; +		gcfg2 = TWSI_ENABLE_OPTION3;  		break;  	} -	writel(gcfg1, DOVE_GLOBAL_CONFIG_1); -	writel(gcfg2, DOVE_GLOBAL_CONFIG_2); +	regmap_update_bits(gconfmap, GLOBAL_CONFIG_1, +			   TWSI_ENABLE_OPTION1, +			   gcfg1); +	regmap_update_bits(gconfmap, GLOBAL_CONFIG_2, +			   TWSI_ENABLE_OPTION2 | TWSI_ENABLE_OPTION3, +			   gcfg2);  	return 0;  }  static struct mvebu_mpp_ctrl dove_mpp_controls[] = { -	MPP_FUNC_CTRL(0, 0, "mpp0", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(1, 1, "mpp1", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(2, 2, "mpp2", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(3, 3, "mpp3", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(4, 4, "mpp4", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(5, 5, "mpp5", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(6, 6, "mpp6", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(7, 7, "mpp7", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(8, 8, "mpp8", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(9, 9, "mpp9", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(10, 10, "mpp10", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(11, 11, "mpp11", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(12, 12, "mpp12", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(13, 13, "mpp13", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(14, 14, "mpp14", dove_pmu_mpp_ctrl), -	MPP_FUNC_CTRL(15, 15, "mpp15", dove_pmu_mpp_ctrl), -	MPP_REG_CTRL(16, 23), +	MPP_FUNC_CTRL(0, 15, NULL, dove_pmu_mpp_ctrl), +	MPP_FUNC_CTRL(16, 23, NULL, dove_mpp_ctrl),  	MPP_FUNC_CTRL(24, 39, "mpp_camera", dove_mpp4_ctrl),  	MPP_FUNC_CTRL(40, 45, "mpp_sdio0", dove_mpp4_ctrl),  	MPP_FUNC_CTRL(46, 51, "mpp_sdio1", dove_mpp4_ctrl), @@ -772,8 +756,17 @@ static struct of_device_id dove_pinctrl_of_match[] = {  	{ }  }; +static struct regmap_config gc_regmap_config = { +	.reg_bits = 32, +	.val_bits = 32, +	.reg_stride = 4, +	.max_register = 5, +}; +  static int dove_pinctrl_probe(struct platform_device *pdev)  { +	struct resource *res, *mpp_res; +	struct resource fb_res;  	const struct of_device_id *match =  		of_match_device(dove_pinctrl_of_match, &pdev->dev);  	pdev->dev.platform_data = (void *)match->data; @@ -789,6 +782,59 @@ static int dove_pinctrl_probe(struct platform_device *pdev)  	}  	clk_prepare_enable(clk); +	mpp_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, mpp_res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base); + +	/* prepare fallback resource */ +	memcpy(&fb_res, mpp_res, sizeof(struct resource)); +	fb_res.start = 0; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 1); +	if (!res) { +		dev_warn(&pdev->dev, "falling back to hardcoded MPP4 resource\n"); +		adjust_resource(&fb_res, +			(mpp_res->start & INT_REGS_MASK) + MPP4_REGS_OFFS, 0x4); +		res = &fb_res; +	} + +	mpp4_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp4_base)) +		return PTR_ERR(mpp4_base); + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 2); +	if (!res) { +		dev_warn(&pdev->dev, "falling back to hardcoded PMU resource\n"); +		adjust_resource(&fb_res, +			(mpp_res->start & INT_REGS_MASK) + PMU_REGS_OFFS, 0x8); +		res = &fb_res; +	} + +	pmu_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(pmu_base)) +		return PTR_ERR(pmu_base); + +	gconfmap = syscon_regmap_lookup_by_compatible("marvell,dove-global-config"); +	if (IS_ERR(gconfmap)) { +		void __iomem *gc_base; + +		dev_warn(&pdev->dev, "falling back to hardcoded global registers\n"); +		adjust_resource(&fb_res, +			(mpp_res->start & INT_REGS_MASK) + GC_REGS_OFFS, 0x14); +		gc_base = devm_ioremap_resource(&pdev->dev, &fb_res); +		if (IS_ERR(gc_base)) +			return PTR_ERR(gc_base); +		gconfmap = devm_regmap_init_mmio(&pdev->dev, +						 gc_base, &gc_regmap_config); +		if (IS_ERR(gconfmap)) +			return PTR_ERR(gconfmap); +	} + +	/* Warn on any missing DT resource */ +	if (fb_res.start) +		dev_warn(&pdev->dev, FW_BUG "Missing pinctrl regs in DTB. Please update your firmware.\n"); +  	return mvebu_pinctrl_probe(pdev);  } @@ -806,7 +852,7 @@ static struct platform_driver dove_pinctrl_driver = {  	.driver = {  		.name = "dove-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(dove_pinctrl_of_match), +		.of_match_table = dove_pinctrl_of_match,  	},  	.probe = dove_pinctrl_probe,  	.remove = dove_pinctrl_remove, diff --git a/drivers/pinctrl/mvebu/pinctrl-kirkwood.c b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c index cdd483df673..0d0211a1a0b 100644 --- a/drivers/pinctrl/mvebu/pinctrl-kirkwood.c +++ b/drivers/pinctrl/mvebu/pinctrl-kirkwood.c @@ -21,6 +21,18 @@  #include "pinctrl-mvebu.h" +static void __iomem *mpp_base; + +static int kirkwood_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	return default_mpp_ctrl_get(mpp_base, pid, config); +} + +static int kirkwood_mpp_ctrl_set(unsigned pid, unsigned long config) +{ +	return default_mpp_ctrl_set(mpp_base, pid, config); +} +  #define V(f6180, f6190, f6192, f6281, f6282, dx4122)	\  	((f6180 << 0) | (f6190 << 1) | (f6192 << 2) |	\  	 (f6281 << 3) | (f6282 << 4) | (dx4122 << 5)) @@ -359,7 +371,7 @@ static struct mvebu_mpp_mode mv88f6xxx_mpp_modes[] = {  };  static struct mvebu_mpp_ctrl mv88f6180_mpp_controls[] = { -	MPP_REG_CTRL(0, 29), +	MPP_FUNC_CTRL(0, 29, NULL, kirkwood_mpp_ctrl),  };  static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = { @@ -367,7 +379,7 @@ static struct pinctrl_gpio_range mv88f6180_gpio_ranges[] = {  };  static struct mvebu_mpp_ctrl mv88f619x_mpp_controls[] = { -	MPP_REG_CTRL(0, 35), +	MPP_FUNC_CTRL(0, 35, NULL, kirkwood_mpp_ctrl),  };  static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = { @@ -376,7 +388,7 @@ static struct pinctrl_gpio_range mv88f619x_gpio_ranges[] = {  };  static struct mvebu_mpp_ctrl mv88f628x_mpp_controls[] = { -	MPP_REG_CTRL(0, 49), +	MPP_FUNC_CTRL(0, 49, NULL, kirkwood_mpp_ctrl),  };  static struct pinctrl_gpio_range mv88f628x_gpio_ranges[] = { @@ -456,9 +468,16 @@ static struct of_device_id kirkwood_pinctrl_of_match[] = {  static int kirkwood_pinctrl_probe(struct platform_device *pdev)  { +	struct resource *res;  	const struct of_device_id *match =  		of_match_device(kirkwood_pinctrl_of_match, &pdev->dev);  	pdev->dev.platform_data = (void *)match->data; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base); +  	return mvebu_pinctrl_probe(pdev);  } @@ -471,7 +490,7 @@ static struct platform_driver kirkwood_pinctrl_driver = {  	.driver = {  		.name = "kirkwood-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(kirkwood_pinctrl_of_match), +		.of_match_table = kirkwood_pinctrl_of_match,  	},  	.probe = kirkwood_pinctrl_probe,  	.remove = kirkwood_pinctrl_remove, diff --git a/drivers/pinctrl/mvebu/pinctrl-mvebu.c b/drivers/pinctrl/mvebu/pinctrl-mvebu.c index 0fd1ad31fbf..9908374f8f9 100644 --- a/drivers/pinctrl/mvebu/pinctrl-mvebu.c +++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.c @@ -50,7 +50,6 @@ struct mvebu_pinctrl {  	struct device *dev;  	struct pinctrl_dev *pctldev;  	struct pinctrl_desc desc; -	void __iomem *base;  	struct mvebu_pinctrl_group *groups;  	unsigned num_groups;  	struct mvebu_pinctrl_function *functions; @@ -138,43 +137,6 @@ static struct mvebu_pinctrl_function *mvebu_pinctrl_find_function_by_name(  	return NULL;  } -/* - * Common mpp pin configuration registers on MVEBU are - * registers of eight 4-bit values for each mpp setting. - * Register offset and bit mask are calculated accordingly below. - */ -static int mvebu_common_mpp_get(struct mvebu_pinctrl *pctl, -				struct mvebu_pinctrl_group *grp, -				unsigned long *config) -{ -	unsigned pin = grp->gid; -	unsigned off = (pin / MPPS_PER_REG) * MPP_BITS; -	unsigned shift = (pin % MPPS_PER_REG) * MPP_BITS; - -	*config = readl(pctl->base + off); -	*config >>= shift; -	*config &= MPP_MASK; - -	return 0; -} - -static int mvebu_common_mpp_set(struct mvebu_pinctrl *pctl, -				struct mvebu_pinctrl_group *grp, -				unsigned long config) -{ -	unsigned pin = grp->gid; -	unsigned off = (pin / MPPS_PER_REG) * MPP_BITS; -	unsigned shift = (pin % MPPS_PER_REG) * MPP_BITS; -	unsigned long reg; - -	reg = readl(pctl->base + off); -	reg &= ~(MPP_MASK << shift); -	reg |= (config << shift); -	writel(reg, pctl->base + off); - -	return 0; -} -  static int mvebu_pinconf_group_get(struct pinctrl_dev *pctldev,  				unsigned gid, unsigned long *config)  { @@ -184,10 +146,7 @@ static int mvebu_pinconf_group_get(struct pinctrl_dev *pctldev,  	if (!grp->ctrl)  		return -EINVAL; -	if (grp->ctrl->mpp_get) -		return grp->ctrl->mpp_get(grp->ctrl, config); - -	return mvebu_common_mpp_get(pctl, grp, config); +	return grp->ctrl->mpp_get(grp->pins[0], config);  }  static int mvebu_pinconf_group_set(struct pinctrl_dev *pctldev, @@ -202,11 +161,7 @@ static int mvebu_pinconf_group_set(struct pinctrl_dev *pctldev,  		return -EINVAL;  	for (i = 0; i < num_configs; i++) { -		if (grp->ctrl->mpp_set) -			ret = grp->ctrl->mpp_set(grp->ctrl, configs[i]); -		else -			ret = mvebu_common_mpp_set(pctl, grp, configs[i]); - +		ret = grp->ctrl->mpp_set(grp->pins[0], configs[i]);  		if (ret)  			return ret;  	} /* for each config */ @@ -347,7 +302,7 @@ static int mvebu_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,  		return -EINVAL;  	if (grp->ctrl->mpp_gpio_req) -		return grp->ctrl->mpp_gpio_req(grp->ctrl, offset); +		return grp->ctrl->mpp_gpio_req(offset);  	setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);  	if (!setting) @@ -370,7 +325,7 @@ static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,  		return -EINVAL;  	if (grp->ctrl->mpp_gpio_dir) -		return grp->ctrl->mpp_gpio_dir(grp->ctrl, offset, input); +		return grp->ctrl->mpp_gpio_dir(offset, input);  	setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);  	if (!setting) @@ -593,11 +548,12 @@ static int mvebu_pinctrl_build_functions(struct platform_device *pdev,  int mvebu_pinctrl_probe(struct platform_device *pdev)  {  	struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev); -	struct resource *res;  	struct mvebu_pinctrl *pctl; -	void __iomem *base;  	struct pinctrl_pin_desc *pdesc;  	unsigned gid, n, k; +	unsigned size, noname = 0; +	char *noname_buf; +	void *p;  	int ret;  	if (!soc || !soc->controls || !soc->modes) { @@ -605,11 +561,6 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)  		return -EINVAL;  	} -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	base = devm_ioremap_resource(&pdev->dev, res); -	if (IS_ERR(base)) -		return PTR_ERR(base); -  	pctl = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pinctrl),  			GFP_KERNEL);  	if (!pctl) { @@ -623,7 +574,6 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)  	pctl->desc.pmxops = &mvebu_pinmux_ops;  	pctl->desc.confops = &mvebu_pinconf_ops;  	pctl->variant = soc->variant; -	pctl->base = base;  	pctl->dev = &pdev->dev;  	platform_set_drvdata(pdev, pctl); @@ -633,33 +583,23 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)  	pctl->desc.npins = 0;  	for (n = 0; n < soc->ncontrols; n++) {  		struct mvebu_mpp_ctrl *ctrl = &soc->controls[n]; -		char *names;  		pctl->desc.npins += ctrl->npins; -		/* initial control pins */ +		/* initialize control's pins[] array */  		for (k = 0; k < ctrl->npins; k++)  			ctrl->pins[k] = ctrl->pid + k; -		/* special soc specific control */ -		if (ctrl->mpp_get || ctrl->mpp_set) { -			if (!ctrl->name || !ctrl->mpp_get || !ctrl->mpp_set) { -				dev_err(&pdev->dev, "wrong soc control info\n"); -				return -EINVAL; -			} +		/* +		 * We allow to pass controls with NULL name that we treat +		 * as a range of one-pin groups with generic mvebu register +		 * controls. +		 */ +		if (!ctrl->name) { +			pctl->num_groups += ctrl->npins; +			noname += ctrl->npins; +		} else {  			pctl->num_groups += 1; -			continue;  		} - -		/* generic mvebu register control */ -		names = devm_kzalloc(&pdev->dev, ctrl->npins * 8, GFP_KERNEL); -		if (!names) { -			dev_err(&pdev->dev, "failed to alloc mpp names\n"); -			return -ENOMEM; -		} -		for (k = 0; k < ctrl->npins; k++) -			sprintf(names + 8*k, "mpp%d", ctrl->pid+k); -		ctrl->name = names; -		pctl->num_groups += ctrl->npins;  	}  	pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins * @@ -673,12 +613,17 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)  		pdesc[n].number = n;  	pctl->desc.pins = pdesc; -	pctl->groups = devm_kzalloc(&pdev->dev, pctl->num_groups * -			     sizeof(struct mvebu_pinctrl_group), GFP_KERNEL); -	if (!pctl->groups) { -		dev_err(&pdev->dev, "failed to alloc pinctrl groups\n"); +	/* +	 * allocate groups and name buffers for unnamed groups. +	 */ +	size = pctl->num_groups * sizeof(*pctl->groups) + noname * 8; +	p = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); +	if (!p) { +		dev_err(&pdev->dev, "failed to alloc group data\n");  		return -ENOMEM;  	} +	pctl->groups = p; +	noname_buf = p + pctl->num_groups * sizeof(*pctl->groups);  	/* assign mpp controls to groups */  	gid = 0; @@ -690,17 +635,26 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)  		pctl->groups[gid].pins = ctrl->pins;  		pctl->groups[gid].npins = ctrl->npins; -		/* generic mvebu register control maps to a number of groups */ -		if (!ctrl->mpp_get && !ctrl->mpp_set) { +		/* +		 * We treat unnamed controls as a range of one-pin groups +		 * with generic mvebu register controls. Use one group for +		 * each in this range and assign a default group name. +		 */ +		if (!ctrl->name) { +			pctl->groups[gid].name = noname_buf;  			pctl->groups[gid].npins = 1; +			sprintf(noname_buf, "mpp%d", ctrl->pid+0); +			noname_buf += 8;  			for (k = 1; k < ctrl->npins; k++) {  				gid++;  				pctl->groups[gid].gid = gid;  				pctl->groups[gid].ctrl = ctrl; -				pctl->groups[gid].name = &ctrl->name[8*k]; +				pctl->groups[gid].name = noname_buf;  				pctl->groups[gid].pins = &ctrl->pins[k];  				pctl->groups[gid].npins = 1; +				sprintf(noname_buf, "mpp%d", ctrl->pid+k); +				noname_buf += 8;  			}  		}  		gid++; diff --git a/drivers/pinctrl/mvebu/pinctrl-mvebu.h b/drivers/pinctrl/mvebu/pinctrl-mvebu.h index 90bd3beee86..65a98e6f726 100644 --- a/drivers/pinctrl/mvebu/pinctrl-mvebu.h +++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.h @@ -28,20 +28,19 @@   * between two or more different settings, e.g. assign mpp pin 13 to   * uart1 or sata.   * - * If optional mpp_get/_set functions are set these are used to get/set - * a specific mode. Otherwise it is assumed that the mpp control is based - * on 4-bit groups in subsequent registers. The optional mpp_gpio_req/_dir - * functions can be used to allow pin settings with varying gpio pins. + * The mpp_get/_set functions are mandatory and are used to get/set a + * specific mode. The optional mpp_gpio_req/_dir functions can be used + * to allow pin settings with varying gpio pins.   */  struct mvebu_mpp_ctrl {  	const char *name;  	u8 pid;  	u8 npins;  	unsigned *pins; -	int (*mpp_get)(struct mvebu_mpp_ctrl *ctrl, unsigned long *config); -	int (*mpp_set)(struct mvebu_mpp_ctrl *ctrl, unsigned long config); -	int (*mpp_gpio_req)(struct mvebu_mpp_ctrl *ctrl, u8 pid); -	int (*mpp_gpio_dir)(struct mvebu_mpp_ctrl *ctrl, u8 pid, bool input); +	int (*mpp_get)(unsigned pid, unsigned long *config); +	int (*mpp_set)(unsigned pid, unsigned long config); +	int (*mpp_gpio_req)(unsigned pid); +	int (*mpp_gpio_dir)(unsigned pid, bool input);  };  /** @@ -114,18 +113,6 @@ struct mvebu_pinctrl_soc_info {  	int ngpioranges;  }; -#define MPP_REG_CTRL(_idl, _idh)				\ -	{							\ -		.name = NULL,					\ -		.pid = _idl,					\ -		.npins = _idh - _idl + 1,			\ -		.pins = (unsigned[_idh - _idl + 1]) { },	\ -		.mpp_get = NULL,				\ -		.mpp_set = NULL,				\ -		.mpp_gpio_req = NULL,				\ -		.mpp_gpio_dir = NULL,				\ -	} -  #define MPP_FUNC_CTRL(_idl, _idh, _name, _func)			\  	{							\  		.name = _name,					\ @@ -186,6 +173,34 @@ struct mvebu_pinctrl_soc_info {  		.npins = _npins,				\  	} +#define MVEBU_MPPS_PER_REG	8 +#define MVEBU_MPP_BITS		4 +#define MVEBU_MPP_MASK		0xf + +static inline int default_mpp_ctrl_get(void __iomem *base, unsigned int pid, +				       unsigned long *config) +{ +	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; + +	*config = (readl(base + off) >> shift) & MVEBU_MPP_MASK; + +	return 0; +} + +static inline int default_mpp_ctrl_set(void __iomem *base, unsigned int pid, +				       unsigned long config) +{ +	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +	unsigned long reg; + +	reg = readl(base + off) & ~(MVEBU_MPP_MASK << shift); +	writel(reg | (config << shift), base + off); + +	return 0; +} +  int mvebu_pinctrl_probe(struct platform_device *pdev);  int mvebu_pinctrl_remove(struct platform_device *pdev); diff --git a/drivers/pinctrl/mvebu/pinctrl-orion.c b/drivers/pinctrl/mvebu/pinctrl-orion.c new file mode 100644 index 00000000000..dda1e7254e1 --- /dev/null +++ b/drivers/pinctrl/mvebu/pinctrl-orion.c @@ -0,0 +1,261 @@ +/* + * Marvell Orion pinctrl driver based on mvebu pinctrl core + * + * Author: Thomas Petazzoni <thomas.petazzoni@free-electrons.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. + * + * The first 16 MPP pins on Orion are easy to handle: they are + * configured through 2 consecutive registers, located at the base + * address of the MPP device. + * + * However the last 4 MPP pins are handled by a register at offset + * 0x50 from the base address, so it is not consecutive with the first + * two registers. + */ + +#include <linux/err.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/clk.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-mvebu.h" + +static void __iomem *mpp_base; +static void __iomem *high_mpp_base; + +static int orion_mpp_ctrl_get(unsigned pid, unsigned long *config) +{ +	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; + +	if (pid < 16) { +		unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +		*config = (readl(mpp_base + off) >> shift) & MVEBU_MPP_MASK; +	} +	else { +		*config = (readl(high_mpp_base) >> shift) & MVEBU_MPP_MASK; +	} + +	return 0; +} + +static int orion_mpp_ctrl_set(unsigned pid, unsigned long config) +{ +	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; + +	if (pid < 16) { +		unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS; +		u32 reg = readl(mpp_base + off) & ~(MVEBU_MPP_MASK << shift); +		writel(reg | (config << shift), mpp_base + off); +	} +	else { +		u32 reg = readl(high_mpp_base) & ~(MVEBU_MPP_MASK << shift); +		writel(reg | (config << shift), high_mpp_base); +	} + +	return 0; +} + +#define V(f5181l, f5182, f5281) \ +	((f5181l << 0) | (f5182 << 1) | (f5281 << 2)) + +enum orion_variant { +	V_5181L = V(1, 0, 0), +	V_5182  = V(0, 1, 0), +	V_5281  = V(0, 0, 1), +	V_ALL   = V(1, 1, 1), +}; + +static struct mvebu_mpp_mode orion_mpp_modes[] = { +	MPP_MODE(0, +		 MPP_VAR_FUNCTION(0x0, "pcie", "rstout",    V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "req2",       V_ALL), +		 MPP_VAR_FUNCTION(0x3, "gpio", NULL,        V_ALL)), +	MPP_MODE(1, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "gnt2",       V_ALL)), +	MPP_MODE(2, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "req3",       V_ALL), +		 MPP_VAR_FUNCTION(0x3, "pci-1", "pme",      V_ALL)), +	MPP_MODE(3, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "gnt3",       V_ALL)), +	MPP_MODE(4, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "req4",       V_ALL), +		 MPP_VAR_FUNCTION(0x4, "bootnand", "re",    V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "sata0", "prsnt",    V_5182)), +	MPP_MODE(5, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "gnt4",       V_ALL), +		 MPP_VAR_FUNCTION(0x4, "bootnand", "we",    V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "sata1", "prsnt",    V_5182)), +	MPP_MODE(6, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "req5",       V_ALL), +		 MPP_VAR_FUNCTION(0x4, "nand", "re0",       V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "pci-1", "clk",      V_5181L), +		 MPP_VAR_FUNCTION(0x5, "sata0", "act",      V_5182)), +	MPP_MODE(7, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x2, "pci", "gnt5",       V_ALL), +		 MPP_VAR_FUNCTION(0x4, "nand", "we0",       V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "pci-1", "clk",      V_5181L), +		 MPP_VAR_FUNCTION(0x5, "sata1", "act",      V_5182)), +	MPP_MODE(8, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "col",         V_ALL)), +	MPP_MODE(9, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "rxerr",       V_ALL)), +	MPP_MODE(10, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "crs",         V_ALL)), +	MPP_MODE(11, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "txerr",       V_ALL)), +	MPP_MODE(12, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "txd4",        V_ALL), +		 MPP_VAR_FUNCTION(0x4, "nand", "re1",       V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "sata0", "ledprsnt", V_5182)), +	MPP_MODE(13, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "txd5",        V_ALL), +		 MPP_VAR_FUNCTION(0x4, "nand", "we1",       V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "sata1", "ledprsnt", V_5182)), +	MPP_MODE(14, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "txd6",        V_ALL), +		 MPP_VAR_FUNCTION(0x4, "nand", "re2",       V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "sata0", "ledact",   V_5182)), +	MPP_MODE(15, +		 MPP_VAR_FUNCTION(0x0, "gpio", NULL,        V_ALL), +		 MPP_VAR_FUNCTION(0x1, "ge", "txd7",        V_ALL), +		 MPP_VAR_FUNCTION(0x4, "nand", "we2",       V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x5, "sata1", "ledact",   V_5182)), +	MPP_MODE(16, +		 MPP_VAR_FUNCTION(0x0, "uart1", "rxd",      V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x1, "ge", "rxd4",        V_ALL), +		 MPP_VAR_FUNCTION(0x5, "gpio", NULL,        V_5182)), +	MPP_MODE(17, +		 MPP_VAR_FUNCTION(0x0, "uart1", "txd",      V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x1, "ge", "rxd5",        V_ALL), +		 MPP_VAR_FUNCTION(0x5, "gpio", NULL,        V_5182)), +	MPP_MODE(18, +		 MPP_VAR_FUNCTION(0x0, "uart1", "cts",      V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x1, "ge", "rxd6",        V_ALL), +		 MPP_VAR_FUNCTION(0x5, "gpio", NULL,        V_5182)), +	MPP_MODE(19, +		 MPP_VAR_FUNCTION(0x0, "uart1", "rts",      V_5182 | V_5281), +		 MPP_VAR_FUNCTION(0x1, "ge", "rxd7",        V_ALL), +		 MPP_VAR_FUNCTION(0x5, "gpio", NULL,        V_5182)), +}; + +static struct mvebu_mpp_ctrl orion_mpp_controls[] = { +	MPP_FUNC_CTRL(0, 19, NULL, orion_mpp_ctrl), +}; + +static struct pinctrl_gpio_range mv88f5181l_gpio_ranges[] = { +	MPP_GPIO_RANGE(0, 0, 0, 16), +}; + +static struct pinctrl_gpio_range mv88f5182_gpio_ranges[] = { +	MPP_GPIO_RANGE(0, 0, 0, 19), +}; + +static struct pinctrl_gpio_range mv88f5281_gpio_ranges[] = { +	MPP_GPIO_RANGE(0, 0, 0, 16), +}; + +static struct mvebu_pinctrl_soc_info mv88f5181l_info = { +	.variant = V_5181L, +	.controls = orion_mpp_controls, +	.ncontrols = ARRAY_SIZE(orion_mpp_controls), +	.modes = orion_mpp_modes, +	.nmodes = ARRAY_SIZE(orion_mpp_modes), +	.gpioranges = mv88f5181l_gpio_ranges, +	.ngpioranges = ARRAY_SIZE(mv88f5181l_gpio_ranges), +}; + +static struct mvebu_pinctrl_soc_info mv88f5182_info = { +	.variant = V_5182, +	.controls = orion_mpp_controls, +	.ncontrols = ARRAY_SIZE(orion_mpp_controls), +	.modes = orion_mpp_modes, +	.nmodes = ARRAY_SIZE(orion_mpp_modes), +	.gpioranges = mv88f5182_gpio_ranges, +	.ngpioranges = ARRAY_SIZE(mv88f5182_gpio_ranges), +}; + +static struct mvebu_pinctrl_soc_info mv88f5281_info = { +	.variant = V_5281, +	.controls = orion_mpp_controls, +	.ncontrols = ARRAY_SIZE(orion_mpp_controls), +	.modes = orion_mpp_modes, +	.nmodes = ARRAY_SIZE(orion_mpp_modes), +	.gpioranges = mv88f5281_gpio_ranges, +	.ngpioranges = ARRAY_SIZE(mv88f5281_gpio_ranges), +}; + +/* + * There are multiple variants of the Orion SoCs, but in terms of pin + * muxing, they are identical. + */ +static struct of_device_id orion_pinctrl_of_match[] = { +	{ .compatible = "marvell,88f5181l-pinctrl", .data = &mv88f5181l_info }, +	{ .compatible = "marvell,88f5182-pinctrl", .data = &mv88f5182_info }, +	{ .compatible = "marvell,88f5281-pinctrl", .data = &mv88f5281_info }, +	{ } +}; + +static int orion_pinctrl_probe(struct platform_device *pdev) +{ +	const struct of_device_id *match = +		of_match_device(orion_pinctrl_of_match, &pdev->dev); +	struct resource *res; + +	pdev->dev.platform_data = (void*)match->data; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(mpp_base)) +		return PTR_ERR(mpp_base); + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 1); +	high_mpp_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(high_mpp_base)) +		return PTR_ERR(high_mpp_base); + +	return mvebu_pinctrl_probe(pdev); +} + +static int orion_pinctrl_remove(struct platform_device *pdev) +{ +	return mvebu_pinctrl_remove(pdev); +} + +static struct platform_driver orion_pinctrl_driver = { +	.driver = { +		.name = "orion-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(orion_pinctrl_of_match), +	}, +	.probe = orion_pinctrl_probe, +	.remove = orion_pinctrl_remove, +}; + +module_platform_driver(orion_pinctrl_driver); + +MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>"); +MODULE_DESCRIPTION("Marvell Orion pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinconf-generic.c b/drivers/pinctrl/pinconf-generic.c index 55a0ebe830a..29ff77f90fc 100644 --- a/drivers/pinctrl/pinconf-generic.c +++ b/drivers/pinctrl/pinconf-generic.c @@ -48,6 +48,7 @@ static struct pin_config_item conf_items[] = {  	PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_DRAIN, "output drive open drain", NULL),  	PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_SOURCE, "output drive open source", NULL),  	PCONFDUMP(PIN_CONFIG_DRIVE_STRENGTH, "output drive strength", "mA"), +	PCONFDUMP(PIN_CONFIG_INPUT_ENABLE, "input enabled", NULL),  	PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT_ENABLE, "input schmitt enabled", NULL),  	PCONFDUMP(PIN_CONFIG_INPUT_SCHMITT, "input schmitt trigger", NULL),  	PCONFDUMP(PIN_CONFIG_INPUT_DEBOUNCE, "input debounce", "usec"), @@ -160,13 +161,17 @@ static struct pinconf_generic_dt_params dt_params[] = {  	{ "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },  	{ "drive-open-source", PIN_CONFIG_DRIVE_OPEN_SOURCE, 0 },  	{ "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 }, +	{ "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 }, +	{ "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },  	{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },  	{ "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },  	{ "input-debounce", PIN_CONFIG_INPUT_DEBOUNCE, 0 }, +	{ "power-source", PIN_CONFIG_POWER_SOURCE, 0 },  	{ "low-power-enable", PIN_CONFIG_LOW_POWER_MODE, 1 },  	{ "low-power-disable", PIN_CONFIG_LOW_POWER_MODE, 0 },  	{ "output-low", PIN_CONFIG_OUTPUT, 0, },  	{ "output-high", PIN_CONFIG_OUTPUT, 1, }, +	{ "slew-rate", PIN_CONFIG_SLEW_RATE, 0},  };  /** @@ -224,13 +229,12 @@ int pinconf_generic_parse_dt_config(struct device_node *np,  	 * Now limit the number of configs to the real number of  	 * found properties.  	 */ -	*configs = kzalloc(ncfg * sizeof(unsigned long), GFP_KERNEL); +	*configs = kmemdup(cfg, ncfg * sizeof(unsigned long), GFP_KERNEL);  	if (!*configs) {  		ret = -ENOMEM;  		goto out;  	} -	memcpy(*configs, cfg, ncfg * sizeof(unsigned long));  	*nconfigs = ncfg;  out: diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c index a138965c01c..8bfa0643e5d 100644 --- a/drivers/pinctrl/pinconf.c +++ b/drivers/pinctrl/pinconf.c @@ -28,12 +28,6 @@ int pinconf_check_ops(struct pinctrl_dev *pctldev)  {  	const struct pinconf_ops *ops = pctldev->desc->confops; -	/* We must be able to read out pin status */ -	if (!ops->pin_config_get && !ops->pin_config_group_get) { -		dev_err(pctldev->dev, -			"pinconf must be able to read out pin status\n"); -		return -EINVAL; -	}  	/* We have to be able to config the pins in SOME way */  	if (!ops->pin_config_set && !ops->pin_config_group_set) {  		dev_err(pctldev->dev, @@ -67,9 +61,9 @@ int pin_config_get_for_pin(struct pinctrl_dev *pctldev, unsigned pin,  	const struct pinconf_ops *ops = pctldev->desc->confops;  	if (!ops || !ops->pin_config_get) { -		dev_err(pctldev->dev, "cannot get pin configuration, missing " +		dev_dbg(pctldev->dev, "cannot get pin configuration, missing "  			"pin_config_get() function in driver\n"); -		return -EINVAL; +		return -ENOTSUPP;  	}  	return ops->pin_config_get(pctldev, pin, config); @@ -93,10 +87,10 @@ 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_err(pctldev->dev, "cannot get configuration for pin " +		dev_dbg(pctldev->dev, "cannot get configuration for pin "  			"group, missing group config get function in "  			"driver\n"); -		ret = -EINVAL; +		ret = -ENOTSUPP;  		goto unlock;  	} @@ -302,12 +296,8 @@ static void pinconf_dump_pin(struct pinctrl_dev *pctldev,  static int pinconf_pins_show(struct seq_file *s, void *what)  {  	struct pinctrl_dev *pctldev = s->private; -	const struct pinconf_ops *ops = pctldev->desc->confops;  	unsigned i, pin; -	if (!ops || !ops->pin_config_get) -		return 0; -  	seq_puts(s, "Pin config settings per pin\n");  	seq_puts(s, "Format: pin (name): configs\n"); @@ -352,13 +342,9 @@ static int pinconf_groups_show(struct seq_file *s, void *what)  {  	struct pinctrl_dev *pctldev = s->private;  	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; -	const struct pinconf_ops *ops = pctldev->desc->confops;  	unsigned ngroups = pctlops->get_groups_count(pctldev);  	unsigned selector = 0; -	if (!ops || !ops->pin_config_group_get) -		return 0; -  	seq_puts(s, "Pin config settings per pin group\n");  	seq_puts(s, "Format: group (name): configs\n"); @@ -490,7 +476,7 @@ exit:   * <devicename> <state> <pinname> are values that should match the pinctrl-maps   * <newvalue> reflects the new config and is driver dependant   */ -static int pinconf_dbg_config_write(struct file *file, +static ssize_t pinconf_dbg_config_write(struct file *file,  	const char __user *user_buf, size_t count, loff_t *ppos)  {  	struct pinctrl_maps *maps_node; @@ -508,7 +494,7 @@ static int pinconf_dbg_config_write(struct file *file,  	int i;  	/* Get userspace string and assure termination */ -	buf_size = min(count, (size_t)(sizeof(buf)-1)); +	buf_size = min(count, sizeof(buf) - 1);  	if (copy_from_user(buf, user_buf, buf_size))  		return -EFAULT;  	buf[buf_size] = 0; diff --git a/drivers/pinctrl/pinctrl-abx500.c b/drivers/pinctrl/pinctrl-abx500.c index 4780959e11d..163da9c3ea0 100644 --- a/drivers/pinctrl/pinctrl-abx500.c +++ b/drivers/pinctrl/pinctrl-abx500.c @@ -24,7 +24,6 @@  #include <linux/bitops.h>  #include <linux/mfd/abx500.h>  #include <linux/mfd/abx500/ab8500.h> -#include <linux/mfd/abx500/ab8500-gpio.h>  #include <linux/pinctrl/pinctrl.h>  #include <linux/pinctrl/consumer.h>  #include <linux/pinctrl/pinmux.h> @@ -418,7 +417,7 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,  			ret = abx500_gpio_set_bits(chip,  					AB8500_GPIO_ALTFUN_REG,  					af.alt_bit1, -					!!(af.alta_val && BIT(0))); +					!!(af.alta_val & BIT(0)));  			if (ret < 0)  				goto out; @@ -439,7 +438,7 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,  			goto out;  		ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, -				af.alt_bit1, !!(af.altb_val && BIT(0))); +				af.alt_bit1, !!(af.altb_val & BIT(0)));  		if (ret < 0)  			goto out; @@ -462,7 +461,7 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,  			goto out;  		ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, -				af.alt_bit2, !!(af.altc_val && BIT(1))); +				af.alt_bit2, !!(af.altc_val & BIT(1)));  		break;  	default: @@ -1218,21 +1217,15 @@ static const struct of_device_id abx500_gpio_match[] = {  static int abx500_gpio_probe(struct platform_device *pdev)  { -	struct ab8500_platform_data *abx500_pdata = -				dev_get_platdata(pdev->dev.parent); -	struct abx500_gpio_platform_data *pdata = NULL;  	struct device_node *np = pdev->dev.of_node; +	const struct of_device_id *match;  	struct abx500_pinctrl *pct; -	const struct platform_device_id *platid = platform_get_device_id(pdev);  	unsigned int id = -1;  	int ret, err;  	int i; -	if (abx500_pdata) -		pdata = abx500_pdata->gpio; - -	if (!(pdata || np)) { -		dev_err(&pdev->dev, "gpio dt and platform data missing\n"); +	if (!np) { +		dev_err(&pdev->dev, "gpio dt node missing\n");  		return -ENODEV;  	} @@ -1248,17 +1241,14 @@ static int abx500_gpio_probe(struct platform_device *pdev)  	pct->parent = dev_get_drvdata(pdev->dev.parent);  	pct->chip = abx500gpio_chip;  	pct->chip.dev = &pdev->dev; -	pct->chip.base = (np) ? -1 : pdata->gpio_base; - -	if (platid) -		id = platid->driver_data; -	else if (np) { -		const struct of_device_id *match; +	pct->chip.base = -1; /* Dynamic allocation */ -		match = of_match_device(abx500_gpio_match, &pdev->dev); -		if (match) -			id = (unsigned long)match->data; +	match = of_match_device(abx500_gpio_match, &pdev->dev); +	if (!match) { +		dev_err(&pdev->dev, "gpio dt not matching\n"); +		return -ENODEV;  	} +	id = (unsigned long)match->data;  	/* Poke in other ASIC variants here */  	switch (id) { @@ -1349,14 +1339,6 @@ static int abx500_gpio_remove(struct platform_device *pdev)  	return 0;  } -static const struct platform_device_id abx500_pinctrl_id[] = { -	{ "pinctrl-ab8500", PINCTRL_AB8500 }, -	{ "pinctrl-ab8540", PINCTRL_AB8540 }, -	{ "pinctrl-ab9540", PINCTRL_AB9540 }, -	{ "pinctrl-ab8505", PINCTRL_AB8505 }, -	{ }, -}; -  static struct platform_driver abx500_gpio_driver = {  	.driver = {  		.name = "abx500-gpio", @@ -1365,7 +1347,6 @@ static struct platform_driver abx500_gpio_driver = {  	},  	.probe = abx500_gpio_probe,  	.remove = abx500_gpio_remove, -	.id_table = abx500_pinctrl_id,  };  static int __init abx500_gpio_init(void) diff --git a/drivers/pinctrl/pinctrl-abx500.h b/drivers/pinctrl/pinctrl-abx500.h index eeca8f97399..2beef3bfe9c 100644 --- a/drivers/pinctrl/pinctrl-abx500.h +++ b/drivers/pinctrl/pinctrl-abx500.h @@ -1,4 +1,4 @@ -#ifndef PINCTRL_PINCTRL_ABx5O0_H +#ifndef PINCTRL_PINCTRL_ABx500_H  #define PINCTRL_PINCTRL_ABx500_H  /* Package definitions */ @@ -15,6 +15,18 @@ enum abx500_pin_func {  	ABX500_ALT_C,  }; +enum abx500_gpio_pull_updown { +	ABX500_GPIO_PULL_DOWN = 0x0, +	ABX500_GPIO_PULL_NONE = 0x1, +	ABX500_GPIO_PULL_UP = 0x3, +}; + +enum abx500_gpio_vinsel { +	ABX500_GPIO_VINSEL_VBAT = 0x0, +	ABX500_GPIO_VINSEL_VIN_1V8 = 0x1, +	ABX500_GPIO_VINSEL_VDD_BIF = 0x2, +}; +  /**   * struct abx500_function - ABx500 pinctrl mux function   * @name: The name of the function, exported to pinctrl core. diff --git a/drivers/pinctrl/pinctrl-adi2-bf54x.c b/drivers/pinctrl/pinctrl-adi2-bf54x.c new file mode 100644 index 00000000000..008a29e92e5 --- /dev/null +++ b/drivers/pinctrl/pinctrl-adi2-bf54x.c @@ -0,0 +1,588 @@ +/* + * Pinctrl Driver for ADI GPIO2 controller + * + * Copyright 2007-2013 Analog Devices Inc. + * + * Licensed under the GPLv2 or later + */ + +#include <asm/portmux.h> +#include "pinctrl-adi2.h" + +static const struct pinctrl_pin_desc adi_pads[] = { +	PINCTRL_PIN(0, "PA0"), +	PINCTRL_PIN(1, "PA1"), +	PINCTRL_PIN(2, "PA2"), +	PINCTRL_PIN(3, "PG3"), +	PINCTRL_PIN(4, "PA4"), +	PINCTRL_PIN(5, "PA5"), +	PINCTRL_PIN(6, "PA6"), +	PINCTRL_PIN(7, "PA7"), +	PINCTRL_PIN(8, "PA8"), +	PINCTRL_PIN(9, "PA9"), +	PINCTRL_PIN(10, "PA10"), +	PINCTRL_PIN(11, "PA11"), +	PINCTRL_PIN(12, "PA12"), +	PINCTRL_PIN(13, "PA13"), +	PINCTRL_PIN(14, "PA14"), +	PINCTRL_PIN(15, "PA15"), +	PINCTRL_PIN(16, "PB0"), +	PINCTRL_PIN(17, "PB1"), +	PINCTRL_PIN(18, "PB2"), +	PINCTRL_PIN(19, "PB3"), +	PINCTRL_PIN(20, "PB4"), +	PINCTRL_PIN(21, "PB5"), +	PINCTRL_PIN(22, "PB6"), +	PINCTRL_PIN(23, "PB7"), +	PINCTRL_PIN(24, "PB8"), +	PINCTRL_PIN(25, "PB9"), +	PINCTRL_PIN(26, "PB10"), +	PINCTRL_PIN(27, "PB11"), +	PINCTRL_PIN(28, "PB12"), +	PINCTRL_PIN(29, "PB13"), +	PINCTRL_PIN(30, "PB14"), +	PINCTRL_PIN(32, "PC0"), +	PINCTRL_PIN(33, "PC1"), +	PINCTRL_PIN(34, "PC2"), +	PINCTRL_PIN(35, "PC3"), +	PINCTRL_PIN(36, "PC4"), +	PINCTRL_PIN(37, "PC5"), +	PINCTRL_PIN(38, "PC6"), +	PINCTRL_PIN(39, "PC7"), +	PINCTRL_PIN(40, "PC8"), +	PINCTRL_PIN(41, "PC9"), +	PINCTRL_PIN(42, "PC10"), +	PINCTRL_PIN(43, "PC11"), +	PINCTRL_PIN(44, "PC12"), +	PINCTRL_PIN(45, "PC13"), +	PINCTRL_PIN(48, "PD0"), +	PINCTRL_PIN(49, "PD1"), +	PINCTRL_PIN(50, "PD2"), +	PINCTRL_PIN(51, "PD3"), +	PINCTRL_PIN(52, "PD4"), +	PINCTRL_PIN(53, "PD5"), +	PINCTRL_PIN(54, "PD6"), +	PINCTRL_PIN(55, "PD7"), +	PINCTRL_PIN(56, "PD8"), +	PINCTRL_PIN(57, "PD9"), +	PINCTRL_PIN(58, "PD10"), +	PINCTRL_PIN(59, "PD11"), +	PINCTRL_PIN(60, "PD12"), +	PINCTRL_PIN(61, "PD13"), +	PINCTRL_PIN(62, "PD14"), +	PINCTRL_PIN(63, "PD15"), +	PINCTRL_PIN(64, "PE0"), +	PINCTRL_PIN(65, "PE1"), +	PINCTRL_PIN(66, "PE2"), +	PINCTRL_PIN(67, "PE3"), +	PINCTRL_PIN(68, "PE4"), +	PINCTRL_PIN(69, "PE5"), +	PINCTRL_PIN(70, "PE6"), +	PINCTRL_PIN(71, "PE7"), +	PINCTRL_PIN(72, "PE8"), +	PINCTRL_PIN(73, "PE9"), +	PINCTRL_PIN(74, "PE10"), +	PINCTRL_PIN(75, "PE11"), +	PINCTRL_PIN(76, "PE12"), +	PINCTRL_PIN(77, "PE13"), +	PINCTRL_PIN(78, "PE14"), +	PINCTRL_PIN(79, "PE15"), +	PINCTRL_PIN(80, "PF0"), +	PINCTRL_PIN(81, "PF1"), +	PINCTRL_PIN(82, "PF2"), +	PINCTRL_PIN(83, "PF3"), +	PINCTRL_PIN(84, "PF4"), +	PINCTRL_PIN(85, "PF5"), +	PINCTRL_PIN(86, "PF6"), +	PINCTRL_PIN(87, "PF7"), +	PINCTRL_PIN(88, "PF8"), +	PINCTRL_PIN(89, "PF9"), +	PINCTRL_PIN(90, "PF10"), +	PINCTRL_PIN(91, "PF11"), +	PINCTRL_PIN(92, "PF12"), +	PINCTRL_PIN(93, "PF13"), +	PINCTRL_PIN(94, "PF14"), +	PINCTRL_PIN(95, "PF15"), +	PINCTRL_PIN(96, "PG0"), +	PINCTRL_PIN(97, "PG1"), +	PINCTRL_PIN(98, "PG2"), +	PINCTRL_PIN(99, "PG3"), +	PINCTRL_PIN(100, "PG4"), +	PINCTRL_PIN(101, "PG5"), +	PINCTRL_PIN(102, "PG6"), +	PINCTRL_PIN(103, "PG7"), +	PINCTRL_PIN(104, "PG8"), +	PINCTRL_PIN(105, "PG9"), +	PINCTRL_PIN(106, "PG10"), +	PINCTRL_PIN(107, "PG11"), +	PINCTRL_PIN(108, "PG12"), +	PINCTRL_PIN(109, "PG13"), +	PINCTRL_PIN(110, "PG14"), +	PINCTRL_PIN(111, "PG15"), +	PINCTRL_PIN(112, "PH0"), +	PINCTRL_PIN(113, "PH1"), +	PINCTRL_PIN(114, "PH2"), +	PINCTRL_PIN(115, "PH3"), +	PINCTRL_PIN(116, "PH4"), +	PINCTRL_PIN(117, "PH5"), +	PINCTRL_PIN(118, "PH6"), +	PINCTRL_PIN(119, "PH7"), +	PINCTRL_PIN(120, "PH8"), +	PINCTRL_PIN(121, "PH9"), +	PINCTRL_PIN(122, "PH10"), +	PINCTRL_PIN(123, "PH11"), +	PINCTRL_PIN(124, "PH12"), +	PINCTRL_PIN(125, "PH13"), +	PINCTRL_PIN(128, "PI0"), +	PINCTRL_PIN(129, "PI1"), +	PINCTRL_PIN(130, "PI2"), +	PINCTRL_PIN(131, "PI3"), +	PINCTRL_PIN(132, "PI4"), +	PINCTRL_PIN(133, "PI5"), +	PINCTRL_PIN(134, "PI6"), +	PINCTRL_PIN(135, "PI7"), +	PINCTRL_PIN(136, "PI8"), +	PINCTRL_PIN(137, "PI9"), +	PINCTRL_PIN(138, "PI10"), +	PINCTRL_PIN(139, "PI11"), +	PINCTRL_PIN(140, "PI12"), +	PINCTRL_PIN(141, "PI13"), +	PINCTRL_PIN(142, "PI14"), +	PINCTRL_PIN(143, "PI15"), +	PINCTRL_PIN(144, "PJ0"), +	PINCTRL_PIN(145, "PJ1"), +	PINCTRL_PIN(146, "PJ2"), +	PINCTRL_PIN(147, "PJ3"), +	PINCTRL_PIN(148, "PJ4"), +	PINCTRL_PIN(149, "PJ5"), +	PINCTRL_PIN(150, "PJ6"), +	PINCTRL_PIN(151, "PJ7"), +	PINCTRL_PIN(152, "PJ8"), +	PINCTRL_PIN(153, "PJ9"), +	PINCTRL_PIN(154, "PJ10"), +	PINCTRL_PIN(155, "PJ11"), +	PINCTRL_PIN(156, "PJ12"), +	PINCTRL_PIN(157, "PJ13"), +}; + +static const unsigned uart0_pins[] = { +	GPIO_PE7, GPIO_PE8, +}; + +static const unsigned uart1_pins[] = { +	GPIO_PH0, GPIO_PH1, +}; + +static const unsigned uart1_ctsrts_pins[] = { +	GPIO_PE9, GPIO_PE10, +}; + +static const unsigned uart2_pins[] = { +	GPIO_PB4, GPIO_PB5, +}; + +static const unsigned uart3_pins[] = { +	GPIO_PB6, GPIO_PB7, +}; + +static const unsigned uart3_ctsrts_pins[] = { +	GPIO_PB2, GPIO_PB3, +}; + +static const unsigned rsi0_pins[] = { +	GPIO_PC8, GPIO_PC9, GPIO_PC10, GPIO_PC11, GPIO_PC12, GPIO_PC13, +}; + +static const unsigned spi0_pins[] = { +	GPIO_PE0, GPIO_PE1, GPIO_PE2, +}; + +static const unsigned spi1_pins[] = { +	GPIO_PG8, GPIO_PG9, GPIO_PG10, +}; + +static const unsigned twi0_pins[] = { +	GPIO_PE14, GPIO_PE15, +}; + +static const unsigned twi1_pins[] = { +	GPIO_PB0, GPIO_PB1, +}; + +static const unsigned rotary_pins[] = { +	GPIO_PH4, GPIO_PH3, GPIO_PH5, +}; + +static const unsigned can0_pins[] = { +	GPIO_PG13, GPIO_PG12, +}; + +static const unsigned can1_pins[] = { +	GPIO_PG14, GPIO_PG15, +}; + +static const unsigned smc0_pins[] = { +	GPIO_PH8, GPIO_PH9, GPIO_PH10, GPIO_PH11, GPIO_PH12, GPIO_PH13, +	GPIO_PI0, GPIO_PI1, GPIO_PI2, GPIO_PI3, GPIO_PI4, GPIO_PI5, GPIO_PI6, +	GPIO_PI7, GPIO_PI8, GPIO_PI9, GPIO_PI10, GPIO_PI11, +	GPIO_PI12, GPIO_PI13, GPIO_PI14, GPIO_PI15, +}; + +static const unsigned sport0_pins[] = { +	GPIO_PC0, GPIO_PC2, GPIO_PC3, GPIO_PC4, GPIO_PC6, GPIO_PC7, +}; + +static const unsigned sport1_pins[] = { +	GPIO_PD0, GPIO_PD2, GPIO_PD3, GPIO_PD4, GPIO_PD6, GPIO_PD7, +}; + +static const unsigned sport2_pins[] = { +	GPIO_PA0, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA6, GPIO_PA7, +}; + +static const unsigned sport3_pins[] = { +	GPIO_PA8, GPIO_PA10, GPIO_PA11, GPIO_PA12, GPIO_PA14, GPIO_PA15, +}; + +static const unsigned ppi0_8b_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF13, GPIO_PG0, GPIO_PG1, GPIO_PG2, +}; + +static const unsigned ppi0_16b_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, +	GPIO_PF13, GPIO_PF14, GPIO_PF15, +	GPIO_PG0, GPIO_PG1, GPIO_PG2, +}; + +static const unsigned ppi0_24b_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, +	GPIO_PF13, GPIO_PF14, GPIO_PF15, GPIO_PD0, GPIO_PD1, GPIO_PD2, +	GPIO_PD3, GPIO_PD4, GPIO_PD5, GPIO_PG3, GPIO_PG4, +	GPIO_PG0, GPIO_PG1, GPIO_PG2, +}; + +static const unsigned ppi1_8b_pins[] = { +	GPIO_PD0, GPIO_PD1, GPIO_PD2, GPIO_PD3, GPIO_PD4, GPIO_PD5, GPIO_PD6, +	GPIO_PD7, GPIO_PE11, GPIO_PE12, GPIO_PE13, +}; + +static const unsigned ppi1_16b_pins[] = { +	GPIO_PD0, GPIO_PD1, GPIO_PD2, GPIO_PD3, GPIO_PD4, GPIO_PD5, GPIO_PD6, +	GPIO_PD7, GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, GPIO_PD12, +	GPIO_PD13, GPIO_PD14, GPIO_PD15, +	GPIO_PE11, GPIO_PE12, GPIO_PE13, +}; + +static const unsigned ppi2_8b_pins[] = { +	GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, GPIO_PD12, +	GPIO_PD13, GPIO_PD14, GPIO_PD15, +	GPIO_PA7, GPIO_PB0, GPIO_PB1, GPIO_PB2, GPIO_PB3, +}; + +static const unsigned atapi_pins[] = { +	GPIO_PH2, GPIO_PJ3, GPIO_PJ4, GPIO_PJ5, GPIO_PJ6, +	GPIO_PJ7, GPIO_PJ8, GPIO_PJ9, GPIO_PJ10, +}; + +static const unsigned atapi_alter_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, +	GPIO_PF13, GPIO_PF14, GPIO_PF15, GPIO_PG2, GPIO_PG3, GPIO_PG4, +}; + +static const unsigned nfc0_pins[] = { +	GPIO_PJ1, GPIO_PJ2, +}; + +static const unsigned keys_4x4_pins[] = { +	GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, +	GPIO_PD12, GPIO_PD13, GPIO_PD14, GPIO_PD15, +}; + +static const unsigned keys_8x8_pins[] = { +	GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, +	GPIO_PD12, GPIO_PD13, GPIO_PD14, GPIO_PD15, +	GPIO_PE0, GPIO_PE1, GPIO_PE2, GPIO_PE3, +	GPIO_PE4, GPIO_PE5, GPIO_PE6, GPIO_PE7, +}; + +static const unsigned short uart0_mux[] = { +	P_UART0_TX, P_UART0_RX, +	0 +}; + +static const unsigned short uart1_mux[] = { +	P_UART1_TX, P_UART1_RX, +	0 +}; + +static const unsigned short uart1_ctsrts_mux[] = { +	P_UART1_RTS, P_UART1_CTS, +	0 +}; + +static const unsigned short uart2_mux[] = { +	P_UART2_TX, P_UART2_RX, +	0 +}; + +static const unsigned short uart3_mux[] = { +	P_UART3_TX, P_UART3_RX, +	0 +}; + +static const unsigned short uart3_ctsrts_mux[] = { +	P_UART3_RTS, P_UART3_CTS, +	0 +}; + +static const unsigned short rsi0_mux[] = { +	P_SD_D0, P_SD_D1, P_SD_D2, P_SD_D3, P_SD_CLK, P_SD_CMD, +	0 +}; + +static const unsigned short spi0_mux[] = { +	P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0 +}; + +static const unsigned short spi1_mux[] = { +	P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0 +}; + +static const unsigned short twi0_mux[] = { +	P_TWI0_SCL, P_TWI0_SDA, 0 +}; + +static const unsigned short twi1_mux[] = { +	P_TWI1_SCL, P_TWI1_SDA, 0 +}; + +static const unsigned short rotary_mux[] = { +	P_CNT_CUD, P_CNT_CDG, P_CNT_CZM, 0 +}; + +static const unsigned short sport0_mux[] = { +	P_SPORT0_TFS, P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, +	P_SPORT0_DRPRI, P_SPORT0_RSCLK, 0 +}; + +static const unsigned short sport1_mux[] = { +	P_SPORT1_TFS, P_SPORT1_DTPRI, P_SPORT1_TSCLK, P_SPORT1_RFS, +	P_SPORT1_DRPRI, P_SPORT1_RSCLK, 0 +}; + +static const unsigned short sport2_mux[] = { +	P_SPORT2_TFS, P_SPORT2_DTPRI, P_SPORT2_TSCLK, P_SPORT2_RFS, +	P_SPORT2_DRPRI, P_SPORT2_RSCLK, 0 +}; + +static const unsigned short sport3_mux[] = { +	P_SPORT3_TFS, P_SPORT3_DTPRI, P_SPORT3_TSCLK, P_SPORT3_RFS, +	P_SPORT3_DRPRI, P_SPORT3_RSCLK, 0 +}; + +static const unsigned short can0_mux[] = { +	P_CAN0_RX, P_CAN0_TX, 0 +}; + +static const unsigned short can1_mux[] = { +	P_CAN1_RX, P_CAN1_TX, 0 +}; + +static const unsigned short smc0_mux[] = { +	P_A4, P_A5, P_A6, P_A7, P_A8, P_A9, P_A10, P_A11, P_A12, +	P_A13, P_A14, P_A15, P_A16, P_A17, P_A18, P_A19, P_A20, P_A21, +	P_A22, P_A23, P_A24, P_A25, P_NOR_CLK, 0, +}; + +static const unsigned short ppi0_8b_mux[] = { +	P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, +	P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, +	P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, +	0, +}; + +static const unsigned short ppi0_16b_mux[] = { +	P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, +	P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, +	P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, +	P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, +	P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, +	0, +}; + +static const unsigned short ppi0_24b_mux[] = { +	P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, +	P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, +	P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, +	P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, +	P_PPI0_D16, P_PPI0_D17, P_PPI0_D18, P_PPI0_D19, +	P_PPI0_D20, P_PPI0_D21, P_PPI0_D22, P_PPI0_D23, +	P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, +	0, +}; + +static const unsigned short ppi1_8b_mux[] = { +	P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, +	P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, +	P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, +	0, +}; + +static const unsigned short ppi1_16b_mux[] = { +	P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, +	P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, +	P_PPI1_D8, P_PPI1_D9, P_PPI1_D10, P_PPI1_D11, +	P_PPI1_D12, P_PPI1_D13, P_PPI1_D14, P_PPI1_D15, +	P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, +	0, +}; + +static const unsigned short ppi2_8b_mux[] = { +	P_PPI2_D0, P_PPI2_D1, P_PPI2_D2, P_PPI2_D3, +	P_PPI2_D4, P_PPI2_D5, P_PPI2_D6, P_PPI2_D7, +	P_PPI2_CLK, P_PPI2_FS1, P_PPI2_FS2, +	0, +}; + +static const unsigned short atapi_mux[] = { +	P_ATAPI_RESET, P_ATAPI_DIOR, P_ATAPI_DIOW, P_ATAPI_CS0, P_ATAPI_CS1, +	P_ATAPI_DMACK, P_ATAPI_DMARQ, P_ATAPI_INTRQ, P_ATAPI_IORDY, +}; + +static const unsigned short atapi_alter_mux[] = { +	P_ATAPI_D0A, P_ATAPI_D1A, P_ATAPI_D2A, P_ATAPI_D3A, P_ATAPI_D4A, +	P_ATAPI_D5A, P_ATAPI_D6A, P_ATAPI_D7A, P_ATAPI_D8A, P_ATAPI_D9A, +	P_ATAPI_D10A, P_ATAPI_D11A, P_ATAPI_D12A, P_ATAPI_D13A, P_ATAPI_D14A, +	P_ATAPI_D15A, P_ATAPI_A0A, P_ATAPI_A1A, P_ATAPI_A2A, +	0 +}; + +static const unsigned short nfc0_mux[] = { +	P_NAND_CE, P_NAND_RB, +	0 +}; + +static const unsigned short keys_4x4_mux[] = { +	P_KEY_ROW3, P_KEY_ROW2, P_KEY_ROW1, P_KEY_ROW0, +	P_KEY_COL3, P_KEY_COL2, P_KEY_COL1, P_KEY_COL0, +	0 +}; + +static const unsigned short keys_8x8_mux[] = { +	P_KEY_ROW7, P_KEY_ROW6, P_KEY_ROW5, P_KEY_ROW4, +	P_KEY_ROW3, P_KEY_ROW2, P_KEY_ROW1, P_KEY_ROW0, +	P_KEY_COL7, P_KEY_COL6, P_KEY_COL5, P_KEY_COL4, +	P_KEY_COL3, P_KEY_COL2, P_KEY_COL1, P_KEY_COL0, +	0 +}; + +static const struct adi_pin_group adi_pin_groups[] = { +	ADI_PIN_GROUP("uart0grp", uart0_pins, uart0_mux), +	ADI_PIN_GROUP("uart1grp", uart1_pins, uart1_mux), +	ADI_PIN_GROUP("uart1ctsrtsgrp", uart1_ctsrts_pins, uart1_ctsrts_mux), +	ADI_PIN_GROUP("uart2grp", uart2_pins, uart2_mux), +	ADI_PIN_GROUP("uart3grp", uart3_pins, uart3_mux), +	ADI_PIN_GROUP("uart3ctsrtsgrp", uart3_ctsrts_pins, uart3_ctsrts_mux), +	ADI_PIN_GROUP("rsi0grp", rsi0_pins, rsi0_mux), +	ADI_PIN_GROUP("spi0grp", spi0_pins, spi0_mux), +	ADI_PIN_GROUP("spi1grp", spi1_pins, spi1_mux), +	ADI_PIN_GROUP("twi0grp", twi0_pins, twi0_mux), +	ADI_PIN_GROUP("twi1grp", twi1_pins, twi1_mux), +	ADI_PIN_GROUP("rotarygrp", rotary_pins, rotary_mux), +	ADI_PIN_GROUP("can0grp", can0_pins, can0_mux), +	ADI_PIN_GROUP("can1grp", can1_pins, can1_mux), +	ADI_PIN_GROUP("smc0grp", smc0_pins, smc0_mux), +	ADI_PIN_GROUP("sport0grp", sport0_pins, sport0_mux), +	ADI_PIN_GROUP("sport1grp", sport1_pins, sport1_mux), +	ADI_PIN_GROUP("sport2grp", sport2_pins, sport2_mux), +	ADI_PIN_GROUP("sport3grp", sport3_pins, sport3_mux), +	ADI_PIN_GROUP("ppi0_8bgrp", ppi0_8b_pins, ppi0_8b_mux), +	ADI_PIN_GROUP("ppi0_16bgrp", ppi0_16b_pins, ppi0_16b_mux), +	ADI_PIN_GROUP("ppi0_24bgrp", ppi0_24b_pins, ppi0_24b_mux), +	ADI_PIN_GROUP("ppi1_8bgrp", ppi1_8b_pins, ppi1_8b_mux), +	ADI_PIN_GROUP("ppi1_16bgrp", ppi1_16b_pins, ppi1_16b_mux), +	ADI_PIN_GROUP("ppi2_8bgrp", ppi2_8b_pins, ppi2_8b_mux), +	ADI_PIN_GROUP("atapigrp", atapi_pins, atapi_mux), +	ADI_PIN_GROUP("atapialtergrp", atapi_alter_pins, atapi_alter_mux), +	ADI_PIN_GROUP("nfc0grp", nfc0_pins, nfc0_mux), +	ADI_PIN_GROUP("keys_4x4grp", keys_4x4_pins, keys_4x4_mux), +	ADI_PIN_GROUP("keys_8x8grp", keys_8x8_pins, keys_8x8_mux), +}; + +static const char * const uart0grp[] = { "uart0grp" }; +static const char * const uart1grp[] = { "uart1grp" }; +static const char * const uart1ctsrtsgrp[] = { "uart1ctsrtsgrp" }; +static const char * const uart2grp[] = { "uart2grp" }; +static const char * const uart3grp[] = { "uart3grp" }; +static const char * const uart3ctsrtsgrp[] = { "uart3ctsrtsgrp" }; +static const char * const rsi0grp[] = { "rsi0grp" }; +static const char * const spi0grp[] = { "spi0grp" }; +static const char * const spi1grp[] = { "spi1grp" }; +static const char * const twi0grp[] = { "twi0grp" }; +static const char * const twi1grp[] = { "twi1grp" }; +static const char * const rotarygrp[] = { "rotarygrp" }; +static const char * const can0grp[] = { "can0grp" }; +static const char * const can1grp[] = { "can1grp" }; +static const char * const smc0grp[] = { "smc0grp" }; +static const char * const sport0grp[] = { "sport0grp" }; +static const char * const sport1grp[] = { "sport1grp" }; +static const char * const sport2grp[] = { "sport2grp" }; +static const char * const sport3grp[] = { "sport3grp" }; +static const char * const ppi0grp[] = { "ppi0_8bgrp", +					"ppi0_16bgrp", +					"ppi0_24bgrp" }; +static const char * const ppi1grp[] = { "ppi1_8bgrp", +					"ppi1_16bgrp" }; +static const char * const ppi2grp[] = { "ppi2_8bgrp" }; +static const char * const atapigrp[] = { "atapigrp" }; +static const char * const atapialtergrp[] = { "atapialtergrp" }; +static const char * const nfc0grp[] = { "nfc0grp" }; +static const char * const keysgrp[] = { "keys_4x4grp", +					"keys_8x8grp" }; + +static const struct adi_pmx_func adi_pmx_functions[] = { +	ADI_PMX_FUNCTION("uart0", uart0grp), +	ADI_PMX_FUNCTION("uart1", uart1grp), +	ADI_PMX_FUNCTION("uart1_ctsrts", uart1ctsrtsgrp), +	ADI_PMX_FUNCTION("uart2", uart2grp), +	ADI_PMX_FUNCTION("uart3", uart3grp), +	ADI_PMX_FUNCTION("uart3_ctsrts", uart3ctsrtsgrp), +	ADI_PMX_FUNCTION("rsi0", rsi0grp), +	ADI_PMX_FUNCTION("spi0", spi0grp), +	ADI_PMX_FUNCTION("spi1", spi1grp), +	ADI_PMX_FUNCTION("twi0", twi0grp), +	ADI_PMX_FUNCTION("twi1", twi1grp), +	ADI_PMX_FUNCTION("rotary", rotarygrp), +	ADI_PMX_FUNCTION("can0", can0grp), +	ADI_PMX_FUNCTION("can1", can1grp), +	ADI_PMX_FUNCTION("smc0", smc0grp), +	ADI_PMX_FUNCTION("sport0", sport0grp), +	ADI_PMX_FUNCTION("sport1", sport1grp), +	ADI_PMX_FUNCTION("sport2", sport2grp), +	ADI_PMX_FUNCTION("sport3", sport3grp), +	ADI_PMX_FUNCTION("ppi0", ppi0grp), +	ADI_PMX_FUNCTION("ppi1", ppi1grp), +	ADI_PMX_FUNCTION("ppi2", ppi2grp), +	ADI_PMX_FUNCTION("atapi", atapigrp), +	ADI_PMX_FUNCTION("atapi_alter", atapialtergrp), +	ADI_PMX_FUNCTION("nfc0", nfc0grp), +	ADI_PMX_FUNCTION("keys", keysgrp), +}; + +static const struct adi_pinctrl_soc_data adi_bf54x_soc = { +	.functions = adi_pmx_functions, +	.nfunctions = ARRAY_SIZE(adi_pmx_functions), +	.groups = adi_pin_groups, +	.ngroups = ARRAY_SIZE(adi_pin_groups), +	.pins = adi_pads, +	.npins = ARRAY_SIZE(adi_pads), +}; + +void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc) +{ +	*soc = &adi_bf54x_soc; +} diff --git a/drivers/pinctrl/pinctrl-adi2-bf60x.c b/drivers/pinctrl/pinctrl-adi2-bf60x.c new file mode 100644 index 00000000000..4cb59fe9be7 --- /dev/null +++ b/drivers/pinctrl/pinctrl-adi2-bf60x.c @@ -0,0 +1,517 @@ +/* + * Pinctrl Driver for ADI GPIO2 controller + * + * Copyright 2007-2013 Analog Devices Inc. + * + * Licensed under the GPLv2 or later + */ + +#include <asm/portmux.h> +#include "pinctrl-adi2.h" + +static const struct pinctrl_pin_desc adi_pads[] = { +	PINCTRL_PIN(0, "PA0"), +	PINCTRL_PIN(1, "PA1"), +	PINCTRL_PIN(2, "PA2"), +	PINCTRL_PIN(3, "PG3"), +	PINCTRL_PIN(4, "PA4"), +	PINCTRL_PIN(5, "PA5"), +	PINCTRL_PIN(6, "PA6"), +	PINCTRL_PIN(7, "PA7"), +	PINCTRL_PIN(8, "PA8"), +	PINCTRL_PIN(9, "PA9"), +	PINCTRL_PIN(10, "PA10"), +	PINCTRL_PIN(11, "PA11"), +	PINCTRL_PIN(12, "PA12"), +	PINCTRL_PIN(13, "PA13"), +	PINCTRL_PIN(14, "PA14"), +	PINCTRL_PIN(15, "PA15"), +	PINCTRL_PIN(16, "PB0"), +	PINCTRL_PIN(17, "PB1"), +	PINCTRL_PIN(18, "PB2"), +	PINCTRL_PIN(19, "PB3"), +	PINCTRL_PIN(20, "PB4"), +	PINCTRL_PIN(21, "PB5"), +	PINCTRL_PIN(22, "PB6"), +	PINCTRL_PIN(23, "PB7"), +	PINCTRL_PIN(24, "PB8"), +	PINCTRL_PIN(25, "PB9"), +	PINCTRL_PIN(26, "PB10"), +	PINCTRL_PIN(27, "PB11"), +	PINCTRL_PIN(28, "PB12"), +	PINCTRL_PIN(29, "PB13"), +	PINCTRL_PIN(30, "PB14"), +	PINCTRL_PIN(31, "PB15"), +	PINCTRL_PIN(32, "PC0"), +	PINCTRL_PIN(33, "PC1"), +	PINCTRL_PIN(34, "PC2"), +	PINCTRL_PIN(35, "PC3"), +	PINCTRL_PIN(36, "PC4"), +	PINCTRL_PIN(37, "PC5"), +	PINCTRL_PIN(38, "PC6"), +	PINCTRL_PIN(39, "PC7"), +	PINCTRL_PIN(40, "PC8"), +	PINCTRL_PIN(41, "PC9"), +	PINCTRL_PIN(42, "PC10"), +	PINCTRL_PIN(43, "PC11"), +	PINCTRL_PIN(44, "PC12"), +	PINCTRL_PIN(45, "PC13"), +	PINCTRL_PIN(46, "PC14"), +	PINCTRL_PIN(47, "PC15"), +	PINCTRL_PIN(48, "PD0"), +	PINCTRL_PIN(49, "PD1"), +	PINCTRL_PIN(50, "PD2"), +	PINCTRL_PIN(51, "PD3"), +	PINCTRL_PIN(52, "PD4"), +	PINCTRL_PIN(53, "PD5"), +	PINCTRL_PIN(54, "PD6"), +	PINCTRL_PIN(55, "PD7"), +	PINCTRL_PIN(56, "PD8"), +	PINCTRL_PIN(57, "PD9"), +	PINCTRL_PIN(58, "PD10"), +	PINCTRL_PIN(59, "PD11"), +	PINCTRL_PIN(60, "PD12"), +	PINCTRL_PIN(61, "PD13"), +	PINCTRL_PIN(62, "PD14"), +	PINCTRL_PIN(63, "PD15"), +	PINCTRL_PIN(64, "PE0"), +	PINCTRL_PIN(65, "PE1"), +	PINCTRL_PIN(66, "PE2"), +	PINCTRL_PIN(67, "PE3"), +	PINCTRL_PIN(68, "PE4"), +	PINCTRL_PIN(69, "PE5"), +	PINCTRL_PIN(70, "PE6"), +	PINCTRL_PIN(71, "PE7"), +	PINCTRL_PIN(72, "PE8"), +	PINCTRL_PIN(73, "PE9"), +	PINCTRL_PIN(74, "PE10"), +	PINCTRL_PIN(75, "PE11"), +	PINCTRL_PIN(76, "PE12"), +	PINCTRL_PIN(77, "PE13"), +	PINCTRL_PIN(78, "PE14"), +	PINCTRL_PIN(79, "PE15"), +	PINCTRL_PIN(80, "PF0"), +	PINCTRL_PIN(81, "PF1"), +	PINCTRL_PIN(82, "PF2"), +	PINCTRL_PIN(83, "PF3"), +	PINCTRL_PIN(84, "PF4"), +	PINCTRL_PIN(85, "PF5"), +	PINCTRL_PIN(86, "PF6"), +	PINCTRL_PIN(87, "PF7"), +	PINCTRL_PIN(88, "PF8"), +	PINCTRL_PIN(89, "PF9"), +	PINCTRL_PIN(90, "PF10"), +	PINCTRL_PIN(91, "PF11"), +	PINCTRL_PIN(92, "PF12"), +	PINCTRL_PIN(93, "PF13"), +	PINCTRL_PIN(94, "PF14"), +	PINCTRL_PIN(95, "PF15"), +	PINCTRL_PIN(96, "PG0"), +	PINCTRL_PIN(97, "PG1"), +	PINCTRL_PIN(98, "PG2"), +	PINCTRL_PIN(99, "PG3"), +	PINCTRL_PIN(100, "PG4"), +	PINCTRL_PIN(101, "PG5"), +	PINCTRL_PIN(102, "PG6"), +	PINCTRL_PIN(103, "PG7"), +	PINCTRL_PIN(104, "PG8"), +	PINCTRL_PIN(105, "PG9"), +	PINCTRL_PIN(106, "PG10"), +	PINCTRL_PIN(107, "PG11"), +	PINCTRL_PIN(108, "PG12"), +	PINCTRL_PIN(109, "PG13"), +	PINCTRL_PIN(110, "PG14"), +	PINCTRL_PIN(111, "PG15"), +}; + +static const unsigned uart0_pins[] = { +	GPIO_PD7, GPIO_PD8, +}; + +static const unsigned uart0_ctsrts_pins[] = { +	GPIO_PD9, GPIO_PD10, +}; + +static const unsigned uart1_pins[] = { +	GPIO_PG15, GPIO_PG14, +}; + +static const unsigned uart1_ctsrts_pins[] = { +	GPIO_PG10, GPIO_PG13, +}; + +static const unsigned rsi0_pins[] = { +	GPIO_PG3, GPIO_PG2, GPIO_PG0, GPIO_PE15, GPIO_PG5, GPIO_PG6, +}; + +static const unsigned eth0_pins[] = { +	GPIO_PC6, GPIO_PC7, GPIO_PC2, GPIO_PC0, GPIO_PC3, GPIO_PC1, +	GPIO_PB13, GPIO_PD6, GPIO_PC5, GPIO_PC4, GPIO_PB14, GPIO_PB15, +}; + +static const unsigned eth1_pins[] = { +	GPIO_PE10, GPIO_PE11, GPIO_PG3, GPIO_PG0, GPIO_PG2, GPIO_PE15, +	GPIO_PG5, GPIO_PE12, GPIO_PE13, GPIO_PE14, GPIO_PG6, GPIO_PC9, +}; + +static const unsigned spi0_pins[] = { +	GPIO_PD4, GPIO_PD2, GPIO_PD3, +}; + +static const unsigned spi1_pins[] = { +	GPIO_PD5, GPIO_PD14, GPIO_PD13, +}; + +static const unsigned twi0_pins[] = { +}; + +static const unsigned twi1_pins[] = { +}; + +static const unsigned rotary_pins[] = { +	GPIO_PG7, GPIO_PG11, GPIO_PG12, +}; + +static const unsigned can0_pins[] = { +	GPIO_PG1, GPIO_PG4, +}; + +static const unsigned smc0_pins[] = { +	GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA5, GPIO_PA6, +	GPIO_PA7, GPIO_PA8, GPIO_PA9, GPIO_PB2, GPIO_PA10, GPIO_PA11, +	GPIO_PB3, GPIO_PA12, GPIO_PA13, GPIO_PA14, GPIO_PA15, GPIO_PB6, +	GPIO_PB7, GPIO_PB8, GPIO_PB10, GPIO_PB11, GPIO_PB0, +}; + +static const unsigned sport0_pins[] = { +	GPIO_PB5, GPIO_PB4, GPIO_PB9, GPIO_PB8, GPIO_PB7, GPIO_PB11, +}; + +static const unsigned sport1_pins[] = { +	GPIO_PE2, GPIO_PE5, GPIO_PD15, GPIO_PE4, GPIO_PE3, GPIO_PE1, +}; + +static const unsigned sport2_pins[] = { +	GPIO_PG4, GPIO_PG1, GPIO_PG9, GPIO_PG10, GPIO_PG7, GPIO_PB12, +}; + +static const unsigned ppi0_8b_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF13, GPIO_PF14, GPIO_PF15, +	GPIO_PE6, GPIO_PE7, GPIO_PE8, GPIO_PE9, +}; + +static const unsigned ppi0_16b_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, +	GPIO_PF13, GPIO_PF14, GPIO_PF15, +	GPIO_PE6, GPIO_PE7, GPIO_PE8, GPIO_PE9, +}; + +static const unsigned ppi0_24b_pins[] = { +	GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, +	GPIO_PF7, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, +	GPIO_PF13, GPIO_PF14, GPIO_PF15, GPIO_PE0, GPIO_PE1, GPIO_PE2, +	GPIO_PE3, GPIO_PE4, GPIO_PE5, GPIO_PE6, GPIO_PE7, GPIO_PE8, +	GPIO_PE9, GPIO_PD12, GPIO_PD15, +}; + +static const unsigned ppi1_8b_pins[] = { +	GPIO_PC0, GPIO_PC1, GPIO_PC2, GPIO_PC3, GPIO_PC4, GPIO_PC5, GPIO_PC6, +	GPIO_PC7, GPIO_PC8, GPIO_PB13, GPIO_PB14, GPIO_PB15, GPIO_PD6, +}; + +static const unsigned ppi1_16b_pins[] = { +	GPIO_PC0, GPIO_PC1, GPIO_PC2, GPIO_PC3, GPIO_PC4, GPIO_PC5, GPIO_PC6, +	GPIO_PC7, GPIO_PC9, GPIO_PC10, GPIO_PC11, GPIO_PC12, +	GPIO_PC13, GPIO_PC14, GPIO_PC15, +	GPIO_PB13, GPIO_PB14, GPIO_PB15, GPIO_PD6, +}; + +static const unsigned ppi2_8b_pins[] = { +	GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA5, GPIO_PA6, +	GPIO_PA7, GPIO_PB0, GPIO_PB1, GPIO_PB2, GPIO_PB3, +}; + +static const unsigned ppi2_16b_pins[] = { +	GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA5, GPIO_PA6, +	GPIO_PA7, GPIO_PA8, GPIO_PA9, GPIO_PA10, GPIO_PA11, GPIO_PA12, +	GPIO_PA13, GPIO_PA14, GPIO_PA15, GPIO_PB0, GPIO_PB1, GPIO_PB2, +}; + +static const unsigned lp0_pins[] = { +	GPIO_PB0, GPIO_PB1, GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, +	GPIO_PA4, GPIO_PA5, GPIO_PA6, GPIO_PA7, +}; + +static const unsigned lp1_pins[] = { +	GPIO_PB3, GPIO_PB2, GPIO_PA8, GPIO_PA9, GPIO_PA10, GPIO_PA11, +	GPIO_PA12, GPIO_PA13, GPIO_PA14, GPIO_PA15, +}; + +static const unsigned lp2_pins[] = { +	GPIO_PE6, GPIO_PE7, GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, +	GPIO_PF4, GPIO_PF5, GPIO_PF6, GPIO_PF7, +}; + +static const unsigned lp3_pins[] = { +	GPIO_PE9, GPIO_PE8, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, +	GPIO_PF12, GPIO_PF13, GPIO_PF14, GPIO_PF15, +}; + +static const unsigned short uart0_mux[] = { +	P_UART0_TX, P_UART0_RX, +	0 +}; + +static const unsigned short uart0_ctsrts_mux[] = { +	P_UART0_RTS, P_UART0_CTS, +	0 +}; + +static const unsigned short uart1_mux[] = { +	P_UART1_TX, P_UART1_RX, +	0 +}; + +static const unsigned short uart1_ctsrts_mux[] = { +	P_UART1_RTS, P_UART1_CTS, +	0 +}; + +static const unsigned short rsi0_mux[] = { +	P_RSI_DATA0, P_RSI_DATA1, P_RSI_DATA2, P_RSI_DATA3, +	P_RSI_CMD, P_RSI_CLK, 0 +}; + +static const unsigned short eth0_mux[] = P_RMII0; +static const unsigned short eth1_mux[] = P_RMII1; + +static const unsigned short spi0_mux[] = { +	P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0 +}; + +static const unsigned short spi1_mux[] = { +	P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0 +}; + +static const unsigned short twi0_mux[] = { +	P_TWI0_SCL, P_TWI0_SDA, 0 +}; + +static const unsigned short twi1_mux[] = { +	P_TWI1_SCL, P_TWI1_SDA, 0 +}; + +static const unsigned short rotary_mux[] = { +	P_CNT_CUD, P_CNT_CDG, P_CNT_CZM, 0 +}; + +static const unsigned short sport0_mux[] = { +	P_SPORT0_ACLK, P_SPORT0_AFS, P_SPORT0_AD0, P_SPORT0_BCLK, +	P_SPORT0_BFS, P_SPORT0_BD0, 0, +}; + +static const unsigned short sport1_mux[] = { +	P_SPORT1_ACLK, P_SPORT1_AFS, P_SPORT1_AD0, P_SPORT1_BCLK, +	P_SPORT1_BFS, P_SPORT1_BD0, 0, +}; + +static const unsigned short sport2_mux[] = { +	P_SPORT2_ACLK, P_SPORT2_AFS, P_SPORT2_AD0, P_SPORT2_BCLK, +	P_SPORT2_BFS, P_SPORT2_BD0, 0, +}; + +static const unsigned short can0_mux[] = { +	P_CAN0_RX, P_CAN0_TX, 0 +}; + +static const unsigned short smc0_mux[] = { +	P_A3, P_A4, P_A5, P_A6, P_A7, P_A8, P_A9, P_A10, P_A11, P_A12, +	P_A13, P_A14, P_A15, P_A16, P_A17, P_A18, P_A19, P_A20, P_A21, +	P_A22, P_A23, P_A24, P_A25, P_NORCK, 0, +}; + +static const unsigned short ppi0_8b_mux[] = { +	P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, +	P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, +	P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, +	0, +}; + +static const unsigned short ppi0_16b_mux[] = { +	P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, +	P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, +	P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, +	P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, +	P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, +	0, +}; + +static const unsigned short ppi0_24b_mux[] = { +	P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, +	P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, +	P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, +	P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, +	P_PPI0_D16, P_PPI0_D17, P_PPI0_D18, P_PPI0_D19, +	P_PPI0_D20, P_PPI0_D21, P_PPI0_D22, P_PPI0_D23, +	P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, +	0, +}; + +static const unsigned short ppi1_8b_mux[] = { +	P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, +	P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, +	P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, +	0, +}; + +static const unsigned short ppi1_16b_mux[] = { +	P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, +	P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, +	P_PPI1_D8, P_PPI1_D9, P_PPI1_D10, P_PPI1_D11, +	P_PPI1_D12, P_PPI1_D13, P_PPI1_D14, P_PPI1_D15, +	P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, +	0, +}; + +static const unsigned short ppi2_8b_mux[] = { +	P_PPI2_D0, P_PPI2_D1, P_PPI2_D2, P_PPI2_D3, +	P_PPI2_D4, P_PPI2_D5, P_PPI2_D6, P_PPI2_D7, +	P_PPI2_CLK, P_PPI2_FS1, P_PPI2_FS2, +	0, +}; + +static const unsigned short ppi2_16b_mux[] = { +	P_PPI2_D0, P_PPI2_D1, P_PPI2_D2, P_PPI2_D3, +	P_PPI2_D4, P_PPI2_D5, P_PPI2_D6, P_PPI2_D7, +	P_PPI2_D8, P_PPI2_D9, P_PPI2_D10, P_PPI2_D11, +	P_PPI2_D12, P_PPI2_D13, P_PPI2_D14, P_PPI2_D15, +	P_PPI2_CLK, P_PPI2_FS1, P_PPI2_FS2, +	0, +}; + +static const unsigned short lp0_mux[] = { +	P_LP0_CLK, P_LP0_ACK, P_LP0_D0, P_LP0_D1, P_LP0_D2, +	P_LP0_D3, P_LP0_D4, P_LP0_D5, P_LP0_D6, P_LP0_D7, +        0 +}; + +static const unsigned short lp1_mux[] = { +	P_LP1_CLK, P_LP1_ACK, P_LP1_D0, P_LP1_D1, P_LP1_D2, +	P_LP1_D3, P_LP1_D4, P_LP1_D5, P_LP1_D6, P_LP1_D7, +        0 +}; + +static const unsigned short lp2_mux[] = { +	P_LP2_CLK, P_LP2_ACK, P_LP2_D0, P_LP2_D1, P_LP2_D2, +	P_LP2_D3, P_LP2_D4, P_LP2_D5, P_LP2_D6, P_LP2_D7, +        0 +}; + +static const unsigned short lp3_mux[] = { +	P_LP3_CLK, P_LP3_ACK, P_LP3_D0, P_LP3_D1, P_LP3_D2, +	P_LP3_D3, P_LP3_D4, P_LP3_D5, P_LP3_D6, P_LP3_D7, +        0 +}; + +static const struct adi_pin_group adi_pin_groups[] = { +	ADI_PIN_GROUP("uart0grp", uart0_pins, uart0_mux), +	ADI_PIN_GROUP("uart0ctsrtsgrp", uart0_ctsrts_pins, uart0_ctsrts_mux), +	ADI_PIN_GROUP("uart1grp", uart1_pins, uart1_mux), +	ADI_PIN_GROUP("uart1ctsrtsgrp", uart1_ctsrts_pins, uart1_ctsrts_mux), +	ADI_PIN_GROUP("rsi0grp", rsi0_pins, rsi0_mux), +	ADI_PIN_GROUP("eth0grp", eth0_pins, eth0_mux), +	ADI_PIN_GROUP("eth1grp", eth1_pins, eth1_mux), +	ADI_PIN_GROUP("spi0grp", spi0_pins, spi0_mux), +	ADI_PIN_GROUP("spi1grp", spi1_pins, spi1_mux), +	ADI_PIN_GROUP("twi0grp", twi0_pins, twi0_mux), +	ADI_PIN_GROUP("twi1grp", twi1_pins, twi1_mux), +	ADI_PIN_GROUP("rotarygrp", rotary_pins, rotary_mux), +	ADI_PIN_GROUP("can0grp", can0_pins, can0_mux), +	ADI_PIN_GROUP("smc0grp", smc0_pins, smc0_mux), +	ADI_PIN_GROUP("sport0grp", sport0_pins, sport0_mux), +	ADI_PIN_GROUP("sport1grp", sport1_pins, sport1_mux), +	ADI_PIN_GROUP("sport2grp", sport2_pins, sport2_mux), +	ADI_PIN_GROUP("ppi0_8bgrp", ppi0_8b_pins, ppi0_8b_mux), +	ADI_PIN_GROUP("ppi0_16bgrp", ppi0_16b_pins, ppi0_16b_mux), +	ADI_PIN_GROUP("ppi0_24bgrp", ppi0_24b_pins, ppi0_24b_mux), +	ADI_PIN_GROUP("ppi1_8bgrp", ppi1_8b_pins, ppi1_8b_mux), +	ADI_PIN_GROUP("ppi1_16bgrp", ppi1_16b_pins, ppi1_16b_mux), +	ADI_PIN_GROUP("ppi2_8bgrp", ppi2_8b_pins, ppi2_8b_mux), +	ADI_PIN_GROUP("ppi2_16bgrp", ppi2_16b_pins, ppi2_16b_mux), +	ADI_PIN_GROUP("lp0grp", lp0_pins, lp0_mux), +	ADI_PIN_GROUP("lp1grp", lp1_pins, lp1_mux), +	ADI_PIN_GROUP("lp2grp", lp2_pins, lp2_mux), +	ADI_PIN_GROUP("lp3grp", lp3_pins, lp3_mux), +}; + +static const char * const uart0grp[] = { "uart0grp" }; +static const char * const uart0ctsrtsgrp[] = { "uart0ctsrtsgrp" }; +static const char * const uart1grp[] = { "uart1grp" }; +static const char * const uart1ctsrtsgrp[] = { "uart1ctsrtsgrp" }; +static const char * const rsi0grp[] = { "rsi0grp" }; +static const char * const eth0grp[] = { "eth0grp" }; +static const char * const eth1grp[] = { "eth1grp" }; +static const char * const spi0grp[] = { "spi0grp" }; +static const char * const spi1grp[] = { "spi1grp" }; +static const char * const twi0grp[] = { "twi0grp" }; +static const char * const twi1grp[] = { "twi1grp" }; +static const char * const rotarygrp[] = { "rotarygrp" }; +static const char * const can0grp[] = { "can0grp" }; +static const char * const smc0grp[] = { "smc0grp" }; +static const char * const sport0grp[] = { "sport0grp" }; +static const char * const sport1grp[] = { "sport1grp" }; +static const char * const sport2grp[] = { "sport2grp" }; +static const char * const ppi0grp[] = { "ppi0_8bgrp", +					"ppi0_16bgrp", +					"ppi0_24bgrp" }; +static const char * const ppi1grp[] = { "ppi1_8bgrp", +					"ppi1_16bgrp" }; +static const char * const ppi2grp[] = { "ppi2_8bgrp", +					"ppi2_16bgrp" }; +static const char * const lp0grp[] = { "lp0grp" }; +static const char * const lp1grp[] = { "lp1grp" }; +static const char * const lp2grp[] = { "lp2grp" }; +static const char * const lp3grp[] = { "lp3grp" }; + +static const struct adi_pmx_func adi_pmx_functions[] = { +	ADI_PMX_FUNCTION("uart0", uart0grp), +	ADI_PMX_FUNCTION("uart0_ctsrts", uart0ctsrtsgrp), +	ADI_PMX_FUNCTION("uart1", uart1grp), +	ADI_PMX_FUNCTION("uart1_ctsrts", uart1ctsrtsgrp), +	ADI_PMX_FUNCTION("rsi0", rsi0grp), +	ADI_PMX_FUNCTION("eth0", eth0grp), +	ADI_PMX_FUNCTION("eth1", eth1grp), +	ADI_PMX_FUNCTION("spi0", spi0grp), +	ADI_PMX_FUNCTION("spi1", spi1grp), +	ADI_PMX_FUNCTION("twi0", twi0grp), +	ADI_PMX_FUNCTION("twi1", twi1grp), +	ADI_PMX_FUNCTION("rotary", rotarygrp), +	ADI_PMX_FUNCTION("can0", can0grp), +	ADI_PMX_FUNCTION("smc0", smc0grp), +	ADI_PMX_FUNCTION("sport0", sport0grp), +	ADI_PMX_FUNCTION("sport1", sport1grp), +	ADI_PMX_FUNCTION("sport2", sport2grp), +	ADI_PMX_FUNCTION("ppi0", ppi0grp), +	ADI_PMX_FUNCTION("ppi1", ppi1grp), +	ADI_PMX_FUNCTION("ppi2", ppi2grp), +	ADI_PMX_FUNCTION("lp0", lp0grp), +	ADI_PMX_FUNCTION("lp1", lp1grp), +	ADI_PMX_FUNCTION("lp2", lp2grp), +	ADI_PMX_FUNCTION("lp3", lp3grp), +}; + +static const struct adi_pinctrl_soc_data adi_bf60x_soc = { +	.functions = adi_pmx_functions, +	.nfunctions = ARRAY_SIZE(adi_pmx_functions), +	.groups = adi_pin_groups, +	.ngroups = ARRAY_SIZE(adi_pin_groups), +	.pins = adi_pads, +	.npins = ARRAY_SIZE(adi_pads), +}; + +void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc) +{ +	*soc = &adi_bf60x_soc; +} diff --git a/drivers/pinctrl/pinctrl-adi2.c b/drivers/pinctrl/pinctrl-adi2.c new file mode 100644 index 00000000000..5c44feb54eb --- /dev/null +++ b/drivers/pinctrl/pinctrl-adi2.c @@ -0,0 +1,1178 @@ +/* + * Pinctrl Driver for ADI GPIO2 controller + * + * Copyright 2007-2013 Analog Devices Inc. + * + * Licensed under the GPLv2 or later + */ + +#include <linux/bitops.h> +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/err.h> +#include <linux/debugfs.h> +#include <linux/seq_file.h> +#include <linux/irq.h> +#include <linux/platform_data/pinctrl-adi2.h> +#include <linux/irqdomain.h> +#include <linux/irqchip/chained_irq.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/pinctrl/consumer.h> +#include <linux/pinctrl/machine.h> +#include <linux/syscore_ops.h> +#include <linux/gpio.h> +#include <asm/portmux.h> +#include "pinctrl-adi2.h" +#include "core.h" + +/* +According to the BF54x HRM, pint means "pin interrupt". +http://www.analog.com/static/imported-files/processor_manuals/ADSP-BF54x_hwr_rev1.2.pdf + +ADSP-BF54x processor Blackfin processors have four SIC interrupt chan- +nels dedicated to pin interrupt purposes. These channels are managed by +four hardware blocks, called PINT0, PINT1, PINT2, and PINT3. Every PINTx +block can sense to up to 32 pins. While PINT0 and PINT1 can sense the +pins of port A and port B, PINT2 and PINT3 manage all the pins from port +C to port J as shown in Figure 9-2. + +n BF54x HRM: +The ten GPIO ports are subdivided into 8-bit half ports, resulting in lower and +upper half 8-bit units. The PINTx_ASSIGN registers control the 8-bit multi- +plexers shown in Figure 9-3. Lower half units of eight pins can be +forwarded to either byte 0 or byte 2 of either associated PINTx block. +Upper half units can be forwarded to either byte 1 or byte 3 of the pin +interrupt blocks, without further restrictions. + +All MMR registers in the pin interrupt module are 32 bits wide. To simply the +mapping logic, this driver only maps a 16-bit gpio port to the upper or lower +16 bits of a PINTx block. You can find the Figure 9-3 on page 583. + +Each IRQ domain is binding to a GPIO bank device. 2 GPIO bank devices can map +to one PINT device. Two in "struct gpio_pint" are used to ease the PINT +interrupt handler. + +The GPIO bank mapping to the lower 16 bits of the PINT device set its IRQ +domain pointer in domain[0]. The IRQ domain pointer of the other bank is set +to domain[1]. PINT interrupt handler adi_gpio_handle_pint_irq() finds out +the current domain pointer according to whether the interrupt request mask +is in lower 16 bits (domain[0]) or upper 16bits (domain[1]). + +A PINT device is not part of a GPIO port device in Blackfin. Multiple GPIO +port devices can be mapped to the same PINT device. + +*/ + +static LIST_HEAD(adi_pint_list); +static LIST_HEAD(adi_gpio_port_list); + +#define DRIVER_NAME "pinctrl-adi2" + +#define PINT_HI_OFFSET		16 + +/** + * struct gpio_port_saved - GPIO port registers that should be saved between + * power suspend and resume operations. + * + * @fer: PORTx_FER register + * @data: PORTx_DATA register + * @dir: PORTx_DIR register + * @inen: PORTx_INEN register + * @mux: PORTx_MUX register + */ +struct gpio_port_saved { +	u16 fer; +	u16 data; +	u16 dir; +	u16 inen; +	u32 mux; +}; + +/* + * struct gpio_pint_saved - PINT registers saved in PM operations + * + * @assign: ASSIGN register + * @edge_set: EDGE_SET register + * @invert_set: INVERT_SET register + */ +struct gpio_pint_saved { +	u32 assign; +	u32 edge_set; +	u32 invert_set; +}; + +/** + * struct gpio_pint - Pin interrupt controller device. Multiple ADI GPIO + * banks can be mapped into one Pin interrupt controller. + * + * @node: All gpio_pint instances are added to a global list. + * @base: PINT device register base address + * @irq: IRQ of the PINT device, it is the parent IRQ of all + *       GPIO IRQs mapping to this device. + * @domain: [0] irq domain of the gpio port, whose hardware interrupts are + *		mapping to the low 16-bit of the pint registers. + *          [1] irq domain of the gpio port, whose hardware interrupts are + *		mapping to the high 16-bit of the pint registers. + * @regs: address pointer to the PINT device + * @map_count: No more than 2 GPIO banks can be mapped to this PINT device. + * @lock: This lock make sure the irq_chip operations to one PINT device + *        for different GPIO interrrupts are atomic. + * @pint_map_port: Set up the mapping between one PINT device and + *                 multiple GPIO banks. + */ +struct gpio_pint { +	struct list_head node; +	void __iomem *base; +	int irq; +	struct irq_domain *domain[2]; +	struct gpio_pint_regs *regs; +	struct gpio_pint_saved saved_data; +	int map_count; +	spinlock_t lock; + +	int (*pint_map_port)(struct gpio_pint *pint, bool assign, +				u8 map, struct irq_domain *domain); +}; + +/** + * ADI pin controller + * + * @dev: a pointer back to containing device + * @pctl: the pinctrl device + * @soc: SoC data for this specific chip + */ +struct adi_pinctrl { +	struct device *dev; +	struct pinctrl_dev *pctl; +	const struct adi_pinctrl_soc_data *soc; +}; + +/** + * struct gpio_port - GPIO bank device. Multiple ADI GPIO banks can be mapped + * into one pin interrupt controller. + * + * @node: All gpio_port instances are added to a list. + * @base: GPIO bank device register base address + * @irq_base: base IRQ of the GPIO bank device + * @width: PIN number of the GPIO bank device + * @regs: address pointer to the GPIO bank device + * @saved_data: registers that should be saved between PM operations. + * @dev: device structure of this GPIO bank + * @pint: GPIO PINT device that this GPIO bank mapped to + * @pint_map: GIOP bank mapping code in PINT device + * @pint_assign: The 32-bit PINT registers can be divided into 2 parts. A + *               GPIO bank can be mapped into either low 16 bits[0] or high 16 + *               bits[1] of each PINT register. + * @lock: This lock make sure the irq_chip operations to one PINT device + *        for different GPIO interrrupts are atomic. + * @chip: abstract a GPIO controller + * @domain: The irq domain owned by the GPIO port. + * @rsvmap: Reservation map array for each pin in the GPIO bank + */ +struct gpio_port { +	struct list_head node; +	void __iomem *base; +	int irq_base; +	unsigned int width; +	struct gpio_port_t *regs; +	struct gpio_port_saved saved_data; +	struct device *dev; + +	struct gpio_pint *pint; +	u8 pint_map; +	bool pint_assign; + +	spinlock_t lock; +	struct gpio_chip chip; +	struct irq_domain *domain; +}; + +static inline u8 pin_to_offset(struct pinctrl_gpio_range *range, unsigned pin) +{ +	return pin - range->pin_base; +} + +static inline u32 hwirq_to_pintbit(struct gpio_port *port, int hwirq) +{ +	return port->pint_assign ? BIT(hwirq) << PINT_HI_OFFSET : BIT(hwirq); +} + +static struct gpio_pint *find_gpio_pint(unsigned id) +{ +	struct gpio_pint *pint; +	int i = 0; + +	list_for_each_entry(pint, &adi_pint_list, node) { +		if (id == i) +			return pint; +		i++; +	} + +	return NULL; +} + +static inline void port_setup(struct gpio_port *port, unsigned offset, +	bool use_for_gpio) +{ +	struct gpio_port_t *regs = port->regs; + +	if (use_for_gpio) +		writew(readw(®s->port_fer) & ~BIT(offset), +			®s->port_fer); +	else +		writew(readw(®s->port_fer) | BIT(offset), ®s->port_fer); +} + +static inline void portmux_setup(struct gpio_port *port, unsigned offset, +	unsigned short function) +{ +	struct gpio_port_t *regs = port->regs; +	u32 pmux; + +	pmux = readl(®s->port_mux); + +	/* The function field of each pin has 2 consecutive bits in +	 * the mux register. +	 */ +	pmux &= ~(0x3 << (2 * offset)); +	pmux |= (function & 0x3) << (2 * offset); + +	writel(pmux, ®s->port_mux); +} + +static inline u16 get_portmux(struct gpio_port *port, unsigned offset) +{ +	struct gpio_port_t *regs = port->regs; +	u32 pmux = readl(®s->port_mux); + +	/* The function field of each pin has 2 consecutive bits in +	 * the mux register. +	 */ +	return pmux >> (2 * offset) & 0x3; +} + +static void adi_gpio_ack_irq(struct irq_data *d) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *regs = port->pint->regs; +	unsigned pintbit = hwirq_to_pintbit(port, d->hwirq); + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) { +		if (readl(®s->invert_set) & pintbit) +			writel(pintbit, ®s->invert_clear); +		else +			writel(pintbit, ®s->invert_set); +	} + +	writel(pintbit, ®s->request); + +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); +} + +static void adi_gpio_mask_ack_irq(struct irq_data *d) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *regs = port->pint->regs; +	unsigned pintbit = hwirq_to_pintbit(port, d->hwirq); + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) { +		if (readl(®s->invert_set) & pintbit) +			writel(pintbit, ®s->invert_clear); +		else +			writel(pintbit, ®s->invert_set); +	} + +	writel(pintbit, ®s->request); +	writel(pintbit, ®s->mask_clear); + +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); +} + +static void adi_gpio_mask_irq(struct irq_data *d) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *regs = port->pint->regs; + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	writel(hwirq_to_pintbit(port, d->hwirq), ®s->mask_clear); + +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); +} + +static void adi_gpio_unmask_irq(struct irq_data *d) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *regs = port->pint->regs; + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	writel(hwirq_to_pintbit(port, d->hwirq), ®s->mask_set); + +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); +} + +static unsigned int adi_gpio_irq_startup(struct irq_data *d) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *regs; + +	if (!port) { +		pr_err("GPIO IRQ %d :Not exist\n", d->irq); +		/* FIXME: negative return code will be ignored */ +		return -ENODEV; +	} + +	regs = port->pint->regs; + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	port_setup(port, d->hwirq, true); +	writew(BIT(d->hwirq), &port->regs->dir_clear); +	writew(readw(&port->regs->inen) | BIT(d->hwirq), &port->regs->inen); + +	writel(hwirq_to_pintbit(port, d->hwirq), ®s->mask_set); + +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); + +	return 0; +} + +static void adi_gpio_irq_shutdown(struct irq_data *d) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *regs = port->pint->regs; + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	writel(hwirq_to_pintbit(port, d->hwirq), ®s->mask_clear); + +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); +} + +static int adi_gpio_irq_type(struct irq_data *d, unsigned int type) +{ +	unsigned long flags; +	struct gpio_port *port = irq_data_get_irq_chip_data(d); +	struct gpio_pint_regs *pint_regs; +	unsigned pintmask; +	unsigned int irq = d->irq; +	int ret = 0; +	char buf[16]; + +	if (!port) { +		pr_err("GPIO IRQ %d :Not exist\n", d->irq); +		return -ENODEV; +	} + +	pint_regs = port->pint->regs; + +	pintmask = hwirq_to_pintbit(port, d->hwirq); + +	spin_lock_irqsave(&port->lock, flags); +	spin_lock(&port->pint->lock); + +	/* In case of interrupt autodetect, set irq type to edge sensitive. */ +	if (type == IRQ_TYPE_PROBE) +		type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING; + +	if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING | +		    IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) { +		snprintf(buf, 16, "gpio-irq%d", irq); +		port_setup(port, d->hwirq, true); +	} else +		goto out; + +	/* The GPIO interrupt is triggered only when its input value +	 * transfer from 0 to 1. So, invert the input value if the +	 * irq type is low or falling +	 */ +	if ((type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW))) +		writel(pintmask, &pint_regs->invert_set); +	else +		writel(pintmask, &pint_regs->invert_clear); + +	/* In edge sensitive case, if the input value of the requested irq +	 * is already 1, invert it. +	 */ +	if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) { +		if (gpio_get_value(port->chip.base + d->hwirq)) +			writel(pintmask, &pint_regs->invert_set); +		else +			writel(pintmask, &pint_regs->invert_clear); +	} + +	if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) { +		writel(pintmask, &pint_regs->edge_set); +		__irq_set_handler_locked(irq, handle_edge_irq); +	} else { +		writel(pintmask, &pint_regs->edge_clear); +		__irq_set_handler_locked(irq, handle_level_irq); +	} + +out: +	spin_unlock(&port->pint->lock); +	spin_unlock_irqrestore(&port->lock, flags); + +	return ret; +} + +#ifdef CONFIG_PM +static int adi_gpio_set_wake(struct irq_data *d, unsigned int state) +{ +	struct gpio_port *port = irq_data_get_irq_chip_data(d); + +	if (!port || !port->pint || port->pint->irq != d->irq) +		return -EINVAL; + +#ifndef SEC_GCTL +	adi_internal_set_wake(port->pint->irq, state); +#endif + +	return 0; +} + +static int adi_pint_suspend(void) +{ +	struct gpio_pint *pint; + +	list_for_each_entry(pint, &adi_pint_list, node) { +		writel(0xffffffff, &pint->regs->mask_clear); +		pint->saved_data.assign = readl(&pint->regs->assign); +		pint->saved_data.edge_set = readl(&pint->regs->edge_set); +		pint->saved_data.invert_set = readl(&pint->regs->invert_set); +	} + +	return 0; +} + +static void adi_pint_resume(void) +{ +	struct gpio_pint *pint; + +	list_for_each_entry(pint, &adi_pint_list, node) { +		writel(pint->saved_data.assign, &pint->regs->assign); +		writel(pint->saved_data.edge_set, &pint->regs->edge_set); +		writel(pint->saved_data.invert_set, &pint->regs->invert_set); +	} +} + +static int adi_gpio_suspend(void) +{ +	struct gpio_port *port; + +	list_for_each_entry(port, &adi_gpio_port_list, node) { +		port->saved_data.fer = readw(&port->regs->port_fer); +		port->saved_data.mux = readl(&port->regs->port_mux); +		port->saved_data.data = readw(&port->regs->data); +		port->saved_data.inen = readw(&port->regs->inen); +		port->saved_data.dir = readw(&port->regs->dir_set); +	} + +	return adi_pint_suspend(); +} + +static void adi_gpio_resume(void) +{ +	struct gpio_port *port; + +	adi_pint_resume(); + +	list_for_each_entry(port, &adi_gpio_port_list, node) { +		writel(port->saved_data.mux, &port->regs->port_mux); +		writew(port->saved_data.fer, &port->regs->port_fer); +		writew(port->saved_data.inen, &port->regs->inen); +		writew(port->saved_data.data & port->saved_data.dir, +					&port->regs->data_set); +		writew(port->saved_data.dir, &port->regs->dir_set); +	} + +} + +static struct syscore_ops gpio_pm_syscore_ops = { +	.suspend = adi_gpio_suspend, +	.resume = adi_gpio_resume, +}; +#else /* CONFIG_PM */ +#define adi_gpio_set_wake NULL +#endif /* CONFIG_PM */ + +#ifdef CONFIG_IRQ_PREFLOW_FASTEOI +static inline void preflow_handler(struct irq_desc *desc) +{ +	if (desc->preflow_handler) +		desc->preflow_handler(&desc->irq_data); +} +#else +static inline void preflow_handler(struct irq_desc *desc) { } +#endif + +static void adi_gpio_handle_pint_irq(unsigned int inta_irq, +			struct irq_desc *desc) +{ +	u32 request; +	u32 level_mask, hwirq; +	bool umask = false; +	struct gpio_pint *pint = irq_desc_get_handler_data(desc); +	struct irq_chip *chip = irq_desc_get_chip(desc); +	struct gpio_pint_regs *regs = pint->regs; +	struct irq_domain *domain; + +	preflow_handler(desc); +	chained_irq_enter(chip, desc); + +	request = readl(®s->request); +	level_mask = readl(®s->edge_set) & request; + +	hwirq = 0; +	domain = pint->domain[0]; +	while (request) { +		/* domain pointer need to be changed only once at IRQ 16 when +		 * we go through IRQ requests from bit 0 to bit 31. +		 */ +		if (hwirq == PINT_HI_OFFSET) +			domain = pint->domain[1]; + +		if (request & 1) { +			if (level_mask & BIT(hwirq)) { +				umask = true; +				chained_irq_exit(chip, desc); +			} +			generic_handle_irq(irq_find_mapping(domain, +					hwirq % PINT_HI_OFFSET)); +		} + +		hwirq++; +		request >>= 1; +	} + +	if (!umask) +		chained_irq_exit(chip, desc); +} + +static struct irq_chip adi_gpio_irqchip = { +	.name = "GPIO", +	.irq_ack = adi_gpio_ack_irq, +	.irq_mask = adi_gpio_mask_irq, +	.irq_mask_ack = adi_gpio_mask_ack_irq, +	.irq_unmask = adi_gpio_unmask_irq, +	.irq_disable = adi_gpio_mask_irq, +	.irq_enable = adi_gpio_unmask_irq, +	.irq_set_type = adi_gpio_irq_type, +	.irq_startup = adi_gpio_irq_startup, +	.irq_shutdown = adi_gpio_irq_shutdown, +	.irq_set_wake = adi_gpio_set_wake, +}; + +static int adi_get_groups_count(struct pinctrl_dev *pctldev) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pinctrl->soc->ngroups; +} + +static const char *adi_get_group_name(struct pinctrl_dev *pctldev, +				       unsigned selector) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pinctrl->soc->groups[selector].name; +} + +static int adi_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, +			       const unsigned **pins, +			       unsigned *num_pins) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); + +	*pins = pinctrl->soc->groups[selector].pins; +	*num_pins = pinctrl->soc->groups[selector].num; +	return 0; +} + +static struct pinctrl_ops adi_pctrl_ops = { +	.get_groups_count = adi_get_groups_count, +	.get_group_name = adi_get_group_name, +	.get_group_pins = adi_get_group_pins, +}; + +static int adi_pinmux_enable(struct pinctrl_dev *pctldev, unsigned func_id, +	unsigned group_id) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); +	struct gpio_port *port; +	struct pinctrl_gpio_range *range; +	unsigned long flags; +	unsigned short *mux, pin; + +	mux = (unsigned short *)pinctrl->soc->groups[group_id].mux; + +	while (*mux) { +		pin = P_IDENT(*mux); + +		range = pinctrl_find_gpio_range_from_pin(pctldev, pin); +		if (range == NULL) /* should not happen */ +			return -ENODEV; + +		port = container_of(range->gc, struct gpio_port, chip); + +		spin_lock_irqsave(&port->lock, flags); + +		portmux_setup(port, pin_to_offset(range, pin), +				P_FUNCT2MUX(*mux)); +		port_setup(port, pin_to_offset(range, pin), false); +		mux++; + +		spin_unlock_irqrestore(&port->lock, flags); +	} + +	return 0; +} + +static void adi_pinmux_disable(struct pinctrl_dev *pctldev, unsigned func_id, +	unsigned group_id) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); +	struct gpio_port *port; +	struct pinctrl_gpio_range *range; +	unsigned long flags; +	unsigned short *mux, pin; + +	mux = (unsigned short *)pinctrl->soc->groups[group_id].mux; + +	while (*mux) { +		pin = P_IDENT(*mux); + +		range = pinctrl_find_gpio_range_from_pin(pctldev, pin); +		if (range == NULL) /* should not happen */ +			return; + +		port = container_of(range->gc, struct gpio_port, chip); + +		spin_lock_irqsave(&port->lock, flags); + +		port_setup(port, pin_to_offset(range, pin), true); +		mux++; + +		spin_unlock_irqrestore(&port->lock, flags); +	} +} + +static int adi_pinmux_get_funcs_count(struct pinctrl_dev *pctldev) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pinctrl->soc->nfunctions; +} + +static const char *adi_pinmux_get_func_name(struct pinctrl_dev *pctldev, +					  unsigned selector) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pinctrl->soc->functions[selector].name; +} + +static int adi_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned selector, +			       const char * const **groups, +			       unsigned * const num_groups) +{ +	struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); + +	*groups = pinctrl->soc->functions[selector].groups; +	*num_groups = pinctrl->soc->functions[selector].num_groups; +	return 0; +} + +static int adi_pinmux_request_gpio(struct pinctrl_dev *pctldev, +	struct pinctrl_gpio_range *range, unsigned pin) +{ +	struct gpio_port *port; +	unsigned long flags; +	u8 offset; + +	port = container_of(range->gc, struct gpio_port, chip); +	offset = pin_to_offset(range, pin); + +	spin_lock_irqsave(&port->lock, flags); + +	port_setup(port, offset, true); + +	spin_unlock_irqrestore(&port->lock, flags); + +	return 0; +} + +static struct pinmux_ops adi_pinmux_ops = { +	.enable = adi_pinmux_enable, +	.disable = adi_pinmux_disable, +	.get_functions_count = adi_pinmux_get_funcs_count, +	.get_function_name = adi_pinmux_get_func_name, +	.get_function_groups = adi_pinmux_get_groups, +	.gpio_request_enable = adi_pinmux_request_gpio, +}; + + +static struct pinctrl_desc adi_pinmux_desc = { +	.name = DRIVER_NAME, +	.pctlops = &adi_pctrl_ops, +	.pmxops = &adi_pinmux_ops, +	.owner = THIS_MODULE, +}; + +static int adi_gpio_request(struct gpio_chip *chip, unsigned offset) +{ +	return pinctrl_request_gpio(chip->base + offset); +} + +static void adi_gpio_free(struct gpio_chip *chip, unsigned offset) +{ +	pinctrl_free_gpio(chip->base + offset); +} + +static int adi_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ +	struct gpio_port *port; +	unsigned long flags; + +	port = container_of(chip, struct gpio_port, chip); + +	spin_lock_irqsave(&port->lock, flags); + +	writew(BIT(offset), &port->regs->dir_clear); +	writew(readw(&port->regs->inen) | BIT(offset), &port->regs->inen); + +	spin_unlock_irqrestore(&port->lock, flags); + +	return 0; +} + +static void adi_gpio_set_value(struct gpio_chip *chip, unsigned offset, +	int value) +{ +	struct gpio_port *port = container_of(chip, struct gpio_port, chip); +	struct gpio_port_t *regs = port->regs; +	unsigned long flags; + +	spin_lock_irqsave(&port->lock, flags); + +	if (value) +		writew(BIT(offset), ®s->data_set); +	else +		writew(BIT(offset), ®s->data_clear); + +	spin_unlock_irqrestore(&port->lock, flags); +} + +static int adi_gpio_direction_output(struct gpio_chip *chip, unsigned offset, +	int value) +{ +	struct gpio_port *port = container_of(chip, struct gpio_port, chip); +	struct gpio_port_t *regs = port->regs; +	unsigned long flags; + +	spin_lock_irqsave(&port->lock, flags); + +	writew(readw(®s->inen) & ~BIT(offset), ®s->inen); +	if (value) +		writew(BIT(offset), ®s->data_set); +	else +		writew(BIT(offset), ®s->data_clear); +	writew(BIT(offset), ®s->dir_set); + +	spin_unlock_irqrestore(&port->lock, flags); + +	return 0; +} + +static int adi_gpio_get_value(struct gpio_chip *chip, unsigned offset) +{ +	struct gpio_port *port = container_of(chip, struct gpio_port, chip); +	struct gpio_port_t *regs = port->regs; +	unsigned long flags; +	int ret; + +	spin_lock_irqsave(&port->lock, flags); + +	ret = !!(readw(®s->data) & BIT(offset)); + +	spin_unlock_irqrestore(&port->lock, flags); + +	return ret; +} + +static int adi_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	struct gpio_port *port = container_of(chip, struct gpio_port, chip); + +	if (port->irq_base >= 0) +		return irq_find_mapping(port->domain, offset); +	else +		return irq_create_mapping(port->domain, offset); +} + +static int adi_pint_map_port(struct gpio_pint *pint, bool assign, u8 map, +	struct irq_domain *domain) +{ +	struct gpio_pint_regs *regs = pint->regs; +	u32 map_mask; + +	if (pint->map_count > 1) +		return -EINVAL; + +	pint->map_count++; + +	/* The map_mask of each gpio port is a 16-bit duplicate +	 * of the 8-bit map. It can be set to either high 16 bits or low +	 * 16 bits of the pint assignment register. +	 */ +	map_mask = (map << 8) | map; +	if (assign) { +		map_mask <<= PINT_HI_OFFSET; +		writel((readl(®s->assign) & 0xFFFF) | map_mask, +			®s->assign); +	} else +		writel((readl(®s->assign) & 0xFFFF0000) | map_mask, +			®s->assign); + +	pint->domain[assign] = domain; + +	return 0; +} + +static int adi_gpio_pint_probe(struct platform_device *pdev) +{ +	struct device *dev = &pdev->dev; +	struct resource *res; +	struct gpio_pint *pint; + +	pint = devm_kzalloc(dev, sizeof(struct gpio_pint), GFP_KERNEL); +	if (!pint) { +		dev_err(dev, "Memory alloc failed\n"); +		return -ENOMEM; +	} + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	pint->base = devm_ioremap_resource(dev, res); +	if (IS_ERR(pint->base)) +		return PTR_ERR(pint->base); + +	pint->regs = (struct gpio_pint_regs *)pint->base; + +	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); +	if (!res) { +		dev_err(dev, "Invalid IRQ resource\n"); +		return -ENODEV; +	} + +	spin_lock_init(&pint->lock); + +	pint->irq = res->start; +	pint->pint_map_port = adi_pint_map_port; +	platform_set_drvdata(pdev, pint); + +	irq_set_chained_handler(pint->irq, adi_gpio_handle_pint_irq); +	irq_set_handler_data(pint->irq, pint); + +	list_add_tail(&pint->node, &adi_pint_list); + +	return 0; +} + +static int adi_gpio_pint_remove(struct platform_device *pdev) +{ +	struct gpio_pint *pint = platform_get_drvdata(pdev); + +	list_del(&pint->node); +	irq_set_handler(pint->irq, handle_simple_irq); + +	return 0; +} + +static int adi_gpio_irq_map(struct irq_domain *d, unsigned int irq, +				irq_hw_number_t hwirq) +{ +	struct gpio_port *port = d->host_data; + +	if (!port) +		return -EINVAL; + +	irq_set_chip_data(irq, port); +	irq_set_chip_and_handler(irq, &adi_gpio_irqchip, +				handle_level_irq); + +	return 0; +} + +static const struct irq_domain_ops adi_gpio_irq_domain_ops = { +	.map = adi_gpio_irq_map, +	.xlate = irq_domain_xlate_onecell, +}; + +static int adi_gpio_init_int(struct gpio_port *port) +{ +	struct device_node *node = port->dev->of_node; +	struct gpio_pint *pint = port->pint; +	int ret; + +	port->domain = irq_domain_add_linear(node, port->width, +				&adi_gpio_irq_domain_ops, port); +	if (!port->domain) { +		dev_err(port->dev, "Failed to create irqdomain\n"); +		return -ENOSYS; +	} + +	/* According to BF54x and BF60x HRM, pin interrupt devices are not +	 * part of the GPIO port device. in GPIO interrupt mode, the GPIO +	 * pins of multiple port devices can be routed into one pin interrupt +	 * device. The mapping can be configured by setting pint assignment +	 * register with the mapping value of different GPIO port. This is +	 * done via function pint_map_port(). +	 */ +	ret = pint->pint_map_port(port->pint, port->pint_assign, +			port->pint_map,	port->domain); +	if (ret) +		return ret; + +	if (port->irq_base >= 0) { +		ret = irq_create_strict_mappings(port->domain, port->irq_base, +					0, port->width); +		if (ret) { +			dev_err(port->dev, "Couldn't associate to domain\n"); +			return ret; +		} +	} + +	return 0; +} + +#define DEVNAME_SIZE 16 + +static int adi_gpio_probe(struct platform_device *pdev) +{ +	struct device *dev = &pdev->dev; +	const struct adi_pinctrl_gpio_platform_data *pdata; +	struct resource *res; +	struct gpio_port *port; +	char pinctrl_devname[DEVNAME_SIZE]; +	static int gpio; +	int ret = 0, ret1; + +	pdata = dev->platform_data; +	if (!pdata) +		return -EINVAL; + +	port = devm_kzalloc(dev, sizeof(struct gpio_port), GFP_KERNEL); +	if (!port) { +		dev_err(dev, "Memory alloc failed\n"); +		return -ENOMEM; +	} + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	port->base = devm_ioremap_resource(dev, res); +	if (IS_ERR(port->base)) +		return PTR_ERR(port->base); + +	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); +	if (!res) +		port->irq_base = -1; +	else +		port->irq_base = res->start; + +	port->width = pdata->port_width; +	port->dev = dev; +	port->regs = (struct gpio_port_t *)port->base; +	port->pint_assign = pdata->pint_assign; +	port->pint_map = pdata->pint_map; + +	port->pint = find_gpio_pint(pdata->pint_id); +	if (port->pint) { +		ret = adi_gpio_init_int(port); +		if (ret) +			return ret; +	} + +	spin_lock_init(&port->lock); + +	platform_set_drvdata(pdev, port); + +	port->chip.label		= "adi-gpio"; +	port->chip.direction_input	= adi_gpio_direction_input; +	port->chip.get			= adi_gpio_get_value; +	port->chip.direction_output	= adi_gpio_direction_output; +	port->chip.set			= adi_gpio_set_value; +	port->chip.request		= adi_gpio_request; +	port->chip.free			= adi_gpio_free; +	port->chip.to_irq		= adi_gpio_to_irq; +	if (pdata->port_gpio_base > 0) +		port->chip.base		= pdata->port_gpio_base; +	else +		port->chip.base		= gpio; +	port->chip.ngpio		= port->width; +	gpio = port->chip.base + port->width; + +	ret = gpiochip_add(&port->chip); +	if (ret) { +		dev_err(&pdev->dev, "Fail to add GPIO chip.\n"); +		goto out_remove_domain; +	} + +	/* Add gpio pin range */ +	snprintf(pinctrl_devname, DEVNAME_SIZE, "pinctrl-adi2.%d", +		pdata->pinctrl_id); +	pinctrl_devname[DEVNAME_SIZE - 1] = 0; +	ret = gpiochip_add_pin_range(&port->chip, pinctrl_devname, +		0, pdata->port_pin_base, port->width); +	if (ret) { +		dev_err(&pdev->dev, "Fail to add pin range to %s.\n", +				pinctrl_devname); +		goto out_remove_gpiochip; +	} + +	list_add_tail(&port->node, &adi_gpio_port_list); + +	return 0; + +out_remove_gpiochip: +	ret1 = gpiochip_remove(&port->chip); +out_remove_domain: +	if (port->pint) +		irq_domain_remove(port->domain); + +	return ret; +} + +static int adi_gpio_remove(struct platform_device *pdev) +{ +	struct gpio_port *port = platform_get_drvdata(pdev); +	int ret; +	u8 offset; + +	list_del(&port->node); +	gpiochip_remove_pin_ranges(&port->chip); +	ret = gpiochip_remove(&port->chip); +	if (port->pint) { +		for (offset = 0; offset < port->width; offset++) +			irq_dispose_mapping(irq_find_mapping(port->domain, +				offset)); +		irq_domain_remove(port->domain); +	} + +	return ret; +} + +static int adi_pinctrl_probe(struct platform_device *pdev) +{ +	struct adi_pinctrl *pinctrl; + +	pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL); +	if (!pinctrl) +		return -ENOMEM; + +	pinctrl->dev = &pdev->dev; + +	adi_pinctrl_soc_init(&pinctrl->soc); + +	adi_pinmux_desc.pins = pinctrl->soc->pins; +	adi_pinmux_desc.npins = pinctrl->soc->npins; + +	/* Now register the pin controller and all pins it handles */ +	pinctrl->pctl = pinctrl_register(&adi_pinmux_desc, &pdev->dev, pinctrl); +	if (!pinctrl->pctl) { +		dev_err(&pdev->dev, "could not register pinctrl ADI2 driver\n"); +		return -EINVAL; +	} + +	platform_set_drvdata(pdev, pinctrl); + +	return 0; +} + +static int adi_pinctrl_remove(struct platform_device *pdev) +{ +	struct adi_pinctrl *pinctrl = platform_get_drvdata(pdev); + +	pinctrl_unregister(pinctrl->pctl); + +	return 0; +} + +static struct platform_driver adi_pinctrl_driver = { +	.probe		= adi_pinctrl_probe, +	.remove		= adi_pinctrl_remove, +	.driver		= { +		.name	= DRIVER_NAME, +	}, +}; + +static struct platform_driver adi_gpio_pint_driver = { +	.probe		= adi_gpio_pint_probe, +	.remove		= adi_gpio_pint_remove, +	.driver		= { +		.name	= "adi-gpio-pint", +	}, +}; + +static struct platform_driver adi_gpio_driver = { +	.probe		= adi_gpio_probe, +	.remove		= adi_gpio_remove, +	.driver		= { +		.name	= "adi-gpio", +	}, +}; + +static int __init adi_pinctrl_setup(void) +{ +	int ret; + +	ret = platform_driver_register(&adi_pinctrl_driver); +	if (ret) +		return ret; + +	ret = platform_driver_register(&adi_gpio_pint_driver); +	if (ret) +		goto pint_error; + +	ret = platform_driver_register(&adi_gpio_driver); +	if (ret) +		goto gpio_error; + +#ifdef CONFIG_PM +	register_syscore_ops(&gpio_pm_syscore_ops); +#endif +	return ret; +gpio_error: +	platform_driver_unregister(&adi_gpio_pint_driver); +pint_error: +	platform_driver_unregister(&adi_pinctrl_driver); + +	return ret; +} +arch_initcall(adi_pinctrl_setup); + +MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>"); +MODULE_DESCRIPTION("ADI gpio2 pin control driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/pinctrl-adi2.h b/drivers/pinctrl/pinctrl-adi2.h new file mode 100644 index 00000000000..3ca29738213 --- /dev/null +++ b/drivers/pinctrl/pinctrl-adi2.h @@ -0,0 +1,75 @@ +/* + * Pinctrl Driver for ADI GPIO2 controller + * + * Copyright 2007-2013 Analog Devices Inc. + * + * Licensed under the GPLv2 or later + */ + +#ifndef PINCTRL_PINCTRL_ADI2_H +#define PINCTRL_PINCTRL_ADI2_H + +#include <linux/pinctrl/pinctrl.h> + + /** + * struct adi_pin_group - describes a pin group + * @name: the name of this pin group + * @pins: an array of pins + * @num: the number of pins in this array + */ +struct adi_pin_group { +	const char *name; +	const unsigned *pins; +	const unsigned num; +	const unsigned short *mux; +}; + +#define ADI_PIN_GROUP(n, p, m)  \ +	{			\ +		.name = n,	\ +		.pins = p,	\ +		.num = ARRAY_SIZE(p),	\ +		.mux = m,			\ +	} + + /** + * struct adi_pmx_func - describes function mux setting of pin groups + * @name: the name of this function mux setting + * @groups: an array of pin groups + * @num_groups: the number of pin groups in this array + * @mux: the function mux setting array, end by zero + */ +struct adi_pmx_func { +	const char *name; +	const char * const *groups; +	const unsigned num_groups; +}; + +#define ADI_PMX_FUNCTION(n, g)		\ +	{					\ +		.name = n,			\ +		.groups = g,			\ +		.num_groups = ARRAY_SIZE(g),	\ +	} + +/** + * struct adi_pinctrl_soc_data - ADI pin controller per-SoC configuration + * @functions:  The functions supported on this SoC. + * @nfunction:  The number of entries in @functions. + * @groups:     An array describing all pin groups the pin SoC supports. + * @ngroups:    The number of entries in @groups. + * @pins:       An array describing all pins the pin controller affects. + * @npins:      The number of entries in @pins. + */ +struct adi_pinctrl_soc_data { +	const struct adi_pmx_func *functions; +	int nfunctions; +	const struct adi_pin_group *groups; +	int ngroups; +	const struct pinctrl_pin_desc *pins; +	int npins; +}; + +void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc); + +#endif /* PINCTRL_PINCTRL_ADI2_H */ diff --git a/drivers/pinctrl/pinctrl-apq8064.c b/drivers/pinctrl/pinctrl-apq8064.c new file mode 100644 index 00000000000..519f7886b0f --- /dev/null +++ b/drivers/pinctrl/pinctrl-apq8064.c @@ -0,0 +1,613 @@ +/* + * Copyright (c) 2014, Sony Mobile Communications AB. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only 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 <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-msm.h" + +static const struct pinctrl_pin_desc apq8064_pins[] = { +	PINCTRL_PIN(0, "GPIO_0"), +	PINCTRL_PIN(1, "GPIO_1"), +	PINCTRL_PIN(2, "GPIO_2"), +	PINCTRL_PIN(3, "GPIO_3"), +	PINCTRL_PIN(4, "GPIO_4"), +	PINCTRL_PIN(5, "GPIO_5"), +	PINCTRL_PIN(6, "GPIO_6"), +	PINCTRL_PIN(7, "GPIO_7"), +	PINCTRL_PIN(8, "GPIO_8"), +	PINCTRL_PIN(9, "GPIO_9"), +	PINCTRL_PIN(10, "GPIO_10"), +	PINCTRL_PIN(11, "GPIO_11"), +	PINCTRL_PIN(12, "GPIO_12"), +	PINCTRL_PIN(13, "GPIO_13"), +	PINCTRL_PIN(14, "GPIO_14"), +	PINCTRL_PIN(15, "GPIO_15"), +	PINCTRL_PIN(16, "GPIO_16"), +	PINCTRL_PIN(17, "GPIO_17"), +	PINCTRL_PIN(18, "GPIO_18"), +	PINCTRL_PIN(19, "GPIO_19"), +	PINCTRL_PIN(20, "GPIO_20"), +	PINCTRL_PIN(21, "GPIO_21"), +	PINCTRL_PIN(22, "GPIO_22"), +	PINCTRL_PIN(23, "GPIO_23"), +	PINCTRL_PIN(24, "GPIO_24"), +	PINCTRL_PIN(25, "GPIO_25"), +	PINCTRL_PIN(26, "GPIO_26"), +	PINCTRL_PIN(27, "GPIO_27"), +	PINCTRL_PIN(28, "GPIO_28"), +	PINCTRL_PIN(29, "GPIO_29"), +	PINCTRL_PIN(30, "GPIO_30"), +	PINCTRL_PIN(31, "GPIO_31"), +	PINCTRL_PIN(32, "GPIO_32"), +	PINCTRL_PIN(33, "GPIO_33"), +	PINCTRL_PIN(34, "GPIO_34"), +	PINCTRL_PIN(35, "GPIO_35"), +	PINCTRL_PIN(36, "GPIO_36"), +	PINCTRL_PIN(37, "GPIO_37"), +	PINCTRL_PIN(38, "GPIO_38"), +	PINCTRL_PIN(39, "GPIO_39"), +	PINCTRL_PIN(40, "GPIO_40"), +	PINCTRL_PIN(41, "GPIO_41"), +	PINCTRL_PIN(42, "GPIO_42"), +	PINCTRL_PIN(43, "GPIO_43"), +	PINCTRL_PIN(44, "GPIO_44"), +	PINCTRL_PIN(45, "GPIO_45"), +	PINCTRL_PIN(46, "GPIO_46"), +	PINCTRL_PIN(47, "GPIO_47"), +	PINCTRL_PIN(48, "GPIO_48"), +	PINCTRL_PIN(49, "GPIO_49"), +	PINCTRL_PIN(50, "GPIO_50"), +	PINCTRL_PIN(51, "GPIO_51"), +	PINCTRL_PIN(52, "GPIO_52"), +	PINCTRL_PIN(53, "GPIO_53"), +	PINCTRL_PIN(54, "GPIO_54"), +	PINCTRL_PIN(55, "GPIO_55"), +	PINCTRL_PIN(56, "GPIO_56"), +	PINCTRL_PIN(57, "GPIO_57"), +	PINCTRL_PIN(58, "GPIO_58"), +	PINCTRL_PIN(59, "GPIO_59"), +	PINCTRL_PIN(60, "GPIO_60"), +	PINCTRL_PIN(61, "GPIO_61"), +	PINCTRL_PIN(62, "GPIO_62"), +	PINCTRL_PIN(63, "GPIO_63"), +	PINCTRL_PIN(64, "GPIO_64"), +	PINCTRL_PIN(65, "GPIO_65"), +	PINCTRL_PIN(66, "GPIO_66"), +	PINCTRL_PIN(67, "GPIO_67"), +	PINCTRL_PIN(68, "GPIO_68"), +	PINCTRL_PIN(69, "GPIO_69"), +	PINCTRL_PIN(70, "GPIO_70"), +	PINCTRL_PIN(71, "GPIO_71"), +	PINCTRL_PIN(72, "GPIO_72"), +	PINCTRL_PIN(73, "GPIO_73"), +	PINCTRL_PIN(74, "GPIO_74"), +	PINCTRL_PIN(75, "GPIO_75"), +	PINCTRL_PIN(76, "GPIO_76"), +	PINCTRL_PIN(77, "GPIO_77"), +	PINCTRL_PIN(78, "GPIO_78"), +	PINCTRL_PIN(79, "GPIO_79"), +	PINCTRL_PIN(80, "GPIO_80"), +	PINCTRL_PIN(81, "GPIO_81"), +	PINCTRL_PIN(82, "GPIO_82"), +	PINCTRL_PIN(83, "GPIO_83"), +	PINCTRL_PIN(84, "GPIO_84"), +	PINCTRL_PIN(85, "GPIO_85"), +	PINCTRL_PIN(86, "GPIO_86"), +	PINCTRL_PIN(87, "GPIO_87"), +	PINCTRL_PIN(88, "GPIO_88"), +	PINCTRL_PIN(89, "GPIO_89"), + +	PINCTRL_PIN(90, "SDC1_CLK"), +	PINCTRL_PIN(91, "SDC1_CMD"), +	PINCTRL_PIN(92, "SDC1_DATA"), +	PINCTRL_PIN(93, "SDC3_CLK"), +	PINCTRL_PIN(94, "SDC3_CMD"), +	PINCTRL_PIN(95, "SDC3_DATA"), +}; + +#define DECLARE_APQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin } +DECLARE_APQ_GPIO_PINS(0); +DECLARE_APQ_GPIO_PINS(1); +DECLARE_APQ_GPIO_PINS(2); +DECLARE_APQ_GPIO_PINS(3); +DECLARE_APQ_GPIO_PINS(4); +DECLARE_APQ_GPIO_PINS(5); +DECLARE_APQ_GPIO_PINS(6); +DECLARE_APQ_GPIO_PINS(7); +DECLARE_APQ_GPIO_PINS(8); +DECLARE_APQ_GPIO_PINS(9); +DECLARE_APQ_GPIO_PINS(10); +DECLARE_APQ_GPIO_PINS(11); +DECLARE_APQ_GPIO_PINS(12); +DECLARE_APQ_GPIO_PINS(13); +DECLARE_APQ_GPIO_PINS(14); +DECLARE_APQ_GPIO_PINS(15); +DECLARE_APQ_GPIO_PINS(16); +DECLARE_APQ_GPIO_PINS(17); +DECLARE_APQ_GPIO_PINS(18); +DECLARE_APQ_GPIO_PINS(19); +DECLARE_APQ_GPIO_PINS(20); +DECLARE_APQ_GPIO_PINS(21); +DECLARE_APQ_GPIO_PINS(22); +DECLARE_APQ_GPIO_PINS(23); +DECLARE_APQ_GPIO_PINS(24); +DECLARE_APQ_GPIO_PINS(25); +DECLARE_APQ_GPIO_PINS(26); +DECLARE_APQ_GPIO_PINS(27); +DECLARE_APQ_GPIO_PINS(28); +DECLARE_APQ_GPIO_PINS(29); +DECLARE_APQ_GPIO_PINS(30); +DECLARE_APQ_GPIO_PINS(31); +DECLARE_APQ_GPIO_PINS(32); +DECLARE_APQ_GPIO_PINS(33); +DECLARE_APQ_GPIO_PINS(34); +DECLARE_APQ_GPIO_PINS(35); +DECLARE_APQ_GPIO_PINS(36); +DECLARE_APQ_GPIO_PINS(37); +DECLARE_APQ_GPIO_PINS(38); +DECLARE_APQ_GPIO_PINS(39); +DECLARE_APQ_GPIO_PINS(40); +DECLARE_APQ_GPIO_PINS(41); +DECLARE_APQ_GPIO_PINS(42); +DECLARE_APQ_GPIO_PINS(43); +DECLARE_APQ_GPIO_PINS(44); +DECLARE_APQ_GPIO_PINS(45); +DECLARE_APQ_GPIO_PINS(46); +DECLARE_APQ_GPIO_PINS(47); +DECLARE_APQ_GPIO_PINS(48); +DECLARE_APQ_GPIO_PINS(49); +DECLARE_APQ_GPIO_PINS(50); +DECLARE_APQ_GPIO_PINS(51); +DECLARE_APQ_GPIO_PINS(52); +DECLARE_APQ_GPIO_PINS(53); +DECLARE_APQ_GPIO_PINS(54); +DECLARE_APQ_GPIO_PINS(55); +DECLARE_APQ_GPIO_PINS(56); +DECLARE_APQ_GPIO_PINS(57); +DECLARE_APQ_GPIO_PINS(58); +DECLARE_APQ_GPIO_PINS(59); +DECLARE_APQ_GPIO_PINS(60); +DECLARE_APQ_GPIO_PINS(61); +DECLARE_APQ_GPIO_PINS(62); +DECLARE_APQ_GPIO_PINS(63); +DECLARE_APQ_GPIO_PINS(64); +DECLARE_APQ_GPIO_PINS(65); +DECLARE_APQ_GPIO_PINS(66); +DECLARE_APQ_GPIO_PINS(67); +DECLARE_APQ_GPIO_PINS(68); +DECLARE_APQ_GPIO_PINS(69); +DECLARE_APQ_GPIO_PINS(70); +DECLARE_APQ_GPIO_PINS(71); +DECLARE_APQ_GPIO_PINS(72); +DECLARE_APQ_GPIO_PINS(73); +DECLARE_APQ_GPIO_PINS(74); +DECLARE_APQ_GPIO_PINS(75); +DECLARE_APQ_GPIO_PINS(76); +DECLARE_APQ_GPIO_PINS(77); +DECLARE_APQ_GPIO_PINS(78); +DECLARE_APQ_GPIO_PINS(79); +DECLARE_APQ_GPIO_PINS(80); +DECLARE_APQ_GPIO_PINS(81); +DECLARE_APQ_GPIO_PINS(82); +DECLARE_APQ_GPIO_PINS(83); +DECLARE_APQ_GPIO_PINS(84); +DECLARE_APQ_GPIO_PINS(85); +DECLARE_APQ_GPIO_PINS(86); +DECLARE_APQ_GPIO_PINS(87); +DECLARE_APQ_GPIO_PINS(88); +DECLARE_APQ_GPIO_PINS(89); + +static const unsigned int sdc1_clk_pins[] = { 90 }; +static const unsigned int sdc1_cmd_pins[] = { 91 }; +static const unsigned int sdc1_data_pins[] = { 92 }; +static const unsigned int sdc3_clk_pins[] = { 93 }; +static const unsigned int sdc3_cmd_pins[] = { 94 }; +static const unsigned int sdc3_data_pins[] = { 95 }; + +#define FUNCTION(fname)					\ +	[APQ_MUX_##fname] = {				\ +		.name = #fname,				\ +		.groups = fname##_groups,		\ +		.ngroups = ARRAY_SIZE(fname##_groups),	\ +	} + +#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \ +	{						\ +		.name = "gpio" #id,			\ +		.pins = gpio##id##_pins,		\ +		.npins = ARRAY_SIZE(gpio##id##_pins),	\ +		.funcs = (int[]){			\ +			APQ_MUX_NA, /* gpio mode */	\ +			APQ_MUX_##f1,			\ +			APQ_MUX_##f2,			\ +			APQ_MUX_##f3,			\ +			APQ_MUX_##f4,			\ +			APQ_MUX_##f5,			\ +			APQ_MUX_##f6,			\ +			APQ_MUX_##f7,			\ +			APQ_MUX_##f8,			\ +			APQ_MUX_##f9,			\ +			APQ_MUX_##f10,			\ +		},					\ +		.nfuncs = 11,				\ +		.ctl_reg = 0x1000 + 0x10 * id,		\ +		.io_reg = 0x1004 + 0x10 * id,		\ +		.intr_cfg_reg = 0x1008 + 0x10 * id,	\ +		.intr_status_reg = 0x100c + 0x10 * id,	\ +		.intr_target_reg = 0x400 + 0x4 * id,	\ +		.mux_bit = 2,				\ +		.pull_bit = 0,				\ +		.drv_bit = 6,				\ +		.oe_bit = 9,				\ +		.in_bit = 0,				\ +		.out_bit = 1,				\ +		.intr_enable_bit = 0,			\ +		.intr_status_bit = 0,			\ +		.intr_ack_high = 1,			\ +		.intr_target_bit = 0,			\ +		.intr_raw_status_bit = 3,		\ +		.intr_polarity_bit = 1,			\ +		.intr_detection_bit = 2,		\ +		.intr_detection_width = 1,		\ +	} + +#define SDC_PINGROUP(pg_name, ctl, pull, drv)		\ +	{						\ +		.name = #pg_name,			\ +		.pins = pg_name##_pins,			\ +		.npins = ARRAY_SIZE(pg_name##_pins),	\ +		.ctl_reg = ctl,				\ +		.io_reg = 0,				\ +		.intr_cfg_reg = 0,			\ +		.intr_status_reg = 0,			\ +		.intr_target_reg = 0,			\ +		.mux_bit = -1,				\ +		.pull_bit = pull,			\ +		.drv_bit = drv,				\ +		.oe_bit = -1,				\ +		.in_bit = -1,				\ +		.out_bit = -1,				\ +		.intr_enable_bit = -1,			\ +		.intr_status_bit = -1,			\ +		.intr_target_bit = -1,			\ +		.intr_raw_status_bit = -1,		\ +		.intr_polarity_bit = -1,		\ +		.intr_detection_bit = -1,		\ +		.intr_detection_width = -1,		\ +	} + +enum apq8064_functions { +	APQ_MUX_cam_mclk, +	APQ_MUX_codec_mic_i2s, +	APQ_MUX_codec_spkr_i2s, +	APQ_MUX_gsbi1, +	APQ_MUX_gsbi2, +	APQ_MUX_gsbi3, +	APQ_MUX_gsbi4, +	APQ_MUX_gsbi4_cam_i2c, +	APQ_MUX_gsbi5, +	APQ_MUX_gsbi5_spi_cs1, +	APQ_MUX_gsbi5_spi_cs2, +	APQ_MUX_gsbi5_spi_cs3, +	APQ_MUX_gsbi6, +	APQ_MUX_gsbi6_spi_cs1, +	APQ_MUX_gsbi6_spi_cs2, +	APQ_MUX_gsbi6_spi_cs3, +	APQ_MUX_gsbi7, +	APQ_MUX_gsbi7_spi_cs1, +	APQ_MUX_gsbi7_spi_cs2, +	APQ_MUX_gsbi7_spi_cs3, +	APQ_MUX_gsbi_cam_i2c, +	APQ_MUX_hdmi, +	APQ_MUX_mi2s, +	APQ_MUX_riva_bt, +	APQ_MUX_riva_fm, +	APQ_MUX_riva_wlan, +	APQ_MUX_sdc2, +	APQ_MUX_sdc4, +	APQ_MUX_slimbus, +	APQ_MUX_spkr_i2s, +	APQ_MUX_tsif1, +	APQ_MUX_tsif2, +	APQ_MUX_usb2_hsic, +	APQ_MUX_NA, +}; + +static const char * const cam_mclk_groups[] = { +	"gpio4" "gpio5" +}; +static const char * const codec_mic_i2s_groups[] = { +	"gpio34", "gpio35", "gpio36", "gpio37", "gpio38" +}; +static const char * const codec_spkr_i2s_groups[] = { +	"gpio39", "gpio40", "gpio41", "gpio42" +}; +static const char * const gsbi1_groups[] = { +	"gpio18", "gpio19", "gpio20", "gpio21" +}; +static const char * const gsbi2_groups[] = { +	"gpio22", "gpio23", "gpio24", "gpio25" +}; +static const char * const gsbi3_groups[] = { +	"gpio6", "gpio7", "gpio8", "gpio9" +}; +static const char * const gsbi4_groups[] = { +	"gpio10", "gpio11", "gpio12", "gpio13" +}; +static const char * const gsbi4_cam_i2c_groups[] = { +	"gpio10", "gpio11", "gpio12", "gpio13" +}; +static const char * const gsbi5_groups[] = { +	"gpio51", "gpio52", "gpio53", "gpio54" +}; +static const char * const gsbi5_spi_cs1_groups[] = { +	"gpio47" +}; +static const char * const gsbi5_spi_cs2_groups[] = { +	"gpio31" +}; +static const char * const gsbi5_spi_cs3_groups[] = { +	"gpio32" +}; +static const char * const gsbi6_groups[] = { +	"gpio14", "gpio15", "gpio16", "gpio17" +}; +static const char * const gsbi6_spi_cs1_groups[] = { +	"gpio47" +}; +static const char * const gsbi6_spi_cs2_groups[] = { +	"gpio31" +}; +static const char * const gsbi6_spi_cs3_groups[] = { +	"gpio32" +}; +static const char * const gsbi7_groups[] = { +	"gpio82", "gpio83", "gpio84", "gpio85" +}; +static const char * const gsbi7_spi_cs1_groups[] = { +	"gpio47" +}; +static const char * const gsbi7_spi_cs2_groups[] = { +	"gpio31" +}; +static const char * const gsbi7_spi_cs3_groups[] = { +	"gpio32" +}; +static const char * const gsbi_cam_i2c_groups[] = { +	"gpio10", "gpio11", "gpio12", "gpio13" +}; +static const char * const hdmi_groups[] = { +	"gpio69", "gpio70", "gpio71", "gpio72" +}; +static const char * const mi2s_groups[] = { +	"gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32", "gpio33" +}; +static const char * const riva_bt_groups[] = { +	"gpio16", "gpio17" +}; +static const char * const riva_fm_groups[] = { +	"gpio14", "gpio15" +}; +static const char * const riva_wlan_groups[] = { +	"gpio64", "gpio65", "gpio66", "gpio67", "gpio68" +}; +static const char * const sdc2_groups[] = { +	"gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62" +}; +static const char * const sdc4_groups[] = { +	"gpio63", "gpio64", "gpio65", "gpio66", "gpio67", "gpio68" +}; +static const char * const slimbus_groups[] = { +	"gpio40", "gpio41" +}; +static const char * const spkr_i2s_groups[] = { +	"gpio47", "gpio48", "gpio49", "gpio50" +}; +static const char * const tsif1_groups[] = { +	"gpio55", "gpio56", "gpio57" +}; +static const char * const tsif2_groups[] = { +	"gpio58", "gpio59", "gpio60" +}; +static const char * const usb2_hsic_groups[] = { +	"gpio88", "gpio89" +}; + +static const struct msm_function apq8064_functions[] = { +	FUNCTION(cam_mclk), +	FUNCTION(codec_mic_i2s), +	FUNCTION(codec_spkr_i2s), +	FUNCTION(gsbi1), +	FUNCTION(gsbi2), +	FUNCTION(gsbi3), +	FUNCTION(gsbi4), +	FUNCTION(gsbi4_cam_i2c), +	FUNCTION(gsbi5), +	FUNCTION(gsbi5_spi_cs1), +	FUNCTION(gsbi5_spi_cs2), +	FUNCTION(gsbi5_spi_cs3), +	FUNCTION(gsbi6), +	FUNCTION(gsbi6_spi_cs1), +	FUNCTION(gsbi6_spi_cs2), +	FUNCTION(gsbi6_spi_cs3), +	FUNCTION(gsbi7), +	FUNCTION(gsbi7_spi_cs1), +	FUNCTION(gsbi7_spi_cs2), +	FUNCTION(gsbi7_spi_cs3), +	FUNCTION(gsbi_cam_i2c), +	FUNCTION(hdmi), +	FUNCTION(mi2s), +	FUNCTION(riva_bt), +	FUNCTION(riva_fm), +	FUNCTION(riva_wlan), +	FUNCTION(sdc2), +	FUNCTION(sdc4), +	FUNCTION(slimbus), +	FUNCTION(spkr_i2s), +	FUNCTION(tsif1), +	FUNCTION(tsif2), +	FUNCTION(usb2_hsic), +}; + +static const struct msm_pingroup apq8064_groups[] = { +	PINGROUP(0, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(4, NA, NA, cam_mclk, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(5, NA, cam_mclk, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(6, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(7, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(8, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(9, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(10, gsbi4, NA, NA, NA, NA, NA, NA, NA, gsbi4_cam_i2c, NA), +	PINGROUP(11, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, gsbi4_cam_i2c), +	PINGROUP(12, gsbi4, NA, NA, NA, NA, gsbi4_cam_i2c, NA, NA, NA, NA), +	PINGROUP(13, gsbi4, NA, NA, NA, NA, gsbi4_cam_i2c, NA, NA, NA, NA), +	PINGROUP(14, riva_fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(15, riva_fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(16, riva_bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(17, riva_bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(18, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(19, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(20, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(21, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(22, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(23, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(24, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(25, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(26, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(27, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(28, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(29, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(30, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(31, mi2s, NA, gsbi5_spi_cs2, gsbi6_spi_cs2, gsbi7_spi_cs2, NA, NA, NA, NA, NA), +	PINGROUP(32, mi2s, NA, NA, NA, NA, gsbi5_spi_cs3, gsbi6_spi_cs3, gsbi7_spi_cs3, NA, NA), +	PINGROUP(33, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(34, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(35, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(36, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(37, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(38, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(39, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(40, slimbus, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(41, slimbus, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(42, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(43, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(44, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(45, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(46, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(47, spkr_i2s, gsbi5_spi_cs1, gsbi6_spi_cs1, gsbi7_spi_cs1, NA, NA, NA, NA, NA, NA), +	PINGROUP(48, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(49, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(50, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(51, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(52, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(53, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(54, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(55, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(56, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(57, tsif1, sdc2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(58, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(59, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(60, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(61, NA, sdc2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(62, NA, sdc2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(63, NA, sdc4, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(64, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(65, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(66, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(67, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(68, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(69, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(70, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(71, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(72, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(73, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(74, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(78, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(82, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(83, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(84, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(85, NA, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(86, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(87, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(88, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(89, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA), + +	SDC_PINGROUP(sdc1_clk, 0x20a0, 13, 6), +	SDC_PINGROUP(sdc1_cmd, 0x20a0, 11, 3), +	SDC_PINGROUP(sdc1_data, 0x20a0, 9, 0), + +	SDC_PINGROUP(sdc3_clk, 0x20a4, 14, 6), +	SDC_PINGROUP(sdc3_cmd, 0x20a4, 11, 3), +	SDC_PINGROUP(sdc3_data, 0x20a4, 9, 0), +}; + +#define NUM_GPIO_PINGROUPS 90 + +static const struct msm_pinctrl_soc_data apq8064_pinctrl = { +	.pins = apq8064_pins, +	.npins = ARRAY_SIZE(apq8064_pins), +	.functions = apq8064_functions, +	.nfunctions = ARRAY_SIZE(apq8064_functions), +	.groups = apq8064_groups, +	.ngroups = ARRAY_SIZE(apq8064_groups), +	.ngpios = NUM_GPIO_PINGROUPS, +}; + +static int apq8064_pinctrl_probe(struct platform_device *pdev) +{ +	return msm_pinctrl_probe(pdev, &apq8064_pinctrl); +} + +static const struct of_device_id apq8064_pinctrl_of_match[] = { +	{ .compatible = "qcom,apq8064-pinctrl", }, +	{ }, +}; + +static struct platform_driver apq8064_pinctrl_driver = { +	.driver = { +		.name = "apq8064-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = apq8064_pinctrl_of_match, +	}, +	.probe = apq8064_pinctrl_probe, +	.remove = msm_pinctrl_remove, +}; + +static int __init apq8064_pinctrl_init(void) +{ +	return platform_driver_register(&apq8064_pinctrl_driver); +} +arch_initcall(apq8064_pinctrl_init); + +static void __exit apq8064_pinctrl_exit(void) +{ +	platform_driver_unregister(&apq8064_pinctrl_driver); +} +module_exit(apq8064_pinctrl_exit); + +MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>"); +MODULE_DESCRIPTION("Qualcomm APQ8064 pinctrl driver"); +MODULE_LICENSE("GPL v2"); +MODULE_DEVICE_TABLE(of, apq8064_pinctrl_of_match); diff --git a/drivers/pinctrl/pinctrl-as3722.c b/drivers/pinctrl/pinctrl-as3722.c new file mode 100644 index 00000000000..c862f9c0e9c --- /dev/null +++ b/drivers/pinctrl/pinctrl-as3722.c @@ -0,0 +1,655 @@ +/* + * ams AS3722 pin control and GPIO driver. + * + * Copyright (c) 2013, NVIDIA Corporation. + * + * Author: Laxman Dewangan <ldewangan@nvidia.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 version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307, USA + */ + +#include <linux/delay.h> +#include <linux/gpio.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/mfd/as3722.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/consumer.h> +#include <linux/pinctrl/machine.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinconf-generic.h> +#include <linux/pinctrl/pinconf.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/pm.h> +#include <linux/slab.h> + +#include "core.h" +#include "pinconf.h" +#include "pinctrl-utils.h" + +#define AS3722_PIN_GPIO0		0 +#define AS3722_PIN_GPIO1		1 +#define AS3722_PIN_GPIO2		2 +#define AS3722_PIN_GPIO3		3 +#define AS3722_PIN_GPIO4		4 +#define AS3722_PIN_GPIO5		5 +#define AS3722_PIN_GPIO6		6 +#define AS3722_PIN_GPIO7		7 +#define AS3722_PIN_NUM			(AS3722_PIN_GPIO7 + 1) + +#define AS3722_GPIO_MODE_PULL_UP           BIT(PIN_CONFIG_BIAS_PULL_UP) +#define AS3722_GPIO_MODE_PULL_DOWN         BIT(PIN_CONFIG_BIAS_PULL_DOWN) +#define AS3722_GPIO_MODE_HIGH_IMPED        BIT(PIN_CONFIG_BIAS_HIGH_IMPEDANCE) +#define AS3722_GPIO_MODE_OPEN_DRAIN        BIT(PIN_CONFIG_DRIVE_OPEN_DRAIN) + +struct as3722_pin_function { +	const char *name; +	const char * const *groups; +	unsigned ngroups; +	int mux_option; +}; + +struct as3722_gpio_pin_control { +	unsigned mode_prop; +	int io_function; +}; + +struct as3722_pingroup { +	const char *name; +	const unsigned pins[1]; +	unsigned npins; +}; + +struct as3722_pctrl_info { +	struct device *dev; +	struct pinctrl_dev *pctl; +	struct as3722 *as3722; +	struct gpio_chip gpio_chip; +	int pins_current_opt[AS3722_PIN_NUM]; +	const struct as3722_pin_function *functions; +	unsigned num_functions; +	const struct as3722_pingroup *pin_groups; +	int num_pin_groups; +	const struct pinctrl_pin_desc *pins; +	unsigned num_pins; +	struct as3722_gpio_pin_control gpio_control[AS3722_PIN_NUM]; +}; + +static const struct pinctrl_pin_desc as3722_pins_desc[] = { +	PINCTRL_PIN(AS3722_PIN_GPIO0, "gpio0"), +	PINCTRL_PIN(AS3722_PIN_GPIO1, "gpio1"), +	PINCTRL_PIN(AS3722_PIN_GPIO2, "gpio2"), +	PINCTRL_PIN(AS3722_PIN_GPIO3, "gpio3"), +	PINCTRL_PIN(AS3722_PIN_GPIO4, "gpio4"), +	PINCTRL_PIN(AS3722_PIN_GPIO5, "gpio5"), +	PINCTRL_PIN(AS3722_PIN_GPIO6, "gpio6"), +	PINCTRL_PIN(AS3722_PIN_GPIO7, "gpio7"), +}; + +static const char * const gpio_groups[] = { +	"gpio0", +	"gpio1", +	"gpio2", +	"gpio3", +	"gpio4", +	"gpio5", +	"gpio6", +	"gpio7", +}; + +enum as3722_pinmux_option { +	AS3722_PINMUX_GPIO			= 0, +	AS3722_PINMUX_INTERRUPT_OUT		= 1, +	AS3722_PINMUX_VSUB_VBAT_UNDEB_LOW_OUT	= 2, +	AS3722_PINMUX_GPIO_INTERRUPT		= 3, +	AS3722_PINMUX_PWM_INPUT			= 4, +	AS3722_PINMUX_VOLTAGE_IN_STBY		= 5, +	AS3722_PINMUX_OC_PG_SD0			= 6, +	AS3722_PINMUX_PG_OUT			= 7, +	AS3722_PINMUX_CLK32K_OUT		= 8, +	AS3722_PINMUX_WATCHDOG_INPUT		= 9, +	AS3722_PINMUX_SOFT_RESET_IN		= 11, +	AS3722_PINMUX_PWM_OUTPUT		= 12, +	AS3722_PINMUX_VSUB_VBAT_LOW_DEB_OUT	= 13, +	AS3722_PINMUX_OC_PG_SD6			= 14, +}; + +#define FUNCTION_GROUP(fname, mux)			\ +	{						\ +		.name = #fname,				\ +		.groups = gpio_groups,			\ +		.ngroups = ARRAY_SIZE(gpio_groups),	\ +		.mux_option = AS3722_PINMUX_##mux,	\ +	} + +static const struct as3722_pin_function as3722_pin_function[] = { +	FUNCTION_GROUP(gpio, GPIO), +	FUNCTION_GROUP(interrupt-out, INTERRUPT_OUT), +	FUNCTION_GROUP(gpio-in-interrupt, GPIO_INTERRUPT), +	FUNCTION_GROUP(vsup-vbat-low-undebounce-out, VSUB_VBAT_UNDEB_LOW_OUT), +	FUNCTION_GROUP(vsup-vbat-low-debounce-out, VSUB_VBAT_LOW_DEB_OUT), +	FUNCTION_GROUP(voltage-in-standby, VOLTAGE_IN_STBY), +	FUNCTION_GROUP(oc-pg-sd0, OC_PG_SD0), +	FUNCTION_GROUP(oc-pg-sd6, OC_PG_SD6), +	FUNCTION_GROUP(powergood-out, PG_OUT), +	FUNCTION_GROUP(pwm-in, PWM_INPUT), +	FUNCTION_GROUP(pwm-out, PWM_OUTPUT), +	FUNCTION_GROUP(clk32k-out, CLK32K_OUT), +	FUNCTION_GROUP(watchdog-in, WATCHDOG_INPUT), +	FUNCTION_GROUP(soft-reset-in, SOFT_RESET_IN), +}; + +#define AS3722_PINGROUP(pg_name, pin_id) \ +	{								\ +		.name = #pg_name,					\ +		.pins = {AS3722_PIN_##pin_id},				\ +		.npins = 1,						\ +	} + +static const struct as3722_pingroup as3722_pingroups[] = { +	AS3722_PINGROUP(gpio0,	GPIO0), +	AS3722_PINGROUP(gpio1,	GPIO1), +	AS3722_PINGROUP(gpio2,	GPIO2), +	AS3722_PINGROUP(gpio3,	GPIO3), +	AS3722_PINGROUP(gpio4,	GPIO4), +	AS3722_PINGROUP(gpio5,	GPIO5), +	AS3722_PINGROUP(gpio6,	GPIO6), +	AS3722_PINGROUP(gpio7,	GPIO7), +}; + +static int as3722_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	return as_pci->num_pin_groups; +} + +static const char *as3722_pinctrl_get_group_name(struct pinctrl_dev *pctldev, +		unsigned group) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	return as_pci->pin_groups[group].name; +} + +static int as3722_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, +		unsigned group, const unsigned **pins, unsigned *num_pins) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	*pins = as_pci->pin_groups[group].pins; +	*num_pins = as_pci->pin_groups[group].npins; +	return 0; +} + +static const struct pinctrl_ops as3722_pinctrl_ops = { +	.get_groups_count = as3722_pinctrl_get_groups_count, +	.get_group_name = as3722_pinctrl_get_group_name, +	.get_group_pins = as3722_pinctrl_get_group_pins, +	.dt_node_to_map = pinconf_generic_dt_node_to_map_pin, +	.dt_free_map = pinctrl_utils_dt_free_map, +}; + +static int as3722_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	return as_pci->num_functions; +} + +static const char *as3722_pinctrl_get_func_name(struct pinctrl_dev *pctldev, +			unsigned function) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	return as_pci->functions[function].name; +} + +static int as3722_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, +		unsigned function, const char * const **groups, +		unsigned * const num_groups) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	*groups = as_pci->functions[function].groups; +	*num_groups = as_pci->functions[function].ngroups; +	return 0; +} + +static int as3722_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function, +		unsigned group) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); +	int gpio_cntr_reg = AS3722_GPIOn_CONTROL_REG(group); +	u8 val = AS3722_GPIO_IOSF_VAL(as_pci->functions[function].mux_option); +	int ret; + +	dev_dbg(as_pci->dev, "%s(): GPIO %u pin to function %u and val %u\n", +		__func__, group, function, val); + +	ret = as3722_update_bits(as_pci->as3722, gpio_cntr_reg, +			AS3722_GPIO_IOSF_MASK, val); +	if (ret < 0) { +		dev_err(as_pci->dev, "GPIO%d_CTRL_REG update failed %d\n", +			group, ret); +		return ret; +	} +	as_pci->gpio_control[group].io_function = function; + +	switch (val) { +	case AS3722_GPIO_IOSF_SD0_OUT: +	case AS3722_GPIO_IOSF_PWR_GOOD_OUT: +	case AS3722_GPIO_IOSF_Q32K_OUT: +	case AS3722_GPIO_IOSF_PWM_OUT: +	case AS3722_GPIO_IOSF_SD6_LOW_VOLT_LOW: +		ret = as3722_update_bits(as_pci->as3722, gpio_cntr_reg, +			AS3722_GPIO_MODE_MASK, AS3722_GPIO_MODE_OUTPUT_VDDH); +		if (ret < 0) { +			dev_err(as_pci->dev, "GPIO%d_CTRL update failed %d\n", +				group, ret); +			return ret; +		} +		as_pci->gpio_control[group].mode_prop = +				AS3722_GPIO_MODE_OUTPUT_VDDH; +		break; +	default: +		break; +	} +	return ret; +} + +static int as3722_pinctrl_gpio_get_mode(unsigned gpio_mode_prop, bool input) +{ +	if (gpio_mode_prop & AS3722_GPIO_MODE_HIGH_IMPED) +		return -EINVAL; + +	if (gpio_mode_prop & AS3722_GPIO_MODE_OPEN_DRAIN) { +		if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_UP) +			return AS3722_GPIO_MODE_IO_OPEN_DRAIN_PULL_UP; +		return AS3722_GPIO_MODE_IO_OPEN_DRAIN; +	} +	if (input) { +		if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_UP) +			return AS3722_GPIO_MODE_INPUT_PULL_UP; +		else if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_DOWN) +			return AS3722_GPIO_MODE_INPUT_PULL_DOWN; +		return AS3722_GPIO_MODE_INPUT; +	} +	if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_DOWN) +		return AS3722_GPIO_MODE_OUTPUT_VDDL; +	return AS3722_GPIO_MODE_OUTPUT_VDDH; +} + +static int as3722_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev, +		struct pinctrl_gpio_range *range, unsigned offset) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); + +	if (as_pci->gpio_control[offset].io_function) +		return -EBUSY; +	return 0; +} + +static int as3722_pinctrl_gpio_set_direction(struct pinctrl_dev *pctldev, +		struct pinctrl_gpio_range *range, unsigned offset, bool input) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); +	struct as3722 *as3722 = as_pci->as3722; +	int mode; + +	mode = as3722_pinctrl_gpio_get_mode( +			as_pci->gpio_control[offset].mode_prop, input); +	if (mode < 0) { +		dev_err(as_pci->dev, "%s direction for GPIO %d not supported\n", +			(input) ? "Input" : "Output", offset); +		return mode; +	} + +	return as3722_update_bits(as3722, AS3722_GPIOn_CONTROL_REG(offset), +				AS3722_GPIO_MODE_MASK, mode); +} + +static const struct pinmux_ops as3722_pinmux_ops = { +	.get_functions_count	= as3722_pinctrl_get_funcs_count, +	.get_function_name	= as3722_pinctrl_get_func_name, +	.get_function_groups	= as3722_pinctrl_get_func_groups, +	.enable			= as3722_pinctrl_enable, +	.gpio_request_enable	= as3722_pinctrl_gpio_request_enable, +	.gpio_set_direction	= as3722_pinctrl_gpio_set_direction, +}; + +static int as3722_pinconf_get(struct pinctrl_dev *pctldev, +			unsigned pin, unsigned long *config) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); +	enum pin_config_param param = pinconf_to_config_param(*config); +	int arg = 0; +	u16 prop; + +	switch (param) { +	case PIN_CONFIG_BIAS_DISABLE: +		prop = AS3722_GPIO_MODE_PULL_UP | +				AS3722_GPIO_MODE_PULL_DOWN; +		if (!(as_pci->gpio_control[pin].mode_prop & prop)) +			arg = 1; +		prop = 0; +		break; + +	case PIN_CONFIG_BIAS_PULL_UP: +		prop = AS3722_GPIO_MODE_PULL_UP; +		break; + +	case PIN_CONFIG_BIAS_PULL_DOWN: +		prop = AS3722_GPIO_MODE_PULL_DOWN; +		break; + +	case PIN_CONFIG_DRIVE_OPEN_DRAIN: +		prop = AS3722_GPIO_MODE_OPEN_DRAIN; +		break; + +	case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: +		prop = AS3722_GPIO_MODE_HIGH_IMPED; +		break; + +	default: +		dev_err(as_pci->dev, "Properties not supported\n"); +		return -ENOTSUPP; +	} + +	if (as_pci->gpio_control[pin].mode_prop & prop) +		arg = 1; + +	*config = pinconf_to_config_packed(param, (u16)arg); +	return 0; +} + +static int as3722_pinconf_set(struct pinctrl_dev *pctldev, +			unsigned pin, unsigned long *configs, +			unsigned num_configs) +{ +	struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); +	enum pin_config_param param; +	int mode_prop; +	int i; + +	for (i = 0; i < num_configs; i++) { +		param = pinconf_to_config_param(configs[i]); +		mode_prop = as_pci->gpio_control[pin].mode_prop; + +		switch (param) { +		case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: +			break; + +		case PIN_CONFIG_BIAS_DISABLE: +			mode_prop &= ~(AS3722_GPIO_MODE_PULL_UP | +					AS3722_GPIO_MODE_PULL_DOWN); +			break; +		case PIN_CONFIG_BIAS_PULL_UP: +			mode_prop |= AS3722_GPIO_MODE_PULL_UP; +			break; + +		case PIN_CONFIG_BIAS_PULL_DOWN: +			mode_prop |= AS3722_GPIO_MODE_PULL_DOWN; +			break; + +		case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: +			mode_prop |= AS3722_GPIO_MODE_HIGH_IMPED; +			break; + +		case PIN_CONFIG_DRIVE_OPEN_DRAIN: +			mode_prop |= AS3722_GPIO_MODE_OPEN_DRAIN; +			break; + +		default: +			dev_err(as_pci->dev, "Properties not supported\n"); +			return -ENOTSUPP; +		} + +		as_pci->gpio_control[pin].mode_prop = mode_prop; +	} +	return 0; +} + +static const struct pinconf_ops as3722_pinconf_ops = { +	.pin_config_get = as3722_pinconf_get, +	.pin_config_set = as3722_pinconf_set, +}; + +static struct pinctrl_desc as3722_pinctrl_desc = { +	.pctlops = &as3722_pinctrl_ops, +	.pmxops = &as3722_pinmux_ops, +	.confops = &as3722_pinconf_ops, +	.owner = THIS_MODULE, +}; + +static inline struct as3722_pctrl_info *to_as_pci(struct gpio_chip *chip) +{ +	return container_of(chip, struct as3722_pctrl_info, gpio_chip); +} + +static int as3722_gpio_get(struct gpio_chip *chip, unsigned offset) +{ +	struct as3722_pctrl_info *as_pci = to_as_pci(chip); +	struct as3722 *as3722 = as_pci->as3722; +	int ret; +	u32 reg; +	u32 control; +	u32 val; +	int mode; +	int invert_enable; + +	ret = as3722_read(as3722, AS3722_GPIOn_CONTROL_REG(offset), &control); +	if (ret < 0) { +		dev_err(as_pci->dev, +			"GPIO_CONTROL%d_REG read failed: %d\n", offset, ret); +		return ret; +	} + +	invert_enable = !!(control & AS3722_GPIO_INV); +	mode = control & AS3722_GPIO_MODE_MASK; +	switch (mode) { +	case AS3722_GPIO_MODE_INPUT: +	case AS3722_GPIO_MODE_INPUT_PULL_UP: +	case AS3722_GPIO_MODE_INPUT_PULL_DOWN: +	case AS3722_GPIO_MODE_IO_OPEN_DRAIN: +	case AS3722_GPIO_MODE_IO_OPEN_DRAIN_PULL_UP: +		reg = AS3722_GPIO_SIGNAL_IN_REG; +		break; +	case AS3722_GPIO_MODE_OUTPUT_VDDH: +	case AS3722_GPIO_MODE_OUTPUT_VDDL: +		reg = AS3722_GPIO_SIGNAL_OUT_REG; +		break; +	default: +		return -EINVAL; +	} + +	ret = as3722_read(as3722, reg, &val); +	if (ret < 0) { +		dev_err(as_pci->dev, +			"GPIO_SIGNAL_IN_REG read failed: %d\n", ret); +		return ret; +	} + +	val = !!(val & AS3722_GPIOn_SIGNAL(offset)); +	return (invert_enable) ? !val : val; +} + +static void as3722_gpio_set(struct gpio_chip *chip, unsigned offset, +		int value) +{ +	struct as3722_pctrl_info *as_pci = to_as_pci(chip); +	struct as3722 *as3722 = as_pci->as3722; +	int en_invert; +	u32 val; +	int ret; + +	ret = as3722_read(as3722, AS3722_GPIOn_CONTROL_REG(offset), &val); +	if (ret < 0) { +		dev_err(as_pci->dev, +			"GPIO_CONTROL%d_REG read failed: %d\n", offset, ret); +		return; +	} +	en_invert = !!(val & AS3722_GPIO_INV); + +	if (value) +		val = (en_invert) ? 0 : AS3722_GPIOn_SIGNAL(offset); +	else +		val = (en_invert) ? AS3722_GPIOn_SIGNAL(offset) : 0; + +	ret = as3722_update_bits(as3722, AS3722_GPIO_SIGNAL_OUT_REG, +			AS3722_GPIOn_SIGNAL(offset), val); +	if (ret < 0) +		dev_err(as_pci->dev, +			"GPIO_SIGNAL_OUT_REG update failed: %d\n", ret); +} + +static int as3722_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ +	return pinctrl_gpio_direction_input(chip->base + offset); +} + +static int as3722_gpio_direction_output(struct gpio_chip *chip, +		unsigned offset, int value) +{ +	as3722_gpio_set(chip, offset, value); +	return pinctrl_gpio_direction_output(chip->base + offset); +} + +static int as3722_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	struct as3722_pctrl_info *as_pci = to_as_pci(chip); + +	return as3722_irq_get_virq(as_pci->as3722, offset); +} + +static int as3722_gpio_request(struct gpio_chip *chip, unsigned offset) +{ +	return pinctrl_request_gpio(chip->base + offset); +} + +static void as3722_gpio_free(struct gpio_chip *chip, unsigned offset) +{ +	pinctrl_free_gpio(chip->base + offset); +} + +static const struct gpio_chip as3722_gpio_chip = { +	.label			= "as3722-gpio", +	.owner			= THIS_MODULE, +	.request		= as3722_gpio_request, +	.free			= as3722_gpio_free, +	.get			= as3722_gpio_get, +	.set			= as3722_gpio_set, +	.direction_input	= as3722_gpio_direction_input, +	.direction_output	= as3722_gpio_direction_output, +	.to_irq			= as3722_gpio_to_irq, +	.can_sleep		= true, +	.ngpio			= AS3722_PIN_NUM, +	.base			= -1, +}; + +static int as3722_pinctrl_probe(struct platform_device *pdev) +{ +	struct as3722_pctrl_info *as_pci; +	int ret; +	int tret; + +	as_pci = devm_kzalloc(&pdev->dev, sizeof(*as_pci), GFP_KERNEL); +	if (!as_pci) +		return -ENOMEM; + +	as_pci->dev = &pdev->dev; +	as_pci->dev->of_node = pdev->dev.parent->of_node; +	as_pci->as3722 = dev_get_drvdata(pdev->dev.parent); +	platform_set_drvdata(pdev, as_pci); + +	as_pci->pins = as3722_pins_desc; +	as_pci->num_pins = ARRAY_SIZE(as3722_pins_desc); +	as_pci->functions = as3722_pin_function; +	as_pci->num_functions = ARRAY_SIZE(as3722_pin_function); +	as_pci->pin_groups = as3722_pingroups; +	as_pci->num_pin_groups = ARRAY_SIZE(as3722_pingroups); +	as3722_pinctrl_desc.name = dev_name(&pdev->dev); +	as3722_pinctrl_desc.pins = as3722_pins_desc; +	as3722_pinctrl_desc.npins = ARRAY_SIZE(as3722_pins_desc); +	as_pci->pctl = pinctrl_register(&as3722_pinctrl_desc, +					&pdev->dev, as_pci); +	if (!as_pci->pctl) { +		dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); +		return -EINVAL; +	} + +	as_pci->gpio_chip = as3722_gpio_chip; +	as_pci->gpio_chip.dev = &pdev->dev; +	as_pci->gpio_chip.of_node = pdev->dev.parent->of_node; +	ret = gpiochip_add(&as_pci->gpio_chip); +	if (ret < 0) { +		dev_err(&pdev->dev, "Couldn't register gpiochip, %d\n", ret); +		goto fail_chip_add; +	} + +	ret = gpiochip_add_pin_range(&as_pci->gpio_chip, dev_name(&pdev->dev), +				0, 0, AS3722_PIN_NUM); +	if (ret < 0) { +		dev_err(&pdev->dev, "Couldn't add pin range, %d\n", ret); +		goto fail_range_add; +	} + +	return 0; + +fail_range_add: +	tret = gpiochip_remove(&as_pci->gpio_chip); +	if (tret < 0) +		dev_warn(&pdev->dev, "Couldn't remove gpio chip, %d\n", tret); + +fail_chip_add: +	pinctrl_unregister(as_pci->pctl); +	return ret; +} + +static int as3722_pinctrl_remove(struct platform_device *pdev) +{ +	struct as3722_pctrl_info *as_pci = platform_get_drvdata(pdev); +	int ret; + +	ret = gpiochip_remove(&as_pci->gpio_chip); +	if (ret < 0) +		return ret; +	pinctrl_unregister(as_pci->pctl); +	return 0; +} + +static struct of_device_id as3722_pinctrl_of_match[] = { +	{ .compatible = "ams,as3722-pinctrl", }, +	{ }, +}; +MODULE_DEVICE_TABLE(of, as3722_pinctrl_of_match); + +static struct platform_driver as3722_pinctrl_driver = { +	.driver = { +		.name = "as3722-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = as3722_pinctrl_of_match, +	}, +	.probe = as3722_pinctrl_probe, +	.remove = as3722_pinctrl_remove, +}; +module_platform_driver(as3722_pinctrl_driver); + +MODULE_ALIAS("platform:as3722-pinctrl"); +MODULE_DESCRIPTION("AS3722 pin control and GPIO driver"); +MODULE_AUTHOR("Laxman Dewangan<ldewangan@nvidia.com>"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index f350fd2e170..421493cb490 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c @@ -16,9 +16,6 @@  #include <linux/of_irq.h>  #include <linux/slab.h>  #include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/irqdomain.h> -#include <linux/irqchip/chained_irq.h>  #include <linux/io.h>  #include <linux/gpio.h>  #include <linux/pinctrl/machine.h> @@ -33,6 +30,7 @@  #include "core.h" +#define MAX_GPIO_BANKS		5  #define MAX_NB_GPIO_PER_BANK	32  struct at91_pinctrl_mux_ops; @@ -46,7 +44,6 @@ struct at91_gpio_chip {  	int			pioc_idx;	/* PIO bank index */  	void __iomem		*regbase;	/* PIO bank virtual address */  	struct clk		*clock;		/* associated clock */ -	struct irq_domain	*domain;	/* associated irq domain */  	struct at91_pinctrl_mux_ops *ops;	/* ops */  }; @@ -117,7 +114,7 @@ struct at91_pin_group {  };  /** - * struct at91_pinctrl_mux_ops - describes an At91 mux ops group + * struct at91_pinctrl_mux_ops - describes an AT91 mux ops group   * on new IP with support for periph C and D the way to mux in   * periph A and B has changed   * So provide the right call back @@ -144,11 +141,11 @@ struct at91_pinctrl_mux_ops {  	void (*mux_C_periph)(void __iomem *pio, unsigned mask);  	void (*mux_D_periph)(void __iomem *pio, unsigned mask);  	bool (*get_deglitch)(void __iomem *pio, unsigned pin); -	void (*set_deglitch)(void __iomem *pio, unsigned mask, bool in_on); +	void (*set_deglitch)(void __iomem *pio, unsigned mask, bool is_on);  	bool (*get_debounce)(void __iomem *pio, unsigned pin, u32 *div); -	void (*set_debounce)(void __iomem *pio, unsigned mask, bool in_on, u32 div); +	void (*set_debounce)(void __iomem *pio, unsigned mask, bool is_on, u32 div);  	bool (*get_pulldown)(void __iomem *pio, unsigned pin); -	void (*set_pulldown)(void __iomem *pio, unsigned mask, bool in_on); +	void (*set_pulldown)(void __iomem *pio, unsigned mask, bool is_on);  	bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin);  	void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask);  	/* irq */ @@ -243,7 +240,7 @@ static int at91_dt_node_to_map(struct pinctrl_dev *pctldev,  	int i;  	/* -	 * first find the group of this node and check if we need create +	 * first find the group of this node and check if we need to create  	 * config maps for pins  	 */  	grp = at91_pinctrl_find_group_by_name(info, np->name); @@ -417,6 +414,14 @@ static void at91_mux_set_deglitch(void __iomem *pio, unsigned mask, bool is_on)  	__raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR));  } +static bool at91_mux_pio3_get_deglitch(void __iomem *pio, unsigned pin) +{ +	if ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1) +		return !((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1); + +	return false; +} +  static void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on)  {  	if (is_on) @@ -428,7 +433,8 @@ static bool at91_mux_pio3_get_debounce(void __iomem *pio, unsigned pin, u32 *div  {  	*div = __raw_readl(pio + PIO_SCDR); -	return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1; +	return ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1) && +	       ((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1);  }  static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask, @@ -438,9 +444,8 @@ static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask,  		__raw_writel(mask, pio + PIO_IFSCER);  		__raw_writel(div & PIO_SCDR_DIV, pio + PIO_SCDR);  		__raw_writel(mask, pio + PIO_IFER); -	} else { -		__raw_writel(mask, pio + PIO_IFDR); -	} +	} else +		__raw_writel(mask, pio + PIO_IFSCDR);  }  static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin) @@ -478,7 +483,7 @@ static struct at91_pinctrl_mux_ops at91sam9x5_ops = {  	.mux_B_periph	= at91_mux_pio3_set_B_periph,  	.mux_C_periph	= at91_mux_pio3_set_C_periph,  	.mux_D_periph	= at91_mux_pio3_set_D_periph, -	.get_deglitch	= at91_mux_get_deglitch, +	.get_deglitch	= at91_mux_pio3_get_deglitch,  	.set_deglitch	= at91_mux_pio3_set_deglitch,  	.get_debounce	= at91_mux_pio3_get_debounce,  	.set_debounce	= at91_mux_pio3_set_debounce, @@ -564,7 +569,7 @@ static int at91_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,  		info->functions[selector].name, info->groups[group].name);  	/* first check that all the pins of the group are valid with a valid -	 * paramter */ +	 * parameter */  	for (i = 0; i < npins; i++) {  		pin = &pins_conf[i];  		ret = pin_check_config(info, info->groups[group].name, i, pin); @@ -713,7 +718,8 @@ static int at91_pinconf_get(struct pinctrl_dev *pctldev,  	unsigned pin;  	int div; -	dev_dbg(info->dev, "%s:%d, pin_id=%d, config=0x%lx", __func__, __LINE__, pin_id, *config); +	*config = 0; +	dev_dbg(info->dev, "%s:%d, pin_id=%d", __func__, __LINE__, pin_id);  	pio = pin_to_controller(info, pin_to_bank(pin_id));  	pin = pin_id % MAX_NB_GPIO_PER_BANK; @@ -774,10 +780,35 @@ static int at91_pinconf_set(struct pinctrl_dev *pctldev,  	return 0;  } +#define DBG_SHOW_FLAG(flag) do {		\ +	if (config & flag) {			\ +		if (num_conf)			\ +			seq_puts(s, "|");	\ +		seq_puts(s, #flag);		\ +		num_conf++;			\ +	}					\ +} while (0) +  static void at91_pinconf_dbg_show(struct pinctrl_dev *pctldev,  				   struct seq_file *s, unsigned pin_id)  { +	unsigned long config; +	int ret, val, num_conf = 0; + +	ret = at91_pinconf_get(pctldev, pin_id, &config); + +	DBG_SHOW_FLAG(MULTI_DRIVE); +	DBG_SHOW_FLAG(PULL_UP); +	DBG_SHOW_FLAG(PULL_DOWN); +	DBG_SHOW_FLAG(DIS_SCHMIT); +	DBG_SHOW_FLAG(DEGLITCH); +	DBG_SHOW_FLAG(DEBOUNCE); +	if (config & DEBOUNCE) { +		val = config >> DEBOUNCE_VAL_SHIFT; +		seq_printf(s, "(%d)", val); +	} +	return;  }  static void at91_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, @@ -958,7 +989,7 @@ static int at91_pinctrl_probe_dt(struct platform_device *pdev,  	at91_pinctrl_child_count(info, np);  	if (info->nbanks < 1) { -		dev_err(&pdev->dev, "you need to specify atleast one gpio-controller\n"); +		dev_err(&pdev->dev, "you need to specify at least one gpio-controller\n");  		return -EINVAL;  	} @@ -1102,6 +1133,17 @@ static void at91_gpio_free(struct gpio_chip *chip, unsigned offset)  	pinctrl_free_gpio(gpio);  } +static int at91_gpio_get_direction(struct gpio_chip *chip, unsigned offset) +{ +	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); +	void __iomem *pio = at91_gpio->regbase; +	unsigned mask = 1 << offset; +	u32 osr; + +	osr = readl_relaxed(pio + PIO_OSR); +	return !(osr & mask); +} +  static int at91_gpio_direction_input(struct gpio_chip *chip, unsigned offset)  {  	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); @@ -1146,21 +1188,6 @@ static int at91_gpio_direction_output(struct gpio_chip *chip, unsigned offset,  	return 0;  } -static int at91_gpio_to_irq(struct gpio_chip *chip, unsigned offset) -{ -	struct at91_gpio_chip *at91_gpio = to_at91_gpio_chip(chip); -	int virq; - -	if (offset < chip->ngpio) -		virq = irq_create_mapping(at91_gpio->domain, offset); -	else -		virq = -ENXIO; - -	dev_dbg(chip->dev, "%s: request IRQ for GPIO %d, return %d\n", -				chip->label, offset + chip->base, virq); -	return virq; -} -  #ifdef CONFIG_DEBUG_FS  static void at91_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)  { @@ -1170,8 +1197,7 @@ static void at91_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)  	void __iomem *pio = at91_gpio->regbase;  	for (i = 0; i < chip->ngpio; i++) { -		unsigned pin = chip->base + i; -		unsigned mask = pin_to_mask(pin); +		unsigned mask = pin_to_mask(i);  		const char *gpio_label;  		u32 pdsr; @@ -1251,22 +1277,22 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)  	switch (type) {  	case IRQ_TYPE_EDGE_RISING: -		irq_set_handler(d->irq, handle_simple_irq); +		__irq_set_handler_locked(d->irq, handle_simple_irq);  		writel_relaxed(mask, pio + PIO_ESR);  		writel_relaxed(mask, pio + PIO_REHLSR);  		break;  	case IRQ_TYPE_EDGE_FALLING: -		irq_set_handler(d->irq, handle_simple_irq); +		__irq_set_handler_locked(d->irq, handle_simple_irq);  		writel_relaxed(mask, pio + PIO_ESR);  		writel_relaxed(mask, pio + PIO_FELLSR);  		break;  	case IRQ_TYPE_LEVEL_LOW: -		irq_set_handler(d->irq, handle_level_irq); +		__irq_set_handler_locked(d->irq, handle_level_irq);  		writel_relaxed(mask, pio + PIO_LSR);  		writel_relaxed(mask, pio + PIO_FELLSR);  		break;  	case IRQ_TYPE_LEVEL_HIGH: -		irq_set_handler(d->irq, handle_level_irq); +		__irq_set_handler_locked(d->irq, handle_level_irq);  		writel_relaxed(mask, pio + PIO_LSR);  		writel_relaxed(mask, pio + PIO_REHLSR);  		break; @@ -1275,7 +1301,7 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)  		 * disable additional interrupt modes:  		 * fall back to default behavior  		 */ -		irq_set_handler(d->irq, handle_simple_irq); +		__irq_set_handler_locked(d->irq, handle_simple_irq);  		writel_relaxed(mask, pio + PIO_AIMDR);  		return 0;  	case IRQ_TYPE_NONE: @@ -1290,6 +1316,36 @@ static int alt_gpio_irq_type(struct irq_data *d, unsigned type)  	return 0;  } +static void gpio_irq_ack(struct irq_data *d) +{ +	/* the interrupt is already cleared before by reading ISR */ +} + +static unsigned int gpio_irq_startup(struct irq_data *d) +{ +	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); +	unsigned	pin = d->hwirq; +	int ret; + +	ret = gpio_lock_as_irq(&at91_gpio->chip, pin); +	if (ret) { +		dev_err(at91_gpio->chip.dev, "unable to lock pind %lu IRQ\n", +			d->hwirq); +		return ret; +	} +	gpio_irq_unmask(d); +	return 0; +} + +static void gpio_irq_shutdown(struct irq_data *d) +{ +	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(d); +	unsigned	pin = d->hwirq; + +	gpio_irq_mask(d); +	gpio_unlock_as_irq(&at91_gpio->chip, pin); +} +  #ifdef CONFIG_PM  static u32 wakeups[MAX_GPIO_BANKS]; @@ -1330,13 +1386,11 @@ void at91_pinctrl_gpio_suspend(void)  		__raw_writel(backups[i], pio + PIO_IDR);  		__raw_writel(wakeups[i], pio + PIO_IER); -		if (!wakeups[i]) { -			clk_unprepare(gpio_chips[i]->clock); -			clk_disable(gpio_chips[i]->clock); -		} else { +		if (!wakeups[i]) +			clk_disable_unprepare(gpio_chips[i]->clock); +		else  			printk(KERN_DEBUG "GPIO-%c may wake for %08x\n",  			       'A'+i, wakeups[i]); -		}  	}  } @@ -1352,10 +1406,8 @@ void at91_pinctrl_gpio_resume(void)  		pio = gpio_chips[i]->regbase; -		if (!wakeups[i]) { -			if (clk_prepare(gpio_chips[i]->clock) == 0) -				clk_enable(gpio_chips[i]->clock); -		} +		if (!wakeups[i]) +			clk_prepare_enable(gpio_chips[i]->clock);  		__raw_writel(wakeups[i], pio + PIO_IDR);  		__raw_writel(backups[i], pio + PIO_IER); @@ -1368,6 +1420,9 @@ void at91_pinctrl_gpio_resume(void)  static struct irq_chip gpio_irqchip = {  	.name		= "GPIO", +	.irq_ack	= gpio_irq_ack, +	.irq_startup	= gpio_irq_startup, +	.irq_shutdown	= gpio_irq_shutdown,  	.irq_disable	= gpio_irq_mask,  	.irq_mask	= gpio_irq_mask,  	.irq_unmask	= gpio_irq_unmask, @@ -1377,9 +1432,11 @@ static struct irq_chip gpio_irqchip = {  static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  { -	struct irq_chip *chip = irq_desc_get_chip(desc); -	struct irq_data *idata = irq_desc_get_irq_data(desc); -	struct at91_gpio_chip *at91_gpio = irq_data_get_irq_chip_data(idata); +	struct irq_chip *chip = irq_get_chip(irq); +	struct gpio_chip *gpio_chip = irq_desc_get_handler_data(desc); +	struct at91_gpio_chip *at91_gpio = container_of(gpio_chip, +					   struct at91_gpio_chip, chip); +  	void __iomem	*pio = at91_gpio->regbase;  	unsigned long	isr;  	int		n; @@ -1387,7 +1444,7 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  	chained_irq_enter(chip, desc);  	for (;;) {  		/* Reading ISR acks pending (edge triggered) GPIO interrupts. -		 * When there none are pending, we're finished unless we need +		 * When there are none pending, we're finished unless we need  		 * to process multiple banks (like ID_PIOCDE on sam9263).  		 */  		isr = readl_relaxed(pio + PIO_ISR) & readl_relaxed(pio + PIO_IMR); @@ -1396,85 +1453,25 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)  				break;  			at91_gpio = at91_gpio->next;  			pio = at91_gpio->regbase; +			gpio_chip = &at91_gpio->chip;  			continue;  		}  		for_each_set_bit(n, &isr, BITS_PER_LONG) { -			generic_handle_irq(irq_find_mapping(at91_gpio->domain, n)); +			generic_handle_irq(irq_find_mapping( +					   gpio_chip->irqdomain, n));  		}  	}  	chained_irq_exit(chip, desc);  	/* now it may re-trigger */  } -/* - * This lock class tells lockdep that GPIO irqs are in a different - * category than their parents, so it won't report false recursion. - */ -static struct lock_class_key gpio_lock_class; - -static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq, -							irq_hw_number_t hw) -{ -	struct at91_gpio_chip	*at91_gpio = h->host_data; -	void __iomem		*pio = at91_gpio->regbase; -	u32			mask = 1 << hw; - -	irq_set_lockdep_class(virq, &gpio_lock_class); - -	/* -	 * Can use the "simple" and not "edge" handler since it's -	 * shorter, and the AIC handles interrupts sanely. -	 */ -	irq_set_chip(virq, &gpio_irqchip); -	if ((at91_gpio->ops == &at91sam9x5_ops) && -	    (readl_relaxed(pio + PIO_AIMMR) & mask) && -	    (readl_relaxed(pio + PIO_ELSR) & mask)) -		irq_set_handler(virq, handle_level_irq); -	else -		irq_set_handler(virq, handle_simple_irq); -	set_irq_flags(virq, IRQF_VALID); -	irq_set_chip_data(virq, at91_gpio); - -	return 0; -} - -static int at91_gpio_irq_domain_xlate(struct irq_domain *d, -				      struct device_node *ctrlr, -				      const u32 *intspec, unsigned int intsize, -				      irq_hw_number_t *out_hwirq, -				      unsigned int *out_type) -{ -	struct at91_gpio_chip *at91_gpio = d->host_data; -	int ret; -	int pin = at91_gpio->chip.base + intspec[0]; - -	if (WARN_ON(intsize < 2)) -		return -EINVAL; -	*out_hwirq = intspec[0]; -	*out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; - -	ret = gpio_request(pin, ctrlr->full_name); -	if (ret) -		return ret; - -	ret = gpio_direction_input(pin); -	if (ret) -		return ret; - -	return 0; -} - -static struct irq_domain_ops at91_gpio_ops = { -	.map	= at91_gpio_irq_map, -	.xlate	= at91_gpio_irq_domain_xlate, -}; -  static int at91_gpio_of_irq_setup(struct device_node *node,  				  struct at91_gpio_chip *at91_gpio)  { -	struct at91_gpio_chip	*prev = NULL; +	struct at91_gpio_chip   *prev = NULL;  	struct irq_data		*d = irq_get_irq_data(at91_gpio->pioc_virq); +	int ret;  	at91_gpio->pioc_hwirq = irqd_to_hwirq(d); @@ -1484,10 +1481,17 @@ static int at91_gpio_of_irq_setup(struct device_node *node,  	/* Disable irqs of this PIO controller */  	writel_relaxed(~0, at91_gpio->regbase + PIO_IDR); -	/* Setup irq domain */ -	at91_gpio->domain = irq_domain_add_linear(node, at91_gpio->chip.ngpio, -						&at91_gpio_ops, at91_gpio); -	if (!at91_gpio->domain) +	/* +	 * Let the generic code handle this edge IRQ, the the chained +	 * handler will perform the actual work of handling the parent +	 * interrupt. +	 */ +	ret = gpiochip_irqchip_add(&at91_gpio->chip, +				   &gpio_irqchip, +				   0, +				   handle_edge_irq, +				   IRQ_TYPE_EDGE_BOTH); +	if (ret)  		panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n",  			at91_gpio->pioc_idx); @@ -1495,15 +1499,18 @@ static int at91_gpio_of_irq_setup(struct device_node *node,  	if (at91_gpio->pioc_idx)  		prev = gpio_chips[at91_gpio->pioc_idx - 1]; -	/* The toplevel handler handles one bank of GPIOs, except -	 * on some SoC it can handles up to three... +	/* The top level handler handles one bank of GPIOs, except +	 * on some SoC it can handle up to three...  	 * We only set up the handler for the first of the list.  	 */  	if (prev && prev->next == at91_gpio)  		return 0; -	irq_set_chip_data(at91_gpio->pioc_virq, at91_gpio); -	irq_set_chained_handler(at91_gpio->pioc_virq, gpio_irq_handler); +	/* Then register the chain on the parent IRQ */ +	gpiochip_set_chained_irqchip(&at91_gpio->chip, +				     &gpio_irqchip, +				     at91_gpio->pioc_virq, +				     gpio_irq_handler);  	return 0;  } @@ -1512,13 +1519,13 @@ static int at91_gpio_of_irq_setup(struct device_node *node,  static struct gpio_chip at91_gpio_template = {  	.request		= at91_gpio_request,  	.free			= at91_gpio_free, +	.get_direction		= at91_gpio_get_direction,  	.direction_input	= at91_gpio_direction_input,  	.get			= at91_gpio_get,  	.direction_output	= at91_gpio_direction_output,  	.set			= at91_gpio_set, -	.to_irq			= at91_gpio_to_irq,  	.dbg_show		= at91_gpio_dbg_show, -	.can_sleep		= 0, +	.can_sleep		= false,  	.ngpio			= MAX_NB_GPIO_PER_BANK,  }; @@ -1671,7 +1678,7 @@ static struct platform_driver at91_gpio_driver = {  	.driver = {  		.name = "gpio-at91",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(at91_gpio_of_match), +		.of_match_table = at91_gpio_of_match,  	},  	.probe = at91_gpio_probe,  }; @@ -1680,7 +1687,7 @@ static struct platform_driver at91_pinctrl_driver = {  	.driver = {  		.name = "pinctrl-at91",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(at91_pinctrl_of_match), +		.of_match_table = at91_pinctrl_of_match,  	},  	.probe = at91_pinctrl_probe,  	.remove = at91_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-baytrail.c b/drivers/pinctrl/pinctrl-baytrail.c index 2832576d8b1..975572e2f26 100644 --- a/drivers/pinctrl/pinctrl-baytrail.c +++ b/drivers/pinctrl/pinctrl-baytrail.c @@ -29,7 +29,6 @@  #include <linux/gpio.h>  #include <linux/irqdomain.h>  #include <linux/acpi.h> -#include <linux/acpi_gpio.h>  #include <linux/platform_device.h>  #include <linux/seq_file.h>  #include <linux/io.h> @@ -44,9 +43,20 @@  #define BYT_INT_STAT_REG	0x800  /* BYT_CONF0_REG register bits */ +#define BYT_IODEN		BIT(31)  #define BYT_TRIG_NEG		BIT(26)  #define BYT_TRIG_POS		BIT(25)  #define BYT_TRIG_LVL		BIT(24) +#define BYT_PULL_STR_SHIFT	9 +#define BYT_PULL_STR_MASK	(3 << BYT_PULL_STR_SHIFT) +#define BYT_PULL_STR_2K		(0 << BYT_PULL_STR_SHIFT) +#define BYT_PULL_STR_10K	(1 << BYT_PULL_STR_SHIFT) +#define BYT_PULL_STR_20K	(2 << BYT_PULL_STR_SHIFT) +#define BYT_PULL_STR_40K	(3 << BYT_PULL_STR_SHIFT) +#define BYT_PULL_ASSIGN_SHIFT	7 +#define BYT_PULL_ASSIGN_MASK	(3 << BYT_PULL_ASSIGN_SHIFT) +#define BYT_PULL_ASSIGN_UP	(1 << BYT_PULL_ASSIGN_SHIFT) +#define BYT_PULL_ASSIGN_DOWN	(2 << BYT_PULL_ASSIGN_SHIFT)  #define BYT_PIN_MUX		0x07  /* BYT_VAL_REG register bits */ @@ -61,6 +71,10 @@  #define BYT_NGPIO_NCORE		28  #define BYT_NGPIO_SUS		44 +#define BYT_SCORE_ACPI_UID	"1" +#define BYT_NCORE_ACPI_UID	"2" +#define BYT_SUS_ACPI_UID	"3" +  /*   * Baytrail gpio controller consist of three separate sub-controllers called   * SCORE, NCORE and SUS. The sub-controllers are identified by their acpi UID. @@ -103,17 +117,17 @@ static unsigned const sus_pins[BYT_NGPIO_SUS] = {  static struct pinctrl_gpio_range byt_ranges[] = {  	{ -		.name = "1", /* match with acpi _UID in probe */ +		.name = BYT_SCORE_ACPI_UID, /* match with acpi _UID in probe */  		.npins = BYT_NGPIO_SCORE,  		.pins = score_pins,  	},  	{ -		.name = "2", +		.name = BYT_NCORE_ACPI_UID,  		.npins = BYT_NGPIO_NCORE,  		.pins = ncore_pins,  	},  	{ -		.name = "3", +		.name = BYT_SUS_ACPI_UID,  		.npins = BYT_NGPIO_SUS,  		.pins = sus_pins,  	}, @@ -146,9 +160,41 @@ static void __iomem *byt_gpio_reg(struct gpio_chip *chip, unsigned offset,  	return vg->reg_base + reg_offset + reg;  } +static bool is_special_pin(struct byt_gpio *vg, unsigned offset) +{ +	/* SCORE pin 92-93 */ +	if (!strcmp(vg->range->name, BYT_SCORE_ACPI_UID) && +		offset >= 92 && offset <= 93) +		return true; + +	/* SUS pin 11-21 */ +	if (!strcmp(vg->range->name, BYT_SUS_ACPI_UID) && +		offset >= 11 && offset <= 21) +		return true; + +	return false; +} +  static int byt_gpio_request(struct gpio_chip *chip, unsigned offset)  {  	struct byt_gpio *vg = to_byt_gpio(chip); +	void __iomem *reg = byt_gpio_reg(chip, offset, BYT_CONF0_REG); +	u32 value; +	bool special; + +	/* +	 * In most cases, func pin mux 000 means GPIO function. +	 * But, some pins may have func pin mux 001 represents +	 * GPIO function. Only allow user to export pin with +	 * func pin mux preset as GPIO function by BIOS/FW. +	 */ +	value = readl(reg) & BYT_PIN_MUX; +	special = is_special_pin(vg, offset); +	if ((special && value != 1) || (!special && value)) { +		dev_err(&vg->pdev->dev, +			"pin %u cannot be used as GPIO.\n", offset); +		return -EINVAL; +	}  	pm_runtime_get(&vg->pdev->dev); @@ -286,21 +332,63 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)  	spin_lock_irqsave(&vg->lock, flags);  	for (i = 0; i < vg->chip.ngpio; i++) { +		const char *pull_str = NULL; +		const char *pull = NULL; +		const char *label;  		offs = vg->range->pins[i] * 16;  		conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG);  		val = readl(vg->reg_base + offs + BYT_VAL_REG); +		label = gpiochip_is_requested(chip, i); +		if (!label) +			label = "Unrequested"; + +		switch (conf0 & BYT_PULL_ASSIGN_MASK) { +		case BYT_PULL_ASSIGN_UP: +			pull = "up"; +			break; +		case BYT_PULL_ASSIGN_DOWN: +			pull = "down"; +			break; +		} + +		switch (conf0 & BYT_PULL_STR_MASK) { +		case BYT_PULL_STR_2K: +			pull_str = "2k"; +			break; +		case BYT_PULL_STR_10K: +			pull_str = "10k"; +			break; +		case BYT_PULL_STR_20K: +			pull_str = "20k"; +			break; +		case BYT_PULL_STR_40K: +			pull_str = "40k"; +			break; +		} +  		seq_printf(s, -			   " gpio-%-3d %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s\n", +			   " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s",  			   i, +			   label,  			   val & BYT_INPUT_EN ? "  " : "in",  			   val & BYT_OUTPUT_EN ? "   " : "out",  			   val & BYT_LEVEL ? "hi" : "lo",  			   vg->range->pins[i], offs,  			   conf0 & 0x7, -			   conf0 & BYT_TRIG_NEG ? " fall" : "", -			   conf0 & BYT_TRIG_POS ? " rise" : "", -			   conf0 & BYT_TRIG_LVL ? " level" : ""); +			   conf0 & BYT_TRIG_NEG ? " fall" : "     ", +			   conf0 & BYT_TRIG_POS ? " rise" : "     ", +			   conf0 & BYT_TRIG_LVL ? " level" : "      "); + +		if (pull && pull_str) +			seq_printf(s, " %-4s %-3s", pull, pull_str); +		else +			seq_puts(s, "          "); + +		if (conf0 & BYT_IODEN) +			seq_puts(s, " open-drain"); + +		seq_puts(s, "\n");  	}  	spin_unlock_irqrestore(&vg->lock, flags);  } @@ -366,11 +454,33 @@ static void byt_irq_mask(struct irq_data *d)  {  } +static int byt_irq_reqres(struct irq_data *d) +{ +	struct byt_gpio *vg = irq_data_get_irq_chip_data(d); + +	if (gpio_lock_as_irq(&vg->chip, irqd_to_hwirq(d))) { +		dev_err(vg->chip.dev, +			"unable to lock HW IRQ %lu for IRQ\n", +			irqd_to_hwirq(d)); +		return -EINVAL; +	} +	return 0; +} + +static void byt_irq_relres(struct irq_data *d) +{ +	struct byt_gpio *vg = irq_data_get_irq_chip_data(d); + +	gpio_unlock_as_irq(&vg->chip, irqd_to_hwirq(d)); +} +  static struct irq_chip byt_irqchip = {  	.name = "BYT-GPIO",  	.irq_mask = byt_irq_mask,  	.irq_unmask = byt_irq_unmask,  	.irq_set_type = byt_irq_type, +	.irq_request_resources = byt_irq_reqres, +	.irq_release_resources = byt_irq_relres,  };  static void byt_gpio_irq_init_hw(struct byt_gpio *vg) @@ -461,15 +571,9 @@ static int byt_gpio_probe(struct platform_device *pdev)  	gc->set = byt_gpio_set;  	gc->dbg_show = byt_gpio_dbg_show;  	gc->base = -1; -	gc->can_sleep = 0; +	gc->can_sleep = false;  	gc->dev = dev; -	ret = gpiochip_add(gc); -	if (ret) { -		dev_err(&pdev->dev, "failed adding byt-gpio chip\n"); -		return ret; -	} -  	/* set up interrupts  */  	irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);  	if (irq_rc && irq_rc->start) { @@ -485,9 +589,12 @@ static int byt_gpio_probe(struct platform_device *pdev)  		irq_set_handler_data(hwirq, vg);  		irq_set_chained_handler(hwirq, byt_gpio_irq_handler); +	} -		/* Register interrupt handlers for gpio signaled acpi events */ -		acpi_gpiochip_request_interrupts(gc); +	ret = gpiochip_add(gc); +	if (ret) { +		dev_err(&pdev->dev, "failed adding byt-gpio chip\n"); +		return ret;  	}  	pm_runtime_enable(dev); @@ -512,6 +619,7 @@ static const struct dev_pm_ops byt_gpio_pm_ops = {  static const struct acpi_device_id byt_gpio_acpi_match[] = {  	{ "INT33B2", 0 }, +	{ "INT33FC", 0 },  	{ }  };  MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match); diff --git a/drivers/pinctrl/pinctrl-bcm281xx.c b/drivers/pinctrl/pinctrl-bcm281xx.c new file mode 100644 index 00000000000..3bed792b2c0 --- /dev/null +++ b/drivers/pinctrl/pinctrl-bcm281xx.c @@ -0,0 +1,1461 @@ +/* + * Copyright (C) 2013 Broadcom Corporation + * + * 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 version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * 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. + */ +#include <linux/err.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/pinctrl/pinconf.h> +#include <linux/pinctrl/pinconf-generic.h> +#include <linux/regmap.h> +#include <linux/slab.h> +#include "core.h" +#include "pinctrl-utils.h" + +/* BCM281XX Pin Control Registers Definitions */ + +/* Function Select bits are the same for all pin control registers */ +#define BCM281XX_PIN_REG_F_SEL_MASK		0x0700 +#define BCM281XX_PIN_REG_F_SEL_SHIFT		8 + +/* Standard pin register */ +#define BCM281XX_STD_PIN_REG_DRV_STR_MASK	0x0007 +#define BCM281XX_STD_PIN_REG_DRV_STR_SHIFT	0 +#define BCM281XX_STD_PIN_REG_INPUT_DIS_MASK	0x0008 +#define BCM281XX_STD_PIN_REG_INPUT_DIS_SHIFT	3 +#define BCM281XX_STD_PIN_REG_SLEW_MASK		0x0010 +#define BCM281XX_STD_PIN_REG_SLEW_SHIFT		4 +#define BCM281XX_STD_PIN_REG_PULL_UP_MASK	0x0020 +#define BCM281XX_STD_PIN_REG_PULL_UP_SHIFT	5 +#define BCM281XX_STD_PIN_REG_PULL_DN_MASK	0x0040 +#define BCM281XX_STD_PIN_REG_PULL_DN_SHIFT	6 +#define BCM281XX_STD_PIN_REG_HYST_MASK		0x0080 +#define BCM281XX_STD_PIN_REG_HYST_SHIFT		7 + +/* I2C pin register */ +#define BCM281XX_I2C_PIN_REG_INPUT_DIS_MASK	0x0004 +#define BCM281XX_I2C_PIN_REG_INPUT_DIS_SHIFT	2 +#define BCM281XX_I2C_PIN_REG_SLEW_MASK		0x0008 +#define BCM281XX_I2C_PIN_REG_SLEW_SHIFT		3 +#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK	0x0070 +#define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT	4 + +/* HDMI pin register */ +#define BCM281XX_HDMI_PIN_REG_INPUT_DIS_MASK	0x0008 +#define BCM281XX_HDMI_PIN_REG_INPUT_DIS_SHIFT	3 +#define BCM281XX_HDMI_PIN_REG_MODE_MASK		0x0010 +#define BCM281XX_HDMI_PIN_REG_MODE_SHIFT	4 + +/** + * bcm281xx_pin_type - types of pin register + */ +enum bcm281xx_pin_type { +	BCM281XX_PIN_TYPE_UNKNOWN = 0, +	BCM281XX_PIN_TYPE_STD, +	BCM281XX_PIN_TYPE_I2C, +	BCM281XX_PIN_TYPE_HDMI, +}; + +static enum bcm281xx_pin_type std_pin = BCM281XX_PIN_TYPE_STD; +static enum bcm281xx_pin_type i2c_pin = BCM281XX_PIN_TYPE_I2C; +static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI; + +/** + * bcm281xx_pin_function- define pin function + */ +struct bcm281xx_pin_function { +	const char *name; +	const char * const *groups; +	const unsigned ngroups; +}; + +/** + * bcm281xx_pinctrl_data - Broadcom-specific pinctrl data + * @reg_base - base of pinctrl registers + */ +struct bcm281xx_pinctrl_data { +	void __iomem *reg_base; + +	/* List of all pins */ +	const struct pinctrl_pin_desc *pins; +	const unsigned npins; + +	const struct bcm281xx_pin_function *functions; +	const unsigned nfunctions; + +	struct regmap *regmap; +}; + +/* + * Pin number definition.  The order here must be the same as defined in the + * PADCTRLREG block in the RDB. + */ +#define BCM281XX_PIN_ADCSYNC		0 +#define BCM281XX_PIN_BAT_RM		1 +#define BCM281XX_PIN_BSC1_SCL		2 +#define BCM281XX_PIN_BSC1_SDA		3 +#define BCM281XX_PIN_BSC2_SCL		4 +#define BCM281XX_PIN_BSC2_SDA		5 +#define BCM281XX_PIN_CLASSGPWR		6 +#define BCM281XX_PIN_CLK_CX8		7 +#define BCM281XX_PIN_CLKOUT_0		8 +#define BCM281XX_PIN_CLKOUT_1		9 +#define BCM281XX_PIN_CLKOUT_2		10 +#define BCM281XX_PIN_CLKOUT_3		11 +#define BCM281XX_PIN_CLKREQ_IN_0	12 +#define BCM281XX_PIN_CLKREQ_IN_1	13 +#define BCM281XX_PIN_CWS_SYS_REQ1	14 +#define BCM281XX_PIN_CWS_SYS_REQ2	15 +#define BCM281XX_PIN_CWS_SYS_REQ3	16 +#define BCM281XX_PIN_DIGMIC1_CLK	17 +#define BCM281XX_PIN_DIGMIC1_DQ		18 +#define BCM281XX_PIN_DIGMIC2_CLK	19 +#define BCM281XX_PIN_DIGMIC2_DQ		20 +#define BCM281XX_PIN_GPEN13		21 +#define BCM281XX_PIN_GPEN14		22 +#define BCM281XX_PIN_GPEN15		23 +#define BCM281XX_PIN_GPIO00		24 +#define BCM281XX_PIN_GPIO01		25 +#define BCM281XX_PIN_GPIO02		26 +#define BCM281XX_PIN_GPIO03		27 +#define BCM281XX_PIN_GPIO04		28 +#define BCM281XX_PIN_GPIO05		29 +#define BCM281XX_PIN_GPIO06		30 +#define BCM281XX_PIN_GPIO07		31 +#define BCM281XX_PIN_GPIO08		32 +#define BCM281XX_PIN_GPIO09		33 +#define BCM281XX_PIN_GPIO10		34 +#define BCM281XX_PIN_GPIO11		35 +#define BCM281XX_PIN_GPIO12		36 +#define BCM281XX_PIN_GPIO13		37 +#define BCM281XX_PIN_GPIO14		38 +#define BCM281XX_PIN_GPS_PABLANK	39 +#define BCM281XX_PIN_GPS_TMARK		40 +#define BCM281XX_PIN_HDMI_SCL		41 +#define BCM281XX_PIN_HDMI_SDA		42 +#define BCM281XX_PIN_IC_DM		43 +#define BCM281XX_PIN_IC_DP		44 +#define BCM281XX_PIN_KP_COL_IP_0	45 +#define BCM281XX_PIN_KP_COL_IP_1	46 +#define BCM281XX_PIN_KP_COL_IP_2	47 +#define BCM281XX_PIN_KP_COL_IP_3	48 +#define BCM281XX_PIN_KP_ROW_OP_0	49 +#define BCM281XX_PIN_KP_ROW_OP_1	50 +#define BCM281XX_PIN_KP_ROW_OP_2	51 +#define BCM281XX_PIN_KP_ROW_OP_3	52 +#define BCM281XX_PIN_LCD_B_0		53 +#define BCM281XX_PIN_LCD_B_1		54 +#define BCM281XX_PIN_LCD_B_2		55 +#define BCM281XX_PIN_LCD_B_3		56 +#define BCM281XX_PIN_LCD_B_4		57 +#define BCM281XX_PIN_LCD_B_5		58 +#define BCM281XX_PIN_LCD_B_6		59 +#define BCM281XX_PIN_LCD_B_7		60 +#define BCM281XX_PIN_LCD_G_0		61 +#define BCM281XX_PIN_LCD_G_1		62 +#define BCM281XX_PIN_LCD_G_2		63 +#define BCM281XX_PIN_LCD_G_3		64 +#define BCM281XX_PIN_LCD_G_4		65 +#define BCM281XX_PIN_LCD_G_5		66 +#define BCM281XX_PIN_LCD_G_6		67 +#define BCM281XX_PIN_LCD_G_7		68 +#define BCM281XX_PIN_LCD_HSYNC		69 +#define BCM281XX_PIN_LCD_OE		70 +#define BCM281XX_PIN_LCD_PCLK		71 +#define BCM281XX_PIN_LCD_R_0		72 +#define BCM281XX_PIN_LCD_R_1		73 +#define BCM281XX_PIN_LCD_R_2		74 +#define BCM281XX_PIN_LCD_R_3		75 +#define BCM281XX_PIN_LCD_R_4		76 +#define BCM281XX_PIN_LCD_R_5		77 +#define BCM281XX_PIN_LCD_R_6		78 +#define BCM281XX_PIN_LCD_R_7		79 +#define BCM281XX_PIN_LCD_VSYNC		80 +#define BCM281XX_PIN_MDMGPIO0		81 +#define BCM281XX_PIN_MDMGPIO1		82 +#define BCM281XX_PIN_MDMGPIO2		83 +#define BCM281XX_PIN_MDMGPIO3		84 +#define BCM281XX_PIN_MDMGPIO4		85 +#define BCM281XX_PIN_MDMGPIO5		86 +#define BCM281XX_PIN_MDMGPIO6		87 +#define BCM281XX_PIN_MDMGPIO7		88 +#define BCM281XX_PIN_MDMGPIO8		89 +#define BCM281XX_PIN_MPHI_DATA_0	90 +#define BCM281XX_PIN_MPHI_DATA_1	91 +#define BCM281XX_PIN_MPHI_DATA_2	92 +#define BCM281XX_PIN_MPHI_DATA_3	93 +#define BCM281XX_PIN_MPHI_DATA_4	94 +#define BCM281XX_PIN_MPHI_DATA_5	95 +#define BCM281XX_PIN_MPHI_DATA_6	96 +#define BCM281XX_PIN_MPHI_DATA_7	97 +#define BCM281XX_PIN_MPHI_DATA_8	98 +#define BCM281XX_PIN_MPHI_DATA_9	99 +#define BCM281XX_PIN_MPHI_DATA_10	100 +#define BCM281XX_PIN_MPHI_DATA_11	101 +#define BCM281XX_PIN_MPHI_DATA_12	102 +#define BCM281XX_PIN_MPHI_DATA_13	103 +#define BCM281XX_PIN_MPHI_DATA_14	104 +#define BCM281XX_PIN_MPHI_DATA_15	105 +#define BCM281XX_PIN_MPHI_HA0		106 +#define BCM281XX_PIN_MPHI_HAT0		107 +#define BCM281XX_PIN_MPHI_HAT1		108 +#define BCM281XX_PIN_MPHI_HCE0_N	109 +#define BCM281XX_PIN_MPHI_HCE1_N	110 +#define BCM281XX_PIN_MPHI_HRD_N		111 +#define BCM281XX_PIN_MPHI_HWR_N		112 +#define BCM281XX_PIN_MPHI_RUN0		113 +#define BCM281XX_PIN_MPHI_RUN1		114 +#define BCM281XX_PIN_MTX_SCAN_CLK	115 +#define BCM281XX_PIN_MTX_SCAN_DATA	116 +#define BCM281XX_PIN_NAND_AD_0		117 +#define BCM281XX_PIN_NAND_AD_1		118 +#define BCM281XX_PIN_NAND_AD_2		119 +#define BCM281XX_PIN_NAND_AD_3		120 +#define BCM281XX_PIN_NAND_AD_4		121 +#define BCM281XX_PIN_NAND_AD_5		122 +#define BCM281XX_PIN_NAND_AD_6		123 +#define BCM281XX_PIN_NAND_AD_7		124 +#define BCM281XX_PIN_NAND_ALE		125 +#define BCM281XX_PIN_NAND_CEN_0		126 +#define BCM281XX_PIN_NAND_CEN_1		127 +#define BCM281XX_PIN_NAND_CLE		128 +#define BCM281XX_PIN_NAND_OEN		129 +#define BCM281XX_PIN_NAND_RDY_0		130 +#define BCM281XX_PIN_NAND_RDY_1		131 +#define BCM281XX_PIN_NAND_WEN		132 +#define BCM281XX_PIN_NAND_WP		133 +#define BCM281XX_PIN_PC1		134 +#define BCM281XX_PIN_PC2		135 +#define BCM281XX_PIN_PMU_INT		136 +#define BCM281XX_PIN_PMU_SCL		137 +#define BCM281XX_PIN_PMU_SDA		138 +#define BCM281XX_PIN_RFST2G_MTSLOTEN3G	139 +#define BCM281XX_PIN_RGMII_0_RX_CTL	140 +#define BCM281XX_PIN_RGMII_0_RXC	141 +#define BCM281XX_PIN_RGMII_0_RXD_0	142 +#define BCM281XX_PIN_RGMII_0_RXD_1	143 +#define BCM281XX_PIN_RGMII_0_RXD_2	144 +#define BCM281XX_PIN_RGMII_0_RXD_3	145 +#define BCM281XX_PIN_RGMII_0_TX_CTL	146 +#define BCM281XX_PIN_RGMII_0_TXC	147 +#define BCM281XX_PIN_RGMII_0_TXD_0	148 +#define BCM281XX_PIN_RGMII_0_TXD_1	149 +#define BCM281XX_PIN_RGMII_0_TXD_2	150 +#define BCM281XX_PIN_RGMII_0_TXD_3	151 +#define BCM281XX_PIN_RGMII_1_RX_CTL	152 +#define BCM281XX_PIN_RGMII_1_RXC	153 +#define BCM281XX_PIN_RGMII_1_RXD_0	154 +#define BCM281XX_PIN_RGMII_1_RXD_1	155 +#define BCM281XX_PIN_RGMII_1_RXD_2	156 +#define BCM281XX_PIN_RGMII_1_RXD_3	157 +#define BCM281XX_PIN_RGMII_1_TX_CTL	158 +#define BCM281XX_PIN_RGMII_1_TXC	159 +#define BCM281XX_PIN_RGMII_1_TXD_0	160 +#define BCM281XX_PIN_RGMII_1_TXD_1	161 +#define BCM281XX_PIN_RGMII_1_TXD_2	162 +#define BCM281XX_PIN_RGMII_1_TXD_3	163 +#define BCM281XX_PIN_RGMII_GPIO_0	164 +#define BCM281XX_PIN_RGMII_GPIO_1	165 +#define BCM281XX_PIN_RGMII_GPIO_2	166 +#define BCM281XX_PIN_RGMII_GPIO_3	167 +#define BCM281XX_PIN_RTXDATA2G_TXDATA3G1	168 +#define BCM281XX_PIN_RTXEN2G_TXDATA3G2	169 +#define BCM281XX_PIN_RXDATA3G0		170 +#define BCM281XX_PIN_RXDATA3G1		171 +#define BCM281XX_PIN_RXDATA3G2		172 +#define BCM281XX_PIN_SDIO1_CLK		173 +#define BCM281XX_PIN_SDIO1_CMD		174 +#define BCM281XX_PIN_SDIO1_DATA_0	175 +#define BCM281XX_PIN_SDIO1_DATA_1	176 +#define BCM281XX_PIN_SDIO1_DATA_2	177 +#define BCM281XX_PIN_SDIO1_DATA_3	178 +#define BCM281XX_PIN_SDIO4_CLK		179 +#define BCM281XX_PIN_SDIO4_CMD		180 +#define BCM281XX_PIN_SDIO4_DATA_0	181 +#define BCM281XX_PIN_SDIO4_DATA_1	182 +#define BCM281XX_PIN_SDIO4_DATA_2	183 +#define BCM281XX_PIN_SDIO4_DATA_3	184 +#define BCM281XX_PIN_SIM_CLK		185 +#define BCM281XX_PIN_SIM_DATA		186 +#define BCM281XX_PIN_SIM_DET		187 +#define BCM281XX_PIN_SIM_RESETN		188 +#define BCM281XX_PIN_SIM2_CLK		189 +#define BCM281XX_PIN_SIM2_DATA		190 +#define BCM281XX_PIN_SIM2_DET		191 +#define BCM281XX_PIN_SIM2_RESETN	192 +#define BCM281XX_PIN_SRI_C		193 +#define BCM281XX_PIN_SRI_D		194 +#define BCM281XX_PIN_SRI_E		195 +#define BCM281XX_PIN_SSP_EXTCLK		196 +#define BCM281XX_PIN_SSP0_CLK		197 +#define BCM281XX_PIN_SSP0_FS		198 +#define BCM281XX_PIN_SSP0_RXD		199 +#define BCM281XX_PIN_SSP0_TXD		200 +#define BCM281XX_PIN_SSP2_CLK		201 +#define BCM281XX_PIN_SSP2_FS_0		202 +#define BCM281XX_PIN_SSP2_FS_1		203 +#define BCM281XX_PIN_SSP2_FS_2		204 +#define BCM281XX_PIN_SSP2_FS_3		205 +#define BCM281XX_PIN_SSP2_RXD_0		206 +#define BCM281XX_PIN_SSP2_RXD_1		207 +#define BCM281XX_PIN_SSP2_TXD_0		208 +#define BCM281XX_PIN_SSP2_TXD_1		209 +#define BCM281XX_PIN_SSP3_CLK		210 +#define BCM281XX_PIN_SSP3_FS		211 +#define BCM281XX_PIN_SSP3_RXD		212 +#define BCM281XX_PIN_SSP3_TXD		213 +#define BCM281XX_PIN_SSP4_CLK		214 +#define BCM281XX_PIN_SSP4_FS		215 +#define BCM281XX_PIN_SSP4_RXD		216 +#define BCM281XX_PIN_SSP4_TXD		217 +#define BCM281XX_PIN_SSP5_CLK		218 +#define BCM281XX_PIN_SSP5_FS		219 +#define BCM281XX_PIN_SSP5_RXD		220 +#define BCM281XX_PIN_SSP5_TXD		221 +#define BCM281XX_PIN_SSP6_CLK		222 +#define BCM281XX_PIN_SSP6_FS		223 +#define BCM281XX_PIN_SSP6_RXD		224 +#define BCM281XX_PIN_SSP6_TXD		225 +#define BCM281XX_PIN_STAT_1		226 +#define BCM281XX_PIN_STAT_2		227 +#define BCM281XX_PIN_SYSCLKEN		228 +#define BCM281XX_PIN_TRACECLK		229 +#define BCM281XX_PIN_TRACEDT00		230 +#define BCM281XX_PIN_TRACEDT01		231 +#define BCM281XX_PIN_TRACEDT02		232 +#define BCM281XX_PIN_TRACEDT03		233 +#define BCM281XX_PIN_TRACEDT04		234 +#define BCM281XX_PIN_TRACEDT05		235 +#define BCM281XX_PIN_TRACEDT06		236 +#define BCM281XX_PIN_TRACEDT07		237 +#define BCM281XX_PIN_TRACEDT08		238 +#define BCM281XX_PIN_TRACEDT09		239 +#define BCM281XX_PIN_TRACEDT10		240 +#define BCM281XX_PIN_TRACEDT11		241 +#define BCM281XX_PIN_TRACEDT12		242 +#define BCM281XX_PIN_TRACEDT13		243 +#define BCM281XX_PIN_TRACEDT14		244 +#define BCM281XX_PIN_TRACEDT15		245 +#define BCM281XX_PIN_TXDATA3G0		246 +#define BCM281XX_PIN_TXPWRIND		247 +#define BCM281XX_PIN_UARTB1_UCTS	248 +#define BCM281XX_PIN_UARTB1_URTS	249 +#define BCM281XX_PIN_UARTB1_URXD	250 +#define BCM281XX_PIN_UARTB1_UTXD	251 +#define BCM281XX_PIN_UARTB2_URXD	252 +#define BCM281XX_PIN_UARTB2_UTXD	253 +#define BCM281XX_PIN_UARTB3_UCTS	254 +#define BCM281XX_PIN_UARTB3_URTS	255 +#define BCM281XX_PIN_UARTB3_URXD	256 +#define BCM281XX_PIN_UARTB3_UTXD	257 +#define BCM281XX_PIN_UARTB4_UCTS	258 +#define BCM281XX_PIN_UARTB4_URTS	259 +#define BCM281XX_PIN_UARTB4_URXD	260 +#define BCM281XX_PIN_UARTB4_UTXD	261 +#define BCM281XX_PIN_VC_CAM1_SCL	262 +#define BCM281XX_PIN_VC_CAM1_SDA	263 +#define BCM281XX_PIN_VC_CAM2_SCL	264 +#define BCM281XX_PIN_VC_CAM2_SDA	265 +#define BCM281XX_PIN_VC_CAM3_SCL	266 +#define BCM281XX_PIN_VC_CAM3_SDA	267 + +#define BCM281XX_PIN_DESC(a, b, c) \ +	{ .number = a, .name = b, .drv_data = &c##_pin } + +/* + * Pin description definition.  The order here must be the same as defined in + * the PADCTRLREG block in the RDB, since the pin number is used as an index + * into this array. + */ +static const struct pinctrl_pin_desc bcm281xx_pinctrl_pins[] = { +	BCM281XX_PIN_DESC(BCM281XX_PIN_ADCSYNC, "adcsync", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_BAT_RM, "bat_rm", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SCL, "bsc1_scl", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SDA, "bsc1_sda", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SCL, "bsc2_scl", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SDA, "bsc2_sda", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLASSGPWR, "classgpwr", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLK_CX8, "clk_cx8", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_0, "clkout_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_1, "clkout_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_2, "clkout_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_3, "clkout_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_0, "clkreq_in_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_1, "clkreq_in_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ1, "cws_sys_req1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ2, "cws_sys_req2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ3, "cws_sys_req3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_CLK, "digmic1_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_DQ, "digmic1_dq", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_CLK, "digmic2_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_DQ, "digmic2_dq", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN13, "gpen13", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN14, "gpen14", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN15, "gpen15", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO00, "gpio00", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO01, "gpio01", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO02, "gpio02", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO03, "gpio03", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO04, "gpio04", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO05, "gpio05", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO06, "gpio06", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO07, "gpio07", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO08, "gpio08", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO09, "gpio09", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO10, "gpio10", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO11, "gpio11", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO12, "gpio12", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO13, "gpio13", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO14, "gpio14", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_PABLANK, "gps_pablank", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_TMARK, "gps_tmark", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SCL, "hdmi_scl", hdmi), +	BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SDA, "hdmi_sda", hdmi), +	BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DM, "ic_dm", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DP, "ic_dp", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_0, "kp_col_ip_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_1, "kp_col_ip_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_2, "kp_col_ip_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_3, "kp_col_ip_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_0, "kp_row_op_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_1, "kp_row_op_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_2, "kp_row_op_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_3, "kp_row_op_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_0, "lcd_b_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_1, "lcd_b_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_2, "lcd_b_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_3, "lcd_b_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_4, "lcd_b_4", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_5, "lcd_b_5", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_6, "lcd_b_6", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_7, "lcd_b_7", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_0, "lcd_g_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_1, "lcd_g_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_2, "lcd_g_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_3, "lcd_g_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_4, "lcd_g_4", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_5, "lcd_g_5", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_6, "lcd_g_6", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_7, "lcd_g_7", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_HSYNC, "lcd_hsync", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_OE, "lcd_oe", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_PCLK, "lcd_pclk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_0, "lcd_r_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_1, "lcd_r_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_2, "lcd_r_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_3, "lcd_r_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_4, "lcd_r_4", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_5, "lcd_r_5", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_6, "lcd_r_6", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_7, "lcd_r_7", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_VSYNC, "lcd_vsync", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO0, "mdmgpio0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO1, "mdmgpio1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO2, "mdmgpio2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO3, "mdmgpio3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO4, "mdmgpio4", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO5, "mdmgpio5", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO6, "mdmgpio6", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO7, "mdmgpio7", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO8, "mdmgpio8", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_0, "mphi_data_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_1, "mphi_data_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_2, "mphi_data_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_3, "mphi_data_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_4, "mphi_data_4", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_5, "mphi_data_5", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_6, "mphi_data_6", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_7, "mphi_data_7", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_8, "mphi_data_8", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_9, "mphi_data_9", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_10, "mphi_data_10", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_11, "mphi_data_11", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_12, "mphi_data_12", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_13, "mphi_data_13", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_14, "mphi_data_14", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_15, "mphi_data_15", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HA0, "mphi_ha0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT0, "mphi_hat0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT1, "mphi_hat1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE0_N, "mphi_hce0_n", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE1_N, "mphi_hce1_n", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HRD_N, "mphi_hrd_n", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HWR_N, "mphi_hwr_n", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN0, "mphi_run0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN1, "mphi_run1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_CLK, "mtx_scan_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_DATA, "mtx_scan_data", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_0, "nand_ad_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_1, "nand_ad_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_2, "nand_ad_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_3, "nand_ad_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_4, "nand_ad_4", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_5, "nand_ad_5", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_6, "nand_ad_6", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_7, "nand_ad_7", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_ALE, "nand_ale", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_0, "nand_cen_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_1, "nand_cen_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CLE, "nand_cle", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_OEN, "nand_oen", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_0, "nand_rdy_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_1, "nand_rdy_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WEN, "nand_wen", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WP, "nand_wp", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_PC1, "pc1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_PC2, "pc2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_INT, "pmu_int", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SCL, "pmu_scl", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SDA, "pmu_sda", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RFST2G_MTSLOTEN3G, "rfst2g_mtsloten3g", +		std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RX_CTL, "rgmii_0_rx_ctl", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXC, "rgmii_0_rxc", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_0, "rgmii_0_rxd_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_1, "rgmii_0_rxd_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_2, "rgmii_0_rxd_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_3, "rgmii_0_rxd_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TX_CTL, "rgmii_0_tx_ctl", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXC, "rgmii_0_txc", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_0, "rgmii_0_txd_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_1, "rgmii_0_txd_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_2, "rgmii_0_txd_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_3, "rgmii_0_txd_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RX_CTL, "rgmii_1_rx_ctl", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXC, "rgmii_1_rxc", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_0, "rgmii_1_rxd_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_1, "rgmii_1_rxd_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_2, "rgmii_1_rxd_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_3, "rgmii_1_rxd_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TX_CTL, "rgmii_1_tx_ctl", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXC, "rgmii_1_txc", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_0, "rgmii_1_txd_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_1, "rgmii_1_txd_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_2, "rgmii_1_txd_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_3, "rgmii_1_txd_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_0, "rgmii_gpio_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_1, "rgmii_gpio_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_2, "rgmii_gpio_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_3, "rgmii_gpio_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RTXDATA2G_TXDATA3G1, +		"rtxdata2g_txdata3g1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RTXEN2G_TXDATA3G2, "rtxen2g_txdata3g2", +		std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G0, "rxdata3g0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G1, "rxdata3g1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G2, "rxdata3g2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CLK, "sdio1_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CMD, "sdio1_cmd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_0, "sdio1_data_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_1, "sdio1_data_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_2, "sdio1_data_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_3, "sdio1_data_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CLK, "sdio4_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CMD, "sdio4_cmd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_0, "sdio4_data_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_1, "sdio4_data_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_2, "sdio4_data_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_3, "sdio4_data_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_CLK, "sim_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DATA, "sim_data", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DET, "sim_det", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_RESETN, "sim_resetn", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_CLK, "sim2_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DATA, "sim2_data", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DET, "sim2_det", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_RESETN, "sim2_resetn", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_C, "sri_c", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_D, "sri_d", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_E, "sri_e", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP_EXTCLK, "ssp_extclk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_CLK, "ssp0_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_FS, "ssp0_fs", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_RXD, "ssp0_rxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_TXD, "ssp0_txd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_CLK, "ssp2_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_0, "ssp2_fs_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_1, "ssp2_fs_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_2, "ssp2_fs_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_3, "ssp2_fs_3", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_0, "ssp2_rxd_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_1, "ssp2_rxd_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_0, "ssp2_txd_0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_1, "ssp2_txd_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_CLK, "ssp3_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_FS, "ssp3_fs", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_RXD, "ssp3_rxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_TXD, "ssp3_txd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_CLK, "ssp4_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_FS, "ssp4_fs", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_RXD, "ssp4_rxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_TXD, "ssp4_txd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_CLK, "ssp5_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_FS, "ssp5_fs", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_RXD, "ssp5_rxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_TXD, "ssp5_txd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_CLK, "ssp6_clk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_FS, "ssp6_fs", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_RXD, "ssp6_rxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_TXD, "ssp6_txd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_1, "stat_1", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_2, "stat_2", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_SYSCLKEN, "sysclken", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACECLK, "traceclk", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT00, "tracedt00", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT01, "tracedt01", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT02, "tracedt02", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT03, "tracedt03", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT04, "tracedt04", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT05, "tracedt05", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT06, "tracedt06", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT07, "tracedt07", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT08, "tracedt08", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT09, "tracedt09", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT10, "tracedt10", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT11, "tracedt11", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT12, "tracedt12", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT13, "tracedt13", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT14, "tracedt14", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT15, "tracedt15", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TXDATA3G0, "txdata3g0", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_TXPWRIND, "txpwrind", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UCTS, "uartb1_ucts", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URTS, "uartb1_urts", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URXD, "uartb1_urxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UTXD, "uartb1_utxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_URXD, "uartb2_urxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_UTXD, "uartb2_utxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UCTS, "uartb3_ucts", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URTS, "uartb3_urts", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URXD, "uartb3_urxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UTXD, "uartb3_utxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UCTS, "uartb4_ucts", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URTS, "uartb4_urts", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URXD, "uartb4_urxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UTXD, "uartb4_utxd", std), +	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SCL, "vc_cam1_scl", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SDA, "vc_cam1_sda", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SCL, "vc_cam2_scl", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SDA, "vc_cam2_sda", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SCL, "vc_cam3_scl", i2c), +	BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SDA, "vc_cam3_sda", i2c), +}; + +static const char * const bcm281xx_alt_groups[] = { +	"adcsync", +	"bat_rm", +	"bsc1_scl", +	"bsc1_sda", +	"bsc2_scl", +	"bsc2_sda", +	"classgpwr", +	"clk_cx8", +	"clkout_0", +	"clkout_1", +	"clkout_2", +	"clkout_3", +	"clkreq_in_0", +	"clkreq_in_1", +	"cws_sys_req1", +	"cws_sys_req2", +	"cws_sys_req3", +	"digmic1_clk", +	"digmic1_dq", +	"digmic2_clk", +	"digmic2_dq", +	"gpen13", +	"gpen14", +	"gpen15", +	"gpio00", +	"gpio01", +	"gpio02", +	"gpio03", +	"gpio04", +	"gpio05", +	"gpio06", +	"gpio07", +	"gpio08", +	"gpio09", +	"gpio10", +	"gpio11", +	"gpio12", +	"gpio13", +	"gpio14", +	"gps_pablank", +	"gps_tmark", +	"hdmi_scl", +	"hdmi_sda", +	"ic_dm", +	"ic_dp", +	"kp_col_ip_0", +	"kp_col_ip_1", +	"kp_col_ip_2", +	"kp_col_ip_3", +	"kp_row_op_0", +	"kp_row_op_1", +	"kp_row_op_2", +	"kp_row_op_3", +	"lcd_b_0", +	"lcd_b_1", +	"lcd_b_2", +	"lcd_b_3", +	"lcd_b_4", +	"lcd_b_5", +	"lcd_b_6", +	"lcd_b_7", +	"lcd_g_0", +	"lcd_g_1", +	"lcd_g_2", +	"lcd_g_3", +	"lcd_g_4", +	"lcd_g_5", +	"lcd_g_6", +	"lcd_g_7", +	"lcd_hsync", +	"lcd_oe", +	"lcd_pclk", +	"lcd_r_0", +	"lcd_r_1", +	"lcd_r_2", +	"lcd_r_3", +	"lcd_r_4", +	"lcd_r_5", +	"lcd_r_6", +	"lcd_r_7", +	"lcd_vsync", +	"mdmgpio0", +	"mdmgpio1", +	"mdmgpio2", +	"mdmgpio3", +	"mdmgpio4", +	"mdmgpio5", +	"mdmgpio6", +	"mdmgpio7", +	"mdmgpio8", +	"mphi_data_0", +	"mphi_data_1", +	"mphi_data_2", +	"mphi_data_3", +	"mphi_data_4", +	"mphi_data_5", +	"mphi_data_6", +	"mphi_data_7", +	"mphi_data_8", +	"mphi_data_9", +	"mphi_data_10", +	"mphi_data_11", +	"mphi_data_12", +	"mphi_data_13", +	"mphi_data_14", +	"mphi_data_15", +	"mphi_ha0", +	"mphi_hat0", +	"mphi_hat1", +	"mphi_hce0_n", +	"mphi_hce1_n", +	"mphi_hrd_n", +	"mphi_hwr_n", +	"mphi_run0", +	"mphi_run1", +	"mtx_scan_clk", +	"mtx_scan_data", +	"nand_ad_0", +	"nand_ad_1", +	"nand_ad_2", +	"nand_ad_3", +	"nand_ad_4", +	"nand_ad_5", +	"nand_ad_6", +	"nand_ad_7", +	"nand_ale", +	"nand_cen_0", +	"nand_cen_1", +	"nand_cle", +	"nand_oen", +	"nand_rdy_0", +	"nand_rdy_1", +	"nand_wen", +	"nand_wp", +	"pc1", +	"pc2", +	"pmu_int", +	"pmu_scl", +	"pmu_sda", +	"rfst2g_mtsloten3g", +	"rgmii_0_rx_ctl", +	"rgmii_0_rxc", +	"rgmii_0_rxd_0", +	"rgmii_0_rxd_1", +	"rgmii_0_rxd_2", +	"rgmii_0_rxd_3", +	"rgmii_0_tx_ctl", +	"rgmii_0_txc", +	"rgmii_0_txd_0", +	"rgmii_0_txd_1", +	"rgmii_0_txd_2", +	"rgmii_0_txd_3", +	"rgmii_1_rx_ctl", +	"rgmii_1_rxc", +	"rgmii_1_rxd_0", +	"rgmii_1_rxd_1", +	"rgmii_1_rxd_2", +	"rgmii_1_rxd_3", +	"rgmii_1_tx_ctl", +	"rgmii_1_txc", +	"rgmii_1_txd_0", +	"rgmii_1_txd_1", +	"rgmii_1_txd_2", +	"rgmii_1_txd_3", +	"rgmii_gpio_0", +	"rgmii_gpio_1", +	"rgmii_gpio_2", +	"rgmii_gpio_3", +	"rtxdata2g_txdata3g1", +	"rtxen2g_txdata3g2", +	"rxdata3g0", +	"rxdata3g1", +	"rxdata3g2", +	"sdio1_clk", +	"sdio1_cmd", +	"sdio1_data_0", +	"sdio1_data_1", +	"sdio1_data_2", +	"sdio1_data_3", +	"sdio4_clk", +	"sdio4_cmd", +	"sdio4_data_0", +	"sdio4_data_1", +	"sdio4_data_2", +	"sdio4_data_3", +	"sim_clk", +	"sim_data", +	"sim_det", +	"sim_resetn", +	"sim2_clk", +	"sim2_data", +	"sim2_det", +	"sim2_resetn", +	"sri_c", +	"sri_d", +	"sri_e", +	"ssp_extclk", +	"ssp0_clk", +	"ssp0_fs", +	"ssp0_rxd", +	"ssp0_txd", +	"ssp2_clk", +	"ssp2_fs_0", +	"ssp2_fs_1", +	"ssp2_fs_2", +	"ssp2_fs_3", +	"ssp2_rxd_0", +	"ssp2_rxd_1", +	"ssp2_txd_0", +	"ssp2_txd_1", +	"ssp3_clk", +	"ssp3_fs", +	"ssp3_rxd", +	"ssp3_txd", +	"ssp4_clk", +	"ssp4_fs", +	"ssp4_rxd", +	"ssp4_txd", +	"ssp5_clk", +	"ssp5_fs", +	"ssp5_rxd", +	"ssp5_txd", +	"ssp6_clk", +	"ssp6_fs", +	"ssp6_rxd", +	"ssp6_txd", +	"stat_1", +	"stat_2", +	"sysclken", +	"traceclk", +	"tracedt00", +	"tracedt01", +	"tracedt02", +	"tracedt03", +	"tracedt04", +	"tracedt05", +	"tracedt06", +	"tracedt07", +	"tracedt08", +	"tracedt09", +	"tracedt10", +	"tracedt11", +	"tracedt12", +	"tracedt13", +	"tracedt14", +	"tracedt15", +	"txdata3g0", +	"txpwrind", +	"uartb1_ucts", +	"uartb1_urts", +	"uartb1_urxd", +	"uartb1_utxd", +	"uartb2_urxd", +	"uartb2_utxd", +	"uartb3_ucts", +	"uartb3_urts", +	"uartb3_urxd", +	"uartb3_utxd", +	"uartb4_ucts", +	"uartb4_urts", +	"uartb4_urxd", +	"uartb4_utxd", +	"vc_cam1_scl", +	"vc_cam1_sda", +	"vc_cam2_scl", +	"vc_cam2_sda", +	"vc_cam3_scl", +	"vc_cam3_sda", +}; + +/* Every pin can implement all ALT1-ALT4 functions */ +#define BCM281XX_PIN_FUNCTION(fcn_name)			\ +{							\ +	.name = #fcn_name,				\ +	.groups = bcm281xx_alt_groups,			\ +	.ngroups = ARRAY_SIZE(bcm281xx_alt_groups),	\ +} + +static const struct bcm281xx_pin_function bcm281xx_functions[] = { +	BCM281XX_PIN_FUNCTION(alt1), +	BCM281XX_PIN_FUNCTION(alt2), +	BCM281XX_PIN_FUNCTION(alt3), +	BCM281XX_PIN_FUNCTION(alt4), +}; + +static struct bcm281xx_pinctrl_data bcm281xx_pinctrl = { +	.pins = bcm281xx_pinctrl_pins, +	.npins = ARRAY_SIZE(bcm281xx_pinctrl_pins), +	.functions = bcm281xx_functions, +	.nfunctions = ARRAY_SIZE(bcm281xx_functions), +}; + +static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev, +						  unsigned pin) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	if (pin >= pdata->npins) +		return BCM281XX_PIN_TYPE_UNKNOWN; + +	return *(enum bcm281xx_pin_type *)(pdata->pins[pin].drv_data); +} + +#define BCM281XX_PIN_SHIFT(type, param) \ +	(BCM281XX_ ## type ## _PIN_REG_ ## param ## _SHIFT) + +#define BCM281XX_PIN_MASK(type, param) \ +	(BCM281XX_ ## type ## _PIN_REG_ ## param ## _MASK) + +/* + * This helper function is used to build up the value and mask used to write to + * a pin register, but does not actually write to the register. + */ +static inline void bcm281xx_pin_update(u32 *reg_val, u32 *reg_mask, +				       u32 param_val, u32 param_shift, +				       u32 param_mask) +{ +	*reg_val &= ~param_mask; +	*reg_val |= (param_val << param_shift) & param_mask; +	*reg_mask |= param_mask; +} + +static struct regmap_config bcm281xx_pinctrl_regmap_config = { +	.reg_bits = 32, +	.reg_stride = 4, +	.val_bits = 32, +	.max_register = BCM281XX_PIN_VC_CAM3_SDA, +}; + +static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	return pdata->npins; +} + +static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev, +						   unsigned group) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	return pdata->pins[group].name; +} + +static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, +					   unsigned group, +					   const unsigned **pins, +					   unsigned *num_pins) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	*pins = &pdata->pins[group].number; +	*num_pins = 1; + +	return 0; +} + +static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, +					  struct seq_file *s, +					  unsigned offset) +{ +	seq_printf(s, " %s", dev_name(pctldev->dev)); +} + +static struct pinctrl_ops bcm281xx_pinctrl_ops = { +	.get_groups_count = bcm281xx_pinctrl_get_groups_count, +	.get_group_name = bcm281xx_pinctrl_get_group_name, +	.get_group_pins = bcm281xx_pinctrl_get_group_pins, +	.pin_dbg_show = bcm281xx_pinctrl_pin_dbg_show, +	.dt_node_to_map = pinconf_generic_dt_node_to_map_pin, +	.dt_free_map = pinctrl_utils_dt_free_map, +}; + +static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	return pdata->nfunctions; +} + +static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev, +						 unsigned function) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	return pdata->functions[function].name; +} + +static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev, +					   unsigned function, +					   const char * const **groups, +					   unsigned * const num_groups) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); + +	*groups = pdata->functions[function].groups; +	*num_groups = pdata->functions[function].ngroups; + +	return 0; +} + +static int bcm281xx_pinmux_enable(struct pinctrl_dev *pctldev, +				  unsigned function, +				  unsigned group) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); +	const struct bcm281xx_pin_function *f = &pdata->functions[function]; +	u32 offset = 4 * pdata->pins[group].number; +	int rc = 0; + +	dev_dbg(pctldev->dev, +		"%s(): Enable function %s (%d) of pin %s (%d) @offset 0x%x.\n", +		__func__, f->name, function, pdata->pins[group].name, +		pdata->pins[group].number, offset); + +	rc = regmap_update_bits(pdata->regmap, offset, +		BCM281XX_PIN_REG_F_SEL_MASK, +		function << BCM281XX_PIN_REG_F_SEL_SHIFT); +	if (rc) +		dev_err(pctldev->dev, +			"Error updating register for pin %s (%d).\n", +			pdata->pins[group].name, pdata->pins[group].number); + +	return rc; +} + +static struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = { +	.get_functions_count = bcm281xx_pinctrl_get_fcns_count, +	.get_function_name = bcm281xx_pinctrl_get_fcn_name, +	.get_function_groups = bcm281xx_pinctrl_get_fcn_groups, +	.enable = bcm281xx_pinmux_enable, +}; + +static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev, +					   unsigned pin, +					   unsigned long *config) +{ +	return -ENOTSUPP; +} + + +/* Goes through the configs and update register val/mask */ +static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev, +				   unsigned pin, +				   unsigned long *configs, +				   unsigned num_configs, +				   u32 *val, +				   u32 *mask) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); +	int i; +	enum pin_config_param param; +	u16 arg; + +	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_INPUT_SCHMITT_ENABLE: +			arg = (arg >= 1 ? 1 : 0); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(STD, HYST), +				BCM281XX_PIN_MASK(STD, HYST)); +			break; +		/* +		 * The pin bias can only be one of pull-up, pull-down, or +		 * disable.  The user does not need to specify a value for the +		 * property, and the default value from pinconf-generic is +		 * ignored. +		 */ +		case PIN_CONFIG_BIAS_DISABLE: +			bcm281xx_pin_update(val, mask, 0, +				BCM281XX_PIN_SHIFT(STD, PULL_UP), +				BCM281XX_PIN_MASK(STD, PULL_UP)); +			bcm281xx_pin_update(val, mask, 0, +				BCM281XX_PIN_SHIFT(STD, PULL_DN), +				BCM281XX_PIN_MASK(STD, PULL_DN)); +			break; + +		case PIN_CONFIG_BIAS_PULL_UP: +			bcm281xx_pin_update(val, mask, 1, +				BCM281XX_PIN_SHIFT(STD, PULL_UP), +				BCM281XX_PIN_MASK(STD, PULL_UP)); +			bcm281xx_pin_update(val, mask, 0, +				BCM281XX_PIN_SHIFT(STD, PULL_DN), +				BCM281XX_PIN_MASK(STD, PULL_DN)); +			break; + +		case PIN_CONFIG_BIAS_PULL_DOWN: +			bcm281xx_pin_update(val, mask, 0, +				BCM281XX_PIN_SHIFT(STD, PULL_UP), +				BCM281XX_PIN_MASK(STD, PULL_UP)); +			bcm281xx_pin_update(val, mask, 1, +				BCM281XX_PIN_SHIFT(STD, PULL_DN), +				BCM281XX_PIN_MASK(STD, PULL_DN)); +			break; + +		case PIN_CONFIG_SLEW_RATE: +			arg = (arg >= 1 ? 1 : 0); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(STD, SLEW), +				BCM281XX_PIN_MASK(STD, SLEW)); +			break; + +		case PIN_CONFIG_INPUT_ENABLE: +			/* inversed since register is for input _disable_ */ +			arg = (arg >= 1 ? 0 : 1); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(STD, INPUT_DIS), +				BCM281XX_PIN_MASK(STD, INPUT_DIS)); +			break; + +		case PIN_CONFIG_DRIVE_STRENGTH: +			/* Valid range is 2-16 mA, even numbers only */ +			if ((arg < 2) || (arg > 16) || (arg % 2)) { +				dev_err(pctldev->dev, +					"Invalid Drive Strength value (%d) for " +					"pin %s (%d). Valid values are " +					"(2..16) mA, even numbers only.\n", +					arg, pdata->pins[pin].name, pin); +				return -EINVAL; +			} +			bcm281xx_pin_update(val, mask, (arg/2)-1, +				BCM281XX_PIN_SHIFT(STD, DRV_STR), +				BCM281XX_PIN_MASK(STD, DRV_STR)); +			break; + +		default: +			dev_err(pctldev->dev, +				"Unrecognized pin config %d for pin %s (%d).\n", +				param, pdata->pins[pin].name, pin); +			return -EINVAL; + +		} /* switch config */ +	} /* for each config */ + +	return 0; +} + +/* + * The pull-up strength for an I2C pin is represented by bits 4-6 in the + * register with the following mapping: + *   0b000: No pull-up + *   0b001: 1200 Ohm + *   0b010: 1800 Ohm + *   0b011: 720 Ohm + *   0b100: 2700 Ohm + *   0b101: 831 Ohm + *   0b110: 1080 Ohm + *   0b111: 568 Ohm + * This array maps pull-up strength in Ohms to register values (1+index). + */ +static const u16 bcm281xx_pullup_map[] = { +	1200, 1800, 720, 2700, 831, 1080, 568 +}; + +/* Goes through the configs and update register val/mask */ +static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev, +				   unsigned pin, +				   unsigned long *configs, +				   unsigned num_configs, +				   u32 *val, +				   u32 *mask) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); +	int i, j; +	enum pin_config_param param; +	u16 arg; + +	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_UP: +			for (j = 0; j < ARRAY_SIZE(bcm281xx_pullup_map); j++) +				if (bcm281xx_pullup_map[j] == arg) +					break; + +			if (j == ARRAY_SIZE(bcm281xx_pullup_map)) { +				dev_err(pctldev->dev, +					"Invalid pull-up value (%d) for pin %s " +					"(%d). Valid values are 568, 720, 831, " +					"1080, 1200, 1800, 2700 Ohms.\n", +					arg, pdata->pins[pin].name, pin); +				return -EINVAL; +			} + +			bcm281xx_pin_update(val, mask, j+1, +				BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR), +				BCM281XX_PIN_MASK(I2C, PULL_UP_STR)); +			break; + +		case PIN_CONFIG_BIAS_DISABLE: +			bcm281xx_pin_update(val, mask, 0, +				BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR), +				BCM281XX_PIN_MASK(I2C, PULL_UP_STR)); +			break; + +		case PIN_CONFIG_SLEW_RATE: +			arg = (arg >= 1 ? 1 : 0); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(I2C, SLEW), +				BCM281XX_PIN_MASK(I2C, SLEW)); +			break; + +		case PIN_CONFIG_INPUT_ENABLE: +			/* inversed since register is for input _disable_ */ +			arg = (arg >= 1 ? 0 : 1); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(I2C, INPUT_DIS), +				BCM281XX_PIN_MASK(I2C, INPUT_DIS)); +			break; + +		default: +			dev_err(pctldev->dev, +				"Unrecognized pin config %d for pin %s (%d).\n", +				param, pdata->pins[pin].name, pin); +			return -EINVAL; + +		} /* switch config */ +	} /* for each config */ + +	return 0; +} + +/* Goes through the configs and update register val/mask */ +static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev, +				    unsigned pin, +				    unsigned long *configs, +				    unsigned num_configs, +				    u32 *val, +				    u32 *mask) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); +	int i; +	enum pin_config_param param; +	u16 arg; + +	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_SLEW_RATE: +			arg = (arg >= 1 ? 1 : 0); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(HDMI, MODE), +				BCM281XX_PIN_MASK(HDMI, MODE)); +			break; + +		case PIN_CONFIG_INPUT_ENABLE: +			/* inversed since register is for input _disable_ */ +			arg = (arg >= 1 ? 0 : 1); +			bcm281xx_pin_update(val, mask, arg, +				BCM281XX_PIN_SHIFT(HDMI, INPUT_DIS), +				BCM281XX_PIN_MASK(HDMI, INPUT_DIS)); +			break; + +		default: +			dev_err(pctldev->dev, +				"Unrecognized pin config %d for pin %s (%d).\n", +				param, pdata->pins[pin].name, pin); +			return -EINVAL; + +		} /* switch config */ +	} /* for each config */ + +	return 0; +} + +static int bcm281xx_pinctrl_pin_config_set(struct pinctrl_dev *pctldev, +					   unsigned pin, +					   unsigned long *configs, +					   unsigned num_configs) +{ +	struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); +	enum bcm281xx_pin_type pin_type; +	u32 offset = 4 * pin; +	u32 cfg_val, cfg_mask; +	int rc; + +	cfg_val = 0; +	cfg_mask = 0; +	pin_type = pin_type_get(pctldev, pin); + +	/* Different pins have different configuration options */ +	switch (pin_type) { +	case BCM281XX_PIN_TYPE_STD: +		rc = bcm281xx_std_pin_update(pctldev, pin, configs, +			num_configs, &cfg_val, &cfg_mask); +		break; + +	case BCM281XX_PIN_TYPE_I2C: +		rc = bcm281xx_i2c_pin_update(pctldev, pin, configs, +			num_configs, &cfg_val, &cfg_mask); +		break; + +	case BCM281XX_PIN_TYPE_HDMI: +		rc = bcm281xx_hdmi_pin_update(pctldev, pin, configs, +			num_configs, &cfg_val, &cfg_mask); +		break; + +	default: +		dev_err(pctldev->dev, "Unknown pin type for pin %s (%d).\n", +			pdata->pins[pin].name, pin); +		return -EINVAL; + +	} /* switch pin type */ + +	if (rc) +		return rc; + +	dev_dbg(pctldev->dev, +		"%s(): Set pin %s (%d) with config 0x%x, mask 0x%x\n", +		__func__, pdata->pins[pin].name, pin, cfg_val, cfg_mask); + +	rc = regmap_update_bits(pdata->regmap, offset, cfg_mask, cfg_val); +	if (rc) { +		dev_err(pctldev->dev, +			"Error updating register for pin %s (%d).\n", +			pdata->pins[pin].name, pin); +		return rc; +	} + +	return 0; +} + +static struct pinconf_ops bcm281xx_pinctrl_pinconf_ops = { +	.pin_config_get = bcm281xx_pinctrl_pin_config_get, +	.pin_config_set = bcm281xx_pinctrl_pin_config_set, +}; + +static struct pinctrl_desc bcm281xx_pinctrl_desc = { +	/* name, pins, npins members initialized in probe function */ +	.pctlops = &bcm281xx_pinctrl_ops, +	.pmxops = &bcm281xx_pinctrl_pinmux_ops, +	.confops = &bcm281xx_pinctrl_pinconf_ops, +	.owner = THIS_MODULE, +}; + +int __init bcm281xx_pinctrl_probe(struct platform_device *pdev) +{ +	struct bcm281xx_pinctrl_data *pdata = &bcm281xx_pinctrl; +	struct resource *res; +	struct pinctrl_dev *pctl; + +	/* So far We can assume there is only 1 bank of registers */ +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!res) { +		dev_err(&pdev->dev, "Missing MEM resource\n"); +		return -ENODEV; +	} + +	pdata->reg_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(pdata->reg_base)) { +		dev_err(&pdev->dev, "Failed to ioremap MEM resource\n"); +		return -ENODEV; +	} + +	/* Initialize the dynamic part of pinctrl_desc */ +	pdata->regmap = devm_regmap_init_mmio(&pdev->dev, pdata->reg_base, +		&bcm281xx_pinctrl_regmap_config); +	if (IS_ERR(pdata->regmap)) { +		dev_err(&pdev->dev, "Regmap MMIO init failed.\n"); +		return -ENODEV; +	} + +	bcm281xx_pinctrl_desc.name = dev_name(&pdev->dev); +	bcm281xx_pinctrl_desc.pins = bcm281xx_pinctrl.pins; +	bcm281xx_pinctrl_desc.npins = bcm281xx_pinctrl.npins; + +	pctl = pinctrl_register(&bcm281xx_pinctrl_desc, +				&pdev->dev, +				pdata); +	if (!pctl) { +		dev_err(&pdev->dev, "Failed to register pinctrl\n"); +		return -ENODEV; +	} + +	platform_set_drvdata(pdev, pdata); + +	return 0; +} + +static struct of_device_id bcm281xx_pinctrl_of_match[] = { +	{ .compatible = "brcm,bcm11351-pinctrl", }, +	{ }, +}; + +static struct platform_driver bcm281xx_pinctrl_driver = { +	.driver = { +		.name = "bcm281xx-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = bcm281xx_pinctrl_of_match, +	}, +}; + +module_platform_driver_probe(bcm281xx_pinctrl_driver, bcm281xx_pinctrl_probe); + +MODULE_AUTHOR("Broadcom Corporation <bcm-kernel-feedback-list@broadcom.com>"); +MODULE_AUTHOR("Sherman Yin <syin@broadcom.com>"); +MODULE_DESCRIPTION("Broadcom BCM281xx pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-bcm2835.c b/drivers/pinctrl/pinctrl-bcm2835.c index c05c1ef2cc3..3d907de9bc9 100644 --- a/drivers/pinctrl/pinctrl-bcm2835.c +++ b/drivers/pinctrl/pinctrl-bcm2835.c @@ -384,7 +384,7 @@ static struct gpio_chip bcm2835_gpio_chip = {  	.to_irq = bcm2835_gpio_to_irq,  	.base = -1,  	.ngpio = BCM2835_NUM_GPIOS, -	.can_sleep = 0, +	.can_sleep = false,  };  static irqreturn_t bcm2835_gpio_irq_handler(int irq, void *dev_id) diff --git a/drivers/pinctrl/pinctrl-coh901.c b/drivers/pinctrl/pinctrl-coh901.c index f22a2193d94..d182fdd2e71 100644 --- a/drivers/pinctrl/pinctrl-coh901.c +++ b/drivers/pinctrl/pinctrl-coh901.c @@ -8,17 +8,14 @@   * Author: Jonas Aaberg <jonas.aberg@stericsson.com>   */  #include <linux/module.h> -#include <linux/irq.h>  #include <linux/interrupt.h>  #include <linux/delay.h>  #include <linux/errno.h>  #include <linux/io.h> -#include <linux/irqdomain.h>  #include <linux/clk.h>  #include <linux/err.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> -#include <linux/list.h>  #include <linux/slab.h>  #include <linux/pinctrl/consumer.h>  #include <linux/pinctrl/pinconf-generic.h> @@ -61,9 +58,17 @@  #define U300_GPIO_PINS_PER_PORT 8  #define U300_GPIO_MAX (U300_GPIO_PINS_PER_PORT * U300_GPIO_NUM_PORTS) +struct u300_gpio_port { +	struct u300_gpio *gpio; +	char name[8]; +	int irq; +	int number; +	u8 toggle_edge_mode; +}; +  struct u300_gpio {  	struct gpio_chip chip; -	struct list_head port_list; +	struct u300_gpio_port ports[U300_GPIO_NUM_PORTS];  	struct clk *clk;  	void __iomem *base;  	struct device *dev; @@ -78,16 +83,6 @@ struct u300_gpio {  	u32 iev;  }; -struct u300_gpio_port { -	struct list_head node; -	struct u300_gpio *gpio; -	char name[8]; -	struct irq_domain *domain; -	int irq; -	int number; -	u8 toggle_edge_mode; -}; -  /*   * Macro to expand to read a specific register found in the "gpio"   * struct. It requires the struct u300_gpio *gpio variable to exist in @@ -308,39 +303,6 @@ static int u300_gpio_direction_output(struct gpio_chip *chip, unsigned offset,  	return 0;  } -static int u300_gpio_to_irq(struct gpio_chip *chip, unsigned offset) -{ -	struct u300_gpio *gpio = to_u300_gpio(chip); -	int portno = offset >> 3; -	struct u300_gpio_port *port = NULL; -	struct list_head *p; -	int retirq; -	bool found = false; - -	list_for_each(p, &gpio->port_list) { -		port = list_entry(p, struct u300_gpio_port, node); -		if (port->number == portno) { -			found = true; -			break; -		} -	} -	if (!found) { -		dev_err(gpio->dev, "could not locate port for GPIO %d IRQ\n", -			offset); -		return -EINVAL; -	} - -	/* -	 * The local hwirqs on the port are the lower three bits, there -	 * are exactly 8 IRQs per port since they are 8-bit -	 */ -	retirq = irq_find_mapping(port->domain, (offset & 0x7)); - -	dev_dbg(gpio->dev, "request IRQ for GPIO %d, return %d from port %d\n", -		offset, retirq, port->number); -	return retirq; -} -  /* Returning -EINVAL means "supported but not available" */  int u300_gpio_config_get(struct gpio_chip *chip,  			 unsigned offset, @@ -461,7 +423,6 @@ static struct gpio_chip u300_gpio_chip = {  	.set			= u300_gpio_set,  	.direction_input	= u300_gpio_direction_input,  	.direction_output	= u300_gpio_direction_output, -	.to_irq			= u300_gpio_to_irq,  };  static void u300_toggle_trigger(struct u300_gpio *gpio, unsigned offset) @@ -485,9 +446,10 @@ static void u300_toggle_trigger(struct u300_gpio *gpio, unsigned offset)  static int u300_gpio_irq_type(struct irq_data *d, unsigned trigger)  { -	struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); -	struct u300_gpio *gpio = port->gpio; -	int offset = (port->number << 3) + d->hwirq; +	struct gpio_chip *chip = irq_data_get_irq_chip_data(d); +	struct u300_gpio *gpio = to_u300_gpio(chip); +	struct u300_gpio_port *port = &gpio->ports[d->hwirq >> 3]; +	int offset = d->hwirq;  	u32 val;  	if ((trigger & IRQF_TRIGGER_RISING) && @@ -521,9 +483,10 @@ static int u300_gpio_irq_type(struct irq_data *d, unsigned trigger)  static void u300_gpio_irq_enable(struct irq_data *d)  { -	struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); -	struct u300_gpio *gpio = port->gpio; -	int offset = (port->number << 3) + d->hwirq; +	struct gpio_chip *chip = irq_data_get_irq_chip_data(d); +	struct u300_gpio *gpio = to_u300_gpio(chip); +	struct u300_gpio_port *port = &gpio->ports[d->hwirq >> 3]; +	int offset = d->hwirq;  	u32 val;  	unsigned long flags; @@ -537,9 +500,9 @@ static void u300_gpio_irq_enable(struct irq_data *d)  static void u300_gpio_irq_disable(struct irq_data *d)  { -	struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); -	struct u300_gpio *gpio = port->gpio; -	int offset = (port->number << 3) + d->hwirq; +	struct gpio_chip *chip = irq_data_get_irq_chip_data(d); +	struct u300_gpio *gpio = to_u300_gpio(chip); +	int offset = d->hwirq;  	u32 val;  	unsigned long flags; @@ -554,17 +517,19 @@ static struct irq_chip u300_gpio_irqchip = {  	.irq_enable		= u300_gpio_irq_enable,  	.irq_disable		= u300_gpio_irq_disable,  	.irq_set_type		= u300_gpio_irq_type, -  };  static void u300_gpio_irq_handler(unsigned irq, struct irq_desc *desc)  { -	struct u300_gpio_port *port = irq_get_handler_data(irq); -	struct u300_gpio *gpio = port->gpio; +	struct irq_chip *parent_chip = irq_get_chip(irq); +	struct gpio_chip *chip = irq_get_handler_data(irq); +	struct u300_gpio *gpio = to_u300_gpio(chip); +	struct u300_gpio_port *port = &gpio->ports[irq - chip->base];  	int pinoffset = port->number << 3; /* get the right stride */  	unsigned long val; -	desc->irq_data.chip->irq_ack(&desc->irq_data); +	chained_irq_enter(parent_chip, desc); +  	/* Read event register */  	val = readl(U300_PIN_REG(pinoffset, iev));  	/* Mask relevant bits */ @@ -577,8 +542,8 @@ static void u300_gpio_irq_handler(unsigned irq, struct irq_desc *desc)  		int irqoffset;  		for_each_set_bit(irqoffset, &val, U300_GPIO_PINS_PER_PORT) { -			int pin_irq = irq_find_mapping(port->domain, irqoffset);  			int offset = pinoffset + irqoffset; +			int pin_irq = irq_find_mapping(chip->irqdomain, offset);  			dev_dbg(gpio->dev, "GPIO IRQ %d on pin %d\n",  				pin_irq, offset); @@ -592,7 +557,7 @@ static void u300_gpio_irq_handler(unsigned irq, struct irq_desc *desc)  		}  	} -	desc->irq_data.chip->irq_unmask(&desc->irq_data); +	chained_irq_exit(parent_chip, desc);  }  static void __init u300_gpio_init_pin(struct u300_gpio *gpio, @@ -643,20 +608,6 @@ static void __init u300_gpio_init_coh901571(struct u300_gpio *gpio)  	}  } -static inline void u300_gpio_free_ports(struct u300_gpio *gpio) -{ -	struct u300_gpio_port *port; -	struct list_head *p, *n; - -	list_for_each_safe(p, n, &gpio->port_list) { -		port = list_entry(p, struct u300_gpio_port, node); -		list_del(&port->node); -		if (port->domain) -			irq_domain_remove(port->domain); -		kfree(port); -	} -} -  /*   * Here we map a GPIO in the local gpio_chip pin space to a pin in   * the local pinctrl pin space. The pin controller used is @@ -747,17 +698,28 @@ static int __init u300_gpio_probe(struct platform_device *pdev)  	       gpio->base + U300_GPIO_CR);  	u300_gpio_init_coh901571(gpio); +#ifdef CONFIG_OF_GPIO +	gpio->chip.of_node = pdev->dev.of_node; +#endif +	err = gpiochip_add(&gpio->chip); +	if (err) { +		dev_err(gpio->dev, "unable to add gpiochip: %d\n", err); +		goto err_no_chip; +	} + +	err = gpiochip_irqchip_add(&gpio->chip, +				   &u300_gpio_irqchip, +				   0, +				   handle_simple_irq, +				   IRQ_TYPE_EDGE_FALLING); +	if (err) { +		dev_err(gpio->dev, "no GPIO irqchip\n"); +		goto err_no_irqchip; +	} +  	/* Add each port with its IRQ separately */ -	INIT_LIST_HEAD(&gpio->port_list);  	for (portno = 0 ; portno < U300_GPIO_NUM_PORTS; portno++) { -		struct u300_gpio_port *port = -			kmalloc(sizeof(struct u300_gpio_port), GFP_KERNEL); - -		if (!port) { -			dev_err(gpio->dev, "out of memory\n"); -			err = -ENOMEM; -			goto err_no_port; -		} +		struct u300_gpio_port *port = &gpio->ports[portno];  		snprintf(port->name, 8, "gpio%d", portno);  		port->number = portno; @@ -765,50 +727,16 @@ static int __init u300_gpio_probe(struct platform_device *pdev)  		port->irq = platform_get_irq(pdev, portno); -		dev_dbg(gpio->dev, "register IRQ %d for port %s\n", port->irq, -			port->name); - -		port->domain = irq_domain_add_linear(pdev->dev.of_node, -						     U300_GPIO_PINS_PER_PORT, -						     &irq_domain_simple_ops, -						     port); -		if (!port->domain) { -			err = -ENOMEM; -			goto err_no_domain; -		} - -		irq_set_chained_handler(port->irq, u300_gpio_irq_handler); -		irq_set_handler_data(port->irq, port); - -		/* For each GPIO pin set the unique IRQ handler */ -		for (i = 0; i < U300_GPIO_PINS_PER_PORT; i++) { -			int irqno = irq_create_mapping(port->domain, i); - -			dev_dbg(gpio->dev, "GPIO%d on port %s gets IRQ %d\n", -				gpio->chip.base + (port->number << 3) + i, -				port->name, irqno); -			irq_set_chip_and_handler(irqno, &u300_gpio_irqchip, -						 handle_simple_irq); -			set_irq_flags(irqno, IRQF_VALID); -			irq_set_chip_data(irqno, port); -		} +		gpiochip_set_chained_irqchip(&gpio->chip, +					     &u300_gpio_irqchip, +					     port->irq, +					     u300_gpio_irq_handler);  		/* Turns off irq force (test register) for this port */  		writel(0x0, gpio->base + portno * gpio->stride + ifr); - -		list_add_tail(&port->node, &gpio->port_list);  	}  	dev_dbg(gpio->dev, "initialized %d GPIO ports\n", portno); -#ifdef CONFIG_OF_GPIO -	gpio->chip.of_node = pdev->dev.of_node; -#endif -	err = gpiochip_add(&gpio->chip); -	if (err) { -		dev_err(gpio->dev, "unable to add gpiochip: %d\n", err); -		goto err_no_chip; -	} -  	/*  	 * Add pinctrl pin ranges, the pin controller must be registered  	 * at this point @@ -827,12 +755,10 @@ static int __init u300_gpio_probe(struct platform_device *pdev)  	return 0;  err_no_range: +err_no_irqchip:  	if (gpiochip_remove(&gpio->chip))  		dev_err(&pdev->dev, "failed to remove gpio chip\n");  err_no_chip: -err_no_domain: -err_no_port: -	u300_gpio_free_ports(gpio);  	clk_disable_unprepare(gpio->clk);  	dev_err(&pdev->dev, "module ERROR:%d\n", err);  	return err; @@ -851,7 +777,6 @@ static int __exit u300_gpio_remove(struct platform_device *pdev)  		dev_err(gpio->dev, "unable to remove gpiochip: %d\n", err);  		return err;  	} -	u300_gpio_free_ports(gpio);  	clk_disable_unprepare(gpio->clk);  	return 0;  } diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c index 2689f8d01a1..9609c23834c 100644 --- a/drivers/pinctrl/pinctrl-exynos.c +++ b/drivers/pinctrl/pinctrl-exynos.c @@ -663,18 +663,18 @@ static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)  /* pin banks of s5pv210 pin-controller */  static struct samsung_pin_bank s5pv210_pin_bank[] = {  	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), -	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04), +	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(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, "gpf0", 0x24), +	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(8, 0x180, "gpf3", 0x30), +	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), @@ -718,6 +718,73 @@ struct samsung_pin_ctrl s5pv210_pin_ctrl[] = {  	},  }; +/* pin banks of exynos3250 pin-controller 0 */ +static struct samsung_pin_bank exynos3250_pin_banks0[] = { +	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 struct samsung_pin_bank exynos3250_pin_banks1[] = { +	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), +}; + +/* + * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes + * two gpio/pin-mux/pinconfig controllers. + */ +struct samsung_pin_ctrl exynos3250_pin_ctrl[] = { +	{ +		/* pin-controller instance 0 data */ +		.pin_banks	= exynos3250_pin_banks0, +		.nr_banks	= ARRAY_SIZE(exynos3250_pin_banks0), +		.geint_con	= EXYNOS_GPIO_ECON_OFFSET, +		.geint_mask	= EXYNOS_GPIO_EMASK_OFFSET, +		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET, +		.svc		= EXYNOS_SVC_OFFSET, +		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume, +		.label		= "exynos3250-gpio-ctrl0", +	}, { +		/* pin-controller instance 1 data */ +		.pin_banks	= exynos3250_pin_banks1, +		.nr_banks	= ARRAY_SIZE(exynos3250_pin_banks1), +		.geint_con	= EXYNOS_GPIO_ECON_OFFSET, +		.geint_mask	= EXYNOS_GPIO_EMASK_OFFSET, +		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET, +		.weint_con	= EXYNOS_WKUP_ECON_OFFSET, +		.weint_mask	= EXYNOS_WKUP_EMASK_OFFSET, +		.weint_pend	= EXYNOS_WKUP_EPEND_OFFSET, +		.svc		= EXYNOS_SVC_OFFSET, +		.eint_gpio_init = exynos_eint_gpio_init, +		.eint_wkup_init = exynos_eint_wkup_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume, +		.label		= "exynos3250-gpio-ctrl1", +	}, +}; +  /* pin banks of exynos4210 pin-controller 0 */  static struct samsung_pin_bank exynos4210_pin_banks0[] = {  	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), @@ -1042,6 +1109,88 @@ struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {  	},  }; +/* pin banks of exynos5260 pin-controller 0 */ +static struct samsung_pin_bank exynos5260_pin_banks0[] = { +	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 struct samsung_pin_bank exynos5260_pin_banks1[] = { +	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 struct samsung_pin_bank exynos5260_pin_banks2[] = { +	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. + */ +struct samsung_pin_ctrl exynos5260_pin_ctrl[] = { +	{ +		/* pin-controller instance 0 data */ +		.pin_banks	= exynos5260_pin_banks0, +		.nr_banks	= ARRAY_SIZE(exynos5260_pin_banks0), +		.geint_con	= EXYNOS_GPIO_ECON_OFFSET, +		.geint_mask	= EXYNOS_GPIO_EMASK_OFFSET, +		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET, +		.weint_con	= EXYNOS_WKUP_ECON_OFFSET, +		.weint_mask	= EXYNOS_WKUP_EMASK_OFFSET, +		.weint_pend	= EXYNOS_WKUP_EPEND_OFFSET, +		.svc		= EXYNOS_SVC_OFFSET, +		.eint_gpio_init = exynos_eint_gpio_init, +		.eint_wkup_init = exynos_eint_wkup_init, +		.label		= "exynos5260-gpio-ctrl0", +	}, { +		/* pin-controller instance 1 data */ +		.pin_banks	= exynos5260_pin_banks1, +		.nr_banks	= ARRAY_SIZE(exynos5260_pin_banks1), +		.geint_con	= EXYNOS_GPIO_ECON_OFFSET, +		.geint_mask	= EXYNOS_GPIO_EMASK_OFFSET, +		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET, +		.svc		= EXYNOS_SVC_OFFSET, +		.eint_gpio_init = exynos_eint_gpio_init, +		.label		= "exynos5260-gpio-ctrl1", +	}, { +		/* pin-controller instance 2 data */ +		.pin_banks	= exynos5260_pin_banks2, +		.nr_banks	= ARRAY_SIZE(exynos5260_pin_banks2), +		.geint_con	= EXYNOS_GPIO_ECON_OFFSET, +		.geint_mask	= EXYNOS_GPIO_EMASK_OFFSET, +		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET, +		.svc		= EXYNOS_SVC_OFFSET, +		.eint_gpio_init = exynos_eint_gpio_init, +		.label		= "exynos5260-gpio-ctrl2", +	}, +}; +  /* pin banks of exynos5420 pin-controller 0 */  static struct samsung_pin_bank exynos5420_pin_banks0[] = {  	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00), diff --git a/drivers/pinctrl/pinctrl-exynos5440.c b/drivers/pinctrl/pinctrl-exynos5440.c index 544d469c5a7..8fe2ab0a769 100644 --- a/drivers/pinctrl/pinctrl-exynos5440.c +++ b/drivers/pinctrl/pinctrl-exynos5440.c @@ -1048,7 +1048,7 @@ static struct platform_driver exynos5440_pinctrl_driver = {  	.driver = {  		.name	= "exynos5440-pinctrl",  		.owner	= THIS_MODULE, -		.of_match_table = of_match_ptr(exynos5440_pinctrl_dt_match), +		.of_match_table = exynos5440_pinctrl_dt_match,  	},  }; diff --git a/drivers/pinctrl/pinctrl-imx.c b/drivers/pinctrl/pinctrl-imx.c index d78dd813bff..a24448e5d39 100644 --- a/drivers/pinctrl/pinctrl-imx.c +++ b/drivers/pinctrl/pinctrl-imx.c @@ -245,11 +245,11 @@ static int imx_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,  			 * The input_reg[i] here is actually some IOMUXC general  			 * purpose register, not regular select input register.  			 */ -			val = readl(ipctl->base + pin->input_val); +			val = readl(ipctl->base + pin->input_reg);  			val &= ~mask;  			val |= select << shift; -			writel(val, ipctl->base + pin->input_val); -		} else if (pin->input_val) { +			writel(val, ipctl->base + pin->input_reg); +		} else if (pin->input_reg) {  			/*  			 * Regular select input register can never be at offset  			 * 0, and we only print register value for regular case. @@ -491,7 +491,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,  			pin->mux_mode |= IOMUXC_CONFIG_SION;  		pin->config = config & ~IMX_PAD_SION; -		dev_dbg(info->dev, "%s: %d 0x%08lx", info->pins[i].name, +		dev_dbg(info->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,  				pin->mux_mode, pin->config);  	} diff --git a/drivers/pinctrl/pinctrl-imx1-core.c b/drivers/pinctrl/pinctrl-imx1-core.c new file mode 100644 index 00000000000..815384b377b --- /dev/null +++ b/drivers/pinctrl/pinctrl-imx1-core.c @@ -0,0 +1,660 @@ +/* + * Core driver for the imx pin controller in imx1/21/27 + * + * Copyright (C) 2013 Pengutronix + * Author: Markus Pargmann <mpa@pengutronix.de> + * + * Based on pinctrl-imx.c: + *	Author: Dong Aisheng <dong.aisheng@linaro.org> + *	Copyright (C) 2012 Freescale Semiconductor, Inc. + *	Copyright (C) 2012 Linaro Ltd. + * + * 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/bitops.h> +#include <linux/err.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/machine.h> +#include <linux/pinctrl/pinconf.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/slab.h> + +#include "core.h" +#include "pinctrl-imx1.h" + +struct imx1_pinctrl { +	struct device *dev; +	struct pinctrl_dev *pctl; +	void __iomem *base; +	const struct imx1_pinctrl_soc_info *info; +}; + +/* + * MX1 register offsets + */ + +#define MX1_DDIR 0x00 +#define MX1_OCR 0x04 +#define MX1_ICONFA 0x0c +#define MX1_ICONFB 0x14 +#define MX1_GIUS 0x20 +#define MX1_GPR 0x38 +#define MX1_PUEN 0x40 + +#define MX1_PORT_STRIDE 0x100 + + +/* + * MUX_ID format defines + */ +#define MX1_MUX_FUNCTION(val) (BIT(0) & val) +#define MX1_MUX_GPIO(val) ((BIT(1) & val) >> 1) +#define MX1_MUX_DIR(val) ((BIT(2) & val) >> 2) +#define MX1_MUX_OCONF(val) (((BIT(4) | BIT(5)) & val) >> 4) +#define MX1_MUX_ICONFA(val) (((BIT(8) | BIT(9)) & val) >> 8) +#define MX1_MUX_ICONFB(val) (((BIT(10) | BIT(11)) & val) >> 10) + + +/* + * IMX1 IOMUXC manages the pins based on ports. Each port has 32 pins. IOMUX + * control register are seperated into function, output configuration, input + * configuration A, input configuration B, GPIO in use and data direction. + * + * Those controls that are represented by 1 bit have a direct mapping between + * bit position and pin id. If they are represented by 2 bit, the lower 16 pins + * are in the first register and the upper 16 pins in the second (next) + * register. pin_id is stored in bit (pin_id%16)*2 and the bit above. + */ + +/* + * Calculates the register offset from a pin_id + */ +static void __iomem *imx1_mem(struct imx1_pinctrl *ipctl, unsigned int pin_id) +{ +	unsigned int port = pin_id / 32; +	return ipctl->base + port * MX1_PORT_STRIDE; +} + +/* + * Write to a register with 2 bits per pin. The function will automatically + * use the next register if the pin is managed in the second register. + */ +static void imx1_write_2bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, +		u32 value, u32 reg_offset) +{ +	void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; +	int offset = (pin_id % 16) * 2; /* offset, regardless of register used */ +	int mask = ~(0x3 << offset); /* Mask for 2 bits at offset */ +	u32 old_val; +	u32 new_val; + +	/* Use the next register if the pin's port pin number is >=16 */ +	if (pin_id % 32 >= 16) +		reg += 0x04; + +	dev_dbg(ipctl->dev, "write: register 0x%p offset %d value 0x%x\n", +			reg, offset, value); + +	/* Get current state of pins */ +	old_val = readl(reg); +	old_val &= mask; + +	new_val = value & 0x3; /* Make sure value is really 2 bit */ +	new_val <<= offset; +	new_val |= old_val;/* Set new state for pin_id */ + +	writel(new_val, reg); +} + +static void imx1_write_bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, +		u32 value, u32 reg_offset) +{ +	void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; +	int offset = pin_id % 32; +	int mask = ~BIT_MASK(offset); +	u32 old_val; +	u32 new_val; + +	/* Get current state of pins */ +	old_val = readl(reg); +	old_val &= mask; + +	new_val = value & 0x1; /* Make sure value is really 1 bit */ +	new_val <<= offset; +	new_val |= old_val;/* Set new state for pin_id */ + +	writel(new_val, reg); +} + +static int imx1_read_2bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, +		u32 reg_offset) +{ +	void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; +	int offset = (pin_id % 16) * 2; + +	/* Use the next register if the pin's port pin number is >=16 */ +	if (pin_id % 32 >= 16) +		reg += 0x04; + +	return (readl(reg) & (BIT(offset) | BIT(offset+1))) >> offset; +} + +static int imx1_read_bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, +		u32 reg_offset) +{ +	void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; +	int offset = pin_id % 32; + +	return !!(readl(reg) & BIT(offset)); +} + +static const inline struct imx1_pin_group *imx1_pinctrl_find_group_by_name( +				const struct imx1_pinctrl_soc_info *info, +				const char *name) +{ +	const struct imx1_pin_group *grp = NULL; +	int i; + +	for (i = 0; i < info->ngroups; i++) { +		if (!strcmp(info->groups[i].name, name)) { +			grp = &info->groups[i]; +			break; +		} +	} + +	return grp; +} + +static int imx1_get_groups_count(struct pinctrl_dev *pctldev) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; + +	return info->ngroups; +} + +static const char *imx1_get_group_name(struct pinctrl_dev *pctldev, +				       unsigned selector) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; + +	return info->groups[selector].name; +} + +static int imx1_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, +			       const unsigned int **pins, +			       unsigned *npins) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; + +	if (selector >= info->ngroups) +		return -EINVAL; + +	*pins = info->groups[selector].pin_ids; +	*npins = info->groups[selector].npins; + +	return 0; +} + +static void imx1_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, +		   unsigned offset) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + +	seq_printf(s, "GPIO %d, function %d, direction %d, oconf %d, iconfa %d, iconfb %d", +			imx1_read_bit(ipctl, offset, MX1_GIUS), +			imx1_read_bit(ipctl, offset, MX1_GPR), +			imx1_read_bit(ipctl, offset, MX1_DDIR), +			imx1_read_2bit(ipctl, offset, MX1_OCR), +			imx1_read_2bit(ipctl, offset, MX1_ICONFA), +			imx1_read_2bit(ipctl, offset, MX1_ICONFB)); +} + +static int imx1_dt_node_to_map(struct pinctrl_dev *pctldev, +			struct device_node *np, +			struct pinctrl_map **map, unsigned *num_maps) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; +	const struct imx1_pin_group *grp; +	struct pinctrl_map *new_map; +	struct device_node *parent; +	int map_num = 1; +	int i, j; + +	/* +	 * first find the group of this node and check if we need create +	 * config maps for pins +	 */ +	grp = imx1_pinctrl_find_group_by_name(info, np->name); +	if (!grp) { +		dev_err(info->dev, "unable to find group for node %s\n", +			np->name); +		return -EINVAL; +	} + +	for (i = 0; i < grp->npins; i++) +		map_num++; + +	new_map = kmalloc(sizeof(struct pinctrl_map) * map_num, GFP_KERNEL); +	if (!new_map) +		return -ENOMEM; + +	*map = new_map; +	*num_maps = map_num; + +	/* create mux map */ +	parent = of_get_parent(np); +	if (!parent) { +		kfree(new_map); +		return -EINVAL; +	} +	new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; +	new_map[0].data.mux.function = parent->name; +	new_map[0].data.mux.group = np->name; +	of_node_put(parent); + +	/* create config map */ +	new_map++; +	for (i = j = 0; i < grp->npins; i++) { +		new_map[j].type = PIN_MAP_TYPE_CONFIGS_PIN; +		new_map[j].data.configs.group_or_pin = +				pin_get_name(pctldev, grp->pins[i].pin_id); +		new_map[j].data.configs.configs = &grp->pins[i].config; +		new_map[j].data.configs.num_configs = 1; +		j++; +	} + +	dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n", +		(*map)->data.mux.function, (*map)->data.mux.group, map_num); + +	return 0; +} + +static void imx1_dt_free_map(struct pinctrl_dev *pctldev, +				struct pinctrl_map *map, unsigned num_maps) +{ +	kfree(map); +} + +static const struct pinctrl_ops imx1_pctrl_ops = { +	.get_groups_count = imx1_get_groups_count, +	.get_group_name = imx1_get_group_name, +	.get_group_pins = imx1_get_group_pins, +	.pin_dbg_show = imx1_pin_dbg_show, +	.dt_node_to_map = imx1_dt_node_to_map, +	.dt_free_map = imx1_dt_free_map, + +}; + +static int imx1_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector, +			   unsigned group) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; +	const struct imx1_pin *pins; +	unsigned int npins; +	int i; + +	/* +	 * Configure the mux mode for each pin in the group for a specific +	 * function. +	 */ +	pins = info->groups[group].pins; +	npins = info->groups[group].npins; + +	WARN_ON(!pins || !npins); + +	dev_dbg(ipctl->dev, "enable function %s group %s\n", +		info->functions[selector].name, info->groups[group].name); + +	for (i = 0; i < npins; i++) { +		unsigned int mux = pins[i].mux_id; +		unsigned int pin_id = pins[i].pin_id; +		unsigned int afunction = MX1_MUX_FUNCTION(mux); +		unsigned int gpio_in_use = MX1_MUX_GPIO(mux); +		unsigned int direction = MX1_MUX_DIR(mux); +		unsigned int gpio_oconf = MX1_MUX_OCONF(mux); +		unsigned int gpio_iconfa = MX1_MUX_ICONFA(mux); +		unsigned int gpio_iconfb = MX1_MUX_ICONFB(mux); + +		dev_dbg(pctldev->dev, "%s, pin 0x%x, function %d, gpio %d, direction %d, oconf %d, iconfa %d, iconfb %d\n", +				__func__, pin_id, afunction, gpio_in_use, +				direction, gpio_oconf, gpio_iconfa, +				gpio_iconfb); + +		imx1_write_bit(ipctl, pin_id, gpio_in_use, MX1_GIUS); +		imx1_write_bit(ipctl, pin_id, direction, MX1_DDIR); + +		if (gpio_in_use) { +			imx1_write_2bit(ipctl, pin_id, gpio_oconf, MX1_OCR); +			imx1_write_2bit(ipctl, pin_id, gpio_iconfa, +					MX1_ICONFA); +			imx1_write_2bit(ipctl, pin_id, gpio_iconfb, +					MX1_ICONFB); +		} else { +			imx1_write_bit(ipctl, pin_id, afunction, MX1_GPR); +		} +	} + +	return 0; +} + +static int imx1_pmx_get_funcs_count(struct pinctrl_dev *pctldev) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; + +	return info->nfunctions; +} + +static const char *imx1_pmx_get_func_name(struct pinctrl_dev *pctldev, +					  unsigned selector) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; + +	return info->functions[selector].name; +} + +static int imx1_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector, +			       const char * const **groups, +			       unsigned * const num_groups) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; + +	*groups = info->functions[selector].groups; +	*num_groups = info->functions[selector].num_groups; + +	return 0; +} + +static const struct pinmux_ops imx1_pmx_ops = { +	.get_functions_count = imx1_pmx_get_funcs_count, +	.get_function_name = imx1_pmx_get_func_name, +	.get_function_groups = imx1_pmx_get_groups, +	.enable = imx1_pmx_enable, +}; + +static int imx1_pinconf_get(struct pinctrl_dev *pctldev, +			     unsigned pin_id, unsigned long *config) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + +	*config = imx1_read_bit(ipctl, pin_id, MX1_PUEN); + +	return 0; +} + +static int imx1_pinconf_set(struct pinctrl_dev *pctldev, +			     unsigned pin_id, unsigned long *configs, +			     unsigned num_configs) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; +	int i; + +	for (i = 0; i != num_configs; ++i) { +		imx1_write_bit(ipctl, pin_id, configs[i] & 0x01, MX1_PUEN); + +		dev_dbg(ipctl->dev, "pinconf set pullup pin %s\n", +			info->pins[pin_id].name); +	} + +	return 0; +} + +static void imx1_pinconf_dbg_show(struct pinctrl_dev *pctldev, +				   struct seq_file *s, unsigned pin_id) +{ +	unsigned long config; + +	imx1_pinconf_get(pctldev, pin_id, &config); +	seq_printf(s, "0x%lx", config); +} + +static void imx1_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, +					 struct seq_file *s, unsigned group) +{ +	struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); +	const struct imx1_pinctrl_soc_info *info = ipctl->info; +	struct imx1_pin_group *grp; +	unsigned long config; +	const char *name; +	int i, ret; + +	if (group > info->ngroups) +		return; + +	seq_puts(s, "\n"); +	grp = &info->groups[group]; +	for (i = 0; i < grp->npins; i++) { +		name = pin_get_name(pctldev, grp->pins[i].pin_id); +		ret = imx1_pinconf_get(pctldev, grp->pins[i].pin_id, &config); +		if (ret) +			return; +		seq_printf(s, "%s: 0x%lx", name, config); +	} +} + +static const struct pinconf_ops imx1_pinconf_ops = { +	.pin_config_get = imx1_pinconf_get, +	.pin_config_set = imx1_pinconf_set, +	.pin_config_dbg_show = imx1_pinconf_dbg_show, +	.pin_config_group_dbg_show = imx1_pinconf_group_dbg_show, +}; + +static struct pinctrl_desc imx1_pinctrl_desc = { +	.pctlops = &imx1_pctrl_ops, +	.pmxops = &imx1_pmx_ops, +	.confops = &imx1_pinconf_ops, +	.owner = THIS_MODULE, +}; + +static int imx1_pinctrl_parse_groups(struct device_node *np, +				    struct imx1_pin_group *grp, +				    struct imx1_pinctrl_soc_info *info, +				    u32 index) +{ +	int size; +	const __be32 *list; +	int i; + +	dev_dbg(info->dev, "group(%d): %s\n", index, np->name); + +	/* Initialise group */ +	grp->name = np->name; + +	/* +	 * the binding format is fsl,pins = <PIN MUX_ID CONFIG> +	 */ +	list = of_get_property(np, "fsl,pins", &size); +	/* we do not check return since it's safe node passed down */ +	if (!size || size % 12) { +		dev_notice(info->dev, "Not a valid fsl,pins property (%s)\n", +				np->name); +		return -EINVAL; +	} + +	grp->npins = size / 12; +	grp->pins = devm_kzalloc(info->dev, +			grp->npins * sizeof(struct imx1_pin), GFP_KERNEL); +	grp->pin_ids = devm_kzalloc(info->dev, +			grp->npins * sizeof(unsigned int), GFP_KERNEL); + +	if (!grp->pins || !grp->pin_ids) +		return -ENOMEM; + +	for (i = 0; i < grp->npins; i++) { +		grp->pins[i].pin_id = be32_to_cpu(*list++); +		grp->pins[i].mux_id = be32_to_cpu(*list++); +		grp->pins[i].config = be32_to_cpu(*list++); + +		grp->pin_ids[i] = grp->pins[i].pin_id; +	} + +	return 0; +} + +static int imx1_pinctrl_parse_functions(struct device_node *np, +				       struct imx1_pinctrl_soc_info *info, +				       u32 index) +{ +	struct device_node *child; +	struct imx1_pmx_func *func; +	struct imx1_pin_group *grp; +	int ret; +	static u32 grp_index; +	u32 i = 0; + +	dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name); + +	func = &info->functions[index]; + +	/* Initialise function */ +	func->name = np->name; +	func->num_groups = of_get_child_count(np); +	if (func->num_groups <= 0) +		return -EINVAL; + +	func->groups = devm_kzalloc(info->dev, +			func->num_groups * sizeof(char *), GFP_KERNEL); + +	if (!func->groups) +		return -ENOMEM; + +	for_each_child_of_node(np, child) { +		func->groups[i] = child->name; +		grp = &info->groups[grp_index++]; +		ret = imx1_pinctrl_parse_groups(child, grp, info, i++); +		if (ret == -ENOMEM) +			return ret; +	} + +	return 0; +} + +static int imx1_pinctrl_parse_dt(struct platform_device *pdev, +		struct imx1_pinctrl *pctl, struct imx1_pinctrl_soc_info *info) +{ +	struct device_node *np = pdev->dev.of_node; +	struct device_node *child; +	int ret; +	u32 nfuncs = 0; +	u32 ngroups = 0; +	u32 ifunc = 0; + +	if (!np) +		return -ENODEV; + +	for_each_child_of_node(np, child) { +		++nfuncs; +		ngroups += of_get_child_count(child); +	} + +	if (!nfuncs) { +		dev_err(&pdev->dev, "No pin functions defined\n"); +		return -EINVAL; +	} + +	info->nfunctions = nfuncs; +	info->functions = devm_kzalloc(&pdev->dev, +			nfuncs * sizeof(struct imx1_pmx_func), GFP_KERNEL); + +	info->ngroups = ngroups; +	info->groups = devm_kzalloc(&pdev->dev, +			ngroups * sizeof(struct imx1_pin_group), GFP_KERNEL); + + +	if (!info->functions || !info->groups) +		return -ENOMEM; + +	for_each_child_of_node(np, child) { +		ret = imx1_pinctrl_parse_functions(child, info, ifunc++); +		if (ret == -ENOMEM) +			return -ENOMEM; +	} + +	return 0; +} + +int imx1_pinctrl_core_probe(struct platform_device *pdev, +		      struct imx1_pinctrl_soc_info *info) +{ +	struct imx1_pinctrl *ipctl; +	struct resource *res; +	struct pinctrl_desc *pctl_desc; +	int ret; + +	if (!info || !info->pins || !info->npins) { +		dev_err(&pdev->dev, "wrong pinctrl info\n"); +		return -EINVAL; +	} +	info->dev = &pdev->dev; + +	/* Create state holders etc for this driver */ +	ipctl = devm_kzalloc(&pdev->dev, sizeof(*ipctl), GFP_KERNEL); +	if (!ipctl) +		return -ENOMEM; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!res) +		return -ENOENT; + +	ipctl->base = devm_ioremap_nocache(&pdev->dev, res->start, +			resource_size(res)); +	if (!ipctl->base) +		return -ENOMEM; + +	pctl_desc = &imx1_pinctrl_desc; +	pctl_desc->name = dev_name(&pdev->dev); +	pctl_desc->pins = info->pins; +	pctl_desc->npins = info->npins; + +	ret = imx1_pinctrl_parse_dt(pdev, ipctl, info); +	if (ret) { +		dev_err(&pdev->dev, "fail to probe dt properties\n"); +		return ret; +	} + +	ipctl->info = info; +	ipctl->dev = info->dev; +	platform_set_drvdata(pdev, ipctl); +	ipctl->pctl = pinctrl_register(pctl_desc, &pdev->dev, ipctl); +	if (!ipctl->pctl) { +		dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); +		return -EINVAL; +	} + +	ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); +	if (ret) { +		pinctrl_unregister(ipctl->pctl); +		dev_err(&pdev->dev, "Failed to populate subdevices\n"); +		return ret; +	} + +	dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); + +	return 0; +} + +int imx1_pinctrl_core_remove(struct platform_device *pdev) +{ +	struct imx1_pinctrl *ipctl = platform_get_drvdata(pdev); + +	pinctrl_unregister(ipctl->pctl); + +	return 0; +} diff --git a/drivers/pinctrl/pinctrl-imx1.h b/drivers/pinctrl/pinctrl-imx1.h new file mode 100644 index 00000000000..692a54c15cd --- /dev/null +++ b/drivers/pinctrl/pinctrl-imx1.h @@ -0,0 +1,73 @@ +/* + * IMX pinmux core definitions + * + * Copyright (C) 2012 Freescale Semiconductor, Inc. + * Copyright (C) 2012 Linaro Ltd. + * + * Author: Dong Aisheng <dong.aisheng@linaro.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. + */ + +#ifndef __DRIVERS_PINCTRL_IMX1_H +#define __DRIVERS_PINCTRL_IMX1_H + +struct platform_device; + +/** + * struct imx1_pin - describes an IMX1/21/27 pin. + * @pin_id: ID of the described pin. + * @mux_id: ID of the mux setup. + * @config: Configuration of the pin (currently only pullup-enable). + */ +struct imx1_pin { +	unsigned int pin_id; +	unsigned int mux_id; +	unsigned long config; +}; + +/** + * struct imx1_pin_group - describes an IMX pin group + * @name: the name of this specific pin group + * @pins: an array of imx1_pin structs used in this group + * @npins: the number of pins in this group array, i.e. the number of + *	elements in .pins so we can iterate over that array + */ +struct imx1_pin_group { +	const char *name; +	unsigned int *pin_ids; +	struct imx1_pin *pins; +	unsigned npins; +}; + +/** + * struct imx1_pmx_func - describes IMX pinmux functions + * @name: the name of this specific function + * @groups: corresponding pin groups + * @num_groups: the number of groups + */ +struct imx1_pmx_func { +	const char *name; +	const char **groups; +	unsigned num_groups; +}; + +struct imx1_pinctrl_soc_info { +	struct device *dev; +	const struct pinctrl_pin_desc *pins; +	unsigned int npins; +	struct imx1_pin_group *groups; +	unsigned int ngroups; +	struct imx1_pmx_func *functions; +	unsigned int nfunctions; +}; + +#define IMX_PINCTRL_PIN(pin) PINCTRL_PIN(pin, #pin) + +int imx1_pinctrl_core_probe(struct platform_device *pdev, +			struct imx1_pinctrl_soc_info *info); +int imx1_pinctrl_core_remove(struct platform_device *pdev); +#endif /* __DRIVERS_PINCTRL_IMX1_H */ diff --git a/drivers/pinctrl/pinctrl-imx25.c b/drivers/pinctrl/pinctrl-imx25.c new file mode 100644 index 00000000000..1aae1b61c4d --- /dev/null +++ b/drivers/pinctrl/pinctrl-imx25.c @@ -0,0 +1,351 @@ +/* + * imx25 pinctrl driver. + * + * Copyright 2013 Eukréa Electromatique <denis@eukrea.com> + * + * This driver was mostly copied from the imx51 pinctrl driver which has: + * + * Copyright (C) 2012 Freescale Semiconductor, Inc. + * Copyright (C) 2012 Linaro, Inc. + * + * Author: Denis Carikli <denis@eukrea.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/err.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-imx.h" + +enum imx25_pads { +	MX25_PAD_RESERVE0 = 1, +	MX25_PAD_RESERVE1 = 2, +	MX25_PAD_A10 = 3, +	MX25_PAD_A13 = 4, +	MX25_PAD_A14 = 5, +	MX25_PAD_A15 = 6, +	MX25_PAD_A16 = 7, +	MX25_PAD_A17 = 8, +	MX25_PAD_A18 = 9, +	MX25_PAD_A19 = 10, +	MX25_PAD_A20 = 11, +	MX25_PAD_A21 = 12, +	MX25_PAD_A22 = 13, +	MX25_PAD_A23 = 14, +	MX25_PAD_A24 = 15, +	MX25_PAD_A25 = 16, +	MX25_PAD_EB0 = 17, +	MX25_PAD_EB1 = 18, +	MX25_PAD_OE = 19, +	MX25_PAD_CS0 = 20, +	MX25_PAD_CS1 = 21, +	MX25_PAD_CS4 = 22, +	MX25_PAD_CS5 = 23, +	MX25_PAD_NF_CE0 = 24, +	MX25_PAD_ECB = 25, +	MX25_PAD_LBA = 26, +	MX25_PAD_BCLK = 27, +	MX25_PAD_RW = 28, +	MX25_PAD_NFWE_B = 29, +	MX25_PAD_NFRE_B = 30, +	MX25_PAD_NFALE = 31, +	MX25_PAD_NFCLE = 32, +	MX25_PAD_NFWP_B = 33, +	MX25_PAD_NFRB = 34, +	MX25_PAD_D15 = 35, +	MX25_PAD_D14 = 36, +	MX25_PAD_D13 = 37, +	MX25_PAD_D12 = 38, +	MX25_PAD_D11 = 39, +	MX25_PAD_D10 = 40, +	MX25_PAD_D9 = 41, +	MX25_PAD_D8 = 42, +	MX25_PAD_D7 = 43, +	MX25_PAD_D6 = 44, +	MX25_PAD_D5 = 45, +	MX25_PAD_D4 = 46, +	MX25_PAD_D3 = 47, +	MX25_PAD_D2 = 48, +	MX25_PAD_D1 = 49, +	MX25_PAD_D0 = 50, +	MX25_PAD_LD0 = 51, +	MX25_PAD_LD1 = 52, +	MX25_PAD_LD2 = 53, +	MX25_PAD_LD3 = 54, +	MX25_PAD_LD4 = 55, +	MX25_PAD_LD5 = 56, +	MX25_PAD_LD6 = 57, +	MX25_PAD_LD7 = 58, +	MX25_PAD_LD8 = 59, +	MX25_PAD_LD9 = 60, +	MX25_PAD_LD10 = 61, +	MX25_PAD_LD11 = 62, +	MX25_PAD_LD12 = 63, +	MX25_PAD_LD13 = 64, +	MX25_PAD_LD14 = 65, +	MX25_PAD_LD15 = 66, +	MX25_PAD_HSYNC = 67, +	MX25_PAD_VSYNC = 68, +	MX25_PAD_LSCLK = 69, +	MX25_PAD_OE_ACD = 70, +	MX25_PAD_CONTRAST = 71, +	MX25_PAD_PWM = 72, +	MX25_PAD_CSI_D2 = 73, +	MX25_PAD_CSI_D3 = 74, +	MX25_PAD_CSI_D4 = 75, +	MX25_PAD_CSI_D5 = 76, +	MX25_PAD_CSI_D6 = 77, +	MX25_PAD_CSI_D7 = 78, +	MX25_PAD_CSI_D8 = 79, +	MX25_PAD_CSI_D9 = 80, +	MX25_PAD_CSI_MCLK = 81, +	MX25_PAD_CSI_VSYNC = 82, +	MX25_PAD_CSI_HSYNC = 83, +	MX25_PAD_CSI_PIXCLK = 84, +	MX25_PAD_I2C1_CLK = 85, +	MX25_PAD_I2C1_DAT = 86, +	MX25_PAD_CSPI1_MOSI = 87, +	MX25_PAD_CSPI1_MISO = 88, +	MX25_PAD_CSPI1_SS0 = 89, +	MX25_PAD_CSPI1_SS1 = 90, +	MX25_PAD_CSPI1_SCLK = 91, +	MX25_PAD_CSPI1_RDY = 92, +	MX25_PAD_UART1_RXD = 93, +	MX25_PAD_UART1_TXD = 94, +	MX25_PAD_UART1_RTS = 95, +	MX25_PAD_UART1_CTS = 96, +	MX25_PAD_UART2_RXD = 97, +	MX25_PAD_UART2_TXD = 98, +	MX25_PAD_UART2_RTS = 99, +	MX25_PAD_UART2_CTS = 100, +	MX25_PAD_SD1_CMD = 101, +	MX25_PAD_SD1_CLK = 102, +	MX25_PAD_SD1_DATA0 = 103, +	MX25_PAD_SD1_DATA1 = 104, +	MX25_PAD_SD1_DATA2 = 105, +	MX25_PAD_SD1_DATA3 = 106, +	MX25_PAD_KPP_ROW0 = 107, +	MX25_PAD_KPP_ROW1 = 108, +	MX25_PAD_KPP_ROW2 = 109, +	MX25_PAD_KPP_ROW3 = 110, +	MX25_PAD_KPP_COL0 = 111, +	MX25_PAD_KPP_COL1 = 112, +	MX25_PAD_KPP_COL2 = 113, +	MX25_PAD_KPP_COL3 = 114, +	MX25_PAD_FEC_MDC = 115, +	MX25_PAD_FEC_MDIO = 116, +	MX25_PAD_FEC_TDATA0 = 117, +	MX25_PAD_FEC_TDATA1 = 118, +	MX25_PAD_FEC_TX_EN = 119, +	MX25_PAD_FEC_RDATA0 = 120, +	MX25_PAD_FEC_RDATA1 = 121, +	MX25_PAD_FEC_RX_DV = 122, +	MX25_PAD_FEC_TX_CLK = 123, +	MX25_PAD_RTCK = 124, +	MX25_PAD_DE_B = 125, +	MX25_PAD_GPIO_A = 126, +	MX25_PAD_GPIO_B = 127, +	MX25_PAD_GPIO_C = 128, +	MX25_PAD_GPIO_D = 129, +	MX25_PAD_GPIO_E = 130, +	MX25_PAD_GPIO_F = 131, +	MX25_PAD_EXT_ARMCLK = 132, +	MX25_PAD_UPLL_BYPCLK = 133, +	MX25_PAD_VSTBY_REQ = 134, +	MX25_PAD_VSTBY_ACK = 135, +	MX25_PAD_POWER_FAIL  = 136, +	MX25_PAD_CLKO = 137, +	MX25_PAD_BOOT_MODE0 = 138, +	MX25_PAD_BOOT_MODE1 = 139, +}; + +/* Pad names for the pinmux subsystem */ +static const struct pinctrl_pin_desc imx25_pinctrl_pads[] = { +	IMX_PINCTRL_PIN(MX25_PAD_RESERVE0), +	IMX_PINCTRL_PIN(MX25_PAD_RESERVE1), +	IMX_PINCTRL_PIN(MX25_PAD_A10), +	IMX_PINCTRL_PIN(MX25_PAD_A13), +	IMX_PINCTRL_PIN(MX25_PAD_A14), +	IMX_PINCTRL_PIN(MX25_PAD_A15), +	IMX_PINCTRL_PIN(MX25_PAD_A16), +	IMX_PINCTRL_PIN(MX25_PAD_A17), +	IMX_PINCTRL_PIN(MX25_PAD_A18), +	IMX_PINCTRL_PIN(MX25_PAD_A19), +	IMX_PINCTRL_PIN(MX25_PAD_A20), +	IMX_PINCTRL_PIN(MX25_PAD_A21), +	IMX_PINCTRL_PIN(MX25_PAD_A22), +	IMX_PINCTRL_PIN(MX25_PAD_A23), +	IMX_PINCTRL_PIN(MX25_PAD_A24), +	IMX_PINCTRL_PIN(MX25_PAD_A25), +	IMX_PINCTRL_PIN(MX25_PAD_EB0), +	IMX_PINCTRL_PIN(MX25_PAD_EB1), +	IMX_PINCTRL_PIN(MX25_PAD_OE), +	IMX_PINCTRL_PIN(MX25_PAD_CS0), +	IMX_PINCTRL_PIN(MX25_PAD_CS1), +	IMX_PINCTRL_PIN(MX25_PAD_CS4), +	IMX_PINCTRL_PIN(MX25_PAD_CS5), +	IMX_PINCTRL_PIN(MX25_PAD_NF_CE0), +	IMX_PINCTRL_PIN(MX25_PAD_ECB), +	IMX_PINCTRL_PIN(MX25_PAD_LBA), +	IMX_PINCTRL_PIN(MX25_PAD_BCLK), +	IMX_PINCTRL_PIN(MX25_PAD_RW), +	IMX_PINCTRL_PIN(MX25_PAD_NFWE_B), +	IMX_PINCTRL_PIN(MX25_PAD_NFRE_B), +	IMX_PINCTRL_PIN(MX25_PAD_NFALE), +	IMX_PINCTRL_PIN(MX25_PAD_NFCLE), +	IMX_PINCTRL_PIN(MX25_PAD_NFWP_B), +	IMX_PINCTRL_PIN(MX25_PAD_NFRB), +	IMX_PINCTRL_PIN(MX25_PAD_D15), +	IMX_PINCTRL_PIN(MX25_PAD_D14), +	IMX_PINCTRL_PIN(MX25_PAD_D13), +	IMX_PINCTRL_PIN(MX25_PAD_D12), +	IMX_PINCTRL_PIN(MX25_PAD_D11), +	IMX_PINCTRL_PIN(MX25_PAD_D10), +	IMX_PINCTRL_PIN(MX25_PAD_D9), +	IMX_PINCTRL_PIN(MX25_PAD_D8), +	IMX_PINCTRL_PIN(MX25_PAD_D7), +	IMX_PINCTRL_PIN(MX25_PAD_D6), +	IMX_PINCTRL_PIN(MX25_PAD_D5), +	IMX_PINCTRL_PIN(MX25_PAD_D4), +	IMX_PINCTRL_PIN(MX25_PAD_D3), +	IMX_PINCTRL_PIN(MX25_PAD_D2), +	IMX_PINCTRL_PIN(MX25_PAD_D1), +	IMX_PINCTRL_PIN(MX25_PAD_D0), +	IMX_PINCTRL_PIN(MX25_PAD_LD0), +	IMX_PINCTRL_PIN(MX25_PAD_LD1), +	IMX_PINCTRL_PIN(MX25_PAD_LD2), +	IMX_PINCTRL_PIN(MX25_PAD_LD3), +	IMX_PINCTRL_PIN(MX25_PAD_LD4), +	IMX_PINCTRL_PIN(MX25_PAD_LD5), +	IMX_PINCTRL_PIN(MX25_PAD_LD6), +	IMX_PINCTRL_PIN(MX25_PAD_LD7), +	IMX_PINCTRL_PIN(MX25_PAD_LD8), +	IMX_PINCTRL_PIN(MX25_PAD_LD9), +	IMX_PINCTRL_PIN(MX25_PAD_LD10), +	IMX_PINCTRL_PIN(MX25_PAD_LD11), +	IMX_PINCTRL_PIN(MX25_PAD_LD12), +	IMX_PINCTRL_PIN(MX25_PAD_LD13), +	IMX_PINCTRL_PIN(MX25_PAD_LD14), +	IMX_PINCTRL_PIN(MX25_PAD_LD15), +	IMX_PINCTRL_PIN(MX25_PAD_HSYNC), +	IMX_PINCTRL_PIN(MX25_PAD_VSYNC), +	IMX_PINCTRL_PIN(MX25_PAD_LSCLK), +	IMX_PINCTRL_PIN(MX25_PAD_OE_ACD), +	IMX_PINCTRL_PIN(MX25_PAD_CONTRAST), +	IMX_PINCTRL_PIN(MX25_PAD_PWM), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D2), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D3), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D4), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D5), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D6), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D7), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D8), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_D9), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_MCLK), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_VSYNC), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_HSYNC), +	IMX_PINCTRL_PIN(MX25_PAD_CSI_PIXCLK), +	IMX_PINCTRL_PIN(MX25_PAD_I2C1_CLK), +	IMX_PINCTRL_PIN(MX25_PAD_I2C1_DAT), +	IMX_PINCTRL_PIN(MX25_PAD_CSPI1_MOSI), +	IMX_PINCTRL_PIN(MX25_PAD_CSPI1_MISO), +	IMX_PINCTRL_PIN(MX25_PAD_CSPI1_SS0), +	IMX_PINCTRL_PIN(MX25_PAD_CSPI1_SS1), +	IMX_PINCTRL_PIN(MX25_PAD_CSPI1_SCLK), +	IMX_PINCTRL_PIN(MX25_PAD_CSPI1_RDY), +	IMX_PINCTRL_PIN(MX25_PAD_UART1_RXD), +	IMX_PINCTRL_PIN(MX25_PAD_UART1_TXD), +	IMX_PINCTRL_PIN(MX25_PAD_UART1_RTS), +	IMX_PINCTRL_PIN(MX25_PAD_UART1_CTS), +	IMX_PINCTRL_PIN(MX25_PAD_UART2_RXD), +	IMX_PINCTRL_PIN(MX25_PAD_UART2_TXD), +	IMX_PINCTRL_PIN(MX25_PAD_UART2_RTS), +	IMX_PINCTRL_PIN(MX25_PAD_UART2_CTS), +	IMX_PINCTRL_PIN(MX25_PAD_SD1_CMD), +	IMX_PINCTRL_PIN(MX25_PAD_SD1_CLK), +	IMX_PINCTRL_PIN(MX25_PAD_SD1_DATA0), +	IMX_PINCTRL_PIN(MX25_PAD_SD1_DATA1), +	IMX_PINCTRL_PIN(MX25_PAD_SD1_DATA2), +	IMX_PINCTRL_PIN(MX25_PAD_SD1_DATA3), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_ROW0), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_ROW1), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_ROW2), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_ROW3), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_COL0), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_COL1), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_COL2), +	IMX_PINCTRL_PIN(MX25_PAD_KPP_COL3), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_MDC), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_MDIO), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_TDATA0), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_TDATA1), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_TX_EN), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_RDATA0), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_RDATA1), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_RX_DV), +	IMX_PINCTRL_PIN(MX25_PAD_FEC_TX_CLK), +	IMX_PINCTRL_PIN(MX25_PAD_RTCK), +	IMX_PINCTRL_PIN(MX25_PAD_DE_B), +	IMX_PINCTRL_PIN(MX25_PAD_GPIO_A), +	IMX_PINCTRL_PIN(MX25_PAD_GPIO_B), +	IMX_PINCTRL_PIN(MX25_PAD_GPIO_C), +	IMX_PINCTRL_PIN(MX25_PAD_GPIO_D), +	IMX_PINCTRL_PIN(MX25_PAD_GPIO_E), +	IMX_PINCTRL_PIN(MX25_PAD_GPIO_F), +	IMX_PINCTRL_PIN(MX25_PAD_EXT_ARMCLK), +	IMX_PINCTRL_PIN(MX25_PAD_UPLL_BYPCLK), +	IMX_PINCTRL_PIN(MX25_PAD_VSTBY_REQ), +	IMX_PINCTRL_PIN(MX25_PAD_VSTBY_ACK), +	IMX_PINCTRL_PIN(MX25_PAD_POWER_FAIL), +	IMX_PINCTRL_PIN(MX25_PAD_CLKO), +	IMX_PINCTRL_PIN(MX25_PAD_BOOT_MODE0), +	IMX_PINCTRL_PIN(MX25_PAD_BOOT_MODE1), +}; + +static struct imx_pinctrl_soc_info imx25_pinctrl_info = { +	.pins = imx25_pinctrl_pads, +	.npins = ARRAY_SIZE(imx25_pinctrl_pads), +}; + +static struct of_device_id imx25_pinctrl_of_match[] = { +	{ .compatible = "fsl,imx25-iomuxc", }, +	{ /* sentinel */ } +}; + +static int imx25_pinctrl_probe(struct platform_device *pdev) +{ +	return imx_pinctrl_probe(pdev, &imx25_pinctrl_info); +} + +static struct platform_driver imx25_pinctrl_driver = { +	.driver = { +		.name = "imx25-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(imx25_pinctrl_of_match), +	}, +	.probe = imx25_pinctrl_probe, +	.remove = imx_pinctrl_remove, +}; + +static int __init imx25_pinctrl_init(void) +{ +	return platform_driver_register(&imx25_pinctrl_driver); +} +arch_initcall(imx25_pinctrl_init); + +static void __exit imx25_pinctrl_exit(void) +{ +	platform_driver_unregister(&imx25_pinctrl_driver); +} +module_exit(imx25_pinctrl_exit); +MODULE_AUTHOR("Denis Carikli <denis@eukrea.com>"); +MODULE_DESCRIPTION("Freescale IMX25 pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-imx27.c b/drivers/pinctrl/pinctrl-imx27.c new file mode 100644 index 00000000000..417c99205bc --- /dev/null +++ b/drivers/pinctrl/pinctrl-imx27.c @@ -0,0 +1,477 @@ +/* + * imx27 pinctrl driver based on imx pinmux core + * + * Copyright (C) 2013 Pengutronix + * + * Author: Markus Pargmann <mpa@pengutronix.de> + * + * 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/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-imx1.h" + +#define PAD_ID(port, pin) (port*32 + pin) +#define PA 0 +#define PB 1 +#define PC 2 +#define PD 3 +#define PE 4 +#define PF 5 + +enum imx27_pads { +	MX27_PAD_USBH2_CLK = PAD_ID(PA, 0), +	MX27_PAD_USBH2_DIR = PAD_ID(PA, 1), +	MX27_PAD_USBH2_DATA7 = PAD_ID(PA, 2), +	MX27_PAD_USBH2_NXT = PAD_ID(PA, 3), +	MX27_PAD_USBH2_STP = PAD_ID(PA, 4), +	MX27_PAD_LSCLK = PAD_ID(PA, 5), +	MX27_PAD_LD0 = PAD_ID(PA, 6), +	MX27_PAD_LD1 = PAD_ID(PA, 7), +	MX27_PAD_LD2 = PAD_ID(PA, 8), +	MX27_PAD_LD3 = PAD_ID(PA, 9), +	MX27_PAD_LD4 = PAD_ID(PA, 10), +	MX27_PAD_LD5 = PAD_ID(PA, 11), +	MX27_PAD_LD6 = PAD_ID(PA, 12), +	MX27_PAD_LD7 = PAD_ID(PA, 13), +	MX27_PAD_LD8 = PAD_ID(PA, 14), +	MX27_PAD_LD9 = PAD_ID(PA, 15), +	MX27_PAD_LD10 = PAD_ID(PA, 16), +	MX27_PAD_LD11 = PAD_ID(PA, 17), +	MX27_PAD_LD12 = PAD_ID(PA, 18), +	MX27_PAD_LD13 = PAD_ID(PA, 19), +	MX27_PAD_LD14 = PAD_ID(PA, 20), +	MX27_PAD_LD15 = PAD_ID(PA, 21), +	MX27_PAD_LD16 = PAD_ID(PA, 22), +	MX27_PAD_LD17 = PAD_ID(PA, 23), +	MX27_PAD_REV = PAD_ID(PA, 24), +	MX27_PAD_CLS = PAD_ID(PA, 25), +	MX27_PAD_PS = PAD_ID(PA, 26), +	MX27_PAD_SPL_SPR = PAD_ID(PA, 27), +	MX27_PAD_HSYNC = PAD_ID(PA, 28), +	MX27_PAD_VSYNC = PAD_ID(PA, 29), +	MX27_PAD_CONTRAST = PAD_ID(PA, 30), +	MX27_PAD_OE_ACD = PAD_ID(PA, 31), + +	MX27_PAD_UNUSED0 = PAD_ID(PB, 0), +	MX27_PAD_UNUSED1 = PAD_ID(PB, 1), +	MX27_PAD_UNUSED2 = PAD_ID(PB, 2), +	MX27_PAD_UNUSED3 = PAD_ID(PB, 3), +	MX27_PAD_SD2_D0 = PAD_ID(PB, 4), +	MX27_PAD_SD2_D1 = PAD_ID(PB, 5), +	MX27_PAD_SD2_D2 = PAD_ID(PB, 6), +	MX27_PAD_SD2_D3 = PAD_ID(PB, 7), +	MX27_PAD_SD2_CMD = PAD_ID(PB, 8), +	MX27_PAD_SD2_CLK = PAD_ID(PB, 9), +	MX27_PAD_CSI_D0 = PAD_ID(PB, 10), +	MX27_PAD_CSI_D1 = PAD_ID(PB, 11), +	MX27_PAD_CSI_D2 = PAD_ID(PB, 12), +	MX27_PAD_CSI_D3 = PAD_ID(PB, 13), +	MX27_PAD_CSI_D4 = PAD_ID(PB, 14), +	MX27_PAD_CSI_MCLK = PAD_ID(PB, 15), +	MX27_PAD_CSI_PIXCLK = PAD_ID(PB, 16), +	MX27_PAD_CSI_D5 = PAD_ID(PB, 17), +	MX27_PAD_CSI_D6 = PAD_ID(PB, 18), +	MX27_PAD_CSI_D7 = PAD_ID(PB, 19), +	MX27_PAD_CSI_VSYNC = PAD_ID(PB, 20), +	MX27_PAD_CSI_HSYNC = PAD_ID(PB, 21), +	MX27_PAD_USBH1_SUSP = PAD_ID(PB, 22), +	MX27_PAD_USB_PWR = PAD_ID(PB, 23), +	MX27_PAD_USB_OC_B = PAD_ID(PB, 24), +	MX27_PAD_USBH1_RCV = PAD_ID(PB, 25), +	MX27_PAD_USBH1_FS = PAD_ID(PB, 26), +	MX27_PAD_USBH1_OE_B = PAD_ID(PB, 27), +	MX27_PAD_USBH1_TXDM = PAD_ID(PB, 28), +	MX27_PAD_USBH1_TXDP = PAD_ID(PB, 29), +	MX27_PAD_USBH1_RXDM = PAD_ID(PB, 30), +	MX27_PAD_USBH1_RXDP = PAD_ID(PB, 31), + +	MX27_PAD_UNUSED4 = PAD_ID(PC, 0), +	MX27_PAD_UNUSED5 = PAD_ID(PC, 1), +	MX27_PAD_UNUSED6 = PAD_ID(PC, 2), +	MX27_PAD_UNUSED7 = PAD_ID(PC, 3), +	MX27_PAD_UNUSED8 = PAD_ID(PC, 4), +	MX27_PAD_I2C2_SDA = PAD_ID(PC, 5), +	MX27_PAD_I2C2_SCL = PAD_ID(PC, 6), +	MX27_PAD_USBOTG_DATA5 = PAD_ID(PC, 7), +	MX27_PAD_USBOTG_DATA6 = PAD_ID(PC, 8), +	MX27_PAD_USBOTG_DATA0 = PAD_ID(PC, 9), +	MX27_PAD_USBOTG_DATA2 = PAD_ID(PC, 10), +	MX27_PAD_USBOTG_DATA1 = PAD_ID(PC, 11), +	MX27_PAD_USBOTG_DATA4 = PAD_ID(PC, 12), +	MX27_PAD_USBOTG_DATA3 = PAD_ID(PC, 13), +	MX27_PAD_TOUT = PAD_ID(PC, 14), +	MX27_PAD_TIN = PAD_ID(PC, 15), +	MX27_PAD_SSI4_FS = PAD_ID(PC, 16), +	MX27_PAD_SSI4_RXDAT = PAD_ID(PC, 17), +	MX27_PAD_SSI4_TXDAT = PAD_ID(PC, 18), +	MX27_PAD_SSI4_CLK = PAD_ID(PC, 19), +	MX27_PAD_SSI1_FS = PAD_ID(PC, 20), +	MX27_PAD_SSI1_RXDAT = PAD_ID(PC, 21), +	MX27_PAD_SSI1_TXDAT = PAD_ID(PC, 22), +	MX27_PAD_SSI1_CLK = PAD_ID(PC, 23), +	MX27_PAD_SSI2_FS = PAD_ID(PC, 24), +	MX27_PAD_SSI2_RXDAT = PAD_ID(PC, 25), +	MX27_PAD_SSI2_TXDAT = PAD_ID(PC, 26), +	MX27_PAD_SSI2_CLK = PAD_ID(PC, 27), +	MX27_PAD_SSI3_FS = PAD_ID(PC, 28), +	MX27_PAD_SSI3_RXDAT = PAD_ID(PC, 29), +	MX27_PAD_SSI3_TXDAT = PAD_ID(PC, 30), +	MX27_PAD_SSI3_CLK = PAD_ID(PC, 31), + +	MX27_PAD_SD3_CMD = PAD_ID(PD, 0), +	MX27_PAD_SD3_CLK = PAD_ID(PD, 1), +	MX27_PAD_ATA_DATA0 = PAD_ID(PD, 2), +	MX27_PAD_ATA_DATA1 = PAD_ID(PD, 3), +	MX27_PAD_ATA_DATA2 = PAD_ID(PD, 4), +	MX27_PAD_ATA_DATA3 = PAD_ID(PD, 5), +	MX27_PAD_ATA_DATA4 = PAD_ID(PD, 6), +	MX27_PAD_ATA_DATA5 = PAD_ID(PD, 7), +	MX27_PAD_ATA_DATA6 = PAD_ID(PD, 8), +	MX27_PAD_ATA_DATA7 = PAD_ID(PD, 9), +	MX27_PAD_ATA_DATA8 = PAD_ID(PD, 10), +	MX27_PAD_ATA_DATA9 = PAD_ID(PD, 11), +	MX27_PAD_ATA_DATA10 = PAD_ID(PD, 12), +	MX27_PAD_ATA_DATA11 = PAD_ID(PD, 13), +	MX27_PAD_ATA_DATA12 = PAD_ID(PD, 14), +	MX27_PAD_ATA_DATA13 = PAD_ID(PD, 15), +	MX27_PAD_ATA_DATA14 = PAD_ID(PD, 16), +	MX27_PAD_I2C_DATA = PAD_ID(PD, 17), +	MX27_PAD_I2C_CLK = PAD_ID(PD, 18), +	MX27_PAD_CSPI2_SS2 = PAD_ID(PD, 19), +	MX27_PAD_CSPI2_SS1 = PAD_ID(PD, 20), +	MX27_PAD_CSPI2_SS0 = PAD_ID(PD, 21), +	MX27_PAD_CSPI2_SCLK = PAD_ID(PD, 22), +	MX27_PAD_CSPI2_MISO = PAD_ID(PD, 23), +	MX27_PAD_CSPI2_MOSI = PAD_ID(PD, 24), +	MX27_PAD_CSPI1_RDY = PAD_ID(PD, 25), +	MX27_PAD_CSPI1_SS2 = PAD_ID(PD, 26), +	MX27_PAD_CSPI1_SS1 = PAD_ID(PD, 27), +	MX27_PAD_CSPI1_SS0 = PAD_ID(PD, 28), +	MX27_PAD_CSPI1_SCLK = PAD_ID(PD, 29), +	MX27_PAD_CSPI1_MISO = PAD_ID(PD, 30), +	MX27_PAD_CSPI1_MOSI = PAD_ID(PD, 31), + +	MX27_PAD_USBOTG_NXT = PAD_ID(PE, 0), +	MX27_PAD_USBOTG_STP = PAD_ID(PE, 1), +	MX27_PAD_USBOTG_DIR = PAD_ID(PE, 2), +	MX27_PAD_UART2_CTS = PAD_ID(PE, 3), +	MX27_PAD_UART2_RTS = PAD_ID(PE, 4), +	MX27_PAD_PWMO = PAD_ID(PE, 5), +	MX27_PAD_UART2_TXD = PAD_ID(PE, 6), +	MX27_PAD_UART2_RXD = PAD_ID(PE, 7), +	MX27_PAD_UART3_TXD = PAD_ID(PE, 8), +	MX27_PAD_UART3_RXD = PAD_ID(PE, 9), +	MX27_PAD_UART3_CTS = PAD_ID(PE, 10), +	MX27_PAD_UART3_RTS = PAD_ID(PE, 11), +	MX27_PAD_UART1_TXD = PAD_ID(PE, 12), +	MX27_PAD_UART1_RXD = PAD_ID(PE, 13), +	MX27_PAD_UART1_CTS = PAD_ID(PE, 14), +	MX27_PAD_UART1_RTS = PAD_ID(PE, 15), +	MX27_PAD_RTCK = PAD_ID(PE, 16), +	MX27_PAD_RESET_OUT_B = PAD_ID(PE, 17), +	MX27_PAD_SD1_D0 = PAD_ID(PE, 18), +	MX27_PAD_SD1_D1 = PAD_ID(PE, 19), +	MX27_PAD_SD1_D2 = PAD_ID(PE, 20), +	MX27_PAD_SD1_D3 = PAD_ID(PE, 21), +	MX27_PAD_SD1_CMD = PAD_ID(PE, 22), +	MX27_PAD_SD1_CLK = PAD_ID(PE, 23), +	MX27_PAD_USBOTG_CLK = PAD_ID(PE, 24), +	MX27_PAD_USBOTG_DATA7 = PAD_ID(PE, 25), +	MX27_PAD_UNUSED9 = PAD_ID(PE, 26), +	MX27_PAD_UNUSED10 = PAD_ID(PE, 27), +	MX27_PAD_UNUSED11 = PAD_ID(PE, 28), +	MX27_PAD_UNUSED12 = PAD_ID(PE, 29), +	MX27_PAD_UNUSED13 = PAD_ID(PE, 30), +	MX27_PAD_UNUSED14 = PAD_ID(PE, 31), + +	MX27_PAD_NFRB = PAD_ID(PF, 0), +	MX27_PAD_NFCLE = PAD_ID(PF, 1), +	MX27_PAD_NFWP_B = PAD_ID(PF, 2), +	MX27_PAD_NFCE_B = PAD_ID(PF, 3), +	MX27_PAD_NFALE = PAD_ID(PF, 4), +	MX27_PAD_NFRE_B = PAD_ID(PF, 5), +	MX27_PAD_NFWE_B = PAD_ID(PF, 6), +	MX27_PAD_PC_POE = PAD_ID(PF, 7), +	MX27_PAD_PC_RW_B = PAD_ID(PF, 8), +	MX27_PAD_IOIS16 = PAD_ID(PF, 9), +	MX27_PAD_PC_RST = PAD_ID(PF, 10), +	MX27_PAD_PC_BVD2 = PAD_ID(PF, 11), +	MX27_PAD_PC_BVD1 = PAD_ID(PF, 12), +	MX27_PAD_PC_VS2 = PAD_ID(PF, 13), +	MX27_PAD_PC_VS1 = PAD_ID(PF, 14), +	MX27_PAD_CLKO = PAD_ID(PF, 15), +	MX27_PAD_PC_PWRON = PAD_ID(PF, 16), +	MX27_PAD_PC_READY = PAD_ID(PF, 17), +	MX27_PAD_PC_WAIT_B = PAD_ID(PF, 18), +	MX27_PAD_PC_CD2_B = PAD_ID(PF, 19), +	MX27_PAD_PC_CD1_B = PAD_ID(PF, 20), +	MX27_PAD_CS4_B = PAD_ID(PF, 21), +	MX27_PAD_CS5_B = PAD_ID(PF, 22), +	MX27_PAD_ATA_DATA15 = PAD_ID(PF, 23), +	MX27_PAD_UNUSED15 = PAD_ID(PF, 24), +	MX27_PAD_UNUSED16 = PAD_ID(PF, 25), +	MX27_PAD_UNUSED17 = PAD_ID(PF, 26), +	MX27_PAD_UNUSED18 = PAD_ID(PF, 27), +	MX27_PAD_UNUSED19 = PAD_ID(PF, 28), +	MX27_PAD_UNUSED20 = PAD_ID(PF, 29), +	MX27_PAD_UNUSED21 = PAD_ID(PF, 30), +	MX27_PAD_UNUSED22 = PAD_ID(PF, 31), +}; + +/* Pad names for the pinmux subsystem */ +static const struct pinctrl_pin_desc imx27_pinctrl_pads[] = { +	IMX_PINCTRL_PIN(MX27_PAD_USBH2_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_USBH2_DIR), +	IMX_PINCTRL_PIN(MX27_PAD_USBH2_DATA7), +	IMX_PINCTRL_PIN(MX27_PAD_USBH2_NXT), +	IMX_PINCTRL_PIN(MX27_PAD_USBH2_STP), +	IMX_PINCTRL_PIN(MX27_PAD_LSCLK), +	IMX_PINCTRL_PIN(MX27_PAD_LD0), +	IMX_PINCTRL_PIN(MX27_PAD_LD1), +	IMX_PINCTRL_PIN(MX27_PAD_LD2), +	IMX_PINCTRL_PIN(MX27_PAD_LD3), +	IMX_PINCTRL_PIN(MX27_PAD_LD4), +	IMX_PINCTRL_PIN(MX27_PAD_LD5), +	IMX_PINCTRL_PIN(MX27_PAD_LD6), +	IMX_PINCTRL_PIN(MX27_PAD_LD7), +	IMX_PINCTRL_PIN(MX27_PAD_LD8), +	IMX_PINCTRL_PIN(MX27_PAD_LD9), +	IMX_PINCTRL_PIN(MX27_PAD_LD10), +	IMX_PINCTRL_PIN(MX27_PAD_LD11), +	IMX_PINCTRL_PIN(MX27_PAD_LD12), +	IMX_PINCTRL_PIN(MX27_PAD_LD13), +	IMX_PINCTRL_PIN(MX27_PAD_LD14), +	IMX_PINCTRL_PIN(MX27_PAD_LD15), +	IMX_PINCTRL_PIN(MX27_PAD_LD16), +	IMX_PINCTRL_PIN(MX27_PAD_LD17), +	IMX_PINCTRL_PIN(MX27_PAD_REV), +	IMX_PINCTRL_PIN(MX27_PAD_CLS), +	IMX_PINCTRL_PIN(MX27_PAD_PS), +	IMX_PINCTRL_PIN(MX27_PAD_SPL_SPR), +	IMX_PINCTRL_PIN(MX27_PAD_HSYNC), +	IMX_PINCTRL_PIN(MX27_PAD_VSYNC), +	IMX_PINCTRL_PIN(MX27_PAD_CONTRAST), +	IMX_PINCTRL_PIN(MX27_PAD_OE_ACD), + +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED0), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED1), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED2), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED3), +	IMX_PINCTRL_PIN(MX27_PAD_SD2_D0), +	IMX_PINCTRL_PIN(MX27_PAD_SD2_D1), +	IMX_PINCTRL_PIN(MX27_PAD_SD2_D2), +	IMX_PINCTRL_PIN(MX27_PAD_SD2_D3), +	IMX_PINCTRL_PIN(MX27_PAD_SD2_CMD), +	IMX_PINCTRL_PIN(MX27_PAD_SD2_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D0), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D1), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D2), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D3), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D4), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_MCLK), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_PIXCLK), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D5), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D6), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_D7), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_VSYNC), +	IMX_PINCTRL_PIN(MX27_PAD_CSI_HSYNC), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_SUSP), +	IMX_PINCTRL_PIN(MX27_PAD_USB_PWR), +	IMX_PINCTRL_PIN(MX27_PAD_USB_OC_B), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_RCV), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_FS), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_OE_B), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_TXDM), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_TXDP), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_RXDM), +	IMX_PINCTRL_PIN(MX27_PAD_USBH1_RXDP), + +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED4), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED5), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED6), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED7), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED8), +	IMX_PINCTRL_PIN(MX27_PAD_I2C2_SDA), +	IMX_PINCTRL_PIN(MX27_PAD_I2C2_SCL), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA5), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA6), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA0), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA2), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA1), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA4), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA3), +	IMX_PINCTRL_PIN(MX27_PAD_TOUT), +	IMX_PINCTRL_PIN(MX27_PAD_TIN), +	IMX_PINCTRL_PIN(MX27_PAD_SSI4_FS), +	IMX_PINCTRL_PIN(MX27_PAD_SSI4_RXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI4_TXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI4_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_SSI1_FS), +	IMX_PINCTRL_PIN(MX27_PAD_SSI1_RXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI1_TXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI1_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_SSI2_FS), +	IMX_PINCTRL_PIN(MX27_PAD_SSI2_RXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI2_TXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI2_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_SSI3_FS), +	IMX_PINCTRL_PIN(MX27_PAD_SSI3_RXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI3_TXDAT), +	IMX_PINCTRL_PIN(MX27_PAD_SSI3_CLK), + +	IMX_PINCTRL_PIN(MX27_PAD_SD3_CMD), +	IMX_PINCTRL_PIN(MX27_PAD_SD3_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA0), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA1), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA2), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA3), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA4), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA5), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA6), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA7), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA8), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA9), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA10), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA11), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA12), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA13), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA14), +	IMX_PINCTRL_PIN(MX27_PAD_I2C_DATA), +	IMX_PINCTRL_PIN(MX27_PAD_I2C_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SS2), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SS1), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SS0), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SCLK), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI2_MISO), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI2_MOSI), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_RDY), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SS2), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SS1), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SS0), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SCLK), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_MISO), +	IMX_PINCTRL_PIN(MX27_PAD_CSPI1_MOSI), + +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_NXT), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_STP), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DIR), +	IMX_PINCTRL_PIN(MX27_PAD_UART2_CTS), +	IMX_PINCTRL_PIN(MX27_PAD_UART2_RTS), +	IMX_PINCTRL_PIN(MX27_PAD_PWMO), +	IMX_PINCTRL_PIN(MX27_PAD_UART2_TXD), +	IMX_PINCTRL_PIN(MX27_PAD_UART2_RXD), +	IMX_PINCTRL_PIN(MX27_PAD_UART3_TXD), +	IMX_PINCTRL_PIN(MX27_PAD_UART3_RXD), +	IMX_PINCTRL_PIN(MX27_PAD_UART3_CTS), +	IMX_PINCTRL_PIN(MX27_PAD_UART3_RTS), +	IMX_PINCTRL_PIN(MX27_PAD_UART1_TXD), +	IMX_PINCTRL_PIN(MX27_PAD_UART1_RXD), +	IMX_PINCTRL_PIN(MX27_PAD_UART1_CTS), +	IMX_PINCTRL_PIN(MX27_PAD_UART1_RTS), +	IMX_PINCTRL_PIN(MX27_PAD_RTCK), +	IMX_PINCTRL_PIN(MX27_PAD_RESET_OUT_B), +	IMX_PINCTRL_PIN(MX27_PAD_SD1_D0), +	IMX_PINCTRL_PIN(MX27_PAD_SD1_D1), +	IMX_PINCTRL_PIN(MX27_PAD_SD1_D2), +	IMX_PINCTRL_PIN(MX27_PAD_SD1_D3), +	IMX_PINCTRL_PIN(MX27_PAD_SD1_CMD), +	IMX_PINCTRL_PIN(MX27_PAD_SD1_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_CLK), +	IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA7), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED9), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED10), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED11), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED12), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED13), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED14), + +	IMX_PINCTRL_PIN(MX27_PAD_NFRB), +	IMX_PINCTRL_PIN(MX27_PAD_NFCLE), +	IMX_PINCTRL_PIN(MX27_PAD_NFWP_B), +	IMX_PINCTRL_PIN(MX27_PAD_NFCE_B), +	IMX_PINCTRL_PIN(MX27_PAD_NFALE), +	IMX_PINCTRL_PIN(MX27_PAD_NFRE_B), +	IMX_PINCTRL_PIN(MX27_PAD_NFWE_B), +	IMX_PINCTRL_PIN(MX27_PAD_PC_POE), +	IMX_PINCTRL_PIN(MX27_PAD_PC_RW_B), +	IMX_PINCTRL_PIN(MX27_PAD_IOIS16), +	IMX_PINCTRL_PIN(MX27_PAD_PC_RST), +	IMX_PINCTRL_PIN(MX27_PAD_PC_BVD2), +	IMX_PINCTRL_PIN(MX27_PAD_PC_BVD1), +	IMX_PINCTRL_PIN(MX27_PAD_PC_VS2), +	IMX_PINCTRL_PIN(MX27_PAD_PC_VS1), +	IMX_PINCTRL_PIN(MX27_PAD_CLKO), +	IMX_PINCTRL_PIN(MX27_PAD_PC_PWRON), +	IMX_PINCTRL_PIN(MX27_PAD_PC_READY), +	IMX_PINCTRL_PIN(MX27_PAD_PC_WAIT_B), +	IMX_PINCTRL_PIN(MX27_PAD_PC_CD2_B), +	IMX_PINCTRL_PIN(MX27_PAD_PC_CD1_B), +	IMX_PINCTRL_PIN(MX27_PAD_CS4_B), +	IMX_PINCTRL_PIN(MX27_PAD_CS5_B), +	IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA15), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED15), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED16), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED17), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED18), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED19), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED20), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED21), +	IMX_PINCTRL_PIN(MX27_PAD_UNUSED22), +}; + +static struct imx1_pinctrl_soc_info imx27_pinctrl_info = { +	.pins = imx27_pinctrl_pads, +	.npins = ARRAY_SIZE(imx27_pinctrl_pads), +}; + +static struct of_device_id imx27_pinctrl_of_match[] = { +	{ .compatible = "fsl,imx27-iomuxc", }, +	{ /* sentinel */ } +}; + +struct imx27_pinctrl_private { +	int num_gpio_childs; +	struct platform_device **gpio_dev; +	struct mxc_gpio_platform_data *gpio_pdata; +}; + +static int imx27_pinctrl_probe(struct platform_device *pdev) +{ +	return imx1_pinctrl_core_probe(pdev, &imx27_pinctrl_info); +} + +static struct platform_driver imx27_pinctrl_driver = { +	.driver = { +		.name = "imx27-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(imx27_pinctrl_of_match), +	}, +	.probe = imx27_pinctrl_probe, +	.remove = imx1_pinctrl_core_remove, +}; + +static int __init imx27_pinctrl_init(void) +{ +	return platform_driver_register(&imx27_pinctrl_driver); +} +arch_initcall(imx27_pinctrl_init); + +static void __exit imx27_pinctrl_exit(void) +{ +	platform_driver_unregister(&imx27_pinctrl_driver); +} +module_exit(imx27_pinctrl_exit); +MODULE_AUTHOR("Markus Pargmann <mpa@pengutronix.de>"); +MODULE_DESCRIPTION("Freescale IMX27 pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-imx35.c b/drivers/pinctrl/pinctrl-imx35.c index c4549829fc4..278a04ae894 100644 --- a/drivers/pinctrl/pinctrl-imx35.c +++ b/drivers/pinctrl/pinctrl-imx35.c @@ -1019,7 +1019,7 @@ static struct platform_driver imx35_pinctrl_driver = {  	.driver = {  		.name = "imx35-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(imx35_pinctrl_of_match), +		.of_match_table = imx35_pinctrl_of_match,  	},  	.probe = imx35_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-imx50.c b/drivers/pinctrl/pinctrl-imx50.c new file mode 100644 index 00000000000..b06feed1b03 --- /dev/null +++ b/drivers/pinctrl/pinctrl-imx50.c @@ -0,0 +1,426 @@ +/* + * imx50 pinctrl driver based on imx pinmux core + * + * Copyright (C) 2013 Greg Ungerer <gerg@uclinux.org> + * Copyright (C) 2012 Freescale Semiconductor, Inc. + * Copyright (C) 2012 Linaro, Inc. + * + * 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/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-imx.h" + +enum imx50_pads { +	MX50_PAD_RESERVE0 = 0, +	MX50_PAD_RESERVE1 = 1, +	MX50_PAD_RESERVE2 = 2, +	MX50_PAD_RESERVE3 = 3, +	MX50_PAD_RESERVE4 = 4, +	MX50_PAD_RESERVE5 = 5, +	MX50_PAD_RESERVE6 = 6, +	MX50_PAD_RESERVE7 = 7, +	MX50_PAD_KEY_COL0 = 8, +	MX50_PAD_KEY_ROW0 = 9, +	MX50_PAD_KEY_COL1 = 10, +	MX50_PAD_KEY_ROW1 = 11, +	MX50_PAD_KEY_COL2 = 12, +	MX50_PAD_KEY_ROW2 = 13, +	MX50_PAD_KEY_COL3 = 14, +	MX50_PAD_KEY_ROW3 = 15, +	MX50_PAD_I2C1_SCL = 16, +	MX50_PAD_I2C1_SDA = 17, +	MX50_PAD_I2C2_SCL = 18, +	MX50_PAD_I2C2_SDA = 19, +	MX50_PAD_I2C3_SCL = 20, +	MX50_PAD_I2C3_SDA = 21, +	MX50_PAD_PWM1 = 22, +	MX50_PAD_PWM2 = 23, +	MX50_PAD_0WIRE = 24, +	MX50_PAD_EPITO = 25, +	MX50_PAD_WDOG = 26, +	MX50_PAD_SSI_TXFS = 27, +	MX50_PAD_SSI_TXC = 28, +	MX50_PAD_SSI_TXD = 29, +	MX50_PAD_SSI_RXD = 30, +	MX50_PAD_SSI_RXF = 31, +	MX50_PAD_SSI_RXC = 32, +	MX50_PAD_UART1_TXD = 33, +	MX50_PAD_UART1_RXD = 34, +	MX50_PAD_UART1_CTS = 35, +	MX50_PAD_UART1_RTS = 36, +	MX50_PAD_UART2_TXD = 37, +	MX50_PAD_UART2_RXD = 38, +	MX50_PAD_UART2_CTS = 39, +	MX50_PAD_UART2_RTS = 40, +	MX50_PAD_UART3_TXD = 41, +	MX50_PAD_UART3_RXD = 42, +	MX50_PAD_UART4_TXD = 43, +	MX50_PAD_UART4_RXD = 44, +	MX50_PAD_CSPI_CLK = 45, +	MX50_PAD_CSPI_MOSI = 46, +	MX50_PAD_CSPI_MISO = 47, +	MX50_PAD_CSPI_SS0 = 48, +	MX50_PAD_ECSPI1_CLK = 49, +	MX50_PAD_ECSPI1_MOSI = 50, +	MX50_PAD_ECSPI1_MISO = 51, +	MX50_PAD_ECSPI1_SS0 = 52, +	MX50_PAD_ECSPI2_CLK = 53, +	MX50_PAD_ECSPI2_MOSI = 54, +	MX50_PAD_ECSPI2_MISO = 55, +	MX50_PAD_ECSPI2_SS0 = 56, +	MX50_PAD_SD1_CLK = 57, +	MX50_PAD_SD1_CMD = 58, +	MX50_PAD_SD1_D0 = 59, +	MX50_PAD_SD1_D1 = 60, +	MX50_PAD_SD1_D2 = 61, +	MX50_PAD_SD1_D3 = 62, +	MX50_PAD_SD2_CLK = 63, +	MX50_PAD_SD2_CMD = 64, +	MX50_PAD_SD2_D0 = 65, +	MX50_PAD_SD2_D1 = 66, +	MX50_PAD_SD2_D2 = 67, +	MX50_PAD_SD2_D3 = 68, +	MX50_PAD_SD2_D4 = 69, +	MX50_PAD_SD2_D5 = 70, +	MX50_PAD_SD2_D6 = 71, +	MX50_PAD_SD2_D7 = 72, +	MX50_PAD_SD2_WP = 73, +	MX50_PAD_SD2_CD = 74, +	MX50_PAD_DISP_D0 = 75, +	MX50_PAD_DISP_D1 = 76, +	MX50_PAD_DISP_D2 = 77, +	MX50_PAD_DISP_D3 = 78, +	MX50_PAD_DISP_D4 = 79, +	MX50_PAD_DISP_D5 = 80, +	MX50_PAD_DISP_D6 = 81, +	MX50_PAD_DISP_D7 = 82, +	MX50_PAD_DISP_WR = 83, +	MX50_PAD_DISP_RD = 84, +	MX50_PAD_DISP_RS = 85, +	MX50_PAD_DISP_CS = 86, +	MX50_PAD_DISP_BUSY = 87, +	MX50_PAD_DISP_RESET = 88, +	MX50_PAD_SD3_CLK = 89, +	MX50_PAD_SD3_CMD = 90, +	MX50_PAD_SD3_D0 = 91, +	MX50_PAD_SD3_D1 = 92, +	MX50_PAD_SD3_D2 = 93, +	MX50_PAD_SD3_D3 = 94, +	MX50_PAD_SD3_D4 = 95, +	MX50_PAD_SD3_D5 = 96, +	MX50_PAD_SD3_D6 = 97, +	MX50_PAD_SD3_D7 = 98, +	MX50_PAD_SD3_WP = 99, +	MX50_PAD_DISP_D8 = 100, +	MX50_PAD_DISP_D9 = 101, +	MX50_PAD_DISP_D10 = 102, +	MX50_PAD_DISP_D11 = 103, +	MX50_PAD_DISP_D12 = 104, +	MX50_PAD_DISP_D13 = 105, +	MX50_PAD_DISP_D14 = 106, +	MX50_PAD_DISP_D15 = 107, +	MX50_PAD_EPDC_D0 = 108, +	MX50_PAD_EPDC_D1 = 109, +	MX50_PAD_EPDC_D2 = 110, +	MX50_PAD_EPDC_D3 = 111, +	MX50_PAD_EPDC_D4 = 112, +	MX50_PAD_EPDC_D5 = 113, +	MX50_PAD_EPDC_D6 = 114, +	MX50_PAD_EPDC_D7 = 115, +	MX50_PAD_EPDC_D8 = 116, +	MX50_PAD_EPDC_D9 = 117, +	MX50_PAD_EPDC_D10 = 118, +	MX50_PAD_EPDC_D11 = 119, +	MX50_PAD_EPDC_D12 = 120, +	MX50_PAD_EPDC_D13 = 121, +	MX50_PAD_EPDC_D14 = 122, +	MX50_PAD_EPDC_D15 = 123, +	MX50_PAD_EPDC_GDCLK = 124, +	MX50_PAD_EPDC_GDSP = 125, +	MX50_PAD_EPDC_GDOE = 126, +	MX50_PAD_EPDC_GDRL = 127, +	MX50_PAD_EPDC_SDCLK = 128, +	MX50_PAD_EPDC_SDOEZ = 129, +	MX50_PAD_EPDC_SDOED = 130, +	MX50_PAD_EPDC_SDOE = 131, +	MX50_PAD_EPDC_SDLE = 132, +	MX50_PAD_EPDC_SDCLKN = 133, +	MX50_PAD_EPDC_SDSHR = 134, +	MX50_PAD_EPDC_PWRCOM = 135, +	MX50_PAD_EPDC_PWRSTAT = 136, +	MX50_PAD_EPDC_PWRCTRL0 = 137, +	MX50_PAD_EPDC_PWRCTRL1 = 138, +	MX50_PAD_EPDC_PWRCTRL2 = 139, +	MX50_PAD_EPDC_PWRCTRL3 = 140, +	MX50_PAD_EPDC_VCOM0 = 141, +	MX50_PAD_EPDC_VCOM1 = 142, +	MX50_PAD_EPDC_BDR0 = 143, +	MX50_PAD_EPDC_BDR1 = 144, +	MX50_PAD_EPDC_SDCE0 = 145, +	MX50_PAD_EPDC_SDCE1 = 146, +	MX50_PAD_EPDC_SDCE2 = 147, +	MX50_PAD_EPDC_SDCE3 = 148, +	MX50_PAD_EPDC_SDCE4 = 149, +	MX50_PAD_EPDC_SDCE5 = 150, +	MX50_PAD_EIM_DA0 = 151, +	MX50_PAD_EIM_DA1 = 152, +	MX50_PAD_EIM_DA2 = 153, +	MX50_PAD_EIM_DA3 = 154, +	MX50_PAD_EIM_DA4 = 155, +	MX50_PAD_EIM_DA5 = 156, +	MX50_PAD_EIM_DA6 = 157, +	MX50_PAD_EIM_DA7 = 158, +	MX50_PAD_EIM_DA8 = 159, +	MX50_PAD_EIM_DA9 = 160, +	MX50_PAD_EIM_DA10 = 161, +	MX50_PAD_EIM_DA11 = 162, +	MX50_PAD_EIM_DA12 = 163, +	MX50_PAD_EIM_DA13 = 164, +	MX50_PAD_EIM_DA14 = 165, +	MX50_PAD_EIM_DA15 = 166, +	MX50_PAD_EIM_CS2 = 167, +	MX50_PAD_EIM_CS1 = 168, +	MX50_PAD_EIM_CS0 = 169, +	MX50_PAD_EIM_EB0 = 170, +	MX50_PAD_EIM_EB1 = 171, +	MX50_PAD_EIM_WAIT = 172, +	MX50_PAD_EIM_BCLK = 173, +	MX50_PAD_EIM_RDY = 174, +	MX50_PAD_EIM_OE = 175, +	MX50_PAD_EIM_RW = 176, +	MX50_PAD_EIM_LBA = 177, +	MX50_PAD_EIM_CRE = 178, +}; + +/* Pad names for the pinmux subsystem */ +static const struct pinctrl_pin_desc imx50_pinctrl_pads[] = { +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE0), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE1), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE2), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE3), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE4), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE5), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE6), +	IMX_PINCTRL_PIN(MX50_PAD_RESERVE7), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_COL0), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW0), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_COL1), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW1), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_COL2), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW2), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_COL3), +	IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW3), +	IMX_PINCTRL_PIN(MX50_PAD_I2C1_SCL), +	IMX_PINCTRL_PIN(MX50_PAD_I2C1_SDA), +	IMX_PINCTRL_PIN(MX50_PAD_I2C2_SCL), +	IMX_PINCTRL_PIN(MX50_PAD_I2C2_SDA), +	IMX_PINCTRL_PIN(MX50_PAD_I2C3_SCL), +	IMX_PINCTRL_PIN(MX50_PAD_I2C3_SDA), +	IMX_PINCTRL_PIN(MX50_PAD_PWM1), +	IMX_PINCTRL_PIN(MX50_PAD_PWM2), +	IMX_PINCTRL_PIN(MX50_PAD_0WIRE), +	IMX_PINCTRL_PIN(MX50_PAD_EPITO), +	IMX_PINCTRL_PIN(MX50_PAD_WDOG), +	IMX_PINCTRL_PIN(MX50_PAD_SSI_TXFS), +	IMX_PINCTRL_PIN(MX50_PAD_SSI_TXC), +	IMX_PINCTRL_PIN(MX50_PAD_SSI_TXD), +	IMX_PINCTRL_PIN(MX50_PAD_SSI_RXD), +	IMX_PINCTRL_PIN(MX50_PAD_SSI_RXF), +	IMX_PINCTRL_PIN(MX50_PAD_SSI_RXC), +	IMX_PINCTRL_PIN(MX50_PAD_UART1_TXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART1_RXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART1_CTS), +	IMX_PINCTRL_PIN(MX50_PAD_UART1_RTS), +	IMX_PINCTRL_PIN(MX50_PAD_UART2_TXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART2_RXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART2_CTS), +	IMX_PINCTRL_PIN(MX50_PAD_UART2_RTS), +	IMX_PINCTRL_PIN(MX50_PAD_UART3_TXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART3_RXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART4_TXD), +	IMX_PINCTRL_PIN(MX50_PAD_UART4_RXD), +	IMX_PINCTRL_PIN(MX50_PAD_CSPI_CLK), +	IMX_PINCTRL_PIN(MX50_PAD_CSPI_MOSI), +	IMX_PINCTRL_PIN(MX50_PAD_CSPI_MISO), +	IMX_PINCTRL_PIN(MX50_PAD_CSPI_SS0), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_CLK), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_MOSI), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_MISO), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_SS0), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_CLK), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_MOSI), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_MISO), +	IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_SS0), +	IMX_PINCTRL_PIN(MX50_PAD_SD1_CLK), +	IMX_PINCTRL_PIN(MX50_PAD_SD1_CMD), +	IMX_PINCTRL_PIN(MX50_PAD_SD1_D0), +	IMX_PINCTRL_PIN(MX50_PAD_SD1_D1), +	IMX_PINCTRL_PIN(MX50_PAD_SD1_D2), +	IMX_PINCTRL_PIN(MX50_PAD_SD1_D3), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_CLK), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_CMD), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D0), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D1), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D2), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D3), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D4), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D5), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D6), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_D7), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_WP), +	IMX_PINCTRL_PIN(MX50_PAD_SD2_CD), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D0), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D1), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D2), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D3), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D4), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D5), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D6), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D7), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_WR), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_RD), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_RS), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_CS), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_BUSY), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_RESET), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_CLK), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_CMD), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D0), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D1), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D2), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D3), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D4), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D5), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D6), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_D7), +	IMX_PINCTRL_PIN(MX50_PAD_SD3_WP), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D8), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D9), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D10), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D11), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D12), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D13), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D14), +	IMX_PINCTRL_PIN(MX50_PAD_DISP_D15), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D0), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D1), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D2), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D3), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D4), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D5), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D6), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D7), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D8), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D9), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D10), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D11), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D12), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D13), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D14), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_D15), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDCLK), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDSP), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDOE), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDRL), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCLK), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDOEZ), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDOED), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDOE), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDLE), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCLKN), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDSHR), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCOM), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRSTAT), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL0), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL1), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL2), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL3), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_VCOM0), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_VCOM1), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_BDR0), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_BDR1), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE0), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE1), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE2), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE3), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE4), +	IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE5), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA0), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA1), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA2), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA3), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA4), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA5), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA6), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA7), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA8), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA9), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA10), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA11), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA12), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA13), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA14), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_DA15), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_CS2), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_CS1), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_CS0), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_EB0), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_EB1), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_WAIT), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_BCLK), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_RDY), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_OE), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_RW), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_LBA), +	IMX_PINCTRL_PIN(MX50_PAD_EIM_CRE), +}; + +static struct imx_pinctrl_soc_info imx50_pinctrl_info = { +	.pins = imx50_pinctrl_pads, +	.npins = ARRAY_SIZE(imx50_pinctrl_pads), +}; + +static struct of_device_id imx50_pinctrl_of_match[] = { +	{ .compatible = "fsl,imx50-iomuxc", }, +	{ /* sentinel */ } +}; + +static int imx50_pinctrl_probe(struct platform_device *pdev) +{ +	return imx_pinctrl_probe(pdev, &imx50_pinctrl_info); +} + +static struct platform_driver imx50_pinctrl_driver = { +	.driver = { +		.name = "imx50-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(imx50_pinctrl_of_match), +	}, +	.probe = imx50_pinctrl_probe, +	.remove = imx_pinctrl_remove, +}; + +static int __init imx50_pinctrl_init(void) +{ +	return platform_driver_register(&imx50_pinctrl_driver); +} +arch_initcall(imx50_pinctrl_init); + +static void __exit imx50_pinctrl_exit(void) +{ +	platform_driver_unregister(&imx50_pinctrl_driver); +} +module_exit(imx50_pinctrl_exit); +MODULE_DESCRIPTION("Freescale IMX50 pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-imx51.c b/drivers/pinctrl/pinctrl-imx51.c index db268b92007..19ab182bef6 100644 --- a/drivers/pinctrl/pinctrl-imx51.c +++ b/drivers/pinctrl/pinctrl-imx51.c @@ -782,7 +782,7 @@ static struct platform_driver imx51_pinctrl_driver = {  	.driver = {  		.name = "imx51-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(imx51_pinctrl_of_match), +		.of_match_table = imx51_pinctrl_of_match,  	},  	.probe = imx51_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-imx53.c b/drivers/pinctrl/pinctrl-imx53.c index 17562ae9005..f8d45c4cfde 100644 --- a/drivers/pinctrl/pinctrl-imx53.c +++ b/drivers/pinctrl/pinctrl-imx53.c @@ -468,7 +468,7 @@ static struct platform_driver imx53_pinctrl_driver = {  	.driver = {  		.name = "imx53-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(imx53_pinctrl_of_match), +		.of_match_table = imx53_pinctrl_of_match,  	},  	.probe = imx53_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-imx6dl.c b/drivers/pinctrl/pinctrl-imx6dl.c index a76b7242793..db2a1489bd9 100644 --- a/drivers/pinctrl/pinctrl-imx6dl.c +++ b/drivers/pinctrl/pinctrl-imx6dl.c @@ -474,7 +474,7 @@ static struct platform_driver imx6dl_pinctrl_driver = {  	.driver = {  		.name = "imx6dl-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(imx6dl_pinctrl_of_match), +		.of_match_table = imx6dl_pinctrl_of_match,  	},  	.probe = imx6dl_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-imx6q.c b/drivers/pinctrl/pinctrl-imx6q.c index 76dd9c4949f..8eb5ac1bd5f 100644 --- a/drivers/pinctrl/pinctrl-imx6q.c +++ b/drivers/pinctrl/pinctrl-imx6q.c @@ -480,7 +480,7 @@ static struct platform_driver imx6q_pinctrl_driver = {  	.driver = {  		.name = "imx6q-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(imx6q_pinctrl_of_match), +		.of_match_table = imx6q_pinctrl_of_match,  	},  	.probe = imx6q_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-imx6sl.c b/drivers/pinctrl/pinctrl-imx6sl.c index 4eb7ccab5f2..f21b7389df3 100644 --- a/drivers/pinctrl/pinctrl-imx6sl.c +++ b/drivers/pinctrl/pinctrl-imx6sl.c @@ -380,7 +380,7 @@ static struct platform_driver imx6sl_pinctrl_driver = {  	.driver = {  		.name = "imx6sl-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(imx6sl_pinctrl_of_match), +		.of_match_table = imx6sl_pinctrl_of_match,  	},  	.probe = imx6sl_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-imx6sx.c b/drivers/pinctrl/pinctrl-imx6sx.c new file mode 100644 index 00000000000..09758a56b9d --- /dev/null +++ b/drivers/pinctrl/pinctrl-imx6sx.c @@ -0,0 +1,407 @@ +/* + * Copyright (C) 2014 Freescale Semiconductor, Inc. + * + * 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/err.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-imx.h" + +enum imx6sx_pads { +	MX6Sx_PAD_RESERVE0 = 0, +	MX6Sx_PAD_RESERVE1 = 1, +	MX6Sx_PAD_RESERVE2 = 2, +	MX6Sx_PAD_RESERVE3 = 3, +	MX6Sx_PAD_RESERVE4 = 4, +	MX6SX_PAD_GPIO1_IO00 = 5, +	MX6SX_PAD_GPIO1_IO01 = 6, +	MX6SX_PAD_GPIO1_IO02 = 7, +	MX6SX_PAD_GPIO1_IO03 = 8, +	MX6SX_PAD_GPIO1_IO04 = 9, +	MX6SX_PAD_GPIO1_IO05 = 10, +	MX6SX_PAD_GPIO1_IO06 = 11, +	MX6SX_PAD_GPIO1_IO07 = 12, +	MX6SX_PAD_GPIO1_IO08 = 13, +	MX6SX_PAD_GPIO1_IO09 = 14, +	MX6SX_PAD_GPIO1_IO10 = 15, +	MX6SX_PAD_GPIO1_IO11 = 16, +	MX6SX_PAD_GPIO1_IO12 = 17, +	MX6SX_PAD_GPIO1_IO13 = 18, +	MX6SX_PAD_CSI_DATA00 = 19, +	MX6SX_PAD_CSI_DATA01 = 20, +	MX6SX_PAD_CSI_DATA02 = 21, +	MX6SX_PAD_CSI_DATA03 = 22, +	MX6SX_PAD_CSI_DATA04 = 23, +	MX6SX_PAD_CSI_DATA05 = 24, +	MX6SX_PAD_CSI_DATA06 = 25, +	MX6SX_PAD_CSI_DATA07 = 26, +	MX6SX_PAD_CSI_HSYNC = 27, +	MX6SX_PAD_CSI_MCLK = 28, +	MX6SX_PAD_CSI_PIXCLK = 29, +	MX6SX_PAD_CSI_VSYNC = 30, +	MX6SX_PAD_ENET1_COL = 31, +	MX6SX_PAD_ENET1_CRS = 32, +	MX6SX_PAD_ENET1_MDC = 33, +	MX6SX_PAD_ENET1_MDIO = 34, +	MX6SX_PAD_ENET1_RX_CLK = 35, +	MX6SX_PAD_ENET1_TX_CLK = 36, +	MX6SX_PAD_ENET2_COL = 37, +	MX6SX_PAD_ENET2_CRS = 38, +	MX6SX_PAD_ENET2_RX_CLK = 39, +	MX6SX_PAD_ENET2_TX_CLK = 40, +	MX6SX_PAD_KEY_COL0 = 41, +	MX6SX_PAD_KEY_COL1 = 42, +	MX6SX_PAD_KEY_COL2 = 43, +	MX6SX_PAD_KEY_COL3 = 44, +	MX6SX_PAD_KEY_COL4 = 45, +	MX6SX_PAD_KEY_ROW0 = 46, +	MX6SX_PAD_KEY_ROW1 = 47, +	MX6SX_PAD_KEY_ROW2 = 48, +	MX6SX_PAD_KEY_ROW3 = 49, +	MX6SX_PAD_KEY_ROW4 = 50, +	MX6SX_PAD_LCD1_CLK = 51, +	MX6SX_PAD_LCD1_DATA00 = 52, +	MX6SX_PAD_LCD1_DATA01 = 53, +	MX6SX_PAD_LCD1_DATA02 = 54, +	MX6SX_PAD_LCD1_DATA03 = 55, +	MX6SX_PAD_LCD1_DATA04 = 56, +	MX6SX_PAD_LCD1_DATA05 = 57, +	MX6SX_PAD_LCD1_DATA06 = 58, +	MX6SX_PAD_LCD1_DATA07 = 59, +	MX6SX_PAD_LCD1_DATA08 = 60, +	MX6SX_PAD_LCD1_DATA09 = 61, +	MX6SX_PAD_LCD1_DATA10 = 62, +	MX6SX_PAD_LCD1_DATA11 = 63, +	MX6SX_PAD_LCD1_DATA12 = 64, +	MX6SX_PAD_LCD1_DATA13 = 65, +	MX6SX_PAD_LCD1_DATA14 = 66, +	MX6SX_PAD_LCD1_DATA15 = 67, +	MX6SX_PAD_LCD1_DATA16 = 68, +	MX6SX_PAD_LCD1_DATA17 = 69, +	MX6SX_PAD_LCD1_DATA18 = 70, +	MX6SX_PAD_LCD1_DATA19 = 71, +	MX6SX_PAD_LCD1_DATA20 = 72, +	MX6SX_PAD_LCD1_DATA21 = 73, +	MX6SX_PAD_LCD1_DATA22 = 74, +	MX6SX_PAD_LCD1_DATA23 = 75, +	MX6SX_PAD_LCD1_ENABLE = 76, +	MX6SX_PAD_LCD1_HSYNC = 77, +	MX6SX_PAD_LCD1_RESET = 78, +	MX6SX_PAD_LCD1_VSYNC = 79, +	MX6SX_PAD_NAND_ALE = 80, +	MX6SX_PAD_NAND_CE0_B = 81, +	MX6SX_PAD_NAND_CE1_B = 82, +	MX6SX_PAD_NAND_CLE = 83, +	MX6SX_PAD_NAND_DATA00 = 84 , +	MX6SX_PAD_NAND_DATA01 = 85, +	MX6SX_PAD_NAND_DATA02 = 86, +	MX6SX_PAD_NAND_DATA03 = 87, +	MX6SX_PAD_NAND_DATA04 = 88, +	MX6SX_PAD_NAND_DATA05 = 89, +	MX6SX_PAD_NAND_DATA06 = 90, +	MX6SX_PAD_NAND_DATA07 = 91, +	MX6SX_PAD_NAND_RE_B = 92, +	MX6SX_PAD_NAND_READY_B = 93, +	MX6SX_PAD_NAND_WE_B = 94, +	MX6SX_PAD_NAND_WP_B = 95, +	MX6SX_PAD_QSPI1A_DATA0 = 96, +	MX6SX_PAD_QSPI1A_DATA1 = 97, +	MX6SX_PAD_QSPI1A_DATA2 = 98, +	MX6SX_PAD_QSPI1A_DATA3 = 99, +	MX6SX_PAD_QSPI1A_DQS = 100, +	MX6SX_PAD_QSPI1A_SCLK = 101, +	MX6SX_PAD_QSPI1A_SS0_B = 102, +	MX6SX_PAD_QSPI1A_SS1_B = 103, +	MX6SX_PAD_QSPI1B_DATA0 = 104, +	MX6SX_PAD_QSPI1B_DATA1 = 105, +	MX6SX_PAD_QSPI1B_DATA2 = 106, +	MX6SX_PAD_QSPI1B_DATA3 = 107, +	MX6SX_PAD_QSPI1B_DQS = 108, +	MX6SX_PAD_QSPI1B_SCLK = 109, +	MX6SX_PAD_QSPI1B_SS0_B = 110, +	MX6SX_PAD_QSPI1B_SS1_B = 111, +	MX6SX_PAD_RGMII1_RD0 = 112, +	MX6SX_PAD_RGMII1_RD1 = 113, +	MX6SX_PAD_RGMII1_RD2 = 114, +	MX6SX_PAD_RGMII1_RD3 = 115, +	MX6SX_PAD_RGMII1_RX_CTL = 116, +	MX6SX_PAD_RGMII1_RXC = 117, +	MX6SX_PAD_RGMII1_TD0 = 118, +	MX6SX_PAD_RGMII1_TD1 = 119, +	MX6SX_PAD_RGMII1_TD2 = 120, +	MX6SX_PAD_RGMII1_TD3 = 121, +	MX6SX_PAD_RGMII1_TX_CTL = 122, +	MX6SX_PAD_RGMII1_TXC = 123, +	MX6SX_PAD_RGMII2_RD0 = 124, +	MX6SX_PAD_RGMII2_RD1 = 125, +	MX6SX_PAD_RGMII2_RD2 = 126, +	MX6SX_PAD_RGMII2_RD3 = 127, +	MX6SX_PAD_RGMII2_RX_CTL = 128, +	MX6SX_PAD_RGMII2_RXC = 129, +	MX6SX_PAD_RGMII2_TD0 = 130, +	MX6SX_PAD_RGMII2_TD1 = 131, +	MX6SX_PAD_RGMII2_TD2 = 132, +	MX6SX_PAD_RGMII2_TD3 = 133, +	MX6SX_PAD_RGMII2_TX_CTL = 134, +	MX6SX_PAD_RGMII2_TXC = 135, +	MX6SX_PAD_SD1_CLK = 136, +	MX6SX_PAD_SD1_CMD = 137, +	MX6SX_PAD_SD1_DATA0 = 138, +	MX6SX_PAD_SD1_DATA1 = 139, +	MX6SX_PAD_SD1_DATA2 = 140, +	MX6SX_PAD_SD1_DATA3 = 141, +	MX6SX_PAD_SD2_CLK = 142, +	MX6SX_PAD_SD2_CMD = 143, +	MX6SX_PAD_SD2_DATA0 = 144, +	MX6SX_PAD_SD2_DATA1 = 145, +	MX6SX_PAD_SD2_DATA2 = 146, +	MX6SX_PAD_SD2_DATA3 = 147, +	MX6SX_PAD_SD3_CLK = 148, +	MX6SX_PAD_SD3_CMD = 149, +	MX6SX_PAD_SD3_DATA0 = 150, +	MX6SX_PAD_SD3_DATA1 = 151, +	MX6SX_PAD_SD3_DATA2 = 152, +	MX6SX_PAD_SD3_DATA3 = 153, +	MX6SX_PAD_SD3_DATA4 = 154, +	MX6SX_PAD_SD3_DATA5 = 155, +	MX6SX_PAD_SD3_DATA6 = 156, +	MX6SX_PAD_SD3_DATA7 = 157, +	MX6SX_PAD_SD4_CLK = 158, +	MX6SX_PAD_SD4_CMD = 159, +	MX6SX_PAD_SD4_DATA0 = 160, +	MX6SX_PAD_SD4_DATA1 = 161, +	MX6SX_PAD_SD4_DATA2 = 162, +	MX6SX_PAD_SD4_DATA3 = 163, +	MX6SX_PAD_SD4_DATA4 = 164, +	MX6SX_PAD_SD4_DATA5 = 165, +	MX6SX_PAD_SD4_DATA6 = 166, +	MX6SX_PAD_SD4_DATA7 = 167, +	MX6SX_PAD_SD4_RESET_B = 168, +	MX6SX_PAD_USB_H_DATA = 169, +	MX6SX_PAD_USB_H_STROBE = 170, +}; + +/* Pad names for the pinmux subsystem */ +static const struct pinctrl_pin_desc imx6sx_pinctrl_pads[] = { +	IMX_PINCTRL_PIN(MX6Sx_PAD_RESERVE0), +	IMX_PINCTRL_PIN(MX6Sx_PAD_RESERVE1), +	IMX_PINCTRL_PIN(MX6Sx_PAD_RESERVE2), +	IMX_PINCTRL_PIN(MX6Sx_PAD_RESERVE3), +	IMX_PINCTRL_PIN(MX6Sx_PAD_RESERVE4), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO00), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO01), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO02), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO03), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO04), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO05), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO06), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO07), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO08), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO09), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO10), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO11), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO12), +	IMX_PINCTRL_PIN(MX6SX_PAD_GPIO1_IO13), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA00), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA01), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA02), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA03), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA04), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA05), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA06), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_DATA07), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_HSYNC), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_MCLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_PIXCLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_CSI_VSYNC), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET1_COL), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET1_CRS), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET1_MDC), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET1_MDIO), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET1_RX_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET1_TX_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET2_COL), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET2_CRS), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET2_RX_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_ENET2_TX_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_COL0), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_COL1), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_COL2), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_COL3), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_COL4), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_ROW0), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_ROW1), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_ROW2), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_ROW3), +	IMX_PINCTRL_PIN(MX6SX_PAD_KEY_ROW4), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA00), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA01), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA02), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA03), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA04), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA05), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA06), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA07), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA08), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA09), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA10), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA11), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA12), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA13), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA14), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA15), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA16), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA17), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA18), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA19), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA20), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA21), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA22), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_DATA23), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_ENABLE), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_HSYNC), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_RESET), +	IMX_PINCTRL_PIN(MX6SX_PAD_LCD1_VSYNC), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_ALE), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_CE0_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_CE1_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_CLE), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA00), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA01), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA02), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA03), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA04), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA05), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA06), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_DATA07), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_RE_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_READY_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_WE_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_NAND_WP_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_DATA0), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_DATA1), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_DATA2), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_DATA3), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_DQS), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_SCLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_SS0_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1A_SS1_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_DATA0), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_DATA1), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_DATA2), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_DATA3), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_DQS), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_SCLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_SS0_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_QSPI1B_SS1_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_RD0), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_RD1), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_RD2), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_RD3), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_RX_CTL), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_RXC), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_TD0), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_TD1), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_TD2), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_TD3), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_TX_CTL), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII1_TXC), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_RD0), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_RD1), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_RD2), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_RD3), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_RX_CTL), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_RXC), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_TD0), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_TD1), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_TD2), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_TD3), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_TX_CTL), +	IMX_PINCTRL_PIN(MX6SX_PAD_RGMII2_TXC), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD1_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD1_CMD), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD1_DATA0), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD1_DATA1), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD1_DATA2), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD1_DATA3), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD2_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD2_CMD), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD2_DATA0), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD2_DATA1), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD2_DATA2), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD2_DATA3), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_CMD), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA0), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA1), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA2), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA3), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA4), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA5), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA6), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD3_DATA7), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_CLK), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_CMD), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA0), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA1), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA2), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA3), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA4), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA5), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA6), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_DATA7), +	IMX_PINCTRL_PIN(MX6SX_PAD_SD4_RESET_B), +	IMX_PINCTRL_PIN(MX6SX_PAD_USB_H_DATA), +	IMX_PINCTRL_PIN(MX6SX_PAD_USB_H_STROBE), +}; + +static struct imx_pinctrl_soc_info imx6sx_pinctrl_info = { +	.pins = imx6sx_pinctrl_pads, +	.npins = ARRAY_SIZE(imx6sx_pinctrl_pads), +}; + +static struct of_device_id imx6sx_pinctrl_of_match[] = { +	{ .compatible = "fsl,imx6sx-iomuxc", }, +	{ /* sentinel */ } +}; + +static int imx6sx_pinctrl_probe(struct platform_device *pdev) +{ +	return imx_pinctrl_probe(pdev, &imx6sx_pinctrl_info); +} + +static struct platform_driver imx6sx_pinctrl_driver = { +	.driver = { +		.name = "imx6sx-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = of_match_ptr(imx6sx_pinctrl_of_match), +	}, +	.probe = imx6sx_pinctrl_probe, +	.remove = imx_pinctrl_remove, +}; + +static int __init imx6sx_pinctrl_init(void) +{ +	return platform_driver_register(&imx6sx_pinctrl_driver); +} +arch_initcall(imx6sx_pinctrl_init); + +static void __exit imx6sx_pinctrl_exit(void) +{ +	platform_driver_unregister(&imx6sx_pinctrl_driver); +} +module_exit(imx6sx_pinctrl_exit); + +MODULE_AUTHOR("Anson Huang <Anson.Huang@freescale.com>"); +MODULE_DESCRIPTION("Freescale imx6sx pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-ipq8064.c b/drivers/pinctrl/pinctrl-ipq8064.c new file mode 100644 index 00000000000..acafea4c3a3 --- /dev/null +++ b/drivers/pinctrl/pinctrl-ipq8064.c @@ -0,0 +1,653 @@ +/* + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only 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 <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-msm.h" + +static const struct pinctrl_pin_desc ipq8064_pins[] = { +	PINCTRL_PIN(0, "GPIO_0"), +	PINCTRL_PIN(1, "GPIO_1"), +	PINCTRL_PIN(2, "GPIO_2"), +	PINCTRL_PIN(3, "GPIO_3"), +	PINCTRL_PIN(4, "GPIO_4"), +	PINCTRL_PIN(5, "GPIO_5"), +	PINCTRL_PIN(6, "GPIO_6"), +	PINCTRL_PIN(7, "GPIO_7"), +	PINCTRL_PIN(8, "GPIO_8"), +	PINCTRL_PIN(9, "GPIO_9"), +	PINCTRL_PIN(10, "GPIO_10"), +	PINCTRL_PIN(11, "GPIO_11"), +	PINCTRL_PIN(12, "GPIO_12"), +	PINCTRL_PIN(13, "GPIO_13"), +	PINCTRL_PIN(14, "GPIO_14"), +	PINCTRL_PIN(15, "GPIO_15"), +	PINCTRL_PIN(16, "GPIO_16"), +	PINCTRL_PIN(17, "GPIO_17"), +	PINCTRL_PIN(18, "GPIO_18"), +	PINCTRL_PIN(19, "GPIO_19"), +	PINCTRL_PIN(20, "GPIO_20"), +	PINCTRL_PIN(21, "GPIO_21"), +	PINCTRL_PIN(22, "GPIO_22"), +	PINCTRL_PIN(23, "GPIO_23"), +	PINCTRL_PIN(24, "GPIO_24"), +	PINCTRL_PIN(25, "GPIO_25"), +	PINCTRL_PIN(26, "GPIO_26"), +	PINCTRL_PIN(27, "GPIO_27"), +	PINCTRL_PIN(28, "GPIO_28"), +	PINCTRL_PIN(29, "GPIO_29"), +	PINCTRL_PIN(30, "GPIO_30"), +	PINCTRL_PIN(31, "GPIO_31"), +	PINCTRL_PIN(32, "GPIO_32"), +	PINCTRL_PIN(33, "GPIO_33"), +	PINCTRL_PIN(34, "GPIO_34"), +	PINCTRL_PIN(35, "GPIO_35"), +	PINCTRL_PIN(36, "GPIO_36"), +	PINCTRL_PIN(37, "GPIO_37"), +	PINCTRL_PIN(38, "GPIO_38"), +	PINCTRL_PIN(39, "GPIO_39"), +	PINCTRL_PIN(40, "GPIO_40"), +	PINCTRL_PIN(41, "GPIO_41"), +	PINCTRL_PIN(42, "GPIO_42"), +	PINCTRL_PIN(43, "GPIO_43"), +	PINCTRL_PIN(44, "GPIO_44"), +	PINCTRL_PIN(45, "GPIO_45"), +	PINCTRL_PIN(46, "GPIO_46"), +	PINCTRL_PIN(47, "GPIO_47"), +	PINCTRL_PIN(48, "GPIO_48"), +	PINCTRL_PIN(49, "GPIO_49"), +	PINCTRL_PIN(50, "GPIO_50"), +	PINCTRL_PIN(51, "GPIO_51"), +	PINCTRL_PIN(52, "GPIO_52"), +	PINCTRL_PIN(53, "GPIO_53"), +	PINCTRL_PIN(54, "GPIO_54"), +	PINCTRL_PIN(55, "GPIO_55"), +	PINCTRL_PIN(56, "GPIO_56"), +	PINCTRL_PIN(57, "GPIO_57"), +	PINCTRL_PIN(58, "GPIO_58"), +	PINCTRL_PIN(59, "GPIO_59"), +	PINCTRL_PIN(60, "GPIO_60"), +	PINCTRL_PIN(61, "GPIO_61"), +	PINCTRL_PIN(62, "GPIO_62"), +	PINCTRL_PIN(63, "GPIO_63"), +	PINCTRL_PIN(64, "GPIO_64"), +	PINCTRL_PIN(65, "GPIO_65"), +	PINCTRL_PIN(66, "GPIO_66"), +	PINCTRL_PIN(67, "GPIO_67"), +	PINCTRL_PIN(68, "GPIO_68"), + +	PINCTRL_PIN(69, "SDC3_CLK"), +	PINCTRL_PIN(70, "SDC3_CMD"), +	PINCTRL_PIN(71, "SDC3_DATA"), +}; + +#define DECLARE_IPQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin } +DECLARE_IPQ_GPIO_PINS(0); +DECLARE_IPQ_GPIO_PINS(1); +DECLARE_IPQ_GPIO_PINS(2); +DECLARE_IPQ_GPIO_PINS(3); +DECLARE_IPQ_GPIO_PINS(4); +DECLARE_IPQ_GPIO_PINS(5); +DECLARE_IPQ_GPIO_PINS(6); +DECLARE_IPQ_GPIO_PINS(7); +DECLARE_IPQ_GPIO_PINS(8); +DECLARE_IPQ_GPIO_PINS(9); +DECLARE_IPQ_GPIO_PINS(10); +DECLARE_IPQ_GPIO_PINS(11); +DECLARE_IPQ_GPIO_PINS(12); +DECLARE_IPQ_GPIO_PINS(13); +DECLARE_IPQ_GPIO_PINS(14); +DECLARE_IPQ_GPIO_PINS(15); +DECLARE_IPQ_GPIO_PINS(16); +DECLARE_IPQ_GPIO_PINS(17); +DECLARE_IPQ_GPIO_PINS(18); +DECLARE_IPQ_GPIO_PINS(19); +DECLARE_IPQ_GPIO_PINS(20); +DECLARE_IPQ_GPIO_PINS(21); +DECLARE_IPQ_GPIO_PINS(22); +DECLARE_IPQ_GPIO_PINS(23); +DECLARE_IPQ_GPIO_PINS(24); +DECLARE_IPQ_GPIO_PINS(25); +DECLARE_IPQ_GPIO_PINS(26); +DECLARE_IPQ_GPIO_PINS(27); +DECLARE_IPQ_GPIO_PINS(28); +DECLARE_IPQ_GPIO_PINS(29); +DECLARE_IPQ_GPIO_PINS(30); +DECLARE_IPQ_GPIO_PINS(31); +DECLARE_IPQ_GPIO_PINS(32); +DECLARE_IPQ_GPIO_PINS(33); +DECLARE_IPQ_GPIO_PINS(34); +DECLARE_IPQ_GPIO_PINS(35); +DECLARE_IPQ_GPIO_PINS(36); +DECLARE_IPQ_GPIO_PINS(37); +DECLARE_IPQ_GPIO_PINS(38); +DECLARE_IPQ_GPIO_PINS(39); +DECLARE_IPQ_GPIO_PINS(40); +DECLARE_IPQ_GPIO_PINS(41); +DECLARE_IPQ_GPIO_PINS(42); +DECLARE_IPQ_GPIO_PINS(43); +DECLARE_IPQ_GPIO_PINS(44); +DECLARE_IPQ_GPIO_PINS(45); +DECLARE_IPQ_GPIO_PINS(46); +DECLARE_IPQ_GPIO_PINS(47); +DECLARE_IPQ_GPIO_PINS(48); +DECLARE_IPQ_GPIO_PINS(49); +DECLARE_IPQ_GPIO_PINS(50); +DECLARE_IPQ_GPIO_PINS(51); +DECLARE_IPQ_GPIO_PINS(52); +DECLARE_IPQ_GPIO_PINS(53); +DECLARE_IPQ_GPIO_PINS(54); +DECLARE_IPQ_GPIO_PINS(55); +DECLARE_IPQ_GPIO_PINS(56); +DECLARE_IPQ_GPIO_PINS(57); +DECLARE_IPQ_GPIO_PINS(58); +DECLARE_IPQ_GPIO_PINS(59); +DECLARE_IPQ_GPIO_PINS(60); +DECLARE_IPQ_GPIO_PINS(61); +DECLARE_IPQ_GPIO_PINS(62); +DECLARE_IPQ_GPIO_PINS(63); +DECLARE_IPQ_GPIO_PINS(64); +DECLARE_IPQ_GPIO_PINS(65); +DECLARE_IPQ_GPIO_PINS(66); +DECLARE_IPQ_GPIO_PINS(67); +DECLARE_IPQ_GPIO_PINS(68); + +static const unsigned int sdc3_clk_pins[] = { 69 }; +static const unsigned int sdc3_cmd_pins[] = { 70 }; +static const unsigned int sdc3_data_pins[] = { 71 }; + +#define FUNCTION(fname)					\ +	[IPQ_MUX_##fname] = {				\ +		.name = #fname,				\ +		.groups = fname##_groups,		\ +		.ngroups = ARRAY_SIZE(fname##_groups),	\ +	} + +#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \ +	{						\ +		.name = "gpio" #id,			\ +		.pins = gpio##id##_pins,		\ +		.npins = ARRAY_SIZE(gpio##id##_pins),	\ +		.funcs = (int[]){			\ +			IPQ_MUX_NA, /* gpio mode */	\ +			IPQ_MUX_##f1,			\ +			IPQ_MUX_##f2,			\ +			IPQ_MUX_##f3,			\ +			IPQ_MUX_##f4,			\ +			IPQ_MUX_##f5,			\ +			IPQ_MUX_##f6,			\ +			IPQ_MUX_##f7,			\ +			IPQ_MUX_##f8,			\ +			IPQ_MUX_##f9,			\ +			IPQ_MUX_##f10,			\ +		},					\ +		.nfuncs = 11,				\ +		.ctl_reg = 0x1000 + 0x10 * id,		\ +		.io_reg = 0x1004 + 0x10 * id,		\ +		.intr_cfg_reg = 0x1008 + 0x10 * id,	\ +		.intr_status_reg = 0x100c + 0x10 * id,	\ +		.intr_target_reg = 0x400 + 0x4 * id,	\ +		.mux_bit = 2,				\ +		.pull_bit = 0,				\ +		.drv_bit = 6,				\ +		.oe_bit = 9,				\ +		.in_bit = 0,				\ +		.out_bit = 1,				\ +		.intr_enable_bit = 0,			\ +		.intr_status_bit = 0,			\ +		.intr_ack_high = 1,			\ +		.intr_target_bit = 0,			\ +		.intr_raw_status_bit = 3,		\ +		.intr_polarity_bit = 1,			\ +		.intr_detection_bit = 2,		\ +		.intr_detection_width = 1,		\ +	} + +#define SDC_PINGROUP(pg_name, ctl, pull, drv)		\ +	{						\ +		.name = #pg_name,	                \ +		.pins = pg_name##_pins,                 \ +		.npins = ARRAY_SIZE(pg_name##_pins),    \ +		.ctl_reg = ctl,                         \ +		.io_reg = 0,                            \ +		.intr_cfg_reg = 0,                      \ +		.intr_status_reg = 0,                   \ +		.intr_target_reg = 0,                   \ +		.mux_bit = -1,                          \ +		.pull_bit = pull,                       \ +		.drv_bit = drv,                         \ +		.oe_bit = -1,                           \ +		.in_bit = -1,                           \ +		.out_bit = -1,                          \ +		.intr_enable_bit = -1,                  \ +		.intr_status_bit = -1,                  \ +		.intr_target_bit = -1,                  \ +		.intr_raw_status_bit = -1,              \ +		.intr_polarity_bit = -1,                \ +		.intr_detection_bit = -1,               \ +		.intr_detection_width = -1,             \ +	} + +enum ipq8064_functions { +	IPQ_MUX_mdio, +	IPQ_MUX_mi2s, +	IPQ_MUX_pdm, +	IPQ_MUX_ssbi, +	IPQ_MUX_spmi, +	IPQ_MUX_audio_pcm, +	IPQ_MUX_gsbi1, +	IPQ_MUX_gsbi2, +	IPQ_MUX_gsbi4, +	IPQ_MUX_gsbi5, +	IPQ_MUX_gsbi5_spi_cs1, +	IPQ_MUX_gsbi5_spi_cs2, +	IPQ_MUX_gsbi5_spi_cs3, +	IPQ_MUX_gsbi6, +	IPQ_MUX_gsbi7, +	IPQ_MUX_nss_spi, +	IPQ_MUX_sdc1, +	IPQ_MUX_spdif, +	IPQ_MUX_nand, +	IPQ_MUX_tsif1, +	IPQ_MUX_tsif2, +	IPQ_MUX_usb_fs_n, +	IPQ_MUX_usb_fs, +	IPQ_MUX_usb2_hsic, +	IPQ_MUX_rgmii2, +	IPQ_MUX_sata, +	IPQ_MUX_pcie1_rst, +	IPQ_MUX_pcie1_prsnt, +	IPQ_MUX_pcie1_pwrflt, +	IPQ_MUX_pcie1_pwren_n, +	IPQ_MUX_pcie1_pwren, +	IPQ_MUX_pcie1_clk_req, +	IPQ_MUX_pcie2_rst, +	IPQ_MUX_pcie2_prsnt, +	IPQ_MUX_pcie2_pwrflt, +	IPQ_MUX_pcie2_pwren_n, +	IPQ_MUX_pcie2_pwren, +	IPQ_MUX_pcie2_clk_req, +	IPQ_MUX_pcie3_rst, +	IPQ_MUX_pcie3_prsnt, +	IPQ_MUX_pcie3_pwrflt, +	IPQ_MUX_pcie3_pwren_n, +	IPQ_MUX_pcie3_pwren, +	IPQ_MUX_pcie3_clk_req, +	IPQ_MUX_ps_hold, +	IPQ_MUX_NA, +}; + +static const char * const mdio_groups[] = { +	"gpio0", "gpio1", "gpio10", "gpio11", +}; + +static const char * const mi2s_groups[] = { +	"gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32", +	"gpio33", "gpio55", "gpio56", "gpio57", "gpio58", +}; + +static const char * const pdm_groups[] = { +	"gpio3", "gpio16", "gpio17", "gpio22", "gpio30", "gpio31", +	"gpio34", "gpio35", "gpio52", "gpio55", "gpio56", "gpio58", +	"gpio59", +}; + +static const char * const ssbi_groups[] = { +	"gpio10", "gpio11", +}; + +static const char * const spmi_groups[] = { +	"gpio10", "gpio11", +}; + +static const char * const audio_pcm_groups[] = { +	"gpio14", "gpio15", "gpio16", "gpio17", +}; + +static const char * const gsbi1_groups[] = { +	"gpio51", "gpio52", "gpio53", "gpio54", +}; + +static const char * const gsbi2_groups[] = { +	"gpio22", "gpio23", "gpio24", "gpio25", +}; + +static const char * const gsbi4_groups[] = { +	"gpio10", "gpio11", "gpio12", "gpio13", +}; + +static const char * const gsbi5_groups[] = { +	"gpio18", "gpio19", "gpio20", "gpio21", +}; + +static const char * const gsbi5_spi_cs1_groups[] = { +	"gpio6", "gpio61", +}; + +static const char * const gsbi5_spi_cs2_groups[] = { +	"gpio7", "gpio62", +}; + +static const char * const gsbi5_spi_cs3_groups[] = { +	"gpio2", +}; + +static const char * const gsbi6_groups[] = { +	"gpio27", "gpio28", "gpio29", "gpio30", "gpio55", "gpio56", +	"gpio57", "gpio58", +}; + +static const char * const gsbi7_groups[] = { +	"gpio6", "gpio7", "gpio8", "gpio9", +}; + +static const char * const nss_spi_groups[] = { +	"gpio14", "gpio15", "gpio16", "gpio17", "gpio55", "gpio56", +	"gpio57", "gpio58", +}; + +static const char * const sdc1_groups[] = { +	"gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43", +	"gpio44", "gpio45", "gpio46", "gpio47", +}; + +static const char * const spdif_groups[] = { +	"gpio10", "gpio48", +}; + +static const char * const nand_groups[] = { +	"gpio34", "gpio35", "gpio36", "gpio37", "gpio38", "gpio39", +	"gpio40", "gpio41", "gpio42", "gpio43", "gpio44", "gpio45", +	"gpio46", "gpio47", +}; + +static const char * const tsif1_groups[] = { +	"gpio55", "gpio56", "gpio57", "gpio58", +}; + +static const char * const tsif2_groups[] = { +	"gpio59", "gpio60", "gpio61", "gpio62", +}; + +static const char * const usb_fs_n_groups[] = { +	"gpio6", +}; + +static const char * const usb_fs_groups[] = { +	"gpio6", "gpio7", "gpio8", +}; + +static const char * const usb2_hsic_groups[] = { +	"gpio67", "gpio68", +}; + +static const char * const rgmii2_groups[] = { +	"gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32", +	"gpio51", "gpio52", "gpio59", "gpio60", "gpio61", "gpio62", +}; + +static const char * const sata_groups[] = { +	"gpio10", +}; + +static const char * const pcie1_rst_groups[] = { +	"gpio3", +}; + +static const char * const pcie1_prsnt_groups[] = { +	"gpio3", "gpio11", +}; + +static const char * const pcie1_pwren_n_groups[] = { +	"gpio4", "gpio12", +}; + +static const char * const pcie1_pwren_groups[] = { +	"gpio4", "gpio12", +}; + +static const char * const pcie1_pwrflt_groups[] = { +	"gpio5", "gpio13", +}; + +static const char * const pcie1_clk_req_groups[] = { +	"gpio5", +}; + +static const char * const pcie2_rst_groups[] = { +	"gpio48", +}; + +static const char * const pcie2_prsnt_groups[] = { +	"gpio11", "gpio48", +}; + +static const char * const pcie2_pwren_n_groups[] = { +	"gpio12", "gpio49", +}; + +static const char * const pcie2_pwren_groups[] = { +	"gpio12", "gpio49", +}; + +static const char * const pcie2_pwrflt_groups[] = { +	"gpio13", "gpio50", +}; + +static const char * const pcie2_clk_req_groups[] = { +	"gpio50", +}; + +static const char * const pcie3_rst_groups[] = { +	"gpio63", +}; + +static const char * const pcie3_prsnt_groups[] = { +	"gpio11", +}; + +static const char * const pcie3_pwren_n_groups[] = { +	"gpio12", +}; + +static const char * const pcie3_pwren_groups[] = { +	"gpio12", +}; + +static const char * const pcie3_pwrflt_groups[] = { +	"gpio13", +}; + +static const char * const pcie3_clk_req_groups[] = { +	"gpio65", +}; + +static const char * const ps_hold_groups[] = { +	"gpio26", +}; + +static const struct msm_function ipq8064_functions[] = { +	FUNCTION(mdio), +	FUNCTION(ssbi), +	FUNCTION(spmi), +	FUNCTION(mi2s), +	FUNCTION(pdm), +	FUNCTION(audio_pcm), +	FUNCTION(gsbi1), +	FUNCTION(gsbi2), +	FUNCTION(gsbi4), +	FUNCTION(gsbi5), +	FUNCTION(gsbi5_spi_cs1), +	FUNCTION(gsbi5_spi_cs2), +	FUNCTION(gsbi5_spi_cs3), +	FUNCTION(gsbi6), +	FUNCTION(gsbi7), +	FUNCTION(nss_spi), +	FUNCTION(sdc1), +	FUNCTION(spdif), +	FUNCTION(nand), +	FUNCTION(tsif1), +	FUNCTION(tsif2), +	FUNCTION(usb_fs_n), +	FUNCTION(usb_fs), +	FUNCTION(usb2_hsic), +	FUNCTION(rgmii2), +	FUNCTION(sata), +	FUNCTION(pcie1_rst), +	FUNCTION(pcie1_prsnt), +	FUNCTION(pcie1_pwren_n), +	FUNCTION(pcie1_pwren), +	FUNCTION(pcie1_pwrflt), +	FUNCTION(pcie1_clk_req), +	FUNCTION(pcie2_rst), +	FUNCTION(pcie2_prsnt), +	FUNCTION(pcie2_pwren_n), +	FUNCTION(pcie2_pwren), +	FUNCTION(pcie2_pwrflt), +	FUNCTION(pcie2_clk_req), +	FUNCTION(pcie3_rst), +	FUNCTION(pcie3_prsnt), +	FUNCTION(pcie3_pwren_n), +	FUNCTION(pcie3_pwren), +	FUNCTION(pcie3_pwrflt), +	FUNCTION(pcie3_clk_req), +	FUNCTION(ps_hold), +}; + +static const struct msm_pingroup ipq8064_groups[] = { +	PINGROUP(0, mdio, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(1, mdio, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(2, gsbi5_spi_cs3, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(3, pcie1_rst, pcie1_prsnt, pdm, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(4, pcie1_pwren_n, pcie1_pwren, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(5, pcie1_clk_req, pcie1_pwrflt, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(6, gsbi7, usb_fs, gsbi5_spi_cs1, usb_fs_n, NA, NA, NA, NA, NA, NA), +	PINGROUP(7, gsbi7, usb_fs, gsbi5_spi_cs2, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(8, gsbi7, usb_fs, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(9, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(10, gsbi4, spdif, sata, ssbi, mdio, spmi, NA, NA, NA, NA), +	PINGROUP(11, gsbi4, pcie2_prsnt, pcie1_prsnt, pcie3_prsnt, ssbi, mdio, spmi, NA, NA, NA), +	PINGROUP(12, gsbi4, pcie2_pwren_n, pcie1_pwren_n, pcie3_pwren_n, pcie2_pwren, pcie1_pwren, pcie3_pwren, NA, NA, NA), +	PINGROUP(13, gsbi4, pcie2_pwrflt, pcie1_pwrflt, pcie3_pwrflt, NA, NA, NA, NA, NA, NA), +	PINGROUP(14, audio_pcm, nss_spi, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(15, audio_pcm, nss_spi, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(16, audio_pcm, nss_spi, pdm, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(17, audio_pcm, nss_spi, pdm, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(18, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(19, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(20, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(21, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(22, gsbi2, pdm, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(23, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(24, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(25, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(26, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(27, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(28, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(29, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(30, mi2s, rgmii2, gsbi6, pdm, NA, NA, NA, NA, NA, NA), +	PINGROUP(31, mi2s, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(32, mi2s, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(33, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(34, nand, pdm, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(35, nand, pdm, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(36, nand, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(37, nand, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(38, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(39, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(40, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(41, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(42, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(43, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(44, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(45, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(46, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(47, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(48, pcie2_rst, spdif, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(49, pcie2_pwren_n, pcie2_pwren, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(50, pcie2_clk_req, pcie2_pwrflt, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(51, gsbi1, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(52, gsbi1, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(53, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(54, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(55, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA), +	PINGROUP(56, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA), +	PINGROUP(57, tsif1, mi2s, gsbi6, nss_spi, NA, NA, NA, NA, NA, NA), +	PINGROUP(58, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA), +	PINGROUP(59, tsif2, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(60, tsif2, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(61, tsif2, rgmii2, gsbi5_spi_cs1, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(62, tsif2, rgmii2, gsbi5_spi_cs2, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(63, pcie3_rst, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(64, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(65, pcie3_clk_req, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(66, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(67, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(68, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA), +	SDC_PINGROUP(sdc3_clk, 0x204a, 14, 6), +	SDC_PINGROUP(sdc3_cmd, 0x204a, 11, 3), +	SDC_PINGROUP(sdc3_data, 0x204a, 9, 0), +}; + +#define NUM_GPIO_PINGROUPS 69 + +static const struct msm_pinctrl_soc_data ipq8064_pinctrl = { +	.pins = ipq8064_pins, +	.npins = ARRAY_SIZE(ipq8064_pins), +	.functions = ipq8064_functions, +	.nfunctions = ARRAY_SIZE(ipq8064_functions), +	.groups = ipq8064_groups, +	.ngroups = ARRAY_SIZE(ipq8064_groups), +	.ngpios = NUM_GPIO_PINGROUPS, +}; + +static int ipq8064_pinctrl_probe(struct platform_device *pdev) +{ +	return msm_pinctrl_probe(pdev, &ipq8064_pinctrl); +} + +static const struct of_device_id ipq8064_pinctrl_of_match[] = { +	{ .compatible = "qcom,ipq8064-pinctrl", }, +	{ }, +}; + +static struct platform_driver ipq8064_pinctrl_driver = { +	.driver = { +		.name = "ipq8064-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = ipq8064_pinctrl_of_match, +	}, +	.probe = ipq8064_pinctrl_probe, +	.remove = msm_pinctrl_remove, +}; + +static int __init ipq8064_pinctrl_init(void) +{ +	return platform_driver_register(&ipq8064_pinctrl_driver); +} +arch_initcall(ipq8064_pinctrl_init); + +static void __exit ipq8064_pinctrl_exit(void) +{ +	platform_driver_unregister(&ipq8064_pinctrl_driver); +} +module_exit(ipq8064_pinctrl_exit); + +MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>"); +MODULE_DESCRIPTION("Qualcomm IPQ8064 pinctrl driver"); +MODULE_LICENSE("GPL v2"); +MODULE_DEVICE_TABLE(of, ipq8064_pinctrl_of_match); diff --git a/drivers/pinctrl/pinctrl-lantiq.h b/drivers/pinctrl/pinctrl-lantiq.h index 6d07f023853..c7cfad5527d 100644 --- a/drivers/pinctrl/pinctrl-lantiq.h +++ b/drivers/pinctrl/pinctrl-lantiq.h @@ -10,6 +10,7 @@   */  #ifndef __PINCTRL_LANTIQ_H +#define __PINCTRL_LANTIQ_H  #include <linux/clkdev.h>  #include <linux/pinctrl/pinctrl.h> diff --git a/drivers/pinctrl/pinctrl-msm.c b/drivers/pinctrl/pinctrl-msm.c new file mode 100644 index 00000000000..df6dda4ce80 --- /dev/null +++ b/drivers/pinctrl/pinctrl-msm.c @@ -0,0 +1,939 @@ +/* + * Copyright (c) 2013, Sony Mobile Communications AB. + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only 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 <linux/err.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/machine.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/pinctrl/pinconf.h> +#include <linux/pinctrl/pinconf-generic.h> +#include <linux/slab.h> +#include <linux/gpio.h> +#include <linux/interrupt.h> +#include <linux/spinlock.h> + +#include "core.h" +#include "pinconf.h" +#include "pinctrl-msm.h" +#include "pinctrl-utils.h" + +#define MAX_NR_GPIO 300 + +/** + * struct msm_pinctrl - state for a pinctrl-msm device + * @dev:            device handle. + * @pctrl:          pinctrl handle. + * @chip:           gpiochip handle. + * @irq:            parent irq for the TLMM irq_chip. + * @lock:           Spinlock to protect register resources as well + *                  as msm_pinctrl data structures. + * @enabled_irqs:   Bitmap of currently enabled irqs. + * @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge + *                  detection. + * @soc;            Reference to soc_data of platform specific data. + * @regs:           Base address for the TLMM register map. + */ +struct msm_pinctrl { +	struct device *dev; +	struct pinctrl_dev *pctrl; +	struct gpio_chip chip; +	int irq; + +	spinlock_t lock; + +	DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO); +	DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO); + +	const struct msm_pinctrl_soc_data *soc; +	void __iomem *regs; +}; + +static inline struct msm_pinctrl *to_msm_pinctrl(struct gpio_chip *gc) +{ +	return container_of(gc, struct msm_pinctrl, chip); +} + +static int msm_get_groups_count(struct pinctrl_dev *pctldev) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pctrl->soc->ngroups; +} + +static const char *msm_get_group_name(struct pinctrl_dev *pctldev, +				      unsigned group) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pctrl->soc->groups[group].name; +} + +static int msm_get_group_pins(struct pinctrl_dev *pctldev, +			      unsigned group, +			      const unsigned **pins, +			      unsigned *num_pins) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); + +	*pins = pctrl->soc->groups[group].pins; +	*num_pins = pctrl->soc->groups[group].npins; +	return 0; +} + +static const struct pinctrl_ops msm_pinctrl_ops = { +	.get_groups_count	= msm_get_groups_count, +	.get_group_name		= msm_get_group_name, +	.get_group_pins		= msm_get_group_pins, +	.dt_node_to_map		= pinconf_generic_dt_node_to_map_group, +	.dt_free_map		= pinctrl_utils_dt_free_map, +}; + +static int msm_get_functions_count(struct pinctrl_dev *pctldev) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pctrl->soc->nfunctions; +} + +static const char *msm_get_function_name(struct pinctrl_dev *pctldev, +					 unsigned function) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); + +	return pctrl->soc->functions[function].name; +} + +static int msm_get_function_groups(struct pinctrl_dev *pctldev, +				   unsigned function, +				   const char * const **groups, +				   unsigned * const num_groups) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); + +	*groups = pctrl->soc->functions[function].groups; +	*num_groups = pctrl->soc->functions[function].ngroups; +	return 0; +} + +static int msm_pinmux_enable(struct pinctrl_dev *pctldev, +			     unsigned function, +			     unsigned group) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); +	const struct msm_pingroup *g; +	unsigned long flags; +	u32 val; +	int i; + +	g = &pctrl->soc->groups[group]; + +	if (WARN_ON(g->mux_bit < 0)) +		return -EINVAL; + +	for (i = 0; i < g->nfuncs; i++) { +		if (g->funcs[i] == function) +			break; +	} + +	if (WARN_ON(i == g->nfuncs)) +		return -EINVAL; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->ctl_reg); +	val &= ~(0x7 << g->mux_bit); +	val |= i << g->mux_bit; +	writel(val, pctrl->regs + g->ctl_reg); + +	spin_unlock_irqrestore(&pctrl->lock, flags); + +	return 0; +} + +static void msm_pinmux_disable(struct pinctrl_dev *pctldev, +			       unsigned function, +			       unsigned group) +{ +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); +	const struct msm_pingroup *g; +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[group]; + +	if (WARN_ON(g->mux_bit < 0)) +		return; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	/* Clear the mux bits to select gpio mode */ +	val = readl(pctrl->regs + g->ctl_reg); +	val &= ~(0x7 << g->mux_bit); +	writel(val, pctrl->regs + g->ctl_reg); + +	spin_unlock_irqrestore(&pctrl->lock, flags); +} + +static const struct pinmux_ops msm_pinmux_ops = { +	.get_functions_count	= msm_get_functions_count, +	.get_function_name	= msm_get_function_name, +	.get_function_groups	= msm_get_function_groups, +	.enable			= msm_pinmux_enable, +	.disable		= msm_pinmux_disable, +}; + +static int msm_config_reg(struct msm_pinctrl *pctrl, +			  const struct msm_pingroup *g, +			  unsigned param, +			  unsigned *mask, +			  unsigned *bit) +{ +	switch (param) { +	case PIN_CONFIG_BIAS_DISABLE: +	case PIN_CONFIG_BIAS_PULL_DOWN: +	case PIN_CONFIG_BIAS_PULL_UP: +		*bit = g->pull_bit; +		*mask = 3; +		break; +	case PIN_CONFIG_DRIVE_STRENGTH: +		*bit = g->drv_bit; +		*mask = 7; +		break; +	case PIN_CONFIG_OUTPUT: +		*bit = g->oe_bit; +		*mask = 1; +		break; +	default: +		dev_err(pctrl->dev, "Invalid config param %04x\n", param); +		return -ENOTSUPP; +	} + +	return 0; +} + +static int msm_config_get(struct pinctrl_dev *pctldev, +			  unsigned int pin, +			  unsigned long *config) +{ +	dev_err(pctldev->dev, "pin_config_set op not supported\n"); +	return -ENOTSUPP; +} + +static int msm_config_set(struct pinctrl_dev *pctldev, unsigned int pin, +				unsigned long *configs, unsigned num_configs) +{ +	dev_err(pctldev->dev, "pin_config_set op not supported\n"); +	return -ENOTSUPP; +} + +#define MSM_NO_PULL	0 +#define MSM_PULL_DOWN	1 +#define MSM_PULL_UP	3 + +static unsigned msm_regval_to_drive(u32 val) +{ +	return (val + 1) * 2; +} + +static int msm_config_group_get(struct pinctrl_dev *pctldev, +				unsigned int group, +				unsigned long *config) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); +	unsigned param = pinconf_to_config_param(*config); +	unsigned mask; +	unsigned arg; +	unsigned bit; +	int ret; +	u32 val; + +	g = &pctrl->soc->groups[group]; + +	ret = msm_config_reg(pctrl, g, param, &mask, &bit); +	if (ret < 0) +		return ret; + +	val = readl(pctrl->regs + g->ctl_reg); +	arg = (val >> bit) & mask; + +	/* Convert register value to pinconf value */ +	switch (param) { +	case PIN_CONFIG_BIAS_DISABLE: +		arg = arg == MSM_NO_PULL; +		break; +	case PIN_CONFIG_BIAS_PULL_DOWN: +		arg = arg == MSM_PULL_DOWN; +		break; +	case PIN_CONFIG_BIAS_PULL_UP: +		arg = arg == MSM_PULL_UP; +		break; +	case PIN_CONFIG_DRIVE_STRENGTH: +		arg = msm_regval_to_drive(arg); +		break; +	case PIN_CONFIG_OUTPUT: +		/* Pin is not output */ +		if (!arg) +			return -EINVAL; + +		val = readl(pctrl->regs + g->io_reg); +		arg = !!(val & BIT(g->in_bit)); +		break; +	default: +		dev_err(pctrl->dev, "Unsupported config parameter: %x\n", +			param); +		return -EINVAL; +	} + +	*config = pinconf_to_config_packed(param, arg); + +	return 0; +} + +static int msm_config_group_set(struct pinctrl_dev *pctldev, +				unsigned group, +				unsigned long *configs, +				unsigned num_configs) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); +	unsigned long flags; +	unsigned param; +	unsigned mask; +	unsigned arg; +	unsigned bit; +	int ret; +	u32 val; +	int i; + +	g = &pctrl->soc->groups[group]; + +	for (i = 0; i < num_configs; i++) { +		param = pinconf_to_config_param(configs[i]); +		arg = pinconf_to_config_argument(configs[i]); + +		ret = msm_config_reg(pctrl, g, param, &mask, &bit); +		if (ret < 0) +			return ret; + +		/* Convert pinconf values to register values */ +		switch (param) { +		case PIN_CONFIG_BIAS_DISABLE: +			arg = MSM_NO_PULL; +			break; +		case PIN_CONFIG_BIAS_PULL_DOWN: +			arg = MSM_PULL_DOWN; +			break; +		case PIN_CONFIG_BIAS_PULL_UP: +			arg = MSM_PULL_UP; +			break; +		case PIN_CONFIG_DRIVE_STRENGTH: +			/* Check for invalid values */ +			if (arg > 16 || arg < 2 || (arg % 2) != 0) +				arg = -1; +			else +				arg = (arg / 2) - 1; +			break; +		case PIN_CONFIG_OUTPUT: +			/* set output value */ +			spin_lock_irqsave(&pctrl->lock, flags); +			val = readl(pctrl->regs + g->io_reg); +			if (arg) +				val |= BIT(g->out_bit); +			else +				val &= ~BIT(g->out_bit); +			writel(val, pctrl->regs + g->io_reg); +			spin_unlock_irqrestore(&pctrl->lock, flags); + +			/* enable output */ +			arg = 1; +			break; +		default: +			dev_err(pctrl->dev, "Unsupported config parameter: %x\n", +				param); +			return -EINVAL; +		} + +		/* Range-check user-supplied value */ +		if (arg & ~mask) { +			dev_err(pctrl->dev, "config %x: %x is invalid\n", param, arg); +			return -EINVAL; +		} + +		spin_lock_irqsave(&pctrl->lock, flags); +		val = readl(pctrl->regs + g->ctl_reg); +		val &= ~(mask << bit); +		val |= arg << bit; +		writel(val, pctrl->regs + g->ctl_reg); +		spin_unlock_irqrestore(&pctrl->lock, flags); +	} + +	return 0; +} + +static const struct pinconf_ops msm_pinconf_ops = { +	.pin_config_get		= msm_config_get, +	.pin_config_set		= msm_config_set, +	.pin_config_group_get	= msm_config_group_get, +	.pin_config_group_set	= msm_config_group_set, +}; + +static struct pinctrl_desc msm_pinctrl_desc = { +	.pctlops = &msm_pinctrl_ops, +	.pmxops = &msm_pinmux_ops, +	.confops = &msm_pinconf_ops, +	.owner = THIS_MODULE, +}; + +static int msm_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[offset]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->ctl_reg); +	val &= ~BIT(g->oe_bit); +	writel(val, pctrl->regs + g->ctl_reg); + +	spin_unlock_irqrestore(&pctrl->lock, flags); + +	return 0; +} + +static int msm_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[offset]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->io_reg); +	if (value) +		val |= BIT(g->out_bit); +	else +		val &= ~BIT(g->out_bit); +	writel(val, pctrl->regs + g->io_reg); + +	val = readl(pctrl->regs + g->ctl_reg); +	val |= BIT(g->oe_bit); +	writel(val, pctrl->regs + g->ctl_reg); + +	spin_unlock_irqrestore(&pctrl->lock, flags); + +	return 0; +} + +static int msm_gpio_get(struct gpio_chip *chip, unsigned offset) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); +	u32 val; + +	g = &pctrl->soc->groups[offset]; + +	val = readl(pctrl->regs + g->io_reg); +	return !!(val & BIT(g->in_bit)); +} + +static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[offset]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->io_reg); +	if (value) +		val |= BIT(g->out_bit); +	else +		val &= ~BIT(g->out_bit); +	writel(val, pctrl->regs + g->io_reg); + +	spin_unlock_irqrestore(&pctrl->lock, flags); +} + +static int msm_gpio_request(struct gpio_chip *chip, unsigned offset) +{ +	int gpio = chip->base + offset; +	return pinctrl_request_gpio(gpio); +} + +static void msm_gpio_free(struct gpio_chip *chip, unsigned offset) +{ +	int gpio = chip->base + offset; +	return pinctrl_free_gpio(gpio); +} + +#ifdef CONFIG_DEBUG_FS +#include <linux/seq_file.h> + +static void msm_gpio_dbg_show_one(struct seq_file *s, +				  struct pinctrl_dev *pctldev, +				  struct gpio_chip *chip, +				  unsigned offset, +				  unsigned gpio) +{ +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip); +	unsigned func; +	int is_out; +	int drive; +	int pull; +	u32 ctl_reg; + +	static const char * const pulls[] = { +		"no pull", +		"pull down", +		"keeper", +		"pull up" +	}; + +	g = &pctrl->soc->groups[offset]; +	ctl_reg = readl(pctrl->regs + g->ctl_reg); + +	is_out = !!(ctl_reg & BIT(g->oe_bit)); +	func = (ctl_reg >> g->mux_bit) & 7; +	drive = (ctl_reg >> g->drv_bit) & 7; +	pull = (ctl_reg >> g->pull_bit) & 3; + +	seq_printf(s, " %-8s: %-3s %d", g->name, is_out ? "out" : "in", func); +	seq_printf(s, " %dmA", msm_regval_to_drive(drive)); +	seq_printf(s, " %s", pulls[pull]); +} + +static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) +{ +	unsigned gpio = chip->base; +	unsigned i; + +	for (i = 0; i < chip->ngpio; i++, gpio++) { +		msm_gpio_dbg_show_one(s, NULL, chip, i, gpio); +		seq_puts(s, "\n"); +	} +} + +#else +#define msm_gpio_dbg_show NULL +#endif + +static struct gpio_chip msm_gpio_template = { +	.direction_input  = msm_gpio_direction_input, +	.direction_output = msm_gpio_direction_output, +	.get              = msm_gpio_get, +	.set              = msm_gpio_set, +	.request          = msm_gpio_request, +	.free             = msm_gpio_free, +	.dbg_show         = msm_gpio_dbg_show, +}; + +/* For dual-edge interrupts in software, since some hardware has no + * such support: + * + * At appropriate moments, this function may be called to flip the polarity + * settings of both-edge irq lines to try and catch the next edge. + * + * The attempt is considered successful if: + * - the status bit goes high, indicating that an edge was caught, or + * - the input value of the gpio doesn't change during the attempt. + * If the value changes twice during the process, that would cause the first + * test to fail but would force the second, as two opposite + * transitions would cause a detection no matter the polarity setting. + * + * The do-loop tries to sledge-hammer closed the timing hole between + * the initial value-read and the polarity-write - if the line value changes + * during that window, an interrupt is lost, the new polarity setting is + * incorrect, and the first success test will fail, causing a retry. + * + * Algorithm comes from Google's msmgpio driver. + */ +static void msm_gpio_update_dual_edge_pos(struct msm_pinctrl *pctrl, +					  const struct msm_pingroup *g, +					  struct irq_data *d) +{ +	int loop_limit = 100; +	unsigned val, val2, intstat; +	unsigned pol; + +	do { +		val = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit); + +		pol = readl(pctrl->regs + g->intr_cfg_reg); +		pol ^= BIT(g->intr_polarity_bit); +		writel(pol, pctrl->regs + g->intr_cfg_reg); + +		val2 = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit); +		intstat = readl(pctrl->regs + g->intr_status_reg); +		if (intstat || (val == val2)) +			return; +	} while (loop_limit-- > 0); +	dev_err(pctrl->dev, "dual-edge irq failed to stabilize, %#08x != %#08x\n", +		val, val2); +} + +static void msm_gpio_irq_mask(struct irq_data *d) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct msm_pinctrl *pctrl = to_msm_pinctrl(gc); +	const struct msm_pingroup *g; +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[d->hwirq]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->intr_cfg_reg); +	val &= ~BIT(g->intr_enable_bit); +	writel(val, pctrl->regs + g->intr_cfg_reg); + +	clear_bit(d->hwirq, pctrl->enabled_irqs); + +	spin_unlock_irqrestore(&pctrl->lock, flags); +} + +static void msm_gpio_irq_unmask(struct irq_data *d) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct msm_pinctrl *pctrl = to_msm_pinctrl(gc); +	const struct msm_pingroup *g; +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[d->hwirq]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->intr_status_reg); +	val &= ~BIT(g->intr_status_bit); +	writel(val, pctrl->regs + g->intr_status_reg); + +	val = readl(pctrl->regs + g->intr_cfg_reg); +	val |= BIT(g->intr_enable_bit); +	writel(val, pctrl->regs + g->intr_cfg_reg); + +	set_bit(d->hwirq, pctrl->enabled_irqs); + +	spin_unlock_irqrestore(&pctrl->lock, flags); +} + +static void msm_gpio_irq_ack(struct irq_data *d) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct msm_pinctrl *pctrl = to_msm_pinctrl(gc); +	const struct msm_pingroup *g; +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[d->hwirq]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	val = readl(pctrl->regs + g->intr_status_reg); +	if (g->intr_ack_high) +		val |= BIT(g->intr_status_bit); +	else +		val &= ~BIT(g->intr_status_bit); +	writel(val, pctrl->regs + g->intr_status_reg); + +	if (test_bit(d->hwirq, pctrl->dual_edge_irqs)) +		msm_gpio_update_dual_edge_pos(pctrl, g, d); + +	spin_unlock_irqrestore(&pctrl->lock, flags); +} + +#define INTR_TARGET_PROC_APPS    4 + +static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct msm_pinctrl *pctrl = to_msm_pinctrl(gc); +	const struct msm_pingroup *g; +	unsigned long flags; +	u32 val; + +	g = &pctrl->soc->groups[d->hwirq]; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	/* +	 * For hw without possibility of detecting both edges +	 */ +	if (g->intr_detection_width == 1 && type == IRQ_TYPE_EDGE_BOTH) +		set_bit(d->hwirq, pctrl->dual_edge_irqs); +	else +		clear_bit(d->hwirq, pctrl->dual_edge_irqs); + +	/* Route interrupts to application cpu */ +	val = readl(pctrl->regs + g->intr_target_reg); +	val &= ~(7 << g->intr_target_bit); +	val |= INTR_TARGET_PROC_APPS << g->intr_target_bit; +	writel(val, pctrl->regs + g->intr_target_reg); + +	/* Update configuration for gpio. +	 * RAW_STATUS_EN is left on for all gpio irqs. Due to the +	 * internal circuitry of TLMM, toggling the RAW_STATUS +	 * could cause the INTR_STATUS to be set for EDGE interrupts. +	 */ +	val = readl(pctrl->regs + g->intr_cfg_reg); +	val |= BIT(g->intr_raw_status_bit); +	if (g->intr_detection_width == 2) { +		val &= ~(3 << g->intr_detection_bit); +		val &= ~(1 << g->intr_polarity_bit); +		switch (type) { +		case IRQ_TYPE_EDGE_RISING: +			val |= 1 << g->intr_detection_bit; +			val |= BIT(g->intr_polarity_bit); +			break; +		case IRQ_TYPE_EDGE_FALLING: +			val |= 2 << g->intr_detection_bit; +			val |= BIT(g->intr_polarity_bit); +			break; +		case IRQ_TYPE_EDGE_BOTH: +			val |= 3 << g->intr_detection_bit; +			val |= BIT(g->intr_polarity_bit); +			break; +		case IRQ_TYPE_LEVEL_LOW: +			break; +		case IRQ_TYPE_LEVEL_HIGH: +			val |= BIT(g->intr_polarity_bit); +			break; +		} +	} else if (g->intr_detection_width == 1) { +		val &= ~(1 << g->intr_detection_bit); +		val &= ~(1 << g->intr_polarity_bit); +		switch (type) { +		case IRQ_TYPE_EDGE_RISING: +			val |= BIT(g->intr_detection_bit); +			val |= BIT(g->intr_polarity_bit); +			break; +		case IRQ_TYPE_EDGE_FALLING: +			val |= BIT(g->intr_detection_bit); +			break; +		case IRQ_TYPE_EDGE_BOTH: +			val |= BIT(g->intr_detection_bit); +			val |= BIT(g->intr_polarity_bit); +			break; +		case IRQ_TYPE_LEVEL_LOW: +			break; +		case IRQ_TYPE_LEVEL_HIGH: +			val |= BIT(g->intr_polarity_bit); +			break; +		} +	} else { +		BUG(); +	} +	writel(val, pctrl->regs + g->intr_cfg_reg); + +	if (test_bit(d->hwirq, pctrl->dual_edge_irqs)) +		msm_gpio_update_dual_edge_pos(pctrl, g, d); + +	spin_unlock_irqrestore(&pctrl->lock, flags); + +	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) +		__irq_set_handler_locked(d->irq, handle_level_irq); +	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) +		__irq_set_handler_locked(d->irq, handle_edge_irq); + +	return 0; +} + +static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct msm_pinctrl *pctrl = to_msm_pinctrl(gc); +	unsigned long flags; + +	spin_lock_irqsave(&pctrl->lock, flags); + +	irq_set_irq_wake(pctrl->irq, on); + +	spin_unlock_irqrestore(&pctrl->lock, flags); + +	return 0; +} + +static struct irq_chip msm_gpio_irq_chip = { +	.name           = "msmgpio", +	.irq_mask       = msm_gpio_irq_mask, +	.irq_unmask     = msm_gpio_irq_unmask, +	.irq_ack        = msm_gpio_irq_ack, +	.irq_set_type   = msm_gpio_irq_set_type, +	.irq_set_wake   = msm_gpio_irq_set_wake, +}; + +static void msm_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) +{ +	struct gpio_chip *gc = irq_desc_get_handler_data(desc); +	const struct msm_pingroup *g; +	struct msm_pinctrl *pctrl = to_msm_pinctrl(gc); +	struct irq_chip *chip = irq_get_chip(irq); +	int irq_pin; +	int handled = 0; +	u32 val; +	int i; + +	chained_irq_enter(chip, desc); + +	/* +	 * Each pin has it's own IRQ status register, so use +	 * enabled_irq bitmap to limit the number of reads. +	 */ +	for_each_set_bit(i, pctrl->enabled_irqs, pctrl->chip.ngpio) { +		g = &pctrl->soc->groups[i]; +		val = readl(pctrl->regs + g->intr_status_reg); +		if (val & BIT(g->intr_status_bit)) { +			irq_pin = irq_find_mapping(gc->irqdomain, i); +			generic_handle_irq(irq_pin); +			handled++; +		} +	} + +	/* No interrupts were flagged */ +	if (handled == 0) +		handle_bad_irq(irq, desc); + +	chained_irq_exit(chip, desc); +} + +static int msm_gpio_init(struct msm_pinctrl *pctrl) +{ +	struct gpio_chip *chip; +	int ret; +	unsigned ngpio = pctrl->soc->ngpios; + +	if (WARN_ON(ngpio > MAX_NR_GPIO)) +		return -EINVAL; + +	chip = &pctrl->chip; +	chip->base = 0; +	chip->ngpio = ngpio; +	chip->label = dev_name(pctrl->dev); +	chip->dev = pctrl->dev; +	chip->owner = THIS_MODULE; +	chip->of_node = pctrl->dev->of_node; + +	ret = gpiochip_add(&pctrl->chip); +	if (ret) { +		dev_err(pctrl->dev, "Failed register gpiochip\n"); +		return ret; +	} + +	ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio); +	if (ret) { +		dev_err(pctrl->dev, "Failed to add pin range\n"); +		return ret; +	} + +	ret = gpiochip_irqchip_add(chip, +				   &msm_gpio_irq_chip, +				   0, +				   handle_edge_irq, +				   IRQ_TYPE_NONE); +	if (ret) { +		dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n"); +		return -ENOSYS; +	} + +	gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip, pctrl->irq, +				     msm_gpio_irq_handler); + +	return 0; +} + +int msm_pinctrl_probe(struct platform_device *pdev, +		      const struct msm_pinctrl_soc_data *soc_data) +{ +	struct msm_pinctrl *pctrl; +	struct resource *res; +	int ret; + +	pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); +	if (!pctrl) { +		dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n"); +		return -ENOMEM; +	} +	pctrl->dev = &pdev->dev; +	pctrl->soc = soc_data; +	pctrl->chip = msm_gpio_template; + +	spin_lock_init(&pctrl->lock); + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	pctrl->regs = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(pctrl->regs)) +		return PTR_ERR(pctrl->regs); + +	pctrl->irq = platform_get_irq(pdev, 0); +	if (pctrl->irq < 0) { +		dev_err(&pdev->dev, "No interrupt defined for msmgpio\n"); +		return pctrl->irq; +	} + +	msm_pinctrl_desc.name = dev_name(&pdev->dev); +	msm_pinctrl_desc.pins = pctrl->soc->pins; +	msm_pinctrl_desc.npins = pctrl->soc->npins; +	pctrl->pctrl = pinctrl_register(&msm_pinctrl_desc, &pdev->dev, pctrl); +	if (!pctrl->pctrl) { +		dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); +		return -ENODEV; +	} + +	ret = msm_gpio_init(pctrl); +	if (ret) { +		pinctrl_unregister(pctrl->pctrl); +		return ret; +	} + +	platform_set_drvdata(pdev, pctrl); + +	dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n"); + +	return 0; +} +EXPORT_SYMBOL(msm_pinctrl_probe); + +int msm_pinctrl_remove(struct platform_device *pdev) +{ +	struct msm_pinctrl *pctrl = platform_get_drvdata(pdev); +	int ret; + +	ret = gpiochip_remove(&pctrl->chip); +	if (ret) { +		dev_err(&pdev->dev, "Failed to remove gpiochip\n"); +		return ret; +	} + +	pinctrl_unregister(pctrl->pctrl); + +	return 0; +} +EXPORT_SYMBOL(msm_pinctrl_remove); + diff --git a/drivers/pinctrl/pinctrl-msm.h b/drivers/pinctrl/pinctrl-msm.h new file mode 100644 index 00000000000..7b2a227a590 --- /dev/null +++ b/drivers/pinctrl/pinctrl-msm.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2013, Sony Mobile Communications AB. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only 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. + */ +#ifndef __PINCTRL_MSM_H__ +#define __PINCTRL_MSM_H__ + +struct pinctrl_pin_desc; + +/** + * struct msm_function - a pinmux function + * @name:    Name of the pinmux function. + * @groups:  List of pingroups for this function. + * @ngroups: Number of entries in @groups. + */ +struct msm_function { +	const char *name; +	const char * const *groups; +	unsigned ngroups; +}; + +/** + * struct msm_pingroup - Qualcomm pingroup definition + * @name:                 Name of the pingroup. + * @pins:	          A list of pins assigned to this pingroup. + * @npins:	          Number of entries in @pins. + * @funcs:                A list of pinmux functions that can be selected for + *                        this group. The index of the selected function is used + *                        for programming the function selector. + *                        Entries should be indices into the groups list of the + *                        struct msm_pinctrl_soc_data. + * @ctl_reg:              Offset of the register holding control bits for this group. + * @io_reg:               Offset of the register holding input/output bits for this group. + * @intr_cfg_reg:         Offset of the register holding interrupt configuration bits. + * @intr_status_reg:      Offset of the register holding the status bits for this group. + * @intr_target_reg:      Offset of the register specifying routing of the interrupts + *                        from this group. + * @mux_bit:              Offset in @ctl_reg for the pinmux function selection. + * @pull_bit:             Offset in @ctl_reg for the bias configuration. + * @drv_bit:              Offset in @ctl_reg for the drive strength configuration. + * @oe_bit:               Offset in @ctl_reg for controlling output enable. + * @in_bit:               Offset in @io_reg for the input bit value. + * @out_bit:              Offset in @io_reg for the output bit value. + * @intr_enable_bit:      Offset in @intr_cfg_reg for enabling the interrupt for this group. + * @intr_status_bit:      Offset in @intr_status_reg for reading and acking the interrupt + *                        status. + * @intr_target_bit:      Offset in @intr_target_reg for configuring the interrupt routing. + * @intr_raw_status_bit:  Offset in @intr_cfg_reg for the raw status bit. + * @intr_polarity_bit:    Offset in @intr_cfg_reg for specifying polarity of the interrupt. + * @intr_detection_bit:   Offset in @intr_cfg_reg for specifying interrupt type. + * @intr_detection_width: Number of bits used for specifying interrupt type, + *                        Should be 2 for SoCs that can detect both edges in hardware, + *                        otherwise 1. + */ +struct msm_pingroup { +	const char *name; +	const unsigned *pins; +	unsigned npins; + +	unsigned *funcs; +	unsigned nfuncs; + +	s16 ctl_reg; +	s16 io_reg; +	s16 intr_cfg_reg; +	s16 intr_status_reg; +	s16 intr_target_reg; + +	unsigned mux_bit:5; + +	unsigned pull_bit:5; +	unsigned drv_bit:5; + +	unsigned oe_bit:5; +	unsigned in_bit:5; +	unsigned out_bit:5; + +	unsigned intr_enable_bit:5; +	unsigned intr_status_bit:5; +	unsigned intr_ack_high:1; + +	unsigned intr_target_bit:5; +	unsigned intr_raw_status_bit:5; +	unsigned intr_polarity_bit:5; +	unsigned intr_detection_bit:5; +	unsigned intr_detection_width:5; +}; + +/** + * struct msm_pinctrl_soc_data - Qualcomm pin controller driver configuration + * @pins:       An array describing all pins the pin controller affects. + * @npins:      The number of entries in @pins. + * @functions:  An array describing all mux functions the SoC supports. + * @nfunctions: The number of entries in @functions. + * @groups:     An array describing all pin groups the pin SoC supports. + * @ngroups:    The numbmer of entries in @groups. + * @ngpio:      The number of pingroups the driver should expose as GPIOs. + */ +struct msm_pinctrl_soc_data { +	const struct pinctrl_pin_desc *pins; +	unsigned npins; +	const struct msm_function *functions; +	unsigned nfunctions; +	const struct msm_pingroup *groups; +	unsigned ngroups; +	unsigned ngpios; +}; + +int msm_pinctrl_probe(struct platform_device *pdev, +		      const struct msm_pinctrl_soc_data *soc_data); +int msm_pinctrl_remove(struct platform_device *pdev); + +#endif diff --git a/drivers/pinctrl/pinctrl-msm8x74.c b/drivers/pinctrl/pinctrl-msm8x74.c new file mode 100644 index 00000000000..418306911a6 --- /dev/null +++ b/drivers/pinctrl/pinctrl-msm8x74.c @@ -0,0 +1,1040 @@ +/* + * Copyright (c) 2013, Sony Mobile Communications AB. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only 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 <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-msm.h" + +static const struct pinctrl_pin_desc msm8x74_pins[] = { +	PINCTRL_PIN(0, "GPIO_0"), +	PINCTRL_PIN(1, "GPIO_1"), +	PINCTRL_PIN(2, "GPIO_2"), +	PINCTRL_PIN(3, "GPIO_3"), +	PINCTRL_PIN(4, "GPIO_4"), +	PINCTRL_PIN(5, "GPIO_5"), +	PINCTRL_PIN(6, "GPIO_6"), +	PINCTRL_PIN(7, "GPIO_7"), +	PINCTRL_PIN(8, "GPIO_8"), +	PINCTRL_PIN(9, "GPIO_9"), +	PINCTRL_PIN(10, "GPIO_10"), +	PINCTRL_PIN(11, "GPIO_11"), +	PINCTRL_PIN(12, "GPIO_12"), +	PINCTRL_PIN(13, "GPIO_13"), +	PINCTRL_PIN(14, "GPIO_14"), +	PINCTRL_PIN(15, "GPIO_15"), +	PINCTRL_PIN(16, "GPIO_16"), +	PINCTRL_PIN(17, "GPIO_17"), +	PINCTRL_PIN(18, "GPIO_18"), +	PINCTRL_PIN(19, "GPIO_19"), +	PINCTRL_PIN(20, "GPIO_20"), +	PINCTRL_PIN(21, "GPIO_21"), +	PINCTRL_PIN(22, "GPIO_22"), +	PINCTRL_PIN(23, "GPIO_23"), +	PINCTRL_PIN(24, "GPIO_24"), +	PINCTRL_PIN(25, "GPIO_25"), +	PINCTRL_PIN(26, "GPIO_26"), +	PINCTRL_PIN(27, "GPIO_27"), +	PINCTRL_PIN(28, "GPIO_28"), +	PINCTRL_PIN(29, "GPIO_29"), +	PINCTRL_PIN(30, "GPIO_30"), +	PINCTRL_PIN(31, "GPIO_31"), +	PINCTRL_PIN(32, "GPIO_32"), +	PINCTRL_PIN(33, "GPIO_33"), +	PINCTRL_PIN(34, "GPIO_34"), +	PINCTRL_PIN(35, "GPIO_35"), +	PINCTRL_PIN(36, "GPIO_36"), +	PINCTRL_PIN(37, "GPIO_37"), +	PINCTRL_PIN(38, "GPIO_38"), +	PINCTRL_PIN(39, "GPIO_39"), +	PINCTRL_PIN(40, "GPIO_40"), +	PINCTRL_PIN(41, "GPIO_41"), +	PINCTRL_PIN(42, "GPIO_42"), +	PINCTRL_PIN(43, "GPIO_43"), +	PINCTRL_PIN(44, "GPIO_44"), +	PINCTRL_PIN(45, "GPIO_45"), +	PINCTRL_PIN(46, "GPIO_46"), +	PINCTRL_PIN(47, "GPIO_47"), +	PINCTRL_PIN(48, "GPIO_48"), +	PINCTRL_PIN(49, "GPIO_49"), +	PINCTRL_PIN(50, "GPIO_50"), +	PINCTRL_PIN(51, "GPIO_51"), +	PINCTRL_PIN(52, "GPIO_52"), +	PINCTRL_PIN(53, "GPIO_53"), +	PINCTRL_PIN(54, "GPIO_54"), +	PINCTRL_PIN(55, "GPIO_55"), +	PINCTRL_PIN(56, "GPIO_56"), +	PINCTRL_PIN(57, "GPIO_57"), +	PINCTRL_PIN(58, "GPIO_58"), +	PINCTRL_PIN(59, "GPIO_59"), +	PINCTRL_PIN(60, "GPIO_60"), +	PINCTRL_PIN(61, "GPIO_61"), +	PINCTRL_PIN(62, "GPIO_62"), +	PINCTRL_PIN(63, "GPIO_63"), +	PINCTRL_PIN(64, "GPIO_64"), +	PINCTRL_PIN(65, "GPIO_65"), +	PINCTRL_PIN(66, "GPIO_66"), +	PINCTRL_PIN(67, "GPIO_67"), +	PINCTRL_PIN(68, "GPIO_68"), +	PINCTRL_PIN(69, "GPIO_69"), +	PINCTRL_PIN(70, "GPIO_70"), +	PINCTRL_PIN(71, "GPIO_71"), +	PINCTRL_PIN(72, "GPIO_72"), +	PINCTRL_PIN(73, "GPIO_73"), +	PINCTRL_PIN(74, "GPIO_74"), +	PINCTRL_PIN(75, "GPIO_75"), +	PINCTRL_PIN(76, "GPIO_76"), +	PINCTRL_PIN(77, "GPIO_77"), +	PINCTRL_PIN(78, "GPIO_78"), +	PINCTRL_PIN(79, "GPIO_79"), +	PINCTRL_PIN(80, "GPIO_80"), +	PINCTRL_PIN(81, "GPIO_81"), +	PINCTRL_PIN(82, "GPIO_82"), +	PINCTRL_PIN(83, "GPIO_83"), +	PINCTRL_PIN(84, "GPIO_84"), +	PINCTRL_PIN(85, "GPIO_85"), +	PINCTRL_PIN(86, "GPIO_86"), +	PINCTRL_PIN(87, "GPIO_87"), +	PINCTRL_PIN(88, "GPIO_88"), +	PINCTRL_PIN(89, "GPIO_89"), +	PINCTRL_PIN(90, "GPIO_90"), +	PINCTRL_PIN(91, "GPIO_91"), +	PINCTRL_PIN(92, "GPIO_92"), +	PINCTRL_PIN(93, "GPIO_93"), +	PINCTRL_PIN(94, "GPIO_94"), +	PINCTRL_PIN(95, "GPIO_95"), +	PINCTRL_PIN(96, "GPIO_96"), +	PINCTRL_PIN(97, "GPIO_97"), +	PINCTRL_PIN(98, "GPIO_98"), +	PINCTRL_PIN(99, "GPIO_99"), +	PINCTRL_PIN(100, "GPIO_100"), +	PINCTRL_PIN(101, "GPIO_101"), +	PINCTRL_PIN(102, "GPIO_102"), +	PINCTRL_PIN(103, "GPIO_103"), +	PINCTRL_PIN(104, "GPIO_104"), +	PINCTRL_PIN(105, "GPIO_105"), +	PINCTRL_PIN(106, "GPIO_106"), +	PINCTRL_PIN(107, "GPIO_107"), +	PINCTRL_PIN(108, "GPIO_108"), +	PINCTRL_PIN(109, "GPIO_109"), +	PINCTRL_PIN(110, "GPIO_110"), +	PINCTRL_PIN(111, "GPIO_111"), +	PINCTRL_PIN(112, "GPIO_112"), +	PINCTRL_PIN(113, "GPIO_113"), +	PINCTRL_PIN(114, "GPIO_114"), +	PINCTRL_PIN(115, "GPIO_115"), +	PINCTRL_PIN(116, "GPIO_116"), +	PINCTRL_PIN(117, "GPIO_117"), +	PINCTRL_PIN(118, "GPIO_118"), +	PINCTRL_PIN(119, "GPIO_119"), +	PINCTRL_PIN(120, "GPIO_120"), +	PINCTRL_PIN(121, "GPIO_121"), +	PINCTRL_PIN(122, "GPIO_122"), +	PINCTRL_PIN(123, "GPIO_123"), +	PINCTRL_PIN(124, "GPIO_124"), +	PINCTRL_PIN(125, "GPIO_125"), +	PINCTRL_PIN(126, "GPIO_126"), +	PINCTRL_PIN(127, "GPIO_127"), +	PINCTRL_PIN(128, "GPIO_128"), +	PINCTRL_PIN(129, "GPIO_129"), +	PINCTRL_PIN(130, "GPIO_130"), +	PINCTRL_PIN(131, "GPIO_131"), +	PINCTRL_PIN(132, "GPIO_132"), +	PINCTRL_PIN(133, "GPIO_133"), +	PINCTRL_PIN(134, "GPIO_134"), +	PINCTRL_PIN(135, "GPIO_135"), +	PINCTRL_PIN(136, "GPIO_136"), +	PINCTRL_PIN(137, "GPIO_137"), +	PINCTRL_PIN(138, "GPIO_138"), +	PINCTRL_PIN(139, "GPIO_139"), +	PINCTRL_PIN(140, "GPIO_140"), +	PINCTRL_PIN(141, "GPIO_141"), +	PINCTRL_PIN(142, "GPIO_142"), +	PINCTRL_PIN(143, "GPIO_143"), +	PINCTRL_PIN(144, "GPIO_144"), +	PINCTRL_PIN(145, "GPIO_145"), + +	PINCTRL_PIN(146, "SDC1_CLK"), +	PINCTRL_PIN(147, "SDC1_CMD"), +	PINCTRL_PIN(148, "SDC1_DATA"), +	PINCTRL_PIN(149, "SDC2_CLK"), +	PINCTRL_PIN(150, "SDC2_CMD"), +	PINCTRL_PIN(151, "SDC2_DATA"), +}; + +#define DECLARE_MSM_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin } +DECLARE_MSM_GPIO_PINS(0); +DECLARE_MSM_GPIO_PINS(1); +DECLARE_MSM_GPIO_PINS(2); +DECLARE_MSM_GPIO_PINS(3); +DECLARE_MSM_GPIO_PINS(4); +DECLARE_MSM_GPIO_PINS(5); +DECLARE_MSM_GPIO_PINS(6); +DECLARE_MSM_GPIO_PINS(7); +DECLARE_MSM_GPIO_PINS(8); +DECLARE_MSM_GPIO_PINS(9); +DECLARE_MSM_GPIO_PINS(10); +DECLARE_MSM_GPIO_PINS(11); +DECLARE_MSM_GPIO_PINS(12); +DECLARE_MSM_GPIO_PINS(13); +DECLARE_MSM_GPIO_PINS(14); +DECLARE_MSM_GPIO_PINS(15); +DECLARE_MSM_GPIO_PINS(16); +DECLARE_MSM_GPIO_PINS(17); +DECLARE_MSM_GPIO_PINS(18); +DECLARE_MSM_GPIO_PINS(19); +DECLARE_MSM_GPIO_PINS(20); +DECLARE_MSM_GPIO_PINS(21); +DECLARE_MSM_GPIO_PINS(22); +DECLARE_MSM_GPIO_PINS(23); +DECLARE_MSM_GPIO_PINS(24); +DECLARE_MSM_GPIO_PINS(25); +DECLARE_MSM_GPIO_PINS(26); +DECLARE_MSM_GPIO_PINS(27); +DECLARE_MSM_GPIO_PINS(28); +DECLARE_MSM_GPIO_PINS(29); +DECLARE_MSM_GPIO_PINS(30); +DECLARE_MSM_GPIO_PINS(31); +DECLARE_MSM_GPIO_PINS(32); +DECLARE_MSM_GPIO_PINS(33); +DECLARE_MSM_GPIO_PINS(34); +DECLARE_MSM_GPIO_PINS(35); +DECLARE_MSM_GPIO_PINS(36); +DECLARE_MSM_GPIO_PINS(37); +DECLARE_MSM_GPIO_PINS(38); +DECLARE_MSM_GPIO_PINS(39); +DECLARE_MSM_GPIO_PINS(40); +DECLARE_MSM_GPIO_PINS(41); +DECLARE_MSM_GPIO_PINS(42); +DECLARE_MSM_GPIO_PINS(43); +DECLARE_MSM_GPIO_PINS(44); +DECLARE_MSM_GPIO_PINS(45); +DECLARE_MSM_GPIO_PINS(46); +DECLARE_MSM_GPIO_PINS(47); +DECLARE_MSM_GPIO_PINS(48); +DECLARE_MSM_GPIO_PINS(49); +DECLARE_MSM_GPIO_PINS(50); +DECLARE_MSM_GPIO_PINS(51); +DECLARE_MSM_GPIO_PINS(52); +DECLARE_MSM_GPIO_PINS(53); +DECLARE_MSM_GPIO_PINS(54); +DECLARE_MSM_GPIO_PINS(55); +DECLARE_MSM_GPIO_PINS(56); +DECLARE_MSM_GPIO_PINS(57); +DECLARE_MSM_GPIO_PINS(58); +DECLARE_MSM_GPIO_PINS(59); +DECLARE_MSM_GPIO_PINS(60); +DECLARE_MSM_GPIO_PINS(61); +DECLARE_MSM_GPIO_PINS(62); +DECLARE_MSM_GPIO_PINS(63); +DECLARE_MSM_GPIO_PINS(64); +DECLARE_MSM_GPIO_PINS(65); +DECLARE_MSM_GPIO_PINS(66); +DECLARE_MSM_GPIO_PINS(67); +DECLARE_MSM_GPIO_PINS(68); +DECLARE_MSM_GPIO_PINS(69); +DECLARE_MSM_GPIO_PINS(70); +DECLARE_MSM_GPIO_PINS(71); +DECLARE_MSM_GPIO_PINS(72); +DECLARE_MSM_GPIO_PINS(73); +DECLARE_MSM_GPIO_PINS(74); +DECLARE_MSM_GPIO_PINS(75); +DECLARE_MSM_GPIO_PINS(76); +DECLARE_MSM_GPIO_PINS(77); +DECLARE_MSM_GPIO_PINS(78); +DECLARE_MSM_GPIO_PINS(79); +DECLARE_MSM_GPIO_PINS(80); +DECLARE_MSM_GPIO_PINS(81); +DECLARE_MSM_GPIO_PINS(82); +DECLARE_MSM_GPIO_PINS(83); +DECLARE_MSM_GPIO_PINS(84); +DECLARE_MSM_GPIO_PINS(85); +DECLARE_MSM_GPIO_PINS(86); +DECLARE_MSM_GPIO_PINS(87); +DECLARE_MSM_GPIO_PINS(88); +DECLARE_MSM_GPIO_PINS(89); +DECLARE_MSM_GPIO_PINS(90); +DECLARE_MSM_GPIO_PINS(91); +DECLARE_MSM_GPIO_PINS(92); +DECLARE_MSM_GPIO_PINS(93); +DECLARE_MSM_GPIO_PINS(94); +DECLARE_MSM_GPIO_PINS(95); +DECLARE_MSM_GPIO_PINS(96); +DECLARE_MSM_GPIO_PINS(97); +DECLARE_MSM_GPIO_PINS(98); +DECLARE_MSM_GPIO_PINS(99); +DECLARE_MSM_GPIO_PINS(100); +DECLARE_MSM_GPIO_PINS(101); +DECLARE_MSM_GPIO_PINS(102); +DECLARE_MSM_GPIO_PINS(103); +DECLARE_MSM_GPIO_PINS(104); +DECLARE_MSM_GPIO_PINS(105); +DECLARE_MSM_GPIO_PINS(106); +DECLARE_MSM_GPIO_PINS(107); +DECLARE_MSM_GPIO_PINS(108); +DECLARE_MSM_GPIO_PINS(109); +DECLARE_MSM_GPIO_PINS(110); +DECLARE_MSM_GPIO_PINS(111); +DECLARE_MSM_GPIO_PINS(112); +DECLARE_MSM_GPIO_PINS(113); +DECLARE_MSM_GPIO_PINS(114); +DECLARE_MSM_GPIO_PINS(115); +DECLARE_MSM_GPIO_PINS(116); +DECLARE_MSM_GPIO_PINS(117); +DECLARE_MSM_GPIO_PINS(118); +DECLARE_MSM_GPIO_PINS(119); +DECLARE_MSM_GPIO_PINS(120); +DECLARE_MSM_GPIO_PINS(121); +DECLARE_MSM_GPIO_PINS(122); +DECLARE_MSM_GPIO_PINS(123); +DECLARE_MSM_GPIO_PINS(124); +DECLARE_MSM_GPIO_PINS(125); +DECLARE_MSM_GPIO_PINS(126); +DECLARE_MSM_GPIO_PINS(127); +DECLARE_MSM_GPIO_PINS(128); +DECLARE_MSM_GPIO_PINS(129); +DECLARE_MSM_GPIO_PINS(130); +DECLARE_MSM_GPIO_PINS(131); +DECLARE_MSM_GPIO_PINS(132); +DECLARE_MSM_GPIO_PINS(133); +DECLARE_MSM_GPIO_PINS(134); +DECLARE_MSM_GPIO_PINS(135); +DECLARE_MSM_GPIO_PINS(136); +DECLARE_MSM_GPIO_PINS(137); +DECLARE_MSM_GPIO_PINS(138); +DECLARE_MSM_GPIO_PINS(139); +DECLARE_MSM_GPIO_PINS(140); +DECLARE_MSM_GPIO_PINS(141); +DECLARE_MSM_GPIO_PINS(142); +DECLARE_MSM_GPIO_PINS(143); +DECLARE_MSM_GPIO_PINS(144); +DECLARE_MSM_GPIO_PINS(145); + +static const unsigned int sdc1_clk_pins[] = { 146 }; +static const unsigned int sdc1_cmd_pins[] = { 147 }; +static const unsigned int sdc1_data_pins[] = { 148 }; +static const unsigned int sdc2_clk_pins[] = { 149 }; +static const unsigned int sdc2_cmd_pins[] = { 150 }; +static const unsigned int sdc2_data_pins[] = { 151 }; + +#define FUNCTION(fname)					\ +	[MSM_MUX_##fname] = {				\ +		.name = #fname,				\ +		.groups = fname##_groups,		\ +		.ngroups = ARRAY_SIZE(fname##_groups),	\ +	} + +#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7)	\ +	{						\ +		.name = "gpio" #id,			\ +		.pins = gpio##id##_pins,		\ +		.npins = ARRAY_SIZE(gpio##id##_pins),	\ +		.funcs = (int[]){			\ +			MSM_MUX_NA, /* gpio mode */	\ +			MSM_MUX_##f1,			\ +			MSM_MUX_##f2,			\ +			MSM_MUX_##f3,			\ +			MSM_MUX_##f4,			\ +			MSM_MUX_##f5,			\ +			MSM_MUX_##f6,			\ +			MSM_MUX_##f7			\ +		},					\ +		.nfuncs = 8,				\ +		.ctl_reg = 0x1000 + 0x10 * id,		\ +		.io_reg = 0x1004 + 0x10 * id,		\ +		.intr_cfg_reg = 0x1008 + 0x10 * id,	\ +		.intr_status_reg = 0x100c + 0x10 * id,	\ +		.intr_target_reg = 0x1008 + 0x10 * id,	\ +		.mux_bit = 2,				\ +		.pull_bit = 0,				\ +		.drv_bit = 6,				\ +		.oe_bit = 9,				\ +		.in_bit = 0,				\ +		.out_bit = 1,				\ +		.intr_enable_bit = 0,			\ +		.intr_status_bit = 0,			\ +		.intr_target_bit = 5,			\ +		.intr_raw_status_bit = 4,		\ +		.intr_polarity_bit = 1,			\ +		.intr_detection_bit = 2,		\ +		.intr_detection_width = 2,		\ +	} + +#define SDC_PINGROUP(pg_name, ctl, pull, drv)		\ +	{						\ +		.name = #pg_name,			\ +		.pins = pg_name##_pins,			\ +		.npins = ARRAY_SIZE(pg_name##_pins),	\ +		.ctl_reg = ctl,				\ +		.io_reg = 0,				\ +		.intr_cfg_reg = 0,			\ +		.intr_status_reg = 0,			\ +		.intr_target_reg = 0,			\ +		.mux_bit = -1,				\ +		.pull_bit = pull,			\ +		.drv_bit = drv,				\ +		.oe_bit = -1,				\ +		.in_bit = -1,				\ +		.out_bit = -1,				\ +		.intr_enable_bit = -1,			\ +		.intr_status_bit = -1,			\ +		.intr_target_bit = -1,			\ +		.intr_raw_status_bit = -1,		\ +		.intr_polarity_bit = -1,		\ +		.intr_detection_bit = -1,		\ +		.intr_detection_width = -1,		\ +	} + +/* + * TODO: Add the rest of the possible functions and fill out + * the pingroup table below. + */ +enum msm8x74_functions { +	MSM_MUX_cci_i2c0, +	MSM_MUX_cci_i2c1, +	MSM_MUX_blsp_i2c1, +	MSM_MUX_blsp_i2c2, +	MSM_MUX_blsp_i2c3, +	MSM_MUX_blsp_i2c4, +	MSM_MUX_blsp_i2c5, +	MSM_MUX_blsp_i2c6, +	MSM_MUX_blsp_i2c7, +	MSM_MUX_blsp_i2c8, +	MSM_MUX_blsp_i2c9, +	MSM_MUX_blsp_i2c10, +	MSM_MUX_blsp_i2c11, +	MSM_MUX_blsp_i2c12, +	MSM_MUX_blsp_spi1, +	MSM_MUX_blsp_spi1_cs1, +	MSM_MUX_blsp_spi1_cs2, +	MSM_MUX_blsp_spi1_cs3, +	MSM_MUX_blsp_spi2, +	MSM_MUX_blsp_spi2_cs1, +	MSM_MUX_blsp_spi2_cs2, +	MSM_MUX_blsp_spi2_cs3, +	MSM_MUX_blsp_spi3, +	MSM_MUX_blsp_spi4, +	MSM_MUX_blsp_spi5, +	MSM_MUX_blsp_spi6, +	MSM_MUX_blsp_spi7, +	MSM_MUX_blsp_spi8, +	MSM_MUX_blsp_spi9, +	MSM_MUX_blsp_spi10, +	MSM_MUX_blsp_spi10_cs1, +	MSM_MUX_blsp_spi10_cs2, +	MSM_MUX_blsp_spi10_cs3, +	MSM_MUX_blsp_spi11, +	MSM_MUX_blsp_spi12, +	MSM_MUX_blsp_uart1, +	MSM_MUX_blsp_uart2, +	MSM_MUX_blsp_uart3, +	MSM_MUX_blsp_uart4, +	MSM_MUX_blsp_uart5, +	MSM_MUX_blsp_uart6, +	MSM_MUX_blsp_uart7, +	MSM_MUX_blsp_uart8, +	MSM_MUX_blsp_uart9, +	MSM_MUX_blsp_uart10, +	MSM_MUX_blsp_uart11, +	MSM_MUX_blsp_uart12, +	MSM_MUX_blsp_uim1, +	MSM_MUX_blsp_uim2, +	MSM_MUX_blsp_uim3, +	MSM_MUX_blsp_uim4, +	MSM_MUX_blsp_uim5, +	MSM_MUX_blsp_uim6, +	MSM_MUX_blsp_uim7, +	MSM_MUX_blsp_uim8, +	MSM_MUX_blsp_uim9, +	MSM_MUX_blsp_uim10, +	MSM_MUX_blsp_uim11, +	MSM_MUX_blsp_uim12, +	MSM_MUX_uim1, +	MSM_MUX_uim2, +	MSM_MUX_uim_batt_alarm, +	MSM_MUX_sdc3, +	MSM_MUX_sdc4, +	MSM_MUX_gcc_gp_clk1, +	MSM_MUX_gcc_gp_clk2, +	MSM_MUX_gcc_gp_clk3, +	MSM_MUX_qua_mi2s, +	MSM_MUX_pri_mi2s, +	MSM_MUX_spkr_mi2s, +	MSM_MUX_ter_mi2s, +	MSM_MUX_sec_mi2s, +	MSM_MUX_hdmi_cec, +	MSM_MUX_hdmi_ddc, +	MSM_MUX_hdmi_hpd, +	MSM_MUX_edp_hpd, +	MSM_MUX_mdp_vsync, +	MSM_MUX_cam_mclk0, +	MSM_MUX_cam_mclk1, +	MSM_MUX_cam_mclk2, +	MSM_MUX_cam_mclk3, +	MSM_MUX_cci_timer0, +	MSM_MUX_cci_timer1, +	MSM_MUX_cci_timer2, +	MSM_MUX_cci_timer3, +	MSM_MUX_cci_timer4, +	MSM_MUX_cci_async_in0, +	MSM_MUX_cci_async_in1, +	MSM_MUX_cci_async_in2, +	MSM_MUX_gp_pdm0, +	MSM_MUX_gp_pdm1, +	MSM_MUX_gp_pdm2, +	MSM_MUX_gp0_clk, +	MSM_MUX_gp1_clk, +	MSM_MUX_gp_mn, +	MSM_MUX_tsif1, +	MSM_MUX_tsif2, +	MSM_MUX_hsic, +	MSM_MUX_grfc, +	MSM_MUX_audio_ref_clk, +	MSM_MUX_bt, +	MSM_MUX_fm, +	MSM_MUX_wlan, +	MSM_MUX_slimbus, +	MSM_MUX_NA, +}; + +static const char * const blsp_uart1_groups[] = { +	"gpio0", "gpio1", "gpio2", "gpio3" +}; +static const char * const blsp_uim1_groups[] = { "gpio0", "gpio1" }; +static const char * const blsp_i2c1_groups[] = { "gpio2", "gpio3" }; +static const char * const blsp_spi1_groups[] = { +	"gpio0", "gpio1", "gpio2", "gpio3" +}; +static const char * const blsp_spi1_cs1_groups[] = { "gpio8" }; +static const char * const blsp_spi1_cs2_groups[] = { "gpio9", "gpio11" }; +static const char * const blsp_spi1_cs3_groups[] = { "gpio10" }; + +static const char * const blsp_uart2_groups[] = { +	"gpio4", "gpio5", "gpio6", "gpio7" +}; +static const char * const blsp_uim2_groups[] = { "gpio4", "gpio5" }; +static const char * const blsp_i2c2_groups[] = { "gpio6", "gpio7" }; +static const char * const blsp_spi2_groups[] = { +	"gpio4", "gpio5", "gpio6", "gpio7" +}; +static const char * const blsp_spi2_cs1_groups[] = { "gpio53", "gpio62" }; +static const char * const blsp_spi2_cs2_groups[] = { "gpio54", "gpio63" }; +static const char * const blsp_spi2_cs3_groups[] = { "gpio66" }; + +static const char * const blsp_uart3_groups[] = { +	"gpio8", "gpio9", "gpio10", "gpio11" +}; +static const char * const blsp_uim3_groups[] = { "gpio8", "gpio9" }; +static const char * const blsp_i2c3_groups[] = { "gpio10", "gpio11" }; +static const char * const blsp_spi3_groups[] = { +	"gpio8", "gpio9", "gpio10", "gpio11" +}; + +static const char * const cci_i2c0_groups[] = { "gpio19", "gpio20" }; +static const char * const cci_i2c1_groups[] = { "gpio21", "gpio22" }; + +static const char * const blsp_uart4_groups[] = { +	"gpio19", "gpio20", "gpio21", "gpio22" +}; +static const char * const blsp_uim4_groups[] = { "gpio19", "gpio20" }; +static const char * const blsp_i2c4_groups[] = { "gpio21", "gpio22" }; +static const char * const blsp_spi4_groups[] = { +	"gpio19", "gpio20", "gpio21", "gpio22" +}; + +static const char * const blsp_uart5_groups[] = { +	"gpio23", "gpio24", "gpio25", "gpio26" +}; +static const char * const blsp_uim5_groups[] = { "gpio23", "gpio24" }; +static const char * const blsp_i2c5_groups[] = { "gpio25", "gpio26" }; +static const char * const blsp_spi5_groups[] = { +	"gpio23", "gpio24", "gpio25", "gpio26" +}; + +static const char * const blsp_uart6_groups[] = { +	"gpio27", "gpio28", "gpio29", "gpio30" +}; +static const char * const blsp_uim6_groups[] = { "gpio27", "gpio28" }; +static const char * const blsp_i2c6_groups[] = { "gpio29", "gpio30" }; +static const char * const blsp_spi6_groups[] = { +	"gpio27", "gpio28", "gpio29", "gpio30" +}; + +static const char * const blsp_uart7_groups[] = { +	"gpio41", "gpio42", "gpio43", "gpio44" +}; +static const char * const blsp_uim7_groups[] = { "gpio41", "gpio42" }; +static const char * const blsp_i2c7_groups[] = { "gpio43", "gpio44" }; +static const char * const blsp_spi7_groups[] = { +	"gpio41", "gpio42", "gpio43", "gpio44" +}; + +static const char * const blsp_uart8_groups[] = { +	"gpio45", "gpio46", "gpio47", "gpio48" +}; +static const char * const blsp_uim8_groups[] = { "gpio45", "gpio46" }; +static const char * const blsp_i2c8_groups[] = { "gpio47", "gpio48" }; +static const char * const blsp_spi8_groups[] = { +	"gpio45", "gpio46", "gpio47", "gpio48" +}; + +static const char * const blsp_uart9_groups[] = { +	"gpio49", "gpio50", "gpio51", "gpio52" +}; +static const char * const blsp_uim9_groups[] = { "gpio49", "gpio50" }; +static const char * const blsp_i2c9_groups[] = { "gpio51", "gpio52" }; +static const char * const blsp_spi9_groups[] = { +	"gpio49", "gpio50", "gpio51", "gpio52" +}; + +static const char * const blsp_uart10_groups[] = { +	"gpio53", "gpio54", "gpio55", "gpio56" +}; +static const char * const blsp_uim10_groups[] = { "gpio53", "gpio54" }; +static const char * const blsp_i2c10_groups[] = { "gpio55", "gpio56" }; +static const char * const blsp_spi10_groups[] = { +	"gpio53", "gpio54", "gpio55", "gpio56" +}; +static const char * const blsp_spi10_cs1_groups[] = { "gpio47", "gpio67" }; +static const char * const blsp_spi10_cs2_groups[] = { "gpio48", "gpio68" }; +static const char * const blsp_spi10_cs3_groups[] = { "gpio90" }; + +static const char * const blsp_uart11_groups[] = { +	"gpio81", "gpio82", "gpio83", "gpio84" +}; +static const char * const blsp_uim11_groups[] = { "gpio81", "gpio82" }; +static const char * const blsp_i2c11_groups[] = { "gpio83", "gpio84" }; +static const char * const blsp_spi11_groups[] = { +	"gpio81", "gpio82", "gpio83", "gpio84" +}; + +static const char * const blsp_uart12_groups[] = { +	"gpio85", "gpio86", "gpio87", "gpio88" +}; +static const char * const blsp_uim12_groups[] = { "gpio85", "gpio86" }; +static const char * const blsp_i2c12_groups[] = { "gpio87", "gpio88" }; +static const char * const blsp_spi12_groups[] = { +	"gpio85", "gpio86", "gpio87", "gpio88" +}; + +static const char * const uim1_groups[] = { +	"gpio97", "gpio98", "gpio99", "gpio100" +}; + +static const char * const uim2_groups[] = { +	"gpio49", "gpio50", "gpio51", "gpio52" +}; + +static const char * const uim_batt_alarm_groups[] = { "gpio101" }; + +static const char * const sdc3_groups[] = { +	"gpio35", "gpio36", "gpio37", "gpio38", "gpio39", "gpio40" +}; + +static const char * const sdc4_groups[] = { +	"gpio91", "gpio92", "gpio93", "gpio94", "gpio95", "gpio96" +}; + +static const char * const gp0_clk_groups[] = { "gpio26" }; +static const char * const gp1_clk_groups[] = { "gpio27", "gpio57", "gpio78" }; +static const char * const gp_mn_groups[] = { "gpio29" }; +static const char * const gcc_gp_clk1_groups[] = { "gpio57", "gpio78" }; +static const char * const gcc_gp_clk2_groups[] = { "gpio58", "gpio81" }; +static const char * const gcc_gp_clk3_groups[] = { "gpio59", "gpio82" }; + +static const char * const qua_mi2s_groups[] = { +	"gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", +}; + +static const char * const pri_mi2s_groups[] = { +	"gpio64", "gpio65", "gpio66", "gpio67", "gpio68" +}; + +static const char * const spkr_mi2s_groups[] = { +	"gpio69", "gpio70", "gpio71", "gpio72" +}; + +static const char * const ter_mi2s_groups[] = { +	"gpio73", "gpio74", "gpio75", "gpio76", "gpio77" +}; + +static const char * const sec_mi2s_groups[] = { +	"gpio78", "gpio79", "gpio80", "gpio81", "gpio82" +}; + +static const char * const hdmi_cec_groups[] = { "gpio31" }; +static const char * const hdmi_ddc_groups[] = { "gpio32", "gpio33" }; +static const char * const hdmi_hpd_groups[] = { "gpio34" }; +static const char * const edp_hpd_groups[] = { "gpio102" }; + +static const char * const mdp_vsync_groups[] = { "gpio12", "gpio13", "gpio14" }; +static const char * const cam_mclk0_groups[] = { "gpio15" }; +static const char * const cam_mclk1_groups[] = { "gpio16" }; +static const char * const cam_mclk2_groups[] = { "gpio17" }; +static const char * const cam_mclk3_groups[] = { "gpio18" }; + +static const char * const cci_timer0_groups[] = { "gpio23" }; +static const char * const cci_timer1_groups[] = { "gpio24" }; +static const char * const cci_timer2_groups[] = { "gpio25" }; +static const char * const cci_timer3_groups[] = { "gpio26" }; +static const char * const cci_timer4_groups[] = { "gpio27" }; +static const char * const cci_async_in0_groups[] = { "gpio28" }; +static const char * const cci_async_in1_groups[] = { "gpio26" }; +static const char * const cci_async_in2_groups[] = { "gpio27" }; + +static const char * const gp_pdm0_groups[] = { "gpio54", "gpio68" }; +static const char * const gp_pdm1_groups[] = { "gpio74", "gpio86" }; +static const char * const gp_pdm2_groups[] = { "gpio63", "gpio79" }; + +static const char * const tsif1_groups[] = { +	"gpio89", "gpio90", "gpio91", "gpio92" +}; + +static const char * const tsif2_groups[] = { +	"gpio93", "gpio94", "gpio95", "gpio96" +}; + +static const char * const hsic_groups[] = { "gpio144", "gpio145" }; +static const char * const grfc_groups[] = { +	"gpio104", "gpio105", "gpio106", "gpio107", "gpio108", "gpio109", +	"gpio110", "gpio111", "gpio112", "gpio113", "gpio114", "gpio115", +	"gpio116", "gpio117", "gpio118", "gpio119", "gpio120", "gpio121", +	"gpio122", "gpio123", "gpio124", "gpio125", "gpio126", "gpio127", +	"gpio128", "gpio136", "gpio137", "gpio141", "gpio143" +}; + +static const char * const audio_ref_clk_groups[] = { "gpio69" }; + +static const char * const bt_groups[] = { "gpio35", "gpio43", "gpio44" }; + +static const char * const fm_groups[] = { "gpio41", "gpio42" }; + +static const char * const wlan_groups[] = { +	"gpio36", "gpio37", "gpio38", "gpio39", "gpio40" +}; + +static const char * const slimbus_groups[] = { "gpio70", "gpio71" }; + +static const struct msm_function msm8x74_functions[] = { +	FUNCTION(cci_i2c0), +	FUNCTION(cci_i2c1), +	FUNCTION(uim1), +	FUNCTION(uim2), +	FUNCTION(uim_batt_alarm), +	FUNCTION(blsp_uim1), +	FUNCTION(blsp_uim2), +	FUNCTION(blsp_uim3), +	FUNCTION(blsp_uim4), +	FUNCTION(blsp_uim5), +	FUNCTION(blsp_uim6), +	FUNCTION(blsp_uim7), +	FUNCTION(blsp_uim8), +	FUNCTION(blsp_uim9), +	FUNCTION(blsp_uim10), +	FUNCTION(blsp_uim11), +	FUNCTION(blsp_uim12), +	FUNCTION(blsp_i2c1), +	FUNCTION(blsp_i2c2), +	FUNCTION(blsp_i2c3), +	FUNCTION(blsp_i2c4), +	FUNCTION(blsp_i2c5), +	FUNCTION(blsp_i2c6), +	FUNCTION(blsp_i2c7), +	FUNCTION(blsp_i2c8), +	FUNCTION(blsp_i2c9), +	FUNCTION(blsp_i2c10), +	FUNCTION(blsp_i2c11), +	FUNCTION(blsp_i2c12), +	FUNCTION(blsp_spi1), +	FUNCTION(blsp_spi1_cs1), +	FUNCTION(blsp_spi1_cs2), +	FUNCTION(blsp_spi1_cs3), +	FUNCTION(blsp_spi2), +	FUNCTION(blsp_spi2_cs1), +	FUNCTION(blsp_spi2_cs2), +	FUNCTION(blsp_spi2_cs3), +	FUNCTION(blsp_spi3), +	FUNCTION(blsp_spi4), +	FUNCTION(blsp_spi5), +	FUNCTION(blsp_spi6), +	FUNCTION(blsp_spi7), +	FUNCTION(blsp_spi8), +	FUNCTION(blsp_spi9), +	FUNCTION(blsp_spi10), +	FUNCTION(blsp_spi10_cs1), +	FUNCTION(blsp_spi10_cs2), +	FUNCTION(blsp_spi10_cs3), +	FUNCTION(blsp_spi11), +	FUNCTION(blsp_spi12), +	FUNCTION(blsp_uart1), +	FUNCTION(blsp_uart2), +	FUNCTION(blsp_uart3), +	FUNCTION(blsp_uart4), +	FUNCTION(blsp_uart5), +	FUNCTION(blsp_uart6), +	FUNCTION(blsp_uart7), +	FUNCTION(blsp_uart8), +	FUNCTION(blsp_uart9), +	FUNCTION(blsp_uart10), +	FUNCTION(blsp_uart11), +	FUNCTION(blsp_uart12), +	FUNCTION(sdc3), +	FUNCTION(sdc4), +	FUNCTION(gcc_gp_clk1), +	FUNCTION(gcc_gp_clk2), +	FUNCTION(gcc_gp_clk3), +	FUNCTION(qua_mi2s), +	FUNCTION(pri_mi2s), +	FUNCTION(spkr_mi2s), +	FUNCTION(ter_mi2s), +	FUNCTION(sec_mi2s), +	FUNCTION(mdp_vsync), +	FUNCTION(cam_mclk0), +	FUNCTION(cam_mclk1), +	FUNCTION(cam_mclk2), +	FUNCTION(cam_mclk3), +	FUNCTION(cci_timer0), +	FUNCTION(cci_timer1), +	FUNCTION(cci_timer2), +	FUNCTION(cci_timer3), +	FUNCTION(cci_timer4), +	FUNCTION(cci_async_in0), +	FUNCTION(cci_async_in1), +	FUNCTION(cci_async_in2), +	FUNCTION(hdmi_cec), +	FUNCTION(hdmi_ddc), +	FUNCTION(hdmi_hpd), +	FUNCTION(edp_hpd), +	FUNCTION(gp_pdm0), +	FUNCTION(gp_pdm1), +	FUNCTION(gp_pdm2), +	FUNCTION(gp0_clk), +	FUNCTION(gp1_clk), +	FUNCTION(gp_mn), +	FUNCTION(tsif1), +	FUNCTION(tsif2), +	FUNCTION(hsic), +	FUNCTION(grfc), +	FUNCTION(audio_ref_clk), +	FUNCTION(bt), +	FUNCTION(fm), +	FUNCTION(wlan), +	FUNCTION(slimbus), +}; + +static const struct msm_pingroup msm8x74_groups[] = { +	PINGROUP(0,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA), +	PINGROUP(1,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA), +	PINGROUP(2,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA), +	PINGROUP(3,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA), +	PINGROUP(4,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA), +	PINGROUP(5,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA), +	PINGROUP(6,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA), +	PINGROUP(7,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA), +	PINGROUP(8,   blsp_spi3, blsp_uart3, blsp_uim3, blsp_spi1_cs1, NA, NA, NA), +	PINGROUP(9,   blsp_spi3, blsp_uart3, blsp_uim3, blsp_spi1_cs2, NA, NA, NA), +	PINGROUP(10,  blsp_spi3, blsp_uart3, blsp_i2c3, blsp_spi1_cs3, NA, NA, NA), +	PINGROUP(11,  blsp_spi3, blsp_uart3, blsp_i2c3, blsp_spi1_cs2, NA, NA, NA), +	PINGROUP(12,  mdp_vsync, NA, NA, NA, NA, NA, NA), +	PINGROUP(13,  mdp_vsync, NA, NA, NA, NA, NA, NA), +	PINGROUP(14,  mdp_vsync, NA, NA, NA, NA, NA, NA), +	PINGROUP(15,  cam_mclk0, NA, NA, NA, NA, NA, NA), +	PINGROUP(16,  cam_mclk1, NA, NA, NA, NA, NA, NA), +	PINGROUP(17,  cam_mclk2, NA, NA, NA, NA, NA, NA), +	PINGROUP(18,  cam_mclk3, NA, NA, NA, NA, NA, NA), +	PINGROUP(19,  cci_i2c0, blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA), +	PINGROUP(20,  cci_i2c0, blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA), +	PINGROUP(21,  cci_i2c1, blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA), +	PINGROUP(22,  cci_i2c1, blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA), +	PINGROUP(23,  cci_timer0, blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA), +	PINGROUP(24,  cci_timer1, blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA), +	PINGROUP(25,  cci_timer2, blsp_spi5, blsp_uart5, blsp_i2c5, NA, NA, NA), +	PINGROUP(26,  cci_timer3, cci_async_in1, blsp_spi5, blsp_uart5, blsp_i2c5, gp0_clk, NA), +	PINGROUP(27,  cci_timer4, cci_async_in2, blsp_spi6, blsp_uart6, blsp_i2c6, gp1_clk, NA), +	PINGROUP(28,  cci_async_in0, blsp_spi6, blsp_uart6, blsp_uim6, NA, NA, NA), +	PINGROUP(29,  blsp_spi6, blsp_uart6, blsp_i2c6, gp_mn, NA, NA, NA), +	PINGROUP(30,  blsp_spi6, blsp_uart6, blsp_i2c6, NA, NA, NA, NA), +	PINGROUP(31,  hdmi_cec, NA, NA, NA, NA, NA, NA), +	PINGROUP(32,  hdmi_ddc, NA, NA, NA, NA, NA, NA), +	PINGROUP(33,  hdmi_ddc, NA, NA, NA, NA, NA, NA), +	PINGROUP(34,  hdmi_hpd, NA, NA, NA, NA, NA, NA), +	PINGROUP(35,  bt, sdc3, NA, NA, NA, NA, NA), +	PINGROUP(36,  wlan, sdc3, NA, NA, NA, NA, NA), +	PINGROUP(37,  wlan, sdc3, NA, NA, NA, NA, NA), +	PINGROUP(38,  wlan, sdc3, NA, NA, NA, NA, NA), +	PINGROUP(39,  wlan, sdc3, NA, NA, NA, NA, NA), +	PINGROUP(40,  wlan, sdc3, NA, NA, NA, NA, NA), +	PINGROUP(41,  fm, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA), +	PINGROUP(42,  fm, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA), +	PINGROUP(43,  bt, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA), +	PINGROUP(44,  bt, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA), +	PINGROUP(45,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA), +	PINGROUP(46,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA), +	PINGROUP(47,  blsp_spi8, blsp_uart8, blsp_i2c8, blsp_spi10_cs1, NA, NA, NA), +	PINGROUP(48,  blsp_spi8, blsp_uart8, blsp_i2c8, blsp_spi10_cs2, NA, NA, NA), +	PINGROUP(49,  uim2, blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA), +	PINGROUP(50,  uim2, blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA), +	PINGROUP(51,  uim2, blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA), +	PINGROUP(52,  uim2, blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA), +	PINGROUP(53,  blsp_spi10, blsp_uart10, blsp_uim10, blsp_spi2_cs1, NA, NA, NA), +	PINGROUP(54,  blsp_spi10, blsp_uart10, blsp_uim10, blsp_spi2_cs2, gp_pdm0, NA, NA), +	PINGROUP(55,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA), +	PINGROUP(56,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA), +	PINGROUP(57,  qua_mi2s, gcc_gp_clk1, NA, NA, NA, NA, NA), +	PINGROUP(58,  qua_mi2s, gcc_gp_clk2, NA, NA, NA, NA, NA), +	PINGROUP(59,  qua_mi2s, gcc_gp_clk3, NA, NA, NA, NA, NA), +	PINGROUP(60,  qua_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(61,  qua_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(62,  qua_mi2s, blsp_spi2_cs1, NA, NA, NA, NA, NA), +	PINGROUP(63,  qua_mi2s, blsp_spi2_cs2, gp_pdm2, NA, NA, NA, NA), +	PINGROUP(64,  pri_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(65,  pri_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(66,  pri_mi2s, blsp_spi2_cs3, NA, NA, NA, NA, NA), +	PINGROUP(67,  pri_mi2s, blsp_spi10_cs1, NA, NA, NA, NA, NA), +	PINGROUP(68,  pri_mi2s, blsp_spi10_cs2, gp_pdm0, NA, NA, NA, NA), +	PINGROUP(69,  spkr_mi2s, audio_ref_clk, NA, NA, NA, NA, NA), +	PINGROUP(70,  slimbus, spkr_mi2s, NA, NA, NA, NA, NA), +	PINGROUP(71,  slimbus, spkr_mi2s, NA, NA, NA, NA, NA), +	PINGROUP(72,  spkr_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(73,  ter_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(74,  ter_mi2s, gp_pdm1, NA, NA, NA, NA, NA), +	PINGROUP(75,  ter_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(76,  ter_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(77,  ter_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(78,  sec_mi2s, gcc_gp_clk1, NA, NA, NA, NA, NA), +	PINGROUP(79,  sec_mi2s, gp_pdm2, NA, NA, NA, NA, NA), +	PINGROUP(80,  sec_mi2s, NA, NA, NA, NA, NA, NA), +	PINGROUP(81,  sec_mi2s, blsp_spi11, blsp_uart11, blsp_uim11, gcc_gp_clk2, NA, NA), +	PINGROUP(82,  sec_mi2s, blsp_spi11, blsp_uart11, blsp_uim11, gcc_gp_clk3, NA, NA), +	PINGROUP(83,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA), +	PINGROUP(84,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA), +	PINGROUP(85,  blsp_spi12, blsp_uart12, blsp_uim12, NA, NA, NA, NA), +	PINGROUP(86,  blsp_spi12, blsp_uart12, blsp_uim12, gp_pdm1, NA, NA, NA), +	PINGROUP(87,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA), +	PINGROUP(88,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA), +	PINGROUP(89,  tsif1, NA, NA, NA, NA, NA, NA), +	PINGROUP(90,  tsif1, blsp_spi10_cs3, NA, NA, NA, NA, NA), +	PINGROUP(91,  tsif1, sdc4, NA, NA, NA, NA, NA), +	PINGROUP(92,  tsif1, sdc4, NA, NA, NA, NA, NA), +	PINGROUP(93,  tsif2, sdc4, NA, NA, NA, NA, NA), +	PINGROUP(94,  tsif2, sdc4, NA, NA, NA, NA, NA), +	PINGROUP(95,  tsif2, sdc4, NA, NA, NA, NA, NA), +	PINGROUP(96,  tsif2, sdc4, NA, NA, NA, NA, NA), +	PINGROUP(97,  uim1, NA, NA, NA, NA, NA, NA), +	PINGROUP(98,  uim1, NA, NA, NA, NA, NA, NA), +	PINGROUP(99,  uim1, NA, NA, NA, NA, NA, NA), +	PINGROUP(100, uim1, NA, NA, NA, NA, NA, NA), +	PINGROUP(101, uim_batt_alarm, NA, NA, NA, NA, NA, NA), +	PINGROUP(102, edp_hpd, NA, NA, NA, NA, NA, NA), +	PINGROUP(103, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(104, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(105, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(106, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(107, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(108, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(109, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(110, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(111, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(112, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(113, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(114, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(115, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(116, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(117, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(118, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(119, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(120, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(121, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(122, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(123, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(124, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(125, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(126, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(127, grfc, NA, NA, NA, NA, NA, NA), +	PINGROUP(128, NA, grfc, NA, NA, NA, NA, NA), +	PINGROUP(129, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(130, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(131, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(132, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(133, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(134, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(135, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(136, NA, grfc, NA, NA, NA, NA, NA), +	PINGROUP(137, NA, grfc, NA, NA, NA, NA, NA), +	PINGROUP(138, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(139, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(140, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(141, NA, grfc, NA, NA, NA, NA, NA), +	PINGROUP(142, NA, NA, NA, NA, NA, NA, NA), +	PINGROUP(143, NA, grfc, NA, NA, NA, NA, NA), +	PINGROUP(144, hsic, NA, NA, NA, NA, NA, NA), +	PINGROUP(145, hsic, NA, NA, NA, NA, NA, NA), +	SDC_PINGROUP(sdc1_clk, 0x2044, 13, 6), +	SDC_PINGROUP(sdc1_cmd, 0x2044, 11, 3), +	SDC_PINGROUP(sdc1_data, 0x2044, 9, 0), +	SDC_PINGROUP(sdc2_clk, 0x2048, 14, 6), +	SDC_PINGROUP(sdc2_cmd, 0x2048, 11, 3), +	SDC_PINGROUP(sdc2_data, 0x2048, 9, 0), +}; + +#define NUM_GPIO_PINGROUPS 146 + +static const struct msm_pinctrl_soc_data msm8x74_pinctrl = { +	.pins = msm8x74_pins, +	.npins = ARRAY_SIZE(msm8x74_pins), +	.functions = msm8x74_functions, +	.nfunctions = ARRAY_SIZE(msm8x74_functions), +	.groups = msm8x74_groups, +	.ngroups = ARRAY_SIZE(msm8x74_groups), +	.ngpios = NUM_GPIO_PINGROUPS, +}; + +static int msm8x74_pinctrl_probe(struct platform_device *pdev) +{ +	return msm_pinctrl_probe(pdev, &msm8x74_pinctrl); +} + +static const struct of_device_id msm8x74_pinctrl_of_match[] = { +	{ .compatible = "qcom,msm8974-pinctrl", }, +	{ }, +}; + +static struct platform_driver msm8x74_pinctrl_driver = { +	.driver = { +		.name = "msm8x74-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = msm8x74_pinctrl_of_match, +	}, +	.probe = msm8x74_pinctrl_probe, +	.remove = msm_pinctrl_remove, +}; + +static int __init msm8x74_pinctrl_init(void) +{ +	return platform_driver_register(&msm8x74_pinctrl_driver); +} +arch_initcall(msm8x74_pinctrl_init); + +static void __exit msm8x74_pinctrl_exit(void) +{ +	platform_driver_unregister(&msm8x74_pinctrl_driver); +} +module_exit(msm8x74_pinctrl_exit); + +MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>"); +MODULE_DESCRIPTION("Qualcomm MSM8x74 pinctrl driver"); +MODULE_LICENSE("GPL v2"); +MODULE_DEVICE_TABLE(of, msm8x74_pinctrl_of_match); + diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c index d7c3ae300fa..8f6f16ef73f 100644 --- a/drivers/pinctrl/pinctrl-nomadik.c +++ b/drivers/pinctrl/pinctrl-nomadik.c @@ -4,7 +4,7 @@   * Copyright (C) 2008,2009 STMicroelectronics   * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>   *   Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com> - * Copyright (C) 2011 Linus Walleij <linus.walleij@linaro.org> + * Copyright (C) 2011-2013 Linus Walleij <linus.walleij@linaro.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 @@ -21,9 +21,6 @@  #include <linux/gpio.h>  #include <linux/spinlock.h>  #include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/irqdomain.h> -#include <linux/irqchip/chained_irq.h>  #include <linux/slab.h>  #include <linux/of_device.h>  #include <linux/of_address.h> @@ -33,7 +30,6 @@  #include <linux/pinctrl/pinconf.h>  /* Since we request GPIOs from ourself */  #include <linux/pinctrl/consumer.h> -#include <linux/platform_data/pinctrl-nomadik.h>  #include "pinctrl-nomadik.h"  #include "core.h" @@ -45,15 +41,216 @@   * Symbols in this file are called "nmk_gpio" for "nomadik gpio"   */ +/* + * pin configurations are represented by 32-bit integers: + * + *	bit  0.. 8 - Pin Number (512 Pins Maximum) + *	bit  9..10 - Alternate Function Selection + *	bit 11..12 - Pull up/down state + *	bit     13 - Sleep mode behaviour + *	bit     14 - Direction + *	bit     15 - Value (if output) + *	bit 16..18 - SLPM pull up/down state + *	bit 19..20 - SLPM direction + *	bit 21..22 - SLPM Value (if output) + *	bit 23..25 - PDIS value (if input) + *	bit	26 - Gpio mode + *	bit	27 - Sleep mode + * + * to facilitate the definition, the following macros are provided + * + * PIN_CFG_DEFAULT - default config (0): + *		     pull up/down = disabled + *		     sleep mode = input/wakeup + *		     direction = input + *		     value = low + *		     SLPM direction = same as normal + *		     SLPM pull = same as normal + *		     SLPM value = same as normal + * + * PIN_CFG	   - default config with alternate function + */ + +typedef unsigned long pin_cfg_t; + +#define PIN_NUM_MASK		0x1ff +#define PIN_NUM(x)		((x) & PIN_NUM_MASK) + +#define PIN_ALT_SHIFT		9 +#define PIN_ALT_MASK		(0x3 << PIN_ALT_SHIFT) +#define PIN_ALT(x)		(((x) & PIN_ALT_MASK) >> PIN_ALT_SHIFT) +#define PIN_GPIO		(NMK_GPIO_ALT_GPIO << PIN_ALT_SHIFT) +#define PIN_ALT_A		(NMK_GPIO_ALT_A << PIN_ALT_SHIFT) +#define PIN_ALT_B		(NMK_GPIO_ALT_B << PIN_ALT_SHIFT) +#define PIN_ALT_C		(NMK_GPIO_ALT_C << PIN_ALT_SHIFT) + +#define PIN_PULL_SHIFT		11 +#define PIN_PULL_MASK		(0x3 << PIN_PULL_SHIFT) +#define PIN_PULL(x)		(((x) & PIN_PULL_MASK) >> PIN_PULL_SHIFT) +#define PIN_PULL_NONE		(NMK_GPIO_PULL_NONE << PIN_PULL_SHIFT) +#define PIN_PULL_UP		(NMK_GPIO_PULL_UP << PIN_PULL_SHIFT) +#define PIN_PULL_DOWN		(NMK_GPIO_PULL_DOWN << PIN_PULL_SHIFT) + +#define PIN_SLPM_SHIFT		13 +#define PIN_SLPM_MASK		(0x1 << PIN_SLPM_SHIFT) +#define PIN_SLPM(x)		(((x) & PIN_SLPM_MASK) >> PIN_SLPM_SHIFT) +#define PIN_SLPM_MAKE_INPUT	(NMK_GPIO_SLPM_INPUT << PIN_SLPM_SHIFT) +#define PIN_SLPM_NOCHANGE	(NMK_GPIO_SLPM_NOCHANGE << PIN_SLPM_SHIFT) +/* These two replace the above in DB8500v2+ */ +#define PIN_SLPM_WAKEUP_ENABLE	(NMK_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT) +#define PIN_SLPM_WAKEUP_DISABLE	(NMK_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT) +#define PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP PIN_SLPM_WAKEUP_DISABLE + +#define PIN_SLPM_GPIO  PIN_SLPM_WAKEUP_ENABLE /* In SLPM, pin is a gpio */ +#define PIN_SLPM_ALTFUNC PIN_SLPM_WAKEUP_DISABLE /* In SLPM, pin is altfunc */ + +#define PIN_DIR_SHIFT		14 +#define PIN_DIR_MASK		(0x1 << PIN_DIR_SHIFT) +#define PIN_DIR(x)		(((x) & PIN_DIR_MASK) >> PIN_DIR_SHIFT) +#define PIN_DIR_INPUT		(0 << PIN_DIR_SHIFT) +#define PIN_DIR_OUTPUT		(1 << PIN_DIR_SHIFT) + +#define PIN_VAL_SHIFT		15 +#define PIN_VAL_MASK		(0x1 << PIN_VAL_SHIFT) +#define PIN_VAL(x)		(((x) & PIN_VAL_MASK) >> PIN_VAL_SHIFT) +#define PIN_VAL_LOW		(0 << PIN_VAL_SHIFT) +#define PIN_VAL_HIGH		(1 << PIN_VAL_SHIFT) + +#define PIN_SLPM_PULL_SHIFT	16 +#define PIN_SLPM_PULL_MASK	(0x7 << PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL(x)	\ +	(((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL_NONE	\ +	((1 + NMK_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL_UP	\ +	((1 + NMK_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT) +#define PIN_SLPM_PULL_DOWN	\ +	((1 + NMK_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT) + +#define PIN_SLPM_DIR_SHIFT	19 +#define PIN_SLPM_DIR_MASK	(0x3 << PIN_SLPM_DIR_SHIFT) +#define PIN_SLPM_DIR(x)		\ +	(((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT) +#define PIN_SLPM_DIR_INPUT	((1 + 0) << PIN_SLPM_DIR_SHIFT) +#define PIN_SLPM_DIR_OUTPUT	((1 + 1) << PIN_SLPM_DIR_SHIFT) + +#define PIN_SLPM_VAL_SHIFT	21 +#define PIN_SLPM_VAL_MASK	(0x3 << PIN_SLPM_VAL_SHIFT) +#define PIN_SLPM_VAL(x)		\ +	(((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT) +#define PIN_SLPM_VAL_LOW	((1 + 0) << PIN_SLPM_VAL_SHIFT) +#define PIN_SLPM_VAL_HIGH	((1 + 1) << PIN_SLPM_VAL_SHIFT) + +#define PIN_SLPM_PDIS_SHIFT		23 +#define PIN_SLPM_PDIS_MASK		(0x3 << PIN_SLPM_PDIS_SHIFT) +#define PIN_SLPM_PDIS(x)	\ +	(((x) & PIN_SLPM_PDIS_MASK) >> PIN_SLPM_PDIS_SHIFT) +#define PIN_SLPM_PDIS_NO_CHANGE		(0 << PIN_SLPM_PDIS_SHIFT) +#define PIN_SLPM_PDIS_DISABLED		(1 << PIN_SLPM_PDIS_SHIFT) +#define PIN_SLPM_PDIS_ENABLED		(2 << PIN_SLPM_PDIS_SHIFT) + +#define PIN_LOWEMI_SHIFT	25 +#define PIN_LOWEMI_MASK		(0x1 << PIN_LOWEMI_SHIFT) +#define PIN_LOWEMI(x)		(((x) & PIN_LOWEMI_MASK) >> PIN_LOWEMI_SHIFT) +#define PIN_LOWEMI_DISABLED	(0 << PIN_LOWEMI_SHIFT) +#define PIN_LOWEMI_ENABLED	(1 << PIN_LOWEMI_SHIFT) + +#define PIN_GPIOMODE_SHIFT	26 +#define PIN_GPIOMODE_MASK	(0x1 << PIN_GPIOMODE_SHIFT) +#define PIN_GPIOMODE(x)		(((x) & PIN_GPIOMODE_MASK) >> PIN_GPIOMODE_SHIFT) +#define PIN_GPIOMODE_DISABLED	(0 << PIN_GPIOMODE_SHIFT) +#define PIN_GPIOMODE_ENABLED	(1 << PIN_GPIOMODE_SHIFT) + +#define PIN_SLEEPMODE_SHIFT	27 +#define PIN_SLEEPMODE_MASK	(0x1 << PIN_SLEEPMODE_SHIFT) +#define PIN_SLEEPMODE(x)	(((x) & PIN_SLEEPMODE_MASK) >> PIN_SLEEPMODE_SHIFT) +#define PIN_SLEEPMODE_DISABLED	(0 << PIN_SLEEPMODE_SHIFT) +#define PIN_SLEEPMODE_ENABLED	(1 << PIN_SLEEPMODE_SHIFT) + + +/* Shortcuts.  Use these instead of separate DIR, PULL, and VAL.  */ +#define PIN_INPUT_PULLDOWN	(PIN_DIR_INPUT | PIN_PULL_DOWN) +#define PIN_INPUT_PULLUP	(PIN_DIR_INPUT | PIN_PULL_UP) +#define PIN_INPUT_NOPULL	(PIN_DIR_INPUT | PIN_PULL_NONE) +#define PIN_OUTPUT_LOW		(PIN_DIR_OUTPUT | PIN_VAL_LOW) +#define PIN_OUTPUT_HIGH		(PIN_DIR_OUTPUT | PIN_VAL_HIGH) + +#define PIN_SLPM_INPUT_PULLDOWN	(PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN) +#define PIN_SLPM_INPUT_PULLUP	(PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP) +#define PIN_SLPM_INPUT_NOPULL	(PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE) +#define PIN_SLPM_OUTPUT_LOW	(PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW) +#define PIN_SLPM_OUTPUT_HIGH	(PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH) + +#define PIN_CFG_DEFAULT		(0) + +#define PIN_CFG(num, alt)		\ +	(PIN_CFG_DEFAULT |\ +	 (PIN_NUM(num) | PIN_##alt)) + +#define PIN_CFG_INPUT(num, alt, pull)		\ +	(PIN_CFG_DEFAULT |\ +	 (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull)) + +#define PIN_CFG_OUTPUT(num, alt, val)		\ +	(PIN_CFG_DEFAULT |\ +	 (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val)) + +/* + * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving + * the "gpio" namespace for generic and cross-machine functions + */ + +#define GPIO_BLOCK_SHIFT 5 +#define NMK_GPIO_PER_CHIP (1 << GPIO_BLOCK_SHIFT) + +/* Register in the logic block */ +#define NMK_GPIO_DAT	0x00 +#define NMK_GPIO_DATS	0x04 +#define NMK_GPIO_DATC	0x08 +#define NMK_GPIO_PDIS	0x0c +#define NMK_GPIO_DIR	0x10 +#define NMK_GPIO_DIRS	0x14 +#define NMK_GPIO_DIRC	0x18 +#define NMK_GPIO_SLPC	0x1c +#define NMK_GPIO_AFSLA	0x20 +#define NMK_GPIO_AFSLB	0x24 +#define NMK_GPIO_LOWEMI	0x28 + +#define NMK_GPIO_RIMSC	0x40 +#define NMK_GPIO_FIMSC	0x44 +#define NMK_GPIO_IS	0x48 +#define NMK_GPIO_IC	0x4c +#define NMK_GPIO_RWIMSC	0x50 +#define NMK_GPIO_FWIMSC	0x54 +#define NMK_GPIO_WKS	0x58 +/* These appear in DB8540 and later ASICs */ +#define NMK_GPIO_EDGELEVEL 0x5C +#define NMK_GPIO_LEVEL	0x60 + + +/* Pull up/down values */ +enum nmk_gpio_pull { +	NMK_GPIO_PULL_NONE, +	NMK_GPIO_PULL_UP, +	NMK_GPIO_PULL_DOWN, +}; + +/* Sleep mode */ +enum nmk_gpio_slpm { +	NMK_GPIO_SLPM_INPUT, +	NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT, +	NMK_GPIO_SLPM_NOCHANGE, +	NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE, +}; +  struct nmk_gpio_chip {  	struct gpio_chip chip; -	struct irq_domain *domain;  	void __iomem *addr;  	struct clk *clk;  	unsigned int bank;  	unsigned int parent_irq; -	int secondary_parent_irq; -	u32 (*get_secondary_status)(unsigned int bank); +	int latent_parent_irq; +	u32 (*get_latent_status)(unsigned int bank);  	void (*set_ioforce)(bool enable);  	spinlock_t lock;  	bool sleepmode; @@ -218,7 +415,7 @@ nmk_gpio_disable_lazy_irq(struct nmk_gpio_chip *nmk_chip, unsigned offset)  	u32 falling = nmk_chip->fimsc & BIT(offset);  	u32 rising = nmk_chip->rimsc & BIT(offset);  	int gpio = nmk_chip->chip.base + offset; -	int irq = irq_find_mapping(nmk_chip->domain, offset); +	int irq = irq_find_mapping(nmk_chip->chip.irqdomain, offset);  	struct irq_data *d = irq_get_irq_data(irq);  	if (!rising && !falling) @@ -446,11 +643,8 @@ static inline int nmk_gpio_get_bitmask(int gpio)  static void nmk_gpio_irq_ack(struct irq_data *d)  { -	struct nmk_gpio_chip *nmk_chip; - -	nmk_chip = irq_data_get_irq_chip_data(d); -	if (!nmk_chip) -		return; +	struct gpio_chip *chip = irq_data_get_irq_chip_data(d); +	struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);  	clk_enable(nmk_chip->clk);  	writel(nmk_gpio_get_bitmask(d->hwirq), nmk_chip->addr + NMK_GPIO_IC); @@ -662,16 +856,15 @@ static struct irq_chip nmk_gpio_irq_chip = {  static void __nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc,  				   u32 status)  { -	struct nmk_gpio_chip *nmk_chip;  	struct irq_chip *host_chip = irq_get_chip(irq); +	struct gpio_chip *chip = irq_desc_get_handler_data(desc);  	chained_irq_enter(host_chip, desc); -	nmk_chip = irq_get_handler_data(irq);  	while (status) {  		int bit = __ffs(status); -		generic_handle_irq(irq_find_mapping(nmk_chip->domain, bit)); +		generic_handle_irq(irq_find_mapping(chip->irqdomain, bit));  		status &= ~BIT(bit);  	} @@ -680,7 +873,8 @@ static void __nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc,  static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)  { -	struct nmk_gpio_chip *nmk_chip = irq_get_handler_data(irq); +	struct gpio_chip *chip = irq_desc_get_handler_data(desc); +	struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);  	u32 status;  	clk_enable(nmk_chip->clk); @@ -690,29 +884,16 @@ static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)  	__nmk_gpio_irq_handler(irq, desc, status);  } -static void nmk_gpio_secondary_irq_handler(unsigned int irq, +static void nmk_gpio_latent_irq_handler(unsigned int irq,  					   struct irq_desc *desc)  { -	struct nmk_gpio_chip *nmk_chip = irq_get_handler_data(irq); -	u32 status = nmk_chip->get_secondary_status(nmk_chip->bank); +	struct gpio_chip *chip = irq_desc_get_handler_data(desc); +	struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip); +	u32 status = nmk_chip->get_latent_status(nmk_chip->bank);  	__nmk_gpio_irq_handler(irq, desc, status);  } -static int nmk_gpio_init_irq(struct nmk_gpio_chip *nmk_chip) -{ -	irq_set_chained_handler(nmk_chip->parent_irq, nmk_gpio_irq_handler); -	irq_set_handler_data(nmk_chip->parent_irq, nmk_chip); - -	if (nmk_chip->secondary_parent_irq >= 0) { -		irq_set_chained_handler(nmk_chip->secondary_parent_irq, -					nmk_gpio_secondary_irq_handler); -		irq_set_handler_data(nmk_chip->secondary_parent_irq, nmk_chip); -	} - -	return 0; -} -  /* I/O Functions */  static int nmk_gpio_request(struct gpio_chip *chip, unsigned offset) @@ -791,14 +972,6 @@ static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset,  	return 0;  } -static int nmk_gpio_to_irq(struct gpio_chip *chip, unsigned offset) -{ -	struct nmk_gpio_chip *nmk_chip = -		container_of(chip, struct nmk_gpio_chip, chip); - -	return irq_create_mapping(nmk_chip->domain, offset); -} -  #ifdef CONFIG_DEBUG_FS  #include <linux/seq_file.h> @@ -841,14 +1014,14 @@ static void nmk_gpio_dbg_show_one(struct seq_file *s,  		   (mode < 0) ? "unknown" : modes[mode],  		   pull ? "pull" : "none"); -	if (label && !is_out) { -		int		irq = gpio_to_irq(gpio); +	if (!is_out) { +		int irq = gpio_to_irq(gpio);  		struct irq_desc	*desc = irq_to_desc(irq);  		/* This races with request_irq(), set_irq_type(),  		 * and set_irq_wake() ... but those are "rare".  		 */ -		if (irq >= 0 && desc->action) { +		if (irq > 0 && desc && desc->action) {  			char *trigger;  			u32 bitmask = nmk_gpio_get_bitmask(gpio); @@ -897,9 +1070,8 @@ static struct gpio_chip nmk_gpio_template = {  	.get			= nmk_gpio_get_input,  	.direction_output	= nmk_gpio_make_output,  	.set			= nmk_gpio_set_output, -	.to_irq			= nmk_gpio_to_irq,  	.dbg_show		= nmk_gpio_dbg_show, -	.can_sleep		= 0, +	.can_sleep		= false,  };  void nmk_gpio_clocks_enable(void) @@ -998,70 +1170,35 @@ void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up)  	}  } -static int nmk_gpio_irq_map(struct irq_domain *d, unsigned int irq, -			    irq_hw_number_t hwirq) -{ -	struct nmk_gpio_chip *nmk_chip = d->host_data; - -	if (!nmk_chip) -		return -EINVAL; - -	irq_set_chip_and_handler(irq, &nmk_gpio_irq_chip, handle_edge_irq); -	set_irq_flags(irq, IRQF_VALID); -	irq_set_chip_data(irq, nmk_chip); -	irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING); - -	return 0; -} - -static const struct irq_domain_ops nmk_gpio_irq_simple_ops = { -	.map = nmk_gpio_irq_map, -	.xlate = irq_domain_xlate_twocell, -}; -  static int nmk_gpio_probe(struct platform_device *dev)  { -	struct nmk_gpio_platform_data *pdata = dev->dev.platform_data;  	struct device_node *np = dev->dev.of_node;  	struct nmk_gpio_chip *nmk_chip;  	struct gpio_chip *chip;  	struct resource *res;  	struct clk *clk; -	int secondary_irq; +	int latent_irq; +	bool supports_sleepmode;  	void __iomem *base; -	int irq_start = 0;  	int irq;  	int ret; -	if (!pdata && !np) { -		dev_err(&dev->dev, "No platform data or device tree found\n"); -		return -ENODEV; -	} - -	if (np) { -		pdata = devm_kzalloc(&dev->dev, sizeof(*pdata), GFP_KERNEL); -		if (!pdata) -			return -ENOMEM; - -		if (of_get_property(np, "st,supports-sleepmode", NULL)) -			pdata->supports_sleepmode = true; - -		if (of_property_read_u32(np, "gpio-bank", &dev->id)) { -			dev_err(&dev->dev, "gpio-bank property not found\n"); -			return -EINVAL; -		} +	if (of_get_property(np, "st,supports-sleepmode", NULL)) +		supports_sleepmode = true; +	else +		supports_sleepmode = false; -		pdata->first_gpio = dev->id * NMK_GPIO_PER_CHIP; -		pdata->num_gpio   = NMK_GPIO_PER_CHIP; +	if (of_property_read_u32(np, "gpio-bank", &dev->id)) { +		dev_err(&dev->dev, "gpio-bank property not found\n"); +		return -EINVAL;  	}  	irq = platform_get_irq(dev, 0);  	if (irq < 0)  		return irq; -	secondary_irq = platform_get_irq(dev, 1); -	if (secondary_irq >= 0 && !pdata->get_secondary_status) -		return -EINVAL; +	/* It's OK for this IRQ not to be present */ +	latent_irq = platform_get_irq(dev, 1);  	res = platform_get_resource(dev, IORESOURCE_MEM, 0);  	base = devm_ioremap_resource(&dev->dev, res); @@ -1086,26 +1223,21 @@ static int nmk_gpio_probe(struct platform_device *dev)  	nmk_chip->addr = base;  	nmk_chip->chip = nmk_gpio_template;  	nmk_chip->parent_irq = irq; -	nmk_chip->secondary_parent_irq = secondary_irq; -	nmk_chip->get_secondary_status = pdata->get_secondary_status; -	nmk_chip->set_ioforce = pdata->set_ioforce; -	nmk_chip->sleepmode = pdata->supports_sleepmode; +	nmk_chip->latent_parent_irq = latent_irq; +	nmk_chip->sleepmode = supports_sleepmode;  	spin_lock_init(&nmk_chip->lock);  	chip = &nmk_chip->chip; -	chip->base = pdata->first_gpio; -	chip->ngpio = pdata->num_gpio; -	chip->label = pdata->name ?: dev_name(&dev->dev); +	chip->base = dev->id * NMK_GPIO_PER_CHIP; +	chip->ngpio = NMK_GPIO_PER_CHIP; +	chip->label = dev_name(&dev->dev);  	chip->dev = &dev->dev;  	chip->owner = THIS_MODULE;  	clk_enable(nmk_chip->clk);  	nmk_chip->lowemi = readl_relaxed(nmk_chip->addr + NMK_GPIO_LOWEMI);  	clk_disable(nmk_chip->clk); - -#ifdef CONFIG_OF_GPIO  	chip->of_node = np; -#endif  	ret = gpiochip_add(&nmk_chip->chip);  	if (ret) @@ -1117,19 +1249,31 @@ static int nmk_gpio_probe(struct platform_device *dev)  	platform_set_drvdata(dev, nmk_chip); -	if (!np) -		irq_start = pdata->first_irq; -	nmk_chip->domain = irq_domain_add_simple(np, -				NMK_GPIO_PER_CHIP, irq_start, -				&nmk_gpio_irq_simple_ops, nmk_chip); -	if (!nmk_chip->domain) { -		dev_err(&dev->dev, "failed to create irqdomain\n"); -		/* Just do this, no matter if it fails */ +	/* +	 * Let the generic code handle this edge IRQ, the the chained +	 * handler will perform the actual work of handling the parent +	 * interrupt. +	 */ +	ret = gpiochip_irqchip_add(&nmk_chip->chip, +				   &nmk_gpio_irq_chip, +				   0, +				   handle_edge_irq, +				   IRQ_TYPE_EDGE_FALLING); +	if (ret) { +		dev_err(&dev->dev, "could not add irqchip\n");  		ret = gpiochip_remove(&nmk_chip->chip); -		return -ENOSYS; +		return -ENODEV;  	} - -	nmk_gpio_init_irq(nmk_chip); +	/* Then register the chain on the parent IRQ */ +	gpiochip_set_chained_irqchip(&nmk_chip->chip, +				     &nmk_gpio_irq_chip, +				     nmk_chip->parent_irq, +				     nmk_gpio_irq_handler); +	if (nmk_chip->latent_parent_irq > 0) +		gpiochip_set_chained_irqchip(&nmk_chip->chip, +					     &nmk_gpio_irq_chip, +					     nmk_chip->latent_parent_irq, +					     nmk_gpio_latent_irq_handler);  	dev_info(&dev->dev, "at address %p\n", nmk_chip->addr); @@ -1829,35 +1973,36 @@ static const struct of_device_id nmk_pinctrl_match[] = {  	{},  }; -static int nmk_pinctrl_suspend(struct platform_device *pdev, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int nmk_pinctrl_suspend(struct device *dev)  {  	struct nmk_pinctrl *npct; -	npct = platform_get_drvdata(pdev); +	npct = dev_get_drvdata(dev);  	if (!npct)  		return -EINVAL;  	return pinctrl_force_sleep(npct->pctl);  } -static int nmk_pinctrl_resume(struct platform_device *pdev) +static int nmk_pinctrl_resume(struct device *dev)  {  	struct nmk_pinctrl *npct; -	npct = platform_get_drvdata(pdev); +	npct = dev_get_drvdata(dev);  	if (!npct)  		return -EINVAL;  	return pinctrl_force_default(npct->pctl);  } +#endif  static int nmk_pinctrl_probe(struct platform_device *pdev)  { -	const struct platform_device_id *platid = platform_get_device_id(pdev); +	const struct of_device_id *match;  	struct device_node *np = pdev->dev.of_node;  	struct device_node *prcm_np;  	struct nmk_pinctrl *npct; -	struct resource *res;  	unsigned int version = 0;  	int i; @@ -1865,16 +2010,10 @@ static int nmk_pinctrl_probe(struct platform_device *pdev)  	if (!npct)  		return -ENOMEM; -	if (platid) -		version = platid->driver_data; -	else if (np) { -		const struct of_device_id *match; - -		match = of_match_device(nmk_pinctrl_match, &pdev->dev); -		if (!match) -			return -ENODEV; -		version = (unsigned int) match->data; -	} +	match = of_match_device(nmk_pinctrl_match, &pdev->dev); +	if (!match) +		return -ENODEV; +	version = (unsigned int) match->data;  	/* Poke in other ASIC variants here */  	if (version == PINCTRL_NMK_STN8815) @@ -1884,17 +2023,9 @@ static int nmk_pinctrl_probe(struct platform_device *pdev)  	if (version == PINCTRL_NMK_DB8540)  		nmk_pinctrl_db8540_init(&npct->soc); -	if (np) { -		prcm_np = of_parse_phandle(np, "prcm", 0); -		if (prcm_np) -			npct->prcm_base = of_iomap(prcm_np, 0); -	} - -	/* Allow platform passed information to over-write DT. */ -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (res) -		npct->prcm_base = devm_ioremap(&pdev->dev, res->start, -					       resource_size(res)); +	prcm_np = of_parse_phandle(np, "prcm", 0); +	if (prcm_np) +		npct->prcm_base = of_iomap(prcm_np, 0);  	if (!npct->prcm_base) {  		if (version == PINCTRL_NMK_STN8815) {  			dev_info(&pdev->dev, @@ -1953,25 +2084,18 @@ static struct platform_driver nmk_gpio_driver = {  	.probe = nmk_gpio_probe,  }; -static const struct platform_device_id nmk_pinctrl_id[] = { -	{ "pinctrl-stn8815", PINCTRL_NMK_STN8815 }, -	{ "pinctrl-db8500", PINCTRL_NMK_DB8500 }, -	{ "pinctrl-db8540", PINCTRL_NMK_DB8540 }, -	{ } -}; +static SIMPLE_DEV_PM_OPS(nmk_pinctrl_pm_ops, +			nmk_pinctrl_suspend, +			nmk_pinctrl_resume);  static struct platform_driver nmk_pinctrl_driver = {  	.driver = {  		.owner = THIS_MODULE,  		.name = "pinctrl-nomadik",  		.of_match_table = nmk_pinctrl_match, +		.pm = &nmk_pinctrl_pm_ops,  	},  	.probe = nmk_pinctrl_probe, -	.id_table = nmk_pinctrl_id, -#ifdef CONFIG_PM -	.suspend = nmk_pinctrl_suspend, -	.resume = nmk_pinctrl_resume, -#endif  };  static int __init nmk_gpio_init(void) diff --git a/drivers/pinctrl/pinctrl-nomadik.h b/drivers/pinctrl/pinctrl-nomadik.h index bcd4191e10e..d8215f1e70c 100644 --- a/drivers/pinctrl/pinctrl-nomadik.h +++ b/drivers/pinctrl/pinctrl-nomadik.h @@ -1,13 +1,23 @@  #ifndef PINCTRL_PINCTRL_NOMADIK_H  #define PINCTRL_PINCTRL_NOMADIK_H -#include <linux/platform_data/pinctrl-nomadik.h> -  /* Package definitions */  #define PINCTRL_NMK_STN8815	0  #define PINCTRL_NMK_DB8500	1  #define PINCTRL_NMK_DB8540	2 +/* Alternate functions: function C is set in hw by setting both A and B */ +#define NMK_GPIO_ALT_GPIO	0 +#define NMK_GPIO_ALT_A	1 +#define NMK_GPIO_ALT_B	2 +#define NMK_GPIO_ALT_C	(NMK_GPIO_ALT_A | NMK_GPIO_ALT_B) + +#define NMK_GPIO_ALT_CX_SHIFT 2 +#define NMK_GPIO_ALT_C1	((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) +#define NMK_GPIO_ALT_C2	((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) +#define NMK_GPIO_ALT_C3	((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) +#define NMK_GPIO_ALT_C4	((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C) +  #define PRCM_GPIOCR_ALTCX(pin_num,\  	altc1_used, altc1_ri, altc1_cb,\  	altc2_used, altc2_ri, altc2_cb,\ diff --git a/drivers/pinctrl/pinctrl-palmas.c b/drivers/pinctrl/pinctrl-palmas.c index 82638fac3cf..f13d0e78a41 100644 --- a/drivers/pinctrl/pinctrl-palmas.c +++ b/drivers/pinctrl/pinctrl-palmas.c @@ -892,8 +892,6 @@ static int palmas_pinconf_set(struct pinctrl_dev *pctldev,  		param_val = pinconf_to_config_argument(configs[i]);  		switch (param) { -		case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: -			return 0;  		case PIN_CONFIG_BIAS_DISABLE:  		case PIN_CONFIG_BIAS_PULL_UP:  		case PIN_CONFIG_BIAS_PULL_DOWN: @@ -961,26 +959,9 @@ static int palmas_pinconf_set(struct pinctrl_dev *pctldev,  	return 0;  } -static int palmas_pinconf_group_get(struct pinctrl_dev *pctldev, -				unsigned group, unsigned long *config) -{ -	dev_err(pctldev->dev, "palmas_pinconf_group_get op not supported\n"); -	return -ENOTSUPP; -} - -static int palmas_pinconf_group_set(struct pinctrl_dev *pctldev, -				unsigned group, unsigned long *configs, -				unsigned num_configs) -{ -	dev_err(pctldev->dev, "palmas_pinconf_group_set op not supported\n"); -	return -ENOTSUPP; -} -  static const struct pinconf_ops palmas_pinconf_ops = {  	.pin_config_get = palmas_pinconf_get,  	.pin_config_set = palmas_pinconf_set, -	.pin_config_group_get = palmas_pinconf_group_get, -	.pin_config_group_set = palmas_pinconf_group_set,  };  static struct pinctrl_desc palmas_pinctrl_desc = { diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index e0718b7c4ab..bb805d5e9ff 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -37,6 +37,8 @@  #include <linux/pinctrl/pinconf-generic.h>  #include <linux/irqchip/chained_irq.h>  #include <linux/clk.h> +#include <linux/regmap.h> +#include <linux/mfd/syscon.h>  #include <dt-bindings/pinctrl/rockchip.h>  #include "core.h" @@ -56,8 +58,20 @@  #define GPIO_EXT_PORT		0x50  #define GPIO_LS_SYNC		0x60 +enum rockchip_pinctrl_type { +	RK2928, +	RK3066B, +	RK3188, +}; + +enum rockchip_pin_bank_type { +	COMMON_BANK, +	RK3188_BANK0, +}; +  /**   * @reg_base: register base of the gpio bank + * @reg_pull: optional separate register for additional pull settings   * @clk: clock of the gpio bank   * @irq: interrupt of the gpio bank   * @pin_base: first pin number @@ -74,12 +88,14 @@   */  struct rockchip_pin_bank {  	void __iomem			*reg_base; +	struct regmap			*regmap_pull;  	struct clk			*clk;  	int				irq;  	u32				pin_base;  	u8				nr_pins;  	char				*name;  	u8				bank_num; +	enum rockchip_pin_bank_type	bank_type;  	bool				valid;  	struct device_node		*of_node;  	struct rockchip_pinctrl		*drvdata; @@ -87,7 +103,7 @@ struct rockchip_pin_bank {  	struct gpio_chip		gpio_chip;  	struct pinctrl_gpio_range	grange;  	spinlock_t			slock; - +	u32				toggle_edge_mode;  };  #define PIN_BANK(id, pins, label)			\ @@ -98,18 +114,17 @@ struct rockchip_pin_bank {  	}  /** - * @pull_auto: some SoCs don't allow pulls to be specified as up or down, but - *	       instead decide this automatically based on the pad-type.   */  struct rockchip_pin_ctrl {  	struct rockchip_pin_bank	*pin_banks;  	u32				nr_banks;  	u32				nr_pins;  	char				*label; +	enum rockchip_pinctrl_type	type;  	int				mux_offset; -	int				pull_offset; -	bool				pull_auto; -	int				pull_bank_stride; +	void	(*pull_calc_reg)(struct rockchip_pin_bank *bank, +				    int pin_num, struct regmap **regmap, +				    int *reg, u8 *bit);  };  struct rockchip_pin_config { @@ -147,7 +162,10 @@ struct rockchip_pmx_func {  };  struct rockchip_pinctrl { -	void __iomem			*reg_base; +	struct regmap			*regmap_base; +	int				reg_size; +	struct regmap			*regmap_pull; +	struct regmap			*regmap_pmu;  	struct device			*dev;  	struct rockchip_pin_ctrl	*ctrl;  	struct pinctrl_desc		pctl; @@ -158,6 +176,12 @@ struct rockchip_pinctrl {  	unsigned int			nfunctions;  }; +static struct regmap_config rockchip_regmap_config = { +	.reg_bits = 32, +	.val_bits = 32, +	.reg_stride = 4, +}; +  static inline struct rockchip_pin_bank *gc_to_pin_bank(struct gpio_chip *gc)  {  	return container_of(gc, struct rockchip_pin_bank, gpio_chip); @@ -316,6 +340,29 @@ static const struct pinctrl_ops rockchip_pctrl_ops = {   * Hardware access   */ +static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) +{ +	struct rockchip_pinctrl *info = bank->drvdata; +	unsigned int val; +	int reg, ret; +	u8 bit; + +	if (bank->bank_type == RK3188_BANK0 && pin < 16) +		return RK_FUNC_GPIO; + +	/* get basic quadrupel of mux registers and the correct reg inside */ +	reg = info->ctrl->mux_offset; +	reg += bank->bank_num * 0x10; +	reg += (pin / 8) * 4; +	bit = (pin % 8) * 2; + +	ret = regmap_read(info->regmap_base, reg, &val); +	if (ret) +		return ret; + +	return ((val >> bit) & 3); +} +  /*   * Set a new mux function for a pin.   * @@ -329,18 +376,33 @@ static const struct pinctrl_ops rockchip_pctrl_ops = {   * @pin: pin to change   * @mux: new mux function to set   */ -static void rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) +static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)  {  	struct rockchip_pinctrl *info = bank->drvdata; -	void __iomem *reg = info->reg_base + info->ctrl->mux_offset; +	int reg, ret;  	unsigned long flags;  	u8 bit;  	u32 data; +	/* +	 * The first 16 pins of rk3188_bank0 are always gpios and do not have +	 * a mux register at all. +	 */ +	if (bank->bank_type == RK3188_BANK0 && pin < 16) { +		if (mux != RK_FUNC_GPIO) { +			dev_err(info->dev, +				"pin %d only supports a gpio mux\n", pin); +			return -ENOTSUPP; +		} else { +			return 0; +		} +	} +  	dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",  						bank->bank_num, pin, mux);  	/* get basic quadrupel of mux registers and the correct reg inside */ +	reg = info->ctrl->mux_offset;  	reg += bank->bank_num * 0x10;  	reg += (pin / 8) * 4;  	bit = (pin % 8) * 2; @@ -349,36 +411,116 @@ static void rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)  	data = (3 << (bit + 16));  	data |= (mux & 3) << bit; -	writel(data, reg); +	ret = regmap_write(info->regmap_base, reg, data);  	spin_unlock_irqrestore(&bank->slock, flags); + +	return ret; +} + +#define RK2928_PULL_OFFSET		0x118 +#define RK2928_PULL_PINS_PER_REG	16 +#define RK2928_PULL_BANK_STRIDE		8 + +static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, +				    int pin_num, struct regmap **regmap, +				    int *reg, u8 *bit) +{ +	struct rockchip_pinctrl *info = bank->drvdata; + +	*regmap = info->regmap_base; +	*reg = RK2928_PULL_OFFSET; +	*reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; +	*reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; + +	*bit = pin_num % RK2928_PULL_PINS_PER_REG; +}; + +#define RK3188_PULL_OFFSET		0x164 +#define RK3188_PULL_BITS_PER_PIN	2 +#define RK3188_PULL_PINS_PER_REG	8 +#define RK3188_PULL_BANK_STRIDE		16 +#define RK3188_PULL_PMU_OFFSET		0x64 + +static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, +				    int pin_num, struct regmap **regmap, +				    int *reg, u8 *bit) +{ +	struct rockchip_pinctrl *info = bank->drvdata; + +	/* The first 12 pins of the first bank are located elsewhere */ +	if (bank->bank_type == RK3188_BANK0 && pin_num < 12) { +		*regmap = info->regmap_pmu ? info->regmap_pmu +					   : bank->regmap_pull; +		*reg = info->regmap_pmu ? RK3188_PULL_PMU_OFFSET : 0; +		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); +		*bit = pin_num % RK3188_PULL_PINS_PER_REG; +		*bit *= RK3188_PULL_BITS_PER_PIN; +	} else { +		*regmap = info->regmap_pull ? info->regmap_pull +					    : info->regmap_base; +		*reg = info->regmap_pull ? 0 : RK3188_PULL_OFFSET; + +		/* correct the offset, as it is the 2nd pull register */ +		*reg -= 4; +		*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; +		*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); + +		/* +		 * The bits in these registers have an inverse ordering +		 * with the lowest pin being in bits 15:14 and the highest +		 * pin in bits 1:0 +		 */ +		*bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); +		*bit *= RK3188_PULL_BITS_PER_PIN; +	}  }  static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)  {  	struct rockchip_pinctrl *info = bank->drvdata;  	struct rockchip_pin_ctrl *ctrl = info->ctrl; -	void __iomem *reg; +	struct regmap *regmap; +	int reg, ret;  	u8 bit; +	u32 data;  	/* rk3066b does support any pulls */ -	if (!ctrl->pull_offset) +	if (ctrl->type == RK3066B)  		return PIN_CONFIG_BIAS_DISABLE; -	reg = info->reg_base + ctrl->pull_offset; +	ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); -	if (ctrl->pull_auto) { -		reg += bank->bank_num * ctrl->pull_bank_stride; -		reg += (pin_num / 16) * 4; -		bit = pin_num % 16; +	ret = regmap_read(regmap, reg, &data); +	if (ret) +		return ret; -		return !(readl_relaxed(reg) & BIT(bit)) +	switch (ctrl->type) { +	case RK2928: +		return !(data & BIT(bit))  				? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT  				: PIN_CONFIG_BIAS_DISABLE; -	} else { -		dev_err(info->dev, "pull support for rk31xx not implemented\n"); +	case RK3188: +		data >>= bit; +		data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1; + +		switch (data) { +		case 0: +			return PIN_CONFIG_BIAS_DISABLE; +		case 1: +			return PIN_CONFIG_BIAS_PULL_UP; +		case 2: +			return PIN_CONFIG_BIAS_PULL_DOWN; +		case 3: +			return PIN_CONFIG_BIAS_BUS_HOLD; +		} + +		dev_err(info->dev, "unknown pull setting\n");  		return -EIO; -	} +	default: +		dev_err(info->dev, "unsupported pinctrl type\n"); +		return -EINVAL; +	};  }  static int rockchip_set_pull(struct rockchip_pin_bank *bank, @@ -386,7 +528,8 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,  {  	struct rockchip_pinctrl *info = bank->drvdata;  	struct rockchip_pin_ctrl *ctrl = info->ctrl; -	void __iomem *reg; +	struct regmap *regmap; +	int reg, ret;  	unsigned long flags;  	u8 bit;  	u32 data; @@ -395,41 +538,57 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,  		 bank->bank_num, pin_num, pull);  	/* rk3066b does support any pulls */ -	if (!ctrl->pull_offset) +	if (ctrl->type == RK3066B)  		return pull ? -EINVAL : 0; -	reg = info->reg_base + ctrl->pull_offset; - -	if (ctrl->pull_auto) { -		if (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT && -					pull != PIN_CONFIG_BIAS_DISABLE) { -			dev_err(info->dev, "only PIN_DEFAULT and DISABLE allowed\n"); -			return -EINVAL; -		} - -		reg += bank->bank_num * ctrl->pull_bank_stride; -		reg += (pin_num / 16) * 4; -		bit = pin_num % 16; +	ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); +	switch (ctrl->type) { +	case RK2928:  		spin_lock_irqsave(&bank->slock, flags);  		data = BIT(bit + 16);  		if (pull == PIN_CONFIG_BIAS_DISABLE)  			data |= BIT(bit); -		writel(data, reg); +		ret = regmap_write(regmap, reg, data);  		spin_unlock_irqrestore(&bank->slock, flags); -	} else { -		if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) { -			dev_err(info->dev, "pull direction (up/down) needs to be specified\n"); +		break; +	case RK3188: +		spin_lock_irqsave(&bank->slock, flags); + +		/* enable the write to the equivalent lower bits */ +		data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); + +		switch (pull) { +		case PIN_CONFIG_BIAS_DISABLE: +			break; +		case PIN_CONFIG_BIAS_PULL_UP: +			data |= (1 << bit); +			break; +		case PIN_CONFIG_BIAS_PULL_DOWN: +			data |= (2 << bit); +			break; +		case PIN_CONFIG_BIAS_BUS_HOLD: +			data |= (3 << bit); +			break; +		default: +			spin_unlock_irqrestore(&bank->slock, flags); +			dev_err(info->dev, "unsupported pull setting %d\n", +				pull);  			return -EINVAL;  		} -		dev_err(info->dev, "pull support for rk31xx not implemented\n"); -		return -EIO; +		ret = regmap_write(regmap, reg, data); + +		spin_unlock_irqrestore(&bank->slock, flags); +		break; +	default: +		dev_err(info->dev, "unsupported pinctrl type\n"); +		return -EINVAL;  	} -	return 0; +	return ret;  }  /* @@ -470,7 +629,7 @@ static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,  	const unsigned int *pins = info->groups[group].pins;  	const struct rockchip_pin_config *data = info->groups[group].data;  	struct rockchip_pin_bank *bank; -	int cnt; +	int cnt, ret = 0;  	dev_dbg(info->dev, "enable function %s group %s\n",  		info->functions[selector].name, info->groups[group].name); @@ -481,8 +640,18 @@ static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,  	 */  	for (cnt = 0; cnt < info->groups[group].npins; cnt++) {  		bank = pin_to_bank(info, pins[cnt]); -		rockchip_set_mux(bank, pins[cnt] - bank->pin_base, -				 data[cnt].func); +		ret = rockchip_set_mux(bank, pins[cnt] - bank->pin_base, +				       data[cnt].func); +		if (ret) +			break; +	} + +	if (ret) { +		/* revert the already done pin settings */ +		for (cnt--; cnt >= 0; cnt--) +			rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0); + +		return ret;  	}  	return 0; @@ -517,7 +686,7 @@ static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,  	struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);  	struct rockchip_pin_bank *bank;  	struct gpio_chip *chip; -	int pin; +	int pin, ret;  	u32 data;  	chip = range->gc; @@ -527,7 +696,9 @@ static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,  	dev_dbg(info->dev, "gpio_direction for pin %u as %s-%d to %s\n",  		 offset, range->name, pin, input ? "input" : "output"); -	rockchip_set_mux(bank, pin, RK_FUNC_GPIO); +	ret = rockchip_set_mux(bank, pin, RK_FUNC_GPIO); +	if (ret < 0) +		return ret;  	data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);  	/* set bit to 1 for output, 0 for input */ @@ -556,22 +727,23 @@ static const struct pinmux_ops rockchip_pmx_ops = {  static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,  					enum pin_config_param pull)  { -	/* rk3066b does support any pulls */ -	if (!ctrl->pull_offset) +	switch (ctrl->type) { +	case RK2928: +		return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || +					pull == PIN_CONFIG_BIAS_DISABLE); +	case RK3066B:  		return pull ? false : true; - -	if (ctrl->pull_auto) { -		if (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT && -					pull != PIN_CONFIG_BIAS_DISABLE) -			return false; -	} else { -		if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) -			return false; +	case RK3188: +		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);  	} -	return true; +	return false;  } +static int rockchip_gpio_direction_output(struct gpio_chip *gc, +					  unsigned offset, int value); +static int rockchip_gpio_get(struct gpio_chip *gc, unsigned offset); +  /* set the pin config settings for a specified pin */  static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,  				unsigned long *configs, unsigned num_configs) @@ -597,6 +769,7 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,  		case PIN_CONFIG_BIAS_PULL_UP:  		case PIN_CONFIG_BIAS_PULL_DOWN:  		case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: +		case PIN_CONFIG_BIAS_BUS_HOLD:  			if (!rockchip_pinconf_pull_valid(info->ctrl, param))  				return -ENOTSUPP; @@ -608,6 +781,13 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,  			if (rc)  				return rc;  			break; +		case PIN_CONFIG_OUTPUT: +			rc = rockchip_gpio_direction_output(&bank->gpio_chip, +							    pin - bank->pin_base, +							    arg); +			if (rc) +				return rc; +			break;  		default:  			return -ENOTSUPP;  			break; @@ -624,30 +804,46 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,  	struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);  	struct rockchip_pin_bank *bank = pin_to_bank(info, pin);  	enum pin_config_param param = pinconf_to_config_param(*config); +	u16 arg; +	int rc;  	switch (param) {  	case PIN_CONFIG_BIAS_DISABLE:  		if (rockchip_get_pull(bank, pin - bank->pin_base) != param)  			return -EINVAL; -		*config = 0; +		arg = 0;  		break;  	case PIN_CONFIG_BIAS_PULL_UP:  	case PIN_CONFIG_BIAS_PULL_DOWN:  	case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: +	case PIN_CONFIG_BIAS_BUS_HOLD:  		if (!rockchip_pinconf_pull_valid(info->ctrl, param))  			return -ENOTSUPP;  		if (rockchip_get_pull(bank, pin - bank->pin_base) != param)  			return -EINVAL; -		*config = 1; +		arg = 1; +		break; +	case PIN_CONFIG_OUTPUT: +		rc = rockchip_get_mux(bank, pin - bank->pin_base); +		if (rc != RK_FUNC_GPIO) +			return -EINVAL; + +		rc = rockchip_gpio_get(&bank->gpio_chip, pin - bank->pin_base); +		if (rc < 0) +			return rc; + +		arg = rc ? 1 : 0;  		break;  	default:  		return -ENOTSUPP;  		break;  	} +	*config = pinconf_to_config_packed(param, arg); +  	return 0;  } @@ -656,7 +852,11 @@ static const struct pinconf_ops rockchip_pinconf_ops = {  	.pin_config_set			= rockchip_pinconf_set,  }; -static const char *gpio_compat = "rockchip,gpio-bank"; +static const struct of_device_id rockchip_bank_match[] = { +	{ .compatible = "rockchip,gpio-bank" }, +	{ .compatible = "rockchip,rk3188-gpio-bank0" }, +	{}, +};  static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,  						struct device_node *np) @@ -664,7 +864,7 @@ static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,  	struct device_node *child;  	for_each_child_of_node(np, child) { -		if (of_device_is_compatible(child, gpio_compat)) +		if (of_match_node(rockchip_bank_match, child))  			continue;  		info->nfunctions++; @@ -807,8 +1007,9 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,  	i = 0;  	for_each_child_of_node(np, child) { -		if (of_device_is_compatible(child, gpio_compat)) +		if (of_match_node(rockchip_bank_match, child))  			continue; +  		ret = rockchip_pinctrl_parse_functions(child, info, i++);  		if (ret) {  			dev_err(&pdev->dev, "failed to parse function\n"); @@ -985,7 +1186,9 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc)  {  	struct irq_chip *chip = irq_get_chip(irq);  	struct rockchip_pin_bank *bank = irq_get_handler_data(irq); +	u32 polarity = 0, data = 0;  	u32 pend; +	bool edge_changed = false;  	dev_dbg(bank->drvdata->dev, "got irq for bank %s\n", bank->name); @@ -993,6 +1196,12 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc)  	pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS); +	if (bank->toggle_edge_mode) { +		polarity = readl_relaxed(bank->reg_base + +					 GPIO_INT_POLARITY); +		data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT); +	} +  	while (pend) {  		unsigned int virq; @@ -1007,9 +1216,30 @@ static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc)  		dev_dbg(bank->drvdata->dev, "handling irq %d\n", irq); +		/* +		 * Triggering IRQ on both rising and falling edge +		 * needs manual intervention. +		 */ +		if (bank->toggle_edge_mode & BIT(irq)) { +			if (data & BIT(irq)) +				polarity &= ~BIT(irq); +			else +				polarity |= BIT(irq); + +			edge_changed = true; +		} +  		generic_handle_irq(virq);  	} +	if (bank->toggle_edge_mode && edge_changed) { +		/* Interrupt params should only be set with ints disabled */ +		data = readl_relaxed(bank->reg_base + GPIO_INTEN); +		writel_relaxed(0, bank->reg_base + GPIO_INTEN); +		writel(polarity, bank->reg_base + GPIO_INT_POLARITY); +		writel(data, bank->reg_base + GPIO_INTEN); +	} +  	chained_irq_exit(chip, desc);  } @@ -1021,6 +1251,16 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)  	u32 polarity;  	u32 level;  	u32 data; +	int ret; + +	/* make sure the pin is configured as gpio input */ +	ret = rockchip_set_mux(bank, d->hwirq, RK_FUNC_GPIO); +	if (ret < 0) +		return ret; + +	data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR); +	data &= ~mask; +	writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR);  	if (type & IRQ_TYPE_EDGE_BOTH)  		__irq_set_handler_locked(d->irq, handle_edge_irq); @@ -1033,19 +1273,37 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)  	polarity = readl_relaxed(gc->reg_base + GPIO_INT_POLARITY);  	switch (type) { +	case IRQ_TYPE_EDGE_BOTH: +		bank->toggle_edge_mode |= mask; +		level |= mask; + +		/* +		 * Determine gpio state. If 1 next interrupt should be falling +		 * otherwise rising. +		 */ +		data = readl(bank->reg_base + GPIO_EXT_PORT); +		if (data & mask) +			polarity &= ~mask; +		else +			polarity |= mask; +		break;  	case IRQ_TYPE_EDGE_RISING: +		bank->toggle_edge_mode &= ~mask;  		level |= mask;  		polarity |= mask;  		break;  	case IRQ_TYPE_EDGE_FALLING: +		bank->toggle_edge_mode &= ~mask;  		level |= mask;  		polarity &= ~mask;  		break;  	case IRQ_TYPE_LEVEL_HIGH: +		bank->toggle_edge_mode &= ~mask;  		level &= ~mask;  		polarity |= mask;  		break;  	case IRQ_TYPE_LEVEL_LOW: +		bank->toggle_edge_mode &= ~mask;  		level &= ~mask;  		polarity &= ~mask;  		break; @@ -1059,12 +1317,6 @@ static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)  	irq_gc_unlock(gc); -	/* make sure the pin is configured as gpio input */ -	rockchip_set_mux(bank, d->hwirq, RK_FUNC_GPIO); -	data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR); -	data &= ~mask; -	writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR); -  	return 0;  } @@ -1192,19 +1444,54 @@ static int rockchip_gpiolib_unregister(struct platform_device *pdev,  }  static int rockchip_get_bank_data(struct rockchip_pin_bank *bank, -				  struct device *dev) +				  struct rockchip_pinctrl *info)  {  	struct resource res; +	void __iomem *base;  	if (of_address_to_resource(bank->of_node, 0, &res)) { -		dev_err(dev, "cannot find IO resource for bank\n"); +		dev_err(info->dev, "cannot find IO resource for bank\n");  		return -ENOENT;  	} -	bank->reg_base = devm_ioremap_resource(dev, &res); +	bank->reg_base = devm_ioremap_resource(info->dev, &res);  	if (IS_ERR(bank->reg_base))  		return PTR_ERR(bank->reg_base); +	/* +	 * special case, where parts of the pull setting-registers are +	 * part of the PMU register space +	 */ +	if (of_device_is_compatible(bank->of_node, +				    "rockchip,rk3188-gpio-bank0")) { +		struct device_node *node; + +		bank->bank_type = RK3188_BANK0; + +		node = of_parse_phandle(bank->of_node->parent, +					"rockchip,pmu", 0); +		if (!node) { +			if (of_address_to_resource(bank->of_node, 1, &res)) { +				dev_err(info->dev, "cannot find IO resource for bank\n"); +				return -ENOENT; +			} + +			base = devm_ioremap_resource(info->dev, &res); +			if (IS_ERR(base)) +				return PTR_ERR(base); +			rockchip_regmap_config.max_register = +						    resource_size(&res) - 4; +			rockchip_regmap_config.name = +					    "rockchip,rk3188-gpio-bank0-pull"; +			bank->regmap_pull = devm_regmap_init_mmio(info->dev, +						    base, +						    &rockchip_regmap_config); +		} + +	} else { +		bank->bank_type = COMMON_BANK; +	} +  	bank->irq = irq_of_parse_and_map(bank->of_node, 0);  	bank->clk = of_clk_get(bank->of_node, 0); @@ -1240,7 +1527,7 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(  			if (!strcmp(bank->name, np->name)) {  				bank->of_node = np; -				if (!rockchip_get_bank_data(bank, &pdev->dev)) +				if (!rockchip_get_bank_data(bank, d))  					bank->valid = true;  				break; @@ -1264,7 +1551,9 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)  	struct rockchip_pinctrl *info;  	struct device *dev = &pdev->dev;  	struct rockchip_pin_ctrl *ctrl; +	struct device_node *np = pdev->dev.of_node, *node;  	struct resource *res; +	void __iomem *base;  	int ret;  	if (!dev->of_node) { @@ -1276,18 +1565,57 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)  	if (!info)  		return -ENOMEM; +	info->dev = dev; +  	ctrl = rockchip_pinctrl_get_soc_data(info, pdev);  	if (!ctrl) {  		dev_err(dev, "driver data not available\n");  		return -EINVAL;  	}  	info->ctrl = ctrl; -	info->dev = dev; -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	info->reg_base = devm_ioremap_resource(&pdev->dev, res); -	if (IS_ERR(info->reg_base)) -		return PTR_ERR(info->reg_base); +	node = of_parse_phandle(np, "rockchip,grf", 0); +	if (node) { +		info->regmap_base = syscon_node_to_regmap(node); +		if (IS_ERR(info->regmap_base)) +			return PTR_ERR(info->regmap_base); +	} else { +		res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +		base = devm_ioremap_resource(&pdev->dev, res); +		if (IS_ERR(base)) +			return PTR_ERR(base); + +		rockchip_regmap_config.max_register = resource_size(res) - 4; +		rockchip_regmap_config.name = "rockchip,pinctrl"; +		info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base, +						    &rockchip_regmap_config); + +		/* to check for the old dt-bindings */ +		info->reg_size = resource_size(res); + +		/* Honor the old binding, with pull registers as 2nd resource */ +		if (ctrl->type == RK3188 && info->reg_size < 0x200) { +			res = platform_get_resource(pdev, IORESOURCE_MEM, 1); +			base = devm_ioremap_resource(&pdev->dev, res); +			if (IS_ERR(base)) +				return PTR_ERR(base); + +			rockchip_regmap_config.max_register = +							resource_size(res) - 4; +			rockchip_regmap_config.name = "rockchip,pinctrl-pull"; +			info->regmap_pull = devm_regmap_init_mmio(&pdev->dev, +						    base, +						    &rockchip_regmap_config); +		} +	} + +	/* try to find the optional reference to the pmu syscon */ +	node = of_parse_phandle(np, "rockchip,pmu", 0); +	if (node) { +		info->regmap_pmu = syscon_node_to_regmap(node); +		if (IS_ERR(info->regmap_pmu)) +			return PTR_ERR(info->regmap_pmu); +	}  	ret = rockchip_gpiolib_register(pdev, info);  	if (ret) @@ -1315,10 +1643,9 @@ static struct rockchip_pin_ctrl rk2928_pin_ctrl = {  		.pin_banks		= rk2928_pin_banks,  		.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),  		.label			= "RK2928-GPIO", +		.type			= RK2928,  		.mux_offset		= 0xa8, -		.pull_offset		= 0x118, -		.pull_auto		= 1, -		.pull_bank_stride	= 8, +		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,  };  static struct rockchip_pin_bank rk3066a_pin_banks[] = { @@ -1334,10 +1661,9 @@ static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {  		.pin_banks		= rk3066a_pin_banks,  		.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),  		.label			= "RK3066a-GPIO", +		.type			= RK2928,  		.mux_offset		= 0xa8, -		.pull_offset		= 0x118, -		.pull_auto		= 1, -		.pull_bank_stride	= 8, +		.pull_calc_reg		= rk2928_calc_pull_reg_and_bit,  };  static struct rockchip_pin_bank rk3066b_pin_banks[] = { @@ -1351,8 +1677,8 @@ static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {  		.pin_banks	= rk3066b_pin_banks,  		.nr_banks	= ARRAY_SIZE(rk3066b_pin_banks),  		.label		= "RK3066b-GPIO", +		.type		= RK3066B,  		.mux_offset	= 0x60, -		.pull_offset	= -EINVAL,  };  static struct rockchip_pin_bank rk3188_pin_banks[] = { @@ -1366,9 +1692,9 @@ static struct rockchip_pin_ctrl rk3188_pin_ctrl = {  		.pin_banks		= rk3188_pin_banks,  		.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),  		.label			= "RK3188-GPIO", -		.mux_offset		= 0x68, -		.pull_offset		= 0x164, -		.pull_bank_stride	= 16, +		.type			= RK3188, +		.mux_offset		= 0x60, +		.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,  };  static const struct of_device_id rockchip_pinctrl_dt_match[] = { diff --git a/drivers/pinctrl/pinctrl-samsung.c b/drivers/pinctrl/pinctrl-samsung.c index 92a9d6c8db0..3e61d0f8f14 100644 --- a/drivers/pinctrl/pinctrl-samsung.c +++ b/drivers/pinctrl/pinctrl-samsung.c @@ -1114,12 +1114,16 @@ static struct syscore_ops samsung_pinctrl_syscore_ops = {  static const struct of_device_id samsung_pinctrl_dt_match[] = {  #ifdef CONFIG_PINCTRL_EXYNOS +	{ .compatible = "samsung,exynos3250-pinctrl", +		.data = (void *)exynos3250_pin_ctrl },  	{ .compatible = "samsung,exynos4210-pinctrl",  		.data = (void *)exynos4210_pin_ctrl },  	{ .compatible = "samsung,exynos4x12-pinctrl",  		.data = (void *)exynos4x12_pin_ctrl },  	{ .compatible = "samsung,exynos5250-pinctrl",  		.data = (void *)exynos5250_pin_ctrl }, +	{ .compatible = "samsung,exynos5260-pinctrl", +		.data = (void *)exynos5260_pin_ctrl },  	{ .compatible = "samsung,exynos5420-pinctrl",  		.data = (void *)exynos5420_pin_ctrl },  	{ .compatible = "samsung,s5pv210-pinctrl", @@ -1148,7 +1152,7 @@ static struct platform_driver samsung_pinctrl_driver = {  	.driver = {  		.name	= "samsung-pinctrl",  		.owner	= THIS_MODULE, -		.of_match_table = of_match_ptr(samsung_pinctrl_dt_match), +		.of_match_table = samsung_pinctrl_dt_match,  	},  }; diff --git a/drivers/pinctrl/pinctrl-samsung.h b/drivers/pinctrl/pinctrl-samsung.h index 30622d9afa2..b3e41fa5798 100644 --- a/drivers/pinctrl/pinctrl-samsung.h +++ b/drivers/pinctrl/pinctrl-samsung.h @@ -251,9 +251,11 @@ struct samsung_pmx_func {  };  /* list of all exported SoC specific data */ +extern struct samsung_pin_ctrl exynos3250_pin_ctrl[];  extern struct samsung_pin_ctrl exynos4210_pin_ctrl[];  extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[];  extern struct samsung_pin_ctrl exynos5250_pin_ctrl[]; +extern struct samsung_pin_ctrl exynos5260_pin_ctrl[];  extern struct samsung_pin_ctrl exynos5420_pin_ctrl[];  extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[];  extern struct samsung_pin_ctrl s3c2412_pin_ctrl[]; diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index a82ace4d9a2..2960557bfed 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -15,15 +15,21 @@  #include <linux/slab.h>  #include <linux/err.h>  #include <linux/list.h> +#include <linux/interrupt.h> + +#include <linux/irqchip/chained_irq.h>  #include <linux/of.h>  #include <linux/of_device.h>  #include <linux/of_address.h> +#include <linux/of_irq.h>  #include <linux/pinctrl/pinctrl.h>  #include <linux/pinctrl/pinmux.h>  #include <linux/pinctrl/pinconf-generic.h> +#include <linux/platform_data/pinctrl-single.h> +  #include "core.h"  #include "pinconf.h" @@ -150,19 +156,36 @@ struct pcs_name {  };  /** + * struct pcs_soc_data - SoC specific settings + * @flags:	initial SoC specific PCS_FEAT_xxx values + * @irq:	optional interrupt for the controller + * @irq_enable_mask:	optional SoC specific interrupt enable mask + * @irq_status_mask:	optional SoC specific interrupt status mask + * @rearm:	optional SoC specific wake-up rearm function + */ +struct pcs_soc_data { +	unsigned flags; +	int irq; +	unsigned irq_enable_mask; +	unsigned irq_status_mask; +	void (*rearm)(void); +}; + +/**   * struct pcs_device - pinctrl device instance   * @res:	resources   * @base:	virtual address of the controller   * @size:	size of the ioremapped area   * @dev:	device entry   * @pctl:	pin controller device + * @flags:	mask of PCS_FEAT_xxx values + * @lock:	spinlock for register access   * @mutex:	mutex protecting the lists   * @width:	bits per mux register   * @fmask:	function register mask   * @fshift:	function register shift   * @foff:	value to turn mux off   * @fmax:	max number of functions in fmask - * @is_pinconf:	whether supports pinconf   * @bits_per_pin:number of bits per pin   * @names:	array of register names for pins   * @pins:	physical pins on the SoC @@ -171,6 +194,9 @@ struct pcs_name {   * @pingroups:	list of pingroups   * @functions:	list of functions   * @gpiofuncs:	list of gpio functions + * @irqs:	list of interrupt registers + * @chip:	chip container for this instance + * @domain:	IRQ domain for this instance   * @ngroups:	number of pingroups   * @nfuncs:	number of functions   * @desc:	pin controller descriptor @@ -183,6 +209,12 @@ struct pcs_device {  	unsigned size;  	struct device *dev;  	struct pinctrl_dev *pctl; +	unsigned flags; +#define PCS_QUIRK_SHARED_IRQ	(1 << 2) +#define PCS_FEAT_IRQ		(1 << 1) +#define PCS_FEAT_PINCONF	(1 << 0) +	struct pcs_soc_data socdata; +	raw_spinlock_t lock;  	struct mutex mutex;  	unsigned width;  	unsigned fmask; @@ -190,7 +222,6 @@ struct pcs_device {  	unsigned foff;  	unsigned fmax;  	bool bits_per_mux; -	bool is_pinconf;  	unsigned bits_per_pin;  	struct pcs_name *names;  	struct pcs_data pins; @@ -199,6 +230,9 @@ struct pcs_device {  	struct list_head pingroups;  	struct list_head functions;  	struct list_head gpiofuncs; +	struct list_head irqs; +	struct irq_chip chip; +	struct irq_domain *domain;  	unsigned ngroups;  	unsigned nfuncs;  	struct pinctrl_desc desc; @@ -206,6 +240,10 @@ struct pcs_device {  	void (*write)(unsigned val, void __iomem *reg);  }; +#define PCS_QUIRK_HAS_SHARED_IRQ	(pcs->flags & PCS_QUIRK_SHARED_IRQ) +#define PCS_HAS_IRQ		(pcs->flags & PCS_FEAT_IRQ) +#define PCS_HAS_PINCONF		(pcs->flags & PCS_FEAT_PINCONF) +  static int pcs_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,  			   unsigned long *config);  static int pcs_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin, @@ -429,9 +467,11 @@ static int pcs_enable(struct pinctrl_dev *pctldev, unsigned fselector,  	for (i = 0; i < func->nvals; i++) {  		struct pcs_func_vals *vals; +		unsigned long flags;  		unsigned val, mask;  		vals = &func->vals[i]; +		raw_spin_lock_irqsave(&pcs->lock, flags);  		val = pcs->read(vals->reg);  		if (pcs->bits_per_mux) @@ -442,6 +482,7 @@ static int pcs_enable(struct pinctrl_dev *pctldev, unsigned fselector,  		val &= ~mask;  		val |= (vals->val & mask);  		pcs->write(val, vals->reg); +		raw_spin_unlock_irqrestore(&pcs->lock, flags);  	}  	return 0; @@ -483,13 +524,22 @@ static void pcs_disable(struct pinctrl_dev *pctldev, unsigned fselector,  	for (i = 0; i < func->nvals; i++) {  		struct pcs_func_vals *vals; -		unsigned val; +		unsigned long flags; +		unsigned val, mask;  		vals = &func->vals[i]; +		raw_spin_lock_irqsave(&pcs->lock, flags);  		val = pcs->read(vals->reg); -		val &= ~pcs->fmask; + +		if (pcs->bits_per_mux) +			mask = vals->mask; +		else +			mask = pcs->fmask; + +		val &= ~mask;  		val |= pcs->foff << pcs->fshift;  		pcs->write(val, vals->reg); +		raw_spin_unlock_irqrestore(&pcs->lock, flags);  	}  } @@ -612,6 +662,7 @@ static int pcs_pinconf_get(struct pinctrl_dev *pctldev,  			break;  		case PIN_CONFIG_DRIVE_STRENGTH:  		case PIN_CONFIG_SLEW_RATE: +		case PIN_CONFIG_LOW_POWER_MODE:  		default:  			*config = data;  			break; @@ -649,6 +700,7 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev,  			case PIN_CONFIG_INPUT_SCHMITT:  			case PIN_CONFIG_DRIVE_STRENGTH:  			case PIN_CONFIG_SLEW_RATE: +			case PIN_CONFIG_LOW_POWER_MODE:  				shift = ffs(func->conf[i].mask) - 1;  				data &= ~func->conf[i].mask;  				data |= (arg << shift) & func->conf[i].mask; @@ -758,6 +810,7 @@ static const struct pinconf_ops pcs_pinconf_ops = {  static int pcs_add_pin(struct pcs_device *pcs, unsigned offset,  		unsigned pin_pos)  { +	struct pcs_soc_data *pcs_soc = &pcs->socdata;  	struct pinctrl_pin_desc *pin;  	struct pcs_name *pn;  	int i; @@ -769,6 +822,18 @@ static int pcs_add_pin(struct pcs_device *pcs, unsigned offset,  		return -ENOMEM;  	} +	if (pcs_soc->irq_enable_mask) { +		unsigned val; + +		val = pcs->read(pcs->base + offset); +		if (val & pcs_soc->irq_enable_mask) { +			dev_dbg(pcs->dev, "irq enabled at boot for pin at %lx (%x), clearing\n", +				(unsigned long)pcs->res->start + offset, val); +			val &= ~pcs_soc->irq_enable_mask; +			pcs->write(val, pcs->base + offset); +		} +	} +  	pin = &pcs->pins.pa[i];  	pn = &pcs->names[i];  	sprintf(pn->name, "%lx.%d", @@ -1051,6 +1116,7 @@ static int pcs_parse_pinconf(struct pcs_device *pcs, struct device_node *np,  		{ "pinctrl-single,drive-strength", PIN_CONFIG_DRIVE_STRENGTH, },  		{ "pinctrl-single,slew-rate", PIN_CONFIG_SLEW_RATE, },  		{ "pinctrl-single,input-schmitt", PIN_CONFIG_INPUT_SCHMITT, }, +		{ "pinctrl-single,low-power-mode", PIN_CONFIG_LOW_POWER_MODE, },  	};  	struct pcs_conf_type prop4[] = {  		{ "pinctrl-single,bias-pullup", PIN_CONFIG_BIAS_PULL_UP, }, @@ -1060,7 +1126,7 @@ static int pcs_parse_pinconf(struct pcs_device *pcs, struct device_node *np,  	};  	/* If pinconf isn't supported, don't parse properties in below. */ -	if (!pcs->is_pinconf) +	if (!PCS_HAS_PINCONF)  		return 0;  	/* cacluate how much properties are supported in current node */ @@ -1184,7 +1250,7 @@ static int pcs_parse_one_pinctrl_entry(struct pcs_device *pcs,  	(*map)->data.mux.group = np->name;  	(*map)->data.mux.function = np->name; -	if (pcs->is_pinconf) { +	if (PCS_HAS_PINCONF) {  		res = pcs_parse_pinconf(pcs, np, function, map);  		if (res)  			goto free_pingroups; @@ -1268,6 +1334,14 @@ static int pcs_parse_bits_in_pinctrl_entry(struct pcs_device *pcs,  			mask_pos = ((pcs->fmask) << (bit_pos - 1));  			val_pos = val & mask_pos;  			submask = mask & mask_pos; + +			if ((mask & mask_pos) == 0) { +				dev_err(pcs->dev, +					"Invalid mask for %s at 0x%x\n", +					np->name, offset); +				break; +			} +  			mask &= ~mask_pos;  			if (submask != mask_pos) { @@ -1305,7 +1379,7 @@ static int pcs_parse_bits_in_pinctrl_entry(struct pcs_device *pcs,  	(*map)->data.mux.group = np->name;  	(*map)->data.mux.function = np->name; -	if (pcs->is_pinconf) { +	if (PCS_HAS_PINCONF) {  		dev_err(pcs->dev, "pinconf not supported\n");  		goto free_pingroups;  	} @@ -1440,11 +1514,33 @@ static void pcs_free_pingroups(struct pcs_device *pcs)  }  /** + * pcs_irq_free() - free interrupt + * @pcs: pcs driver instance + */ +static void pcs_irq_free(struct pcs_device *pcs) +{ +	struct pcs_soc_data *pcs_soc = &pcs->socdata; + +	if (pcs_soc->irq < 0) +		return; + +	if (pcs->domain) +		irq_domain_remove(pcs->domain); + +	if (PCS_QUIRK_HAS_SHARED_IRQ) +		free_irq(pcs_soc->irq, pcs_soc); +	else +		irq_set_chained_handler(pcs_soc->irq, NULL); +} + +/**   * pcs_free_resources() - free memory used by this driver   * @pcs: pcs driver instance   */  static void pcs_free_resources(struct pcs_device *pcs)  { +	pcs_irq_free(pcs); +  	if (pcs->pctl)  		pinctrl_unregister(pcs->pctl); @@ -1493,6 +1589,264 @@ static int pcs_add_gpio_func(struct device_node *node, struct pcs_device *pcs)  	}  	return ret;  } +/** + * @reg:	virtual address of interrupt register + * @hwirq:	hardware irq number + * @irq:	virtual irq number + * @node:	list node + */ +struct pcs_interrupt { +	void __iomem *reg; +	irq_hw_number_t hwirq; +	unsigned int irq; +	struct list_head node; +}; + +/** + * pcs_irq_set() - enables or disables an interrupt + * + * Note that this currently assumes one interrupt per pinctrl + * register that is typically used for wake-up events. + */ +static inline void pcs_irq_set(struct pcs_soc_data *pcs_soc, +			       int irq, const bool enable) +{ +	struct pcs_device *pcs; +	struct list_head *pos; +	unsigned mask; + +	pcs = container_of(pcs_soc, struct pcs_device, socdata); +	list_for_each(pos, &pcs->irqs) { +		struct pcs_interrupt *pcswi; +		unsigned soc_mask; + +		pcswi = list_entry(pos, struct pcs_interrupt, node); +		if (irq != pcswi->irq) +			continue; + +		soc_mask = pcs_soc->irq_enable_mask; +		raw_spin_lock(&pcs->lock); +		mask = pcs->read(pcswi->reg); +		if (enable) +			mask |= soc_mask; +		else +			mask &= ~soc_mask; +		pcs->write(mask, pcswi->reg); +		raw_spin_unlock(&pcs->lock); +	} + +	if (pcs_soc->rearm) +		pcs_soc->rearm(); +} + +/** + * pcs_irq_mask() - mask pinctrl interrupt + * @d: interrupt data + */ +static void pcs_irq_mask(struct irq_data *d) +{ +	struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d); + +	pcs_irq_set(pcs_soc, d->irq, false); +} + +/** + * pcs_irq_unmask() - unmask pinctrl interrupt + * @d: interrupt data + */ +static void pcs_irq_unmask(struct irq_data *d) +{ +	struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d); + +	pcs_irq_set(pcs_soc, d->irq, true); +} + +/** + * pcs_irq_set_wake() - toggle the suspend and resume wake up + * @d: interrupt data + * @state: wake-up state + * + * Note that this should be called only for suspend and resume. + * For runtime PM, the wake-up events should be enabled by default. + */ +static int pcs_irq_set_wake(struct irq_data *d, unsigned int state) +{ +	if (state) +		pcs_irq_unmask(d); +	else +		pcs_irq_mask(d); + +	return 0; +} + +/** + * pcs_irq_handle() - common interrupt handler + * @pcs_irq: interrupt data + * + * Note that this currently assumes we have one interrupt bit per + * mux register. This interrupt is typically used for wake-up events. + * For more complex interrupts different handlers can be specified. + */ +static int pcs_irq_handle(struct pcs_soc_data *pcs_soc) +{ +	struct pcs_device *pcs; +	struct list_head *pos; +	int count = 0; + +	pcs = container_of(pcs_soc, struct pcs_device, socdata); +	list_for_each(pos, &pcs->irqs) { +		struct pcs_interrupt *pcswi; +		unsigned mask; + +		pcswi = list_entry(pos, struct pcs_interrupt, node); +		raw_spin_lock(&pcs->lock); +		mask = pcs->read(pcswi->reg); +		raw_spin_unlock(&pcs->lock); +		if (mask & pcs_soc->irq_status_mask) { +			generic_handle_irq(irq_find_mapping(pcs->domain, +							    pcswi->hwirq)); +			count++; +		} +	} + +	return count; +} + +/** + * pcs_irq_handler() - handler for the shared interrupt case + * @irq: interrupt + * @d: data + * + * Use this for cases where multiple instances of + * pinctrl-single share a single interrupt like on omaps. + */ +static irqreturn_t pcs_irq_handler(int irq, void *d) +{ +	struct pcs_soc_data *pcs_soc = d; + +	return pcs_irq_handle(pcs_soc) ? IRQ_HANDLED : IRQ_NONE; +} + +/** + * pcs_irq_handle() - handler for the dedicated chained interrupt case + * @irq: interrupt + * @desc: interrupt descriptor + * + * Use this if you have a separate interrupt for each + * pinctrl-single instance. + */ +static void pcs_irq_chain_handler(unsigned int irq, struct irq_desc *desc) +{ +	struct pcs_soc_data *pcs_soc = irq_desc_get_handler_data(desc); +	struct irq_chip *chip; +	int res; + +	chip = irq_get_chip(irq); +	chained_irq_enter(chip, desc); +	res = pcs_irq_handle(pcs_soc); +	/* REVISIT: export and add handle_bad_irq(irq, desc)? */ +	chained_irq_exit(chip, desc); + +	return; +} + +static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq, +			     irq_hw_number_t hwirq) +{ +	struct pcs_soc_data *pcs_soc = d->host_data; +	struct pcs_device *pcs; +	struct pcs_interrupt *pcswi; + +	pcs = container_of(pcs_soc, struct pcs_device, socdata); +	pcswi = devm_kzalloc(pcs->dev, sizeof(*pcswi), GFP_KERNEL); +	if (!pcswi) +		return -ENOMEM; + +	pcswi->reg = pcs->base + hwirq; +	pcswi->hwirq = hwirq; +	pcswi->irq = irq; + +	mutex_lock(&pcs->mutex); +	list_add_tail(&pcswi->node, &pcs->irqs); +	mutex_unlock(&pcs->mutex); + +	irq_set_chip_data(irq, pcs_soc); +	irq_set_chip_and_handler(irq, &pcs->chip, +				 handle_level_irq); + +#ifdef CONFIG_ARM +	set_irq_flags(irq, IRQF_VALID); +#else +	irq_set_noprobe(irq); +#endif + +	return 0; +} + +static struct irq_domain_ops pcs_irqdomain_ops = { +	.map = pcs_irqdomain_map, +	.xlate = irq_domain_xlate_onecell, +}; + +/** + * pcs_irq_init_chained_handler() - set up a chained interrupt handler + * @pcs: pcs driver instance + * @np: device node pointer + */ +static int pcs_irq_init_chained_handler(struct pcs_device *pcs, +					struct device_node *np) +{ +	struct pcs_soc_data *pcs_soc = &pcs->socdata; +	const char *name = "pinctrl"; +	int num_irqs; + +	if (!pcs_soc->irq_enable_mask || +	    !pcs_soc->irq_status_mask) { +		pcs_soc->irq = -1; +		return -EINVAL; +	} + +	INIT_LIST_HEAD(&pcs->irqs); +	pcs->chip.name = name; +	pcs->chip.irq_ack = pcs_irq_mask; +	pcs->chip.irq_mask = pcs_irq_mask; +	pcs->chip.irq_unmask = pcs_irq_unmask; +	pcs->chip.irq_set_wake = pcs_irq_set_wake; + +	if (PCS_QUIRK_HAS_SHARED_IRQ) { +		int res; + +		res = request_irq(pcs_soc->irq, pcs_irq_handler, +				  IRQF_SHARED | IRQF_NO_SUSPEND, +				  name, pcs_soc); +		if (res) { +			pcs_soc->irq = -1; +			return res; +		} +	} else { +		irq_set_handler_data(pcs_soc->irq, pcs_soc); +		irq_set_chained_handler(pcs_soc->irq, +					pcs_irq_chain_handler); +	} + +	/* +	 * We can use the register offset as the hardirq +	 * number as irq_domain_add_simple maps them lazily. +	 * This way we can easily support more than one +	 * interrupt per function if needed. +	 */ +	num_irqs = pcs->size; + +	pcs->domain = irq_domain_add_simple(np, num_irqs, 0, +					    &pcs_irqdomain_ops, +					    pcs_soc); +	if (!pcs->domain) { +		irq_set_chained_handler(pcs_soc->irq, NULL); +		return -EINVAL; +	} + +	return 0; +}  #ifdef CONFIG_PM  static int pinctrl_single_suspend(struct platform_device *pdev, @@ -1523,8 +1877,10 @@ 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); @@ -1537,11 +1893,14 @@ static int pcs_probe(struct platform_device *pdev)  		return -ENOMEM;  	}  	pcs->dev = &pdev->dev; +	raw_spin_lock_init(&pcs->lock);  	mutex_init(&pcs->mutex);  	INIT_LIST_HEAD(&pcs->pingroups);  	INIT_LIST_HEAD(&pcs->functions);  	INIT_LIST_HEAD(&pcs->gpiofuncs); -	pcs->is_pinconf = match->data; +	soc = match->data; +	pcs->flags = soc->flags; +	memcpy(&pcs->socdata, soc, sizeof(*soc));  	PCS_GET_PROP_U32("pinctrl-single,register-width", &pcs->width,  			 "register width not specified\n"); @@ -1610,7 +1969,7 @@ static int pcs_probe(struct platform_device *pdev)  	pcs->desc.name = DRIVER_NAME;  	pcs->desc.pctlops = &pcs_pinctrl_ops;  	pcs->desc.pmxops = &pcs_pinmux_ops; -	if (pcs->is_pinconf) +	if (PCS_HAS_PINCONF)  		pcs->desc.confops = &pcs_pinconf_ops;  	pcs->desc.owner = THIS_MODULE; @@ -1629,6 +1988,27 @@ static int pcs_probe(struct platform_device *pdev)  	if (ret < 0)  		goto free; +	pcs->socdata.irq = irq_of_parse_and_map(np, 0); +	if (pcs->socdata.irq) +		pcs->flags |= PCS_FEAT_IRQ; + +	/* We still need auxdata for some omaps for PRM interrupts */ +	pdata = dev_get_platdata(&pdev->dev); +	if (pdata) { +		if (pdata->rearm) +			pcs->socdata.rearm = pdata->rearm; +		if (pdata->irq) { +			pcs->socdata.irq = pdata->irq; +			pcs->flags |= PCS_FEAT_IRQ; +		} +	} + +	if (PCS_HAS_IRQ) { +		ret = pcs_irq_init_chained_handler(pcs, np); +		if (ret < 0) +			dev_warn(pcs->dev, "initialized with no interrupts\n"); +	} +  	dev_info(pcs->dev, "%i pins at pa %p size %u\n",  		 pcs->desc.npins, pcs->base, pcs->size); @@ -1652,9 +2032,25 @@ static int pcs_remove(struct platform_device *pdev)  	return 0;  } +static const struct pcs_soc_data pinctrl_single_omap_wkup = { +	.flags = PCS_QUIRK_SHARED_IRQ, +	.irq_enable_mask = (1 << 14),	/* OMAP_WAKEUP_EN */ +	.irq_status_mask = (1 << 15),	/* OMAP_WAKEUP_EVENT */ +}; + +static const struct pcs_soc_data pinctrl_single = { +}; + +static const struct pcs_soc_data pinconf_single = { +	.flags = PCS_FEAT_PINCONF, +}; +  static struct of_device_id pcs_of_match[] = { -	{ .compatible = "pinctrl-single", .data = (void *)false }, -	{ .compatible = "pinconf-single", .data = (void *)true }, +	{ .compatible = "ti,omap3-padconf", .data = &pinctrl_single_omap_wkup }, +	{ .compatible = "ti,omap4-padconf", .data = &pinctrl_single_omap_wkup }, +	{ .compatible = "ti,omap5-padconf", .data = &pinctrl_single_omap_wkup }, +	{ .compatible = "pinctrl-single", .data = &pinctrl_single }, +	{ .compatible = "pinconf-single", .data = &pinconf_single },  	{ },  };  MODULE_DEVICE_TABLE(of, pcs_of_match); diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c index 9cadc68ee57..9f43916637c 100644 --- a/drivers/pinctrl/pinctrl-st.c +++ b/drivers/pinctrl/pinctrl-st.c @@ -14,6 +14,7 @@  #include <linux/err.h>  #include <linux/io.h>  #include <linux/of.h> +#include <linux/of_irq.h>  #include <linux/of_gpio.h>  #include <linux/of_address.h>  #include <linux/regmap.h> @@ -237,13 +238,13 @@ struct st_pio_control {  };  struct st_pctl_data { -	enum st_retime_style rt_style; -	unsigned int	*input_delays; -	int		ninput_delays; -	unsigned int	*output_delays; -	int		noutput_delays; +	const enum st_retime_style	rt_style; +	const unsigned int		*input_delays; +	const int			ninput_delays; +	const unsigned int		*output_delays; +	const int			noutput_delays;  	/* register offset information */ -	int alt, oe, pu, od, rt; +	const int alt, oe, pu, od, rt;  };  struct st_pinconf { @@ -266,11 +267,58 @@ struct st_pctl_group {  	struct st_pinconf	*pin_conf;  }; +/* + * Edge triggers are not supported at hardware level, it is supported by + * software by exploiting the level trigger support in hardware. + * Software uses a virtual register (EDGE_CONF) for edge trigger configuration + * of each gpio pin in a GPIO bank. + * + * Each bank has a 32 bit EDGE_CONF register which is divided in to 8 parts of + * 4-bits. Each 4-bit space is allocated for each pin in a gpio bank. + * + * bit allocation per pin is: + * Bits:  [0 - 3] | [4 - 7]  [8 - 11] ... ... ... ...  [ 28 - 31] + *       -------------------------------------------------------- + *       |  pin-0  |  pin-2 | pin-3  | ... ... ... ... | pin -7 | + *       -------------------------------------------------------- + * + *  A pin can have one of following the values in its edge configuration field. + * + *	-------   ---------------------------- + *	[0-3]	- Description + *	-------   ---------------------------- + *	0000	- No edge IRQ. + *	0001	- Falling edge IRQ. + *	0010	- Rising edge IRQ. + *	0011	- Rising and Falling edge IRQ. + *	-------   ---------------------------- + */ + +#define ST_IRQ_EDGE_CONF_BITS_PER_PIN	4 +#define ST_IRQ_EDGE_MASK		0xf +#define ST_IRQ_EDGE_FALLING		BIT(0) +#define ST_IRQ_EDGE_RISING		BIT(1) +#define ST_IRQ_EDGE_BOTH		(BIT(0) | BIT(1)) + +#define ST_IRQ_RISING_EDGE_CONF(pin) \ +	(ST_IRQ_EDGE_RISING << (pin * ST_IRQ_EDGE_CONF_BITS_PER_PIN)) + +#define ST_IRQ_FALLING_EDGE_CONF(pin) \ +	(ST_IRQ_EDGE_FALLING << (pin * ST_IRQ_EDGE_CONF_BITS_PER_PIN)) + +#define ST_IRQ_BOTH_EDGE_CONF(pin) \ +	(ST_IRQ_EDGE_BOTH << (pin * ST_IRQ_EDGE_CONF_BITS_PER_PIN)) + +#define ST_IRQ_EDGE_CONF(conf, pin) \ +	(conf >> (pin * ST_IRQ_EDGE_CONF_BITS_PER_PIN) & ST_IRQ_EDGE_MASK) +  struct st_gpio_bank {  	struct gpio_chip		gpio_chip;  	struct pinctrl_gpio_range	range;  	void __iomem			*base;  	struct st_pio_control		pc; +	unsigned long			irq_edge_conf; +	spinlock_t                      lock;  };  struct st_pinctrl { @@ -284,19 +332,20 @@ struct st_pinctrl {  	int				ngroups;  	struct regmap			*regmap;  	const struct st_pctl_data	*data; +	void __iomem			*irqmux_base;  };  /* SOC specific data */  /* STiH415 data */ -static unsigned int stih415_input_delays[] = {0, 500, 1000, 1500}; -static unsigned int stih415_output_delays[] = {0, 1000, 2000, 3000}; +static const unsigned int stih415_input_delays[] = {0, 500, 1000, 1500}; +static const unsigned int stih415_output_delays[] = {0, 1000, 2000, 3000};  #define STIH415_PCTRL_COMMON_DATA				\  	.rt_style	= st_retime_style_packed,		\  	.input_delays	= stih415_input_delays,			\ -	.ninput_delays	= 4,					\ +	.ninput_delays	= ARRAY_SIZE(stih415_input_delays),	\  	.output_delays = stih415_output_delays,			\ -	.noutput_delays = 4 +	.noutput_delays = ARRAY_SIZE(stih415_output_delays)  static const struct st_pctl_data  stih415_sbc_data = {  	STIH415_PCTRL_COMMON_DATA, @@ -324,18 +373,31 @@ static const struct st_pctl_data  stih415_right_data = {  };  /* STiH416 data */ -static unsigned int stih416_delays[] = {0, 300, 500, 750, 1000, 1250, 1500, -			1750, 2000, 2250, 2500, 2750, 3000, 3250 }; +static const unsigned int stih416_delays[] = {0, 300, 500, 750, 1000, 1250, +			1500, 1750, 2000, 2250, 2500, 2750, 3000, 3250 };  static const struct st_pctl_data  stih416_data = {  	.rt_style	= st_retime_style_dedicated,  	.input_delays	= stih416_delays, -	.ninput_delays	= 14, +	.ninput_delays	= ARRAY_SIZE(stih416_delays),  	.output_delays	= stih416_delays, -	.noutput_delays = 14, +	.noutput_delays = ARRAY_SIZE(stih416_delays),  	.alt = 0, .oe = 40, .pu = 50, .od = 60, .rt = 100,  }; +static const struct st_pctl_data stih407_flashdata = { +	.rt_style	= st_retime_style_none, +	.input_delays	= stih416_delays, +	.ninput_delays	= ARRAY_SIZE(stih416_delays), +	.output_delays	= stih416_delays, +	.noutput_delays = ARRAY_SIZE(stih416_delays), +	.alt = 0, +	.oe = -1, /* Not Available */ +	.pu = -1, /* Not Available */ +	.od = 60, +	.rt = 100, +}; +  /* Low level functions.. */  static inline int st_gpio_bank(int gpio)  { @@ -356,25 +418,29 @@ static void st_pinconf_set_config(struct st_pio_control *pc,  	unsigned int oe_value, pu_value, od_value;  	unsigned long mask = BIT(pin); -	regmap_field_read(output_enable, &oe_value); -	regmap_field_read(pull_up, &pu_value); -	regmap_field_read(open_drain, &od_value); - -	/* Clear old values */ -	oe_value &= ~mask; -	pu_value &= ~mask; -	od_value &= ~mask; - -	if (config & ST_PINCONF_OE) -		oe_value |= mask; -	if (config & ST_PINCONF_PU) -		pu_value |= mask; -	if (config & ST_PINCONF_OD) -		od_value |= mask; - -	regmap_field_write(output_enable, oe_value); -	regmap_field_write(pull_up, pu_value); -	regmap_field_write(open_drain, od_value); +	if (output_enable) { +		regmap_field_read(output_enable, &oe_value); +		oe_value &= ~mask; +		if (config & ST_PINCONF_OE) +			oe_value |= mask; +		regmap_field_write(output_enable, oe_value); +	} + +	if (pull_up) { +		regmap_field_read(pull_up, &pu_value); +		pu_value &= ~mask; +		if (config & ST_PINCONF_PU) +			pu_value |= mask; +		regmap_field_write(pull_up, pu_value); +	} + +	if (open_drain) { +		regmap_field_read(open_drain, &od_value); +		od_value &= ~mask; +		if (config & ST_PINCONF_OD) +			od_value |= mask; +		regmap_field_write(open_drain, od_value); +	}  }  static void st_pctl_set_function(struct st_pio_control *pc, @@ -385,6 +451,9 @@ static void st_pctl_set_function(struct st_pio_control *pc,  	int pin = st_gpio_pin(pin_id);  	int offset = pin * 4; +	if (!alt) +		return; +  	regmap_field_read(alt, &val);  	val &= ~(0xf << offset);  	val |= function << offset; @@ -394,7 +463,7 @@ static void st_pctl_set_function(struct st_pio_control *pc,  static unsigned long st_pinconf_delay_to_bit(unsigned int delay,  	const struct st_pctl_data *data, unsigned long config)  { -	unsigned int *delay_times; +	const unsigned int *delay_times;  	int num_delay_times, i, closest_index = -1;  	unsigned int closest_divergence = UINT_MAX; @@ -427,7 +496,7 @@ static unsigned long st_pinconf_delay_to_bit(unsigned int delay,  static unsigned long st_pinconf_bit_to_delay(unsigned int index,  	const struct st_pctl_data *data, unsigned long output)  { -	unsigned int *delay_times; +	const unsigned int *delay_times;  	int num_delay_times;  	if (output) { @@ -522,17 +591,23 @@ static void st_pinconf_get_direction(struct st_pio_control *pc,  {  	unsigned int oe_value, pu_value, od_value; -	regmap_field_read(pc->oe, &oe_value); -	regmap_field_read(pc->pu, &pu_value); -	regmap_field_read(pc->od, &od_value); +	if (pc->oe) { +		regmap_field_read(pc->oe, &oe_value); +		if (oe_value & BIT(pin)) +			ST_PINCONF_PACK_OE(*config); +	} -	if (oe_value & BIT(pin)) -		ST_PINCONF_PACK_OE(*config); -	if (pu_value & BIT(pin)) -		ST_PINCONF_PACK_PU(*config); -	if (od_value & BIT(pin)) -		ST_PINCONF_PACK_OD(*config); +	if (pc->pu) { +		regmap_field_read(pc->pu, &pu_value); +		if (pu_value & BIT(pin)) +			ST_PINCONF_PACK_PU(*config); +	} +	if (pc->od) { +		regmap_field_read(pc->od, &od_value); +		if (od_value & BIT(pin)) +			ST_PINCONF_PACK_OD(*config); +	}  }  static int st_pinconf_get_retime_packed(struct st_pinctrl *info, @@ -1051,8 +1126,21 @@ static int st_pctl_dt_setup_retime(struct st_pinctrl *info,  	return -EINVAL;  } -static int st_parse_syscfgs(struct st_pinctrl *info, -		int bank, struct device_node *np) + +static struct regmap_field *st_pc_get_value(struct device *dev, +					    struct regmap *regmap, int bank, +					    int data, int lsb, int msb) +{ +	struct reg_field reg = REG_FIELD((data + bank) * 4, lsb, msb); + +	if (data < 0) +		return NULL; + +	return devm_regmap_field_alloc(dev, regmap, reg); +} + +static void st_parse_syscfgs(struct st_pinctrl *info, int bank, +			     struct device_node *np)  {  	const struct st_pctl_data *data = info->data;  	/** @@ -1062,29 +1150,21 @@ static int st_parse_syscfgs(struct st_pinctrl *info,  	 */  	int lsb = (bank%4) * ST_GPIO_PINS_PER_BANK;  	int msb = lsb + ST_GPIO_PINS_PER_BANK - 1; -	struct reg_field alt_reg = REG_FIELD((data->alt + bank) * 4, 0, 31); -	struct reg_field oe_reg = REG_FIELD((data->oe + bank/4) * 4, lsb, msb); -	struct reg_field pu_reg = REG_FIELD((data->pu + bank/4) * 4, lsb, msb); -	struct reg_field od_reg = REG_FIELD((data->od + bank/4) * 4, lsb, msb);  	struct st_pio_control *pc = &info->banks[bank].pc;  	struct device *dev = info->dev;  	struct regmap *regmap  = info->regmap; -	pc->alt = devm_regmap_field_alloc(dev, regmap, alt_reg); -	pc->oe = devm_regmap_field_alloc(dev, regmap, oe_reg); -	pc->pu = devm_regmap_field_alloc(dev, regmap, pu_reg); -	pc->od = devm_regmap_field_alloc(dev, regmap, od_reg); - -	if (IS_ERR(pc->alt) || IS_ERR(pc->oe) || -			IS_ERR(pc->pu) || IS_ERR(pc->od)) -		return -EINVAL; +	pc->alt = st_pc_get_value(dev, regmap, bank, data->alt, 0, 31); +	pc->oe = st_pc_get_value(dev, regmap, bank/4, data->oe, lsb, msb); +	pc->pu = st_pc_get_value(dev, regmap, bank/4, data->pu, lsb, msb); +	pc->od = st_pc_get_value(dev, regmap, bank/4, data->od, lsb, msb);  	/* retime avaiable for all pins by default */  	pc->rt_pin_mask = 0xff;  	of_property_read_u32(np, "st,retime-pin-mask", &pc->rt_pin_mask);  	st_pctl_dt_setup_retime(info, bank, pc); -	return 0; +	return;  }  /* @@ -1200,6 +1280,163 @@ static int st_pctl_parse_functions(struct device_node *np,  	return 0;  } +static void st_gpio_irq_mask(struct irq_data *d) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct st_gpio_bank *bank = gpio_chip_to_bank(gc); + +	writel(BIT(d->hwirq), bank->base + REG_PIO_CLR_PMASK); +} + +static void st_gpio_irq_unmask(struct irq_data *d) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct st_gpio_bank *bank = gpio_chip_to_bank(gc); + +	writel(BIT(d->hwirq), bank->base + REG_PIO_SET_PMASK); +} + +static int st_gpio_irq_set_type(struct irq_data *d, unsigned type) +{ +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct st_gpio_bank *bank = gpio_chip_to_bank(gc); +	unsigned long flags; +	int comp, pin = d->hwirq; +	u32 val; +	u32 pin_edge_conf = 0; + +	switch (type) { +	case IRQ_TYPE_LEVEL_HIGH: +		comp = 0; +		break; +	case IRQ_TYPE_EDGE_FALLING: +		comp = 0; +		pin_edge_conf = ST_IRQ_FALLING_EDGE_CONF(pin); +		break; +	case IRQ_TYPE_LEVEL_LOW: +		comp = 1; +		break; +	case IRQ_TYPE_EDGE_RISING: +		comp = 1; +		pin_edge_conf = ST_IRQ_RISING_EDGE_CONF(pin); +		break; +	case IRQ_TYPE_EDGE_BOTH: +		comp = st_gpio_get(&bank->gpio_chip, pin); +		pin_edge_conf = ST_IRQ_BOTH_EDGE_CONF(pin); +		break; +	default: +		return -EINVAL; +	} + +	spin_lock_irqsave(&bank->lock, flags); +	bank->irq_edge_conf &=  ~(ST_IRQ_EDGE_MASK << ( +				pin * ST_IRQ_EDGE_CONF_BITS_PER_PIN)); +	bank->irq_edge_conf |= pin_edge_conf; +	spin_unlock_irqrestore(&bank->lock, flags); + +	val = readl(bank->base + REG_PIO_PCOMP); +	val &= ~BIT(pin); +	val |= (comp << pin); +	writel(val, bank->base + REG_PIO_PCOMP); + +	return 0; +} + +/* + * As edge triggers are not supported at hardware level, it is supported by + * software by exploiting the level trigger support in hardware. + * + * Steps for detection raising edge interrupt in software. + * + * Step 1: CONFIGURE pin to detect level LOW interrupts. + * + * Step 2: DETECT level LOW interrupt and in irqmux/gpio bank interrupt handler, + * if the value of pin is low, then CONFIGURE pin for level HIGH interrupt. + * IGNORE calling the actual interrupt handler for the pin at this stage. + * + * Step 3: DETECT level HIGH interrupt and in irqmux/gpio-bank interrupt handler + * if the value of pin is HIGH, CONFIGURE pin for level LOW interrupt and then + * DISPATCH the interrupt to the interrupt handler of the pin. + * + *		 step-1  ________     __________ + *				|     | step - 3 + *			        |     | + *			step -2 |_____| + * + * falling edge is also detected int the same way. + * + */ +static void __gpio_irq_handler(struct st_gpio_bank *bank) +{ +	unsigned long port_in, port_mask, port_comp, active_irqs; +	unsigned long bank_edge_mask, flags; +	int n, val, ecfg; + +	spin_lock_irqsave(&bank->lock, flags); +	bank_edge_mask = bank->irq_edge_conf; +	spin_unlock_irqrestore(&bank->lock, flags); + +	for (;;) { +		port_in = readl(bank->base + REG_PIO_PIN); +		port_comp = readl(bank->base + REG_PIO_PCOMP); +		port_mask = readl(bank->base + REG_PIO_PMASK); + +		active_irqs = (port_in ^ port_comp) & port_mask; + +		if (active_irqs == 0) +			break; + +		for_each_set_bit(n, &active_irqs, BITS_PER_LONG) { +			/* check if we are detecting fake edges ... */ +			ecfg = ST_IRQ_EDGE_CONF(bank_edge_mask, n); + +			if (ecfg) { +				/* edge detection. */ +				val = st_gpio_get(&bank->gpio_chip, n); + +				writel(BIT(n), +					val ? bank->base + REG_PIO_SET_PCOMP : +					bank->base + REG_PIO_CLR_PCOMP); + +				if (ecfg != ST_IRQ_EDGE_BOTH && +					!((ecfg & ST_IRQ_EDGE_FALLING) ^ val)) +					continue; +			} + +			generic_handle_irq(irq_find_mapping(bank->gpio_chip.irqdomain, n)); +		} +	} +} + +static void st_gpio_irq_handler(unsigned irq, struct irq_desc *desc) +{ +	/* interrupt dedicated per bank */ +	struct irq_chip *chip = irq_get_chip(irq); +	struct gpio_chip *gc = irq_desc_get_handler_data(desc); +	struct st_gpio_bank *bank = gpio_chip_to_bank(gc); + +	chained_irq_enter(chip, desc); +	__gpio_irq_handler(bank); +	chained_irq_exit(chip, desc); +} + +static void st_gpio_irqmux_handler(unsigned irq, struct irq_desc *desc) +{ +	struct irq_chip *chip = irq_get_chip(irq); +	struct st_pinctrl *info = irq_get_handler_data(irq); +	unsigned long status; +	int n; + +	chained_irq_enter(chip, desc); + +	status = readl(info->irqmux_base); + +	for_each_set_bit(n, &status, info->nbanks) +		__gpio_irq_handler(&info->banks[n]); + +	chained_irq_exit(chip, desc); +} +  static struct gpio_chip st_gpio_template = {  	.request		= st_gpio_request,  	.free			= st_gpio_free, @@ -1212,6 +1449,13 @@ static struct gpio_chip st_gpio_template = {  	.of_xlate		= st_gpio_xlate,  }; +static struct irq_chip st_gpio_irqchip = { +	.name		= "GPIO", +	.irq_mask	= st_gpio_irq_mask, +	.irq_unmask	= st_gpio_irq_unmask, +	.irq_set_type	= st_gpio_irq_set_type, +}; +  static int st_gpiolib_register_bank(struct st_pinctrl *info,  	int bank_nr, struct device_node *np)  { @@ -1219,8 +1463,8 @@ static int st_gpiolib_register_bank(struct st_pinctrl *info,  	struct pinctrl_gpio_range *range = &bank->range;  	struct device *dev = info->dev;  	int bank_num = of_alias_get_id(np, "gpio"); -	struct resource res; -	int err; +	struct resource res, irq_res; +	int gpio_irq = 0, err;  	if (of_address_to_resource(np, 0, &res))  		return -ENODEV; @@ -1233,6 +1477,8 @@ static int st_gpiolib_register_bank(struct st_pinctrl *info,  	bank->gpio_chip.base = bank_num * ST_GPIO_PINS_PER_BANK;  	bank->gpio_chip.ngpio = ST_GPIO_PINS_PER_BANK;  	bank->gpio_chip.of_node = np; +	bank->gpio_chip.dev = dev; +	spin_lock_init(&bank->lock);  	of_property_read_string(np, "st,bank-name", &range->name);  	bank->gpio_chip.label = range->name; @@ -1248,6 +1494,43 @@ static int st_gpiolib_register_bank(struct st_pinctrl *info,  	}  	dev_info(dev, "%s bank added.\n", range->name); +	/** +	 * GPIO bank can have one of the two possible types of +	 * interrupt-wirings. +	 * +	 * First type is via irqmux, single interrupt is used by multiple +	 * gpio banks. This reduces number of overall interrupts numbers +	 * required. All these banks belong to a single pincontroller. +	 *		  _________ +	 *		 |	   |----> [gpio-bank (n)    ] +	 *		 |	   |----> [gpio-bank (n + 1)] +	 *	[irqN]-- | irq-mux |----> [gpio-bank (n + 2)] +	 *		 |	   |----> [gpio-bank (...  )] +	 *		 |_________|----> [gpio-bank (n + 7)] +	 * +	 * Second type has a dedicated interrupt per each gpio bank. +	 * +	 *	[irqN]----> [gpio-bank (n)] +	 */ + +	if (of_irq_to_resource(np, 0, &irq_res)) { +		gpio_irq = irq_res.start; +		gpiochip_set_chained_irqchip(&bank->gpio_chip, &st_gpio_irqchip, +					     gpio_irq, st_gpio_irq_handler); +	} + +	if (info->irqmux_base > 0 || gpio_irq > 0) { +		err = gpiochip_irqchip_add(&bank->gpio_chip, &st_gpio_irqchip, +					   0, handle_simple_irq, +					   IRQ_TYPE_LEVEL_LOW); +		if (err) { +			dev_info(dev, "could not add irqchip\n"); +			return err; +		} +	} else { +		dev_info(dev, "No IRQ support for %s bank\n", np->full_name); +	} +  	return 0;  } @@ -1264,6 +1547,10 @@ static struct of_device_id st_pctl_of_match[] = {  	{ .compatible = "st,stih416-rear-pinctrl", .data = &stih416_data},  	{ .compatible = "st,stih416-fvdp-fe-pinctrl", .data = &stih416_data},  	{ .compatible = "st,stih416-fvdp-lite-pinctrl", .data = &stih416_data}, +	{ .compatible = "st,stih407-sbc-pinctrl", .data = &stih416_data}, +	{ .compatible = "st,stih407-front-pinctrl", .data = &stih416_data}, +	{ .compatible = "st,stih407-rear-pinctrl", .data = &stih416_data}, +	{ .compatible = "st,stih407-flash-pinctrl", .data = &stih407_flashdata},  	{ /* sentinel */ }  }; @@ -1276,6 +1563,8 @@ static int st_pctl_probe_dt(struct platform_device *pdev,  	struct device_node *np = pdev->dev.of_node;  	struct device_node *child;  	int grp_index = 0; +	int irq = 0; +	struct resource *res;  	st_pctl_dt_child_count(info, np);  	if (!info->nbanks) { @@ -1306,6 +1595,21 @@ static int st_pctl_probe_dt(struct platform_device *pdev,  	}  	info->data = of_match_node(st_pctl_of_match, np)->data; +	irq = platform_get_irq(pdev, 0); + +	if (irq > 0) { +		res = platform_get_resource_byname(pdev, +					IORESOURCE_MEM, "irqmux"); +		info->irqmux_base = devm_ioremap_resource(&pdev->dev, res); + +		if (IS_ERR(info->irqmux_base)) +			return PTR_ERR(info->irqmux_base); + +		irq_set_chained_handler(irq, st_gpio_irqmux_handler); +		irq_set_handler_data(irq, info); + +	} +  	pctl_desc->npins = info->nbanks * ST_GPIO_PINS_PER_BANK;  	pdesc =	devm_kzalloc(&pdev->dev,  			sizeof(*pdesc) * pctl_desc->npins, GFP_KERNEL); @@ -1370,10 +1674,10 @@ static int st_pctl_probe(struct platform_device *pdev)  	if (ret)  		return ret; -	pctl_desc->owner	= THIS_MODULE, -	pctl_desc->pctlops	= &st_pctlops, -	pctl_desc->pmxops	= &st_pmxops, -	pctl_desc->confops	= &st_confops, +	pctl_desc->owner	= THIS_MODULE; +	pctl_desc->pctlops	= &st_pctlops; +	pctl_desc->pmxops	= &st_pmxops; +	pctl_desc->confops	= &st_confops;  	pctl_desc->name		= dev_name(&pdev->dev);  	info->pctl = pinctrl_register(pctl_desc, &pdev->dev, info); diff --git a/drivers/pinctrl/pinctrl-sunxi-pins.h b/drivers/pinctrl/pinctrl-sunxi-pins.h deleted file mode 100644 index 2c7446a1a19..00000000000 --- a/drivers/pinctrl/pinctrl-sunxi-pins.h +++ /dev/null @@ -1,3861 +0,0 @@ -/* - * Allwinner A1X SoCs pinctrl driver. - * - * Copyright (C) 2012 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. - */ - -#ifndef __PINCTRL_SUNXI_PINS_H -#define __PINCTRL_SUNXI_PINS_H - -#include "pinctrl-sunxi.h" - -static const struct sunxi_desc_pin sun4i_a10_pins[] = { -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD3 */ -		  SUNXI_FUNCTION(0x3, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x4, "uart2")),	/* RTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA1, -		  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_PIN(SUNXI_PINCTRL_PIN_PA2, -		  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_PIN(SUNXI_PINCTRL_PIN_PA3, -		  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_PIN(SUNXI_PINCTRL_PIN_PA4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD3 */ -		  SUNXI_FUNCTION(0x3, "spi1")),		/* CS1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD2 */ -		  SUNXI_FUNCTION(0x3, "spi3")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD1 */ -		  SUNXI_FUNCTION(0x3, "spi3")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD0 */ -		  SUNXI_FUNCTION(0x3, "spi3")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXCK */ -		  SUNXI_FUNCTION(0x3, "spi3")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXERR */ -		  SUNXI_FUNCTION(0x3, "spi3")),		/* CS1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXDV */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* EMDC */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA12, -		  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_PIN(SUNXI_PINCTRL_PIN_PA13, -		  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_PIN(SUNXI_PINCTRL_PIN_PA14, -		  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_PIN(SUNXI_PINCTRL_PIN_PA15, -		  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_PIN(SUNXI_PINCTRL_PIN_PA16, -		  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_PIN(SUNXI_PINCTRL_PIN_PA17, -		  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 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm")),		/* PWM0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0")),		/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0")),		/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* MCLK */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* BCLK */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* BCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* LRCK */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* SYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* DO0 */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* DO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s")),		/* DO1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s")),		/* DO2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s")),		/* DO3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* DI */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* DI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2")),		/* CS1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* MS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* CK0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* DO0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* DI0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */ -		  SUNXI_FUNCTION(0x3, "ir1")),		/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */ -		  SUNXI_FUNCTION(0x3, "ir1")),		/* RX */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE# */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NWP */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE4 */ -		  SUNXI_FUNCTION(0x3, "spi2")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE5 */ -		  SUNXI_FUNCTION(0x3, "spi2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE6 */ -		  SUNXI_FUNCTION(0x3, "spi2")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE7 */ -		  SUNXI_FUNCTION(0x3, "spi2")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQS */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VPC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D8 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D9 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VM3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D16 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VPC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D17 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D20 */ -		  SUNXI_FUNCTION(0x3, "csi1")),		/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D21 */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D22 */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPPP */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D23 */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* DET */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* VCCEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* DE */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* RST */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* SDA */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* PCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* ERR */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* CK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* SYNC */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* DVLD */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* VSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "sim")),		/* VPPEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D7 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* MSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* PCK */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* ERR */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* CK */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* SYNC */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* DVLD */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D2 */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D3 */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D13 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D15 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAA0 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 0),		/* EINT0 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAA1 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 1),		/* EINT1 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAA2 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 2),		/* EINT2 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIRQ */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 3),		/* EINT3 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD0 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 4),		/* EINT4 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD1 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 5),		/* EINT5 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD2 */ -		  SUNXI_FUNCTION(0x4, "uart5"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* BS */ -		  SUNXI_FUNCTION_IRQ(0x6, 6),		/* EINT6 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD3 */ -		  SUNXI_FUNCTION(0x4, "uart5"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* CLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 7),		/* EINT7 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D8 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD4 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN0 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 8),		/* EINT8 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D9 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD5 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN1 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 9),		/* EINT9 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD6 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN2 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D2 */ -		  SUNXI_FUNCTION_IRQ(0x6, 10),		/* EINT10 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD7 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN3 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D3 */ -		  SUNXI_FUNCTION_IRQ(0x6, 11),		/* EINT11 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D12 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD8 */ -		  SUNXI_FUNCTION(0x4, "ps2"),		/* SCK1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 12),		/* EINT12 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D13 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD9 */ -		  SUNXI_FUNCTION(0x4, "ps2"),		/* SDA1 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* RST */ -		  SUNXI_FUNCTION_IRQ(0x6, 13),		/* EINT13 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D13 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D14 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD10 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN4 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPEN */ -		  SUNXI_FUNCTION_IRQ(0x6, 14),		/* EINT14 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D15 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD11 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN5 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPPP */ -		  SUNXI_FUNCTION_IRQ(0x6, 15),		/* EINT15 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D15 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D16 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD12 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN6 */ -		  SUNXI_FUNCTION_IRQ(0x6, 16),		/* EINT16 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D16 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D17 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD13 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN7 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* VCCEN */ -		  SUNXI_FUNCTION_IRQ(0x6, 17),		/* EINT17 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D17 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D18 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD14 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT0 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* SCK */ -		  SUNXI_FUNCTION_IRQ(0x6, 18),		/* EINT18 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D18 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D19 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD15 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT1 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* SDA */ -		  SUNXI_FUNCTION_IRQ(0x6, 19),		/* EINT19 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D19 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D20 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAOE */ -		  SUNXI_FUNCTION(0x4, "can"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 20),		/* EINT20 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D20 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D21 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATADREQ */ -		  SUNXI_FUNCTION(0x4, "can"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 21),		/* EINT21 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D21 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D22 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATADACK */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT2 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CMD */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D23 */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATACS0 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT3 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CLK */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATACS1 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT4 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D0 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* PCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* DE */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIORDY */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT5 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D1 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* FIELD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIOR */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT6 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D2 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIOW */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT7 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D3 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* VSYNC */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm")),		/* PWM1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "uart5"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 22)),		/* EINT22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "uart5"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 23)),		/* EINT23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "uart6"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 24)),		/* EINT24 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "uart6"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 25)),		/* EINT25 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS1 */ -		  SUNXI_FUNCTION(0x3, "ps2"),		/* SCK1 */ -		  SUNXI_FUNCTION(0x4, "timer4"),	/* TCLKIN0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 26)),		/* EINT26 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ -		  SUNXI_FUNCTION(0x3, "ps2"),		/* SDA1 */ -		  SUNXI_FUNCTION(0x4, "timer5"),	/* TCLKIN1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 27)),		/* EINT27 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 28)),		/* EINT28 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 29)),		/* EINT29 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 30)),		/* EINT30 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 31)),		/* EINT31 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ps2"),		/* SCK0 */ -		  SUNXI_FUNCTION(0x3, "uart7"),		/* TX */ -		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSCL */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ps2"),		/* SDA0 */ -		  SUNXI_FUNCTION(0x3, "uart7"),		/* RX */ -		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSDA */ -}; - -static const struct sunxi_desc_pin sun5i_a10s_pins[] = { -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD3 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* CLK */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD2 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* ERR */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD1 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* SYNC */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD0 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* DLVD */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD3 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D0 */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD2 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D1 */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD1 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D2 */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD0 */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D3 */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXCK */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* DTR */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXERR */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* DSR */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXDV */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* DCD */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* EMDC */ -		  SUNXI_FUNCTION(0x3, "ts0"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* RING */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* EMDIO */ -		  SUNXI_FUNCTION(0x3, "uart1"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXEN */ -		  SUNXI_FUNCTION(0x3, "uart1"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXCK */ -		  SUNXI_FUNCTION(0x3, "uart1"),		/* CTS */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ECRS */ -		  SUNXI_FUNCTION(0x3, "uart1"),		/* RTS */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ECOL */ -		  SUNXI_FUNCTION(0x3, "uart2")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXERR */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 31)),		/* EINT31 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm"),		/* PWM0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 16)),		/* EINT16 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 17)),		/* EINT17 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 18)),		/* EINT18 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* MCLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 19)),		/* EINT19 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* BCLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 20)),		/* EINT20 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* LRCK */ -		  SUNXI_FUNCTION_IRQ(0x6, 21)),		/* EINT21 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* DO */ -		  SUNXI_FUNCTION_IRQ(0x6, 22)),		/* EINT22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s"),		/* DI */ -		  SUNXI_FUNCTION_IRQ(0x6, 23)),		/* EINT23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 24)),		/* EINT24 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* MS0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 25)),		/* EINT25 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* CK0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 26)),		/* EINT26 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* DO0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 27)),		/* EINT27 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* DI0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 28)),		/* EINT28 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 29)),		/* EINT29 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 30)),		/* EINT30 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE1 */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ4 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ5 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ6 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ7 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWP */ -		  SUNXI_FUNCTION(0x4, "uart3")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE2 */ -		  SUNXI_FUNCTION(0x4, "uart3")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE3 */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* TX */ -		  SUNXI_FUNCTION(0x4, "uart3")),	/* CTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE4 */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ -		  SUNXI_FUNCTION(0x4, "uart3")),	/* RTS */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "uart2")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "uart2")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "uart2")),	/* CTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "uart2")),	/* RTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ECRS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ECOL */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXERR */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D16 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D17 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXDV */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D20 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D21 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D22 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D23 */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* DE */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXERR */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* EMDC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x3, "emac")),		/* EMDIO */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* PCK */ -		  SUNXI_FUNCTION(0x4, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 14)),		/* EINT14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* ERR */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* CK */ -		  SUNXI_FUNCTION(0x4, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 15)),		/* EINT15 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* SYNC */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x4, "spi2")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* DVLD */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x4, "spi2")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* MS1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x2, "gps"),		/* CLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 0)),		/* EINT0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x2, "gps"),		/* SIGN */ -		  SUNXI_FUNCTION_IRQ(0x6, 1)),		/* EINT1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x2, "gps"),		/* MAG */ -		  SUNXI_FUNCTION_IRQ(0x6, 2)),		/* EINT2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 3)),		/* EINT3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 4)),		/* EINT4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* DO */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 5)),		/* EINT5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* RTS */ -		  SUNXI_FUNCTION(0x5, "uart2"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 6)),		/* EINT6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D2 */ -		  SUNXI_FUNCTION(0x5, "uart2"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 7)),		/* EINT7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D3 */ -		  SUNXI_FUNCTION(0x5, "uart2"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 8)),		/* EINT8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 9)),		/* EINT9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 10)),		/* EINT10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 11)),		/* EINT11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 12)),		/* EINT12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* PWM1 */ -		  SUNXI_FUNCTION(0x5, "uart2"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 13)),		/* EINT13 */ -}; - -static const struct sunxi_desc_pin sun5i_a13_pins[] = { -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm"), -		  SUNXI_FUNCTION_IRQ(0x6, 16)),		/* EINT16 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 17)),		/* EINT17 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 18)),		/* EINT18 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 24)),		/* EINT24 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE1 */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ4 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ5 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ6 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ7 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D7 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQS */ -		  SUNXI_FUNCTION(0x4, "uart3")),	/* RTS */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D7 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D13 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D15 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D18 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D19 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D20 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D21 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* DE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* VSYNC */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* PCLK */ -		  SUNXI_FUNCTION(0x4, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 14)),		/* EINT14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* MCLK */ -		  SUNXI_FUNCTION(0x4, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 15)),		/* EINT15 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x4, "spi2")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x4, "spi2")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x4, "mmc0")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x4, "mmc0")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x4, "mmc0")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x4, "mmc0")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x4, "mmc0")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x4, "mmc0")),		/* D2 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION_IRQ(0x6, 0)),		/* EINT0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION_IRQ(0x6, 1)),		/* EINT1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION_IRQ(0x6, 2)),		/* EINT2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 3)),		/* EINT3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 4)),		/* EINT4 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 9)),		/* EINT9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 10)),		/* EINT10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 11)),		/* EINT11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 12)),		/* EINT12 */ -}; - -static const struct sunxi_desc_pin sun6i_a31_pins[] = { -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD0 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* DTR */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD1 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* DSR */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD2 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* DCD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD3 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* RING */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD4 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD5 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD6 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* RTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD7 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart1")),	/* CTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXCLK */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXEN */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D9 */ -		  SUNXI_FUNCTION(0x4, "mmc3"),		/* CMD */ -		  SUNXI_FUNCTION(0x5, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* GTXCLK */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D10 */ -		  SUNXI_FUNCTION(0x4, "mmc3"),		/* CLK */ -		  SUNXI_FUNCTION(0x5, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD0 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D11 */ -		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D0 */ -		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD1 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D12 */ -		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D1 */ -		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD2 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D13 */ -		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D2 */ -		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD3 */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D14 */ -		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D3 */ -		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD4 */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D15 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD5 */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D16 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD6 */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D17 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD7 */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D18 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXDV */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D19 */ -		  SUNXI_FUNCTION(0x4, "pwm3")),		/* Positive */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXCLK */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D20 */ -		  SUNXI_FUNCTION(0x4, "pwm3")),		/* Negative */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXERR */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D21 */ -		  SUNXI_FUNCTION(0x4, "spi3")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXERR */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D22 */ -		  SUNXI_FUNCTION(0x4, "spi3")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* COL */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D23 */ -		  SUNXI_FUNCTION(0x4, "spi3")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* CRS */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "spi3")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* CLKIN */ -		  SUNXI_FUNCTION(0x3, "lcd1"),		/* DE */ -		  SUNXI_FUNCTION(0x4, "spi3")),		/* CS1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* MDC */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "gmac"),		/* MDIO */ -		  SUNXI_FUNCTION(0x3, "lcd1")),		/* VSYNC */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* MCLK */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION(0x4, "csi")),		/* MCLK1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0")),		/* BCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0")),		/* LRCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO1 */ -		  SUNXI_FUNCTION(0x3, "uart3")),	/* RTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO2 */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */ -		  SUNXI_FUNCTION(0x4, "i2c3")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO3 */ -		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */ -		  SUNXI_FUNCTION(0x4, "i2c3")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "i2s0")),		/* DI */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* WE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* ALE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* CLE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* RE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* RB0 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* RB1 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ0 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ1 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ2 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ3 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ4 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ5 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ6 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ7 */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ8 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ9 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ10 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ11 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ12 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ13 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ14 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ15 */ -		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQS */ -		  SUNXI_FUNCTION(0x3, "mmc2"),		/* RST */ -		  SUNXI_FUNCTION(0x4, "mmc3")),		/* RST */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VPC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D8 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D9 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D16 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VPC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D17 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D20 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D21 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* DE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0")),		/* VSYNC */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* PCLK */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* MCLK */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* ERR */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* SYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* DVLD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "uart5")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "uart5")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "uart5")),	/* RTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "uart5")),	/* CTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D8 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D9 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "ts")),		/* D7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "csi")),		/* MIPI CSI MCLK */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* MS1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart2")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart2")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart2")),	/* RTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart2")),	/* CTS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c3"),		/* SCK */ -		  SUNXI_FUNCTION(0x3, "usb")),		/* DP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c3"),		/* SDA */ -		  SUNXI_FUNCTION(0x3, "usb")),		/* DM3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ -		  SUNXI_FUNCTION(0x3, "i2s1")),		/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "i2s1")),		/* BCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "i2s1")),		/* LRCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "i2s1")),		/* DIN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "i2s1")),		/* DOUT */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart4")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart4")),	/* RX */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* WE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* ALE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* CLE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* RE */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* RB0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* RB1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* DQS */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* MS0 */ -		  SUNXI_FUNCTION(0x4, "pwm1")),		/* Positive */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* CK0 */ -		  SUNXI_FUNCTION(0x4, "pwm1")),		/* Negative */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* DO0 */ -		  SUNXI_FUNCTION(0x4, "pwm2")),		/* Positive */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "jtag"),		/* DI0 */ -		  SUNXI_FUNCTION(0x4, "pwm2")),		/* Negative */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm0")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH28, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out")), -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH29, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH30, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE3 */ -}; - -static const struct sunxi_desc_pin sun7i_a20_pins[] = { -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD3 */ -		  SUNXI_FUNCTION(0x3, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x4, "uart2"),		/* RTS */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GRXD3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA1, -		  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(0x5, "gmac")),		/* GRXD2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA2, -		  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(0x5, "gmac")),		/* GRXD1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA3, -		  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(0x5, "gmac")),		/* GRXD0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD3 */ -		  SUNXI_FUNCTION(0x3, "spi1"),		/* CS1 */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GTXD3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD2 */ -		  SUNXI_FUNCTION(0x3, "spi3"),		/* CS0 */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GTXD2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD1 */ -		  SUNXI_FUNCTION(0x3, "spi3"),		/* CLK */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GTXD1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ETXD0 */ -		  SUNXI_FUNCTION(0x3, "spi3"),		/* MOSI */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GTXD0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXCK */ -		  SUNXI_FUNCTION(0x3, "spi3"),		/* MISO */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GRXCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXERR */ -		  SUNXI_FUNCTION(0x3, "spi3"),		/* CS1 */ -		  SUNXI_FUNCTION(0x5, "gmac"),		/* GNULL / ERXERR */ -		  SUNXI_FUNCTION(0x6, "i2s1")),		/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXDV */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* GRXCTL / ERXDV */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "emac"),		/* EMDC */ -		  SUNXI_FUNCTION(0x4, "uart1"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "gmac")),		/* EMDC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA12, -		  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(0x5, "gmac")),		/* EMDIO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA13, -		  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(0x5, "gmac")),		/* GTXCTL / ETXEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA14, -		  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(0x5, "gmac"),		/* GNULL / ETXCK */ -		  SUNXI_FUNCTION(0x6, "i2s1")),		/* BCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA15, -		  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(0x5, "gmac"),		/* GTXCK / ECRS */ -		  SUNXI_FUNCTION(0x6, "i2s1")),		/* LRCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA16, -		  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(0x5, "gmac"),		/* GCLKIN / ECOL */ -		  SUNXI_FUNCTION(0x6, "i2s1")),		/* DO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PA17, -		  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(0x5, "gmac"),		/* GNULL / ETXERR */ -		  SUNXI_FUNCTION(0x6, "i2s1")),		/* LRCK */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm")),		/* PWM0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0"),		/* TX */ -		  SUNXI_FUNCTION(0x4, "spdif")),	/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ir0")),		/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* MCLK */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* BCLK */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* BCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* LRCK */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* SYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO0 */ -		  SUNXI_FUNCTION(0x3, "ac97")),		/* DO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DI */ -		  SUNXI_FUNCTION(0x3, "ac97"),		/* DI */ -		  SUNXI_FUNCTION(0x4, "spdif")),	/* DI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS1 */ -		  SUNXI_FUNCTION(0x4, "spdif")),	/* DO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* MS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* CK0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* DO0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "jtag")),		/* DI0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */ -		  SUNXI_FUNCTION(0x3, "ir1")),		/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PB23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */ -		  SUNXI_FUNCTION(0x3, "ir1")),		/* RX */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ -		  SUNXI_FUNCTION(0x3, "spi0")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE# */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ -		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NWP */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE4 */ -		  SUNXI_FUNCTION(0x3, "spi2"),		/* CS0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 12)),		/* EINT12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE5 */ -		  SUNXI_FUNCTION(0x3, "spi2"),		/* CLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 13)),		/* EINT13 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE6 */ -		  SUNXI_FUNCTION(0x3, "spi2"),		/* MOSI */ -		  SUNXI_FUNCTION_IRQ(0x6, 14)),		/* EINT14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE7 */ -		  SUNXI_FUNCTION(0x3, "spi2"),		/* MISO */ -		  SUNXI_FUNCTION_IRQ(0x6, 15)),		/* EINT15 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PC24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQS */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VPC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D8 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D9 */ -		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VM3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D16 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VPC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D17 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ -		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D20 */ -		  SUNXI_FUNCTION(0x3, "csi1")),		/* MCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D21 */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D22 */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPPP */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D23 */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* DET */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* VCCEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* DE */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* RST */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PD27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd0"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x3, "sim")),		/* SDA */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* PCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* ERR */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* CK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* SYNC */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* DVLD */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* VSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "sim")),		/* VPPEN */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PE11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts0"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "csi0")),		/* D7 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* MSI */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PF5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* PCK */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* ERR */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* CK */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* SYNC */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* DVLD */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D0 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D2 */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D1 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D3 */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D2 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D3 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D4 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D5 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D13 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D6 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ts1"),		/* D7 */ -		  SUNXI_FUNCTION(0x3, "csi1"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "csi0")),		/* D15 */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D0 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 0),		/* EINT0 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D1 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 1),		/* EINT1 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D2 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 2),		/* EINT2 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D3 */ -		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x6, 3),		/* EINT3 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D4 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 4),		/* EINT4 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D4 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D5 */ -		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 5),		/* EINT5 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D5 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D6 */ -		  SUNXI_FUNCTION(0x4, "uart5"),		/* TX */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* BS */ -		  SUNXI_FUNCTION_IRQ(0x6, 6),		/* EINT6 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D6 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D7 */ -		  SUNXI_FUNCTION(0x4, "uart5"),		/* RX */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* CLK */ -		  SUNXI_FUNCTION_IRQ(0x6, 7),		/* EINT7 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D7 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D8 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD3 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN0 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D0 */ -		  SUNXI_FUNCTION_IRQ(0x6, 8),		/* EINT8 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D8 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D9 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD2 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN1 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 9),		/* EINT9 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D9 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D10 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD1 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN2 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D2 */ -		  SUNXI_FUNCTION_IRQ(0x6, 10),		/* EINT10 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D10 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D11 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD0 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN3 */ -		  SUNXI_FUNCTION(0x5, "ms"),		/* D3 */ -		  SUNXI_FUNCTION_IRQ(0x6, 11),		/* EINT11 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D11 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D12 */ -		  SUNXI_FUNCTION(0x4, "ps2"),		/* SCK1 */ -		  SUNXI_FUNCTION_IRQ(0x6, 12),		/* EINT12 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D12 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D13 */ -		  SUNXI_FUNCTION(0x4, "ps2"),		/* SDA1 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* RST */ -		  SUNXI_FUNCTION_IRQ(0x6, 13),		/* EINT13 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D13 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D14 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD3 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN4 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPEN */ -		  SUNXI_FUNCTION_IRQ(0x6, 14),		/* EINT14 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D14 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D15 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD3 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN5 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPPP */ -		  SUNXI_FUNCTION_IRQ(0x6, 15),		/* EINT15 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D15 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D16 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD2 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN6 */ -		  SUNXI_FUNCTION_IRQ(0x6, 16),		/* EINT16 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D16 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D17 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD1 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN7 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* VCCEN */ -		  SUNXI_FUNCTION_IRQ(0x6, 17),		/* EINT17 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D17 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D18 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD0 */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT0 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* SCK */ -		  SUNXI_FUNCTION_IRQ(0x6, 18),		/* EINT18 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D18 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D19 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXERR */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT1 */ -		  SUNXI_FUNCTION(0x5, "sim"),		/* SDA */ -		  SUNXI_FUNCTION_IRQ(0x6, 19),		/* EINT19 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D19 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D20 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXDV */ -		  SUNXI_FUNCTION(0x4, "can"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x6, 20),		/* EINT20 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D20 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D21 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* EMDC */ -		  SUNXI_FUNCTION(0x4, "can"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x6, 21),		/* EINT21 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D21 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH22, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D22 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* EMDIO */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT2 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CMD */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH23, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D23 */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXEN */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT3 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CLK */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* D23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH24, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXCK */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT4 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D0 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* PCLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH25, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* DE */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ECRS */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT5 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D1 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* FIELD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH26, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* HSYNC */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ECOL */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT6 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D2 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* HSYNC */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PH27, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "lcd1"),		/* VSYNC */ -		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXERR */ -		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT7 */ -		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D3 */ -		  SUNXI_FUNCTION(0x7, "csi1")),		/* VSYNC */ -	/* Hole */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI0, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "i2c3")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI1, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "i2c3")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI2, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x3, "i2c4")),		/* SCK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI3, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "pwm"),		/* PWM1 */ -		  SUNXI_FUNCTION(0x3, "i2c4")),		/* SDA */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI4, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CMD */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI5, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CLK */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI6, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D0 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI7, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D1 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI8, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D2 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI9, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D3 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI10, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "uart5"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x5, 22)),		/* EINT22 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI11, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "uart5"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x5, 23)),		/* EINT23 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI12, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "uart6"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x5, 24)),		/* EINT24 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI13, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "uart6"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x5, 25)),		/* EINT25 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI14, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS1 */ -		  SUNXI_FUNCTION(0x3, "ps2"),		/* SCK1 */ -		  SUNXI_FUNCTION(0x4, "timer4"),	/* TCLKIN0 */ -		  SUNXI_FUNCTION_IRQ(0x5, 26)),		/* EINT26 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI15, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ -		  SUNXI_FUNCTION(0x3, "ps2"),		/* SDA1 */ -		  SUNXI_FUNCTION(0x4, "timer5"),	/* TCLKIN1 */ -		  SUNXI_FUNCTION_IRQ(0x5, 27)),		/* EINT27 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI16, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* RTS */ -		  SUNXI_FUNCTION_IRQ(0x5, 28)),		/* EINT28 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI17, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* CTS */ -		  SUNXI_FUNCTION_IRQ(0x5, 29)),		/* EINT29 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI18, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* TX */ -		  SUNXI_FUNCTION_IRQ(0x5, 30)),		/* EINT30 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI19, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ -		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ -		  SUNXI_FUNCTION_IRQ(0x5, 31)),		/* EINT31 */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI20, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ps2"),		/* SCK0 */ -		  SUNXI_FUNCTION(0x3, "uart7"),		/* TX */ -		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSCL */ -	SUNXI_PIN(SUNXI_PINCTRL_PIN_PI21, -		  SUNXI_FUNCTION(0x0, "gpio_in"), -		  SUNXI_FUNCTION(0x1, "gpio_out"), -		  SUNXI_FUNCTION(0x2, "ps2"),		/* SDA0 */ -		  SUNXI_FUNCTION(0x3, "uart7"),		/* RX */ -		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSDA */ -}; - -static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = { -	.pins = sun4i_a10_pins, -	.npins = ARRAY_SIZE(sun4i_a10_pins), -}; - -static const struct sunxi_pinctrl_desc sun5i_a10s_pinctrl_data = { -	.pins = sun5i_a10s_pins, -	.npins = ARRAY_SIZE(sun5i_a10s_pins), -}; - -static const struct sunxi_pinctrl_desc sun5i_a13_pinctrl_data = { -	.pins = sun5i_a13_pins, -	.npins = ARRAY_SIZE(sun5i_a13_pins), -}; - -static const struct sunxi_pinctrl_desc sun6i_a31_pinctrl_data = { -	.pins = sun6i_a31_pins, -	.npins = ARRAY_SIZE(sun6i_a31_pins), -}; - -static const struct sunxi_pinctrl_desc sun7i_a20_pinctrl_data = { -	.pins = sun7i_a20_pins, -	.npins = ARRAY_SIZE(sun7i_a20_pins), -}; - -#endif /* __PINCTRL_SUNXI_PINS_H */ diff --git a/drivers/pinctrl/pinctrl-sunxi.h b/drivers/pinctrl/pinctrl-sunxi.h deleted file mode 100644 index 01c494f8a14..00000000000 --- a/drivers/pinctrl/pinctrl-sunxi.h +++ /dev/null @@ -1,548 +0,0 @@ -/* - * Allwinner A1X SoCs pinctrl driver. - * - * Copyright (C) 2012 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. - */ - -#ifndef __PINCTRL_SUNXI_H -#define __PINCTRL_SUNXI_H - -#include <linux/kernel.h> -#include <linux/spinlock.h> - -#define PA_BASE	0 -#define PB_BASE	32 -#define PC_BASE	64 -#define PD_BASE	96 -#define PE_BASE	128 -#define PF_BASE	160 -#define PG_BASE	192 -#define PH_BASE	224 -#define PI_BASE	256 - -#define SUNXI_PINCTRL_PIN_PA0	PINCTRL_PIN(PA_BASE + 0, "PA0") -#define SUNXI_PINCTRL_PIN_PA1	PINCTRL_PIN(PA_BASE + 1, "PA1") -#define SUNXI_PINCTRL_PIN_PA2	PINCTRL_PIN(PA_BASE + 2, "PA2") -#define SUNXI_PINCTRL_PIN_PA3	PINCTRL_PIN(PA_BASE + 3, "PA3") -#define SUNXI_PINCTRL_PIN_PA4	PINCTRL_PIN(PA_BASE + 4, "PA4") -#define SUNXI_PINCTRL_PIN_PA5	PINCTRL_PIN(PA_BASE + 5, "PA5") -#define SUNXI_PINCTRL_PIN_PA6	PINCTRL_PIN(PA_BASE + 6, "PA6") -#define SUNXI_PINCTRL_PIN_PA7	PINCTRL_PIN(PA_BASE + 7, "PA7") -#define SUNXI_PINCTRL_PIN_PA8	PINCTRL_PIN(PA_BASE + 8, "PA8") -#define SUNXI_PINCTRL_PIN_PA9	PINCTRL_PIN(PA_BASE + 9, "PA9") -#define SUNXI_PINCTRL_PIN_PA10	PINCTRL_PIN(PA_BASE + 10, "PA10") -#define SUNXI_PINCTRL_PIN_PA11	PINCTRL_PIN(PA_BASE + 11, "PA11") -#define SUNXI_PINCTRL_PIN_PA12	PINCTRL_PIN(PA_BASE + 12, "PA12") -#define SUNXI_PINCTRL_PIN_PA13	PINCTRL_PIN(PA_BASE + 13, "PA13") -#define SUNXI_PINCTRL_PIN_PA14	PINCTRL_PIN(PA_BASE + 14, "PA14") -#define SUNXI_PINCTRL_PIN_PA15	PINCTRL_PIN(PA_BASE + 15, "PA15") -#define SUNXI_PINCTRL_PIN_PA16	PINCTRL_PIN(PA_BASE + 16, "PA16") -#define SUNXI_PINCTRL_PIN_PA17	PINCTRL_PIN(PA_BASE + 17, "PA17") -#define SUNXI_PINCTRL_PIN_PA18	PINCTRL_PIN(PA_BASE + 18, "PA18") -#define SUNXI_PINCTRL_PIN_PA19	PINCTRL_PIN(PA_BASE + 19, "PA19") -#define SUNXI_PINCTRL_PIN_PA20	PINCTRL_PIN(PA_BASE + 20, "PA20") -#define SUNXI_PINCTRL_PIN_PA21	PINCTRL_PIN(PA_BASE + 21, "PA21") -#define SUNXI_PINCTRL_PIN_PA22	PINCTRL_PIN(PA_BASE + 22, "PA22") -#define SUNXI_PINCTRL_PIN_PA23	PINCTRL_PIN(PA_BASE + 23, "PA23") -#define SUNXI_PINCTRL_PIN_PA24	PINCTRL_PIN(PA_BASE + 24, "PA24") -#define SUNXI_PINCTRL_PIN_PA25	PINCTRL_PIN(PA_BASE + 25, "PA25") -#define SUNXI_PINCTRL_PIN_PA26	PINCTRL_PIN(PA_BASE + 26, "PA26") -#define SUNXI_PINCTRL_PIN_PA27	PINCTRL_PIN(PA_BASE + 27, "PA27") -#define SUNXI_PINCTRL_PIN_PA28	PINCTRL_PIN(PA_BASE + 28, "PA28") -#define SUNXI_PINCTRL_PIN_PA29	PINCTRL_PIN(PA_BASE + 29, "PA29") -#define SUNXI_PINCTRL_PIN_PA30	PINCTRL_PIN(PA_BASE + 30, "PA30") -#define SUNXI_PINCTRL_PIN_PA31	PINCTRL_PIN(PA_BASE + 31, "PA31") - -#define SUNXI_PINCTRL_PIN_PB0	PINCTRL_PIN(PB_BASE + 0, "PB0") -#define SUNXI_PINCTRL_PIN_PB1	PINCTRL_PIN(PB_BASE + 1, "PB1") -#define SUNXI_PINCTRL_PIN_PB2	PINCTRL_PIN(PB_BASE + 2, "PB2") -#define SUNXI_PINCTRL_PIN_PB3	PINCTRL_PIN(PB_BASE + 3, "PB3") -#define SUNXI_PINCTRL_PIN_PB4	PINCTRL_PIN(PB_BASE + 4, "PB4") -#define SUNXI_PINCTRL_PIN_PB5	PINCTRL_PIN(PB_BASE + 5, "PB5") -#define SUNXI_PINCTRL_PIN_PB6	PINCTRL_PIN(PB_BASE + 6, "PB6") -#define SUNXI_PINCTRL_PIN_PB7	PINCTRL_PIN(PB_BASE + 7, "PB7") -#define SUNXI_PINCTRL_PIN_PB8	PINCTRL_PIN(PB_BASE + 8, "PB8") -#define SUNXI_PINCTRL_PIN_PB9	PINCTRL_PIN(PB_BASE + 9, "PB9") -#define SUNXI_PINCTRL_PIN_PB10	PINCTRL_PIN(PB_BASE + 10, "PB10") -#define SUNXI_PINCTRL_PIN_PB11	PINCTRL_PIN(PB_BASE + 11, "PB11") -#define SUNXI_PINCTRL_PIN_PB12	PINCTRL_PIN(PB_BASE + 12, "PB12") -#define SUNXI_PINCTRL_PIN_PB13	PINCTRL_PIN(PB_BASE + 13, "PB13") -#define SUNXI_PINCTRL_PIN_PB14	PINCTRL_PIN(PB_BASE + 14, "PB14") -#define SUNXI_PINCTRL_PIN_PB15	PINCTRL_PIN(PB_BASE + 15, "PB15") -#define SUNXI_PINCTRL_PIN_PB16	PINCTRL_PIN(PB_BASE + 16, "PB16") -#define SUNXI_PINCTRL_PIN_PB17	PINCTRL_PIN(PB_BASE + 17, "PB17") -#define SUNXI_PINCTRL_PIN_PB18	PINCTRL_PIN(PB_BASE + 18, "PB18") -#define SUNXI_PINCTRL_PIN_PB19	PINCTRL_PIN(PB_BASE + 19, "PB19") -#define SUNXI_PINCTRL_PIN_PB20	PINCTRL_PIN(PB_BASE + 20, "PB20") -#define SUNXI_PINCTRL_PIN_PB21	PINCTRL_PIN(PB_BASE + 21, "PB21") -#define SUNXI_PINCTRL_PIN_PB22	PINCTRL_PIN(PB_BASE + 22, "PB22") -#define SUNXI_PINCTRL_PIN_PB23	PINCTRL_PIN(PB_BASE + 23, "PB23") -#define SUNXI_PINCTRL_PIN_PB24	PINCTRL_PIN(PB_BASE + 24, "PB24") -#define SUNXI_PINCTRL_PIN_PB25	PINCTRL_PIN(PB_BASE + 25, "PB25") -#define SUNXI_PINCTRL_PIN_PB26	PINCTRL_PIN(PB_BASE + 26, "PB26") -#define SUNXI_PINCTRL_PIN_PB27	PINCTRL_PIN(PB_BASE + 27, "PB27") -#define SUNXI_PINCTRL_PIN_PB28	PINCTRL_PIN(PB_BASE + 28, "PB28") -#define SUNXI_PINCTRL_PIN_PB29	PINCTRL_PIN(PB_BASE + 29, "PB29") -#define SUNXI_PINCTRL_PIN_PB30	PINCTRL_PIN(PB_BASE + 30, "PB30") -#define SUNXI_PINCTRL_PIN_PB31	PINCTRL_PIN(PB_BASE + 31, "PB31") - -#define SUNXI_PINCTRL_PIN_PC0	PINCTRL_PIN(PC_BASE + 0, "PC0") -#define SUNXI_PINCTRL_PIN_PC1	PINCTRL_PIN(PC_BASE + 1, "PC1") -#define SUNXI_PINCTRL_PIN_PC2	PINCTRL_PIN(PC_BASE + 2, "PC2") -#define SUNXI_PINCTRL_PIN_PC3	PINCTRL_PIN(PC_BASE + 3, "PC3") -#define SUNXI_PINCTRL_PIN_PC4	PINCTRL_PIN(PC_BASE + 4, "PC4") -#define SUNXI_PINCTRL_PIN_PC5	PINCTRL_PIN(PC_BASE + 5, "PC5") -#define SUNXI_PINCTRL_PIN_PC6	PINCTRL_PIN(PC_BASE + 6, "PC6") -#define SUNXI_PINCTRL_PIN_PC7	PINCTRL_PIN(PC_BASE + 7, "PC7") -#define SUNXI_PINCTRL_PIN_PC8	PINCTRL_PIN(PC_BASE + 8, "PC8") -#define SUNXI_PINCTRL_PIN_PC9	PINCTRL_PIN(PC_BASE + 9, "PC9") -#define SUNXI_PINCTRL_PIN_PC10	PINCTRL_PIN(PC_BASE + 10, "PC10") -#define SUNXI_PINCTRL_PIN_PC11	PINCTRL_PIN(PC_BASE + 11, "PC11") -#define SUNXI_PINCTRL_PIN_PC12	PINCTRL_PIN(PC_BASE + 12, "PC12") -#define SUNXI_PINCTRL_PIN_PC13	PINCTRL_PIN(PC_BASE + 13, "PC13") -#define SUNXI_PINCTRL_PIN_PC14	PINCTRL_PIN(PC_BASE + 14, "PC14") -#define SUNXI_PINCTRL_PIN_PC15	PINCTRL_PIN(PC_BASE + 15, "PC15") -#define SUNXI_PINCTRL_PIN_PC16	PINCTRL_PIN(PC_BASE + 16, "PC16") -#define SUNXI_PINCTRL_PIN_PC17	PINCTRL_PIN(PC_BASE + 17, "PC17") -#define SUNXI_PINCTRL_PIN_PC18	PINCTRL_PIN(PC_BASE + 18, "PC18") -#define SUNXI_PINCTRL_PIN_PC19	PINCTRL_PIN(PC_BASE + 19, "PC19") -#define SUNXI_PINCTRL_PIN_PC20	PINCTRL_PIN(PC_BASE + 20, "PC20") -#define SUNXI_PINCTRL_PIN_PC21	PINCTRL_PIN(PC_BASE + 21, "PC21") -#define SUNXI_PINCTRL_PIN_PC22	PINCTRL_PIN(PC_BASE + 22, "PC22") -#define SUNXI_PINCTRL_PIN_PC23	PINCTRL_PIN(PC_BASE + 23, "PC23") -#define SUNXI_PINCTRL_PIN_PC24	PINCTRL_PIN(PC_BASE + 24, "PC24") -#define SUNXI_PINCTRL_PIN_PC25	PINCTRL_PIN(PC_BASE + 25, "PC25") -#define SUNXI_PINCTRL_PIN_PC26	PINCTRL_PIN(PC_BASE + 26, "PC26") -#define SUNXI_PINCTRL_PIN_PC27	PINCTRL_PIN(PC_BASE + 27, "PC27") -#define SUNXI_PINCTRL_PIN_PC28	PINCTRL_PIN(PC_BASE + 28, "PC28") -#define SUNXI_PINCTRL_PIN_PC29	PINCTRL_PIN(PC_BASE + 29, "PC29") -#define SUNXI_PINCTRL_PIN_PC30	PINCTRL_PIN(PC_BASE + 30, "PC30") -#define SUNXI_PINCTRL_PIN_PC31	PINCTRL_PIN(PC_BASE + 31, "PC31") - -#define SUNXI_PINCTRL_PIN_PD0	PINCTRL_PIN(PD_BASE + 0, "PD0") -#define SUNXI_PINCTRL_PIN_PD1	PINCTRL_PIN(PD_BASE + 1, "PD1") -#define SUNXI_PINCTRL_PIN_PD2	PINCTRL_PIN(PD_BASE + 2, "PD2") -#define SUNXI_PINCTRL_PIN_PD3	PINCTRL_PIN(PD_BASE + 3, "PD3") -#define SUNXI_PINCTRL_PIN_PD4	PINCTRL_PIN(PD_BASE + 4, "PD4") -#define SUNXI_PINCTRL_PIN_PD5	PINCTRL_PIN(PD_BASE + 5, "PD5") -#define SUNXI_PINCTRL_PIN_PD6	PINCTRL_PIN(PD_BASE + 6, "PD6") -#define SUNXI_PINCTRL_PIN_PD7	PINCTRL_PIN(PD_BASE + 7, "PD7") -#define SUNXI_PINCTRL_PIN_PD8	PINCTRL_PIN(PD_BASE + 8, "PD8") -#define SUNXI_PINCTRL_PIN_PD9	PINCTRL_PIN(PD_BASE + 9, "PD9") -#define SUNXI_PINCTRL_PIN_PD10	PINCTRL_PIN(PD_BASE + 10, "PD10") -#define SUNXI_PINCTRL_PIN_PD11	PINCTRL_PIN(PD_BASE + 11, "PD11") -#define SUNXI_PINCTRL_PIN_PD12	PINCTRL_PIN(PD_BASE + 12, "PD12") -#define SUNXI_PINCTRL_PIN_PD13	PINCTRL_PIN(PD_BASE + 13, "PD13") -#define SUNXI_PINCTRL_PIN_PD14	PINCTRL_PIN(PD_BASE + 14, "PD14") -#define SUNXI_PINCTRL_PIN_PD15	PINCTRL_PIN(PD_BASE + 15, "PD15") -#define SUNXI_PINCTRL_PIN_PD16	PINCTRL_PIN(PD_BASE + 16, "PD16") -#define SUNXI_PINCTRL_PIN_PD17	PINCTRL_PIN(PD_BASE + 17, "PD17") -#define SUNXI_PINCTRL_PIN_PD18	PINCTRL_PIN(PD_BASE + 18, "PD18") -#define SUNXI_PINCTRL_PIN_PD19	PINCTRL_PIN(PD_BASE + 19, "PD19") -#define SUNXI_PINCTRL_PIN_PD20	PINCTRL_PIN(PD_BASE + 20, "PD20") -#define SUNXI_PINCTRL_PIN_PD21	PINCTRL_PIN(PD_BASE + 21, "PD21") -#define SUNXI_PINCTRL_PIN_PD22	PINCTRL_PIN(PD_BASE + 22, "PD22") -#define SUNXI_PINCTRL_PIN_PD23	PINCTRL_PIN(PD_BASE + 23, "PD23") -#define SUNXI_PINCTRL_PIN_PD24	PINCTRL_PIN(PD_BASE + 24, "PD24") -#define SUNXI_PINCTRL_PIN_PD25	PINCTRL_PIN(PD_BASE + 25, "PD25") -#define SUNXI_PINCTRL_PIN_PD26	PINCTRL_PIN(PD_BASE + 26, "PD26") -#define SUNXI_PINCTRL_PIN_PD27	PINCTRL_PIN(PD_BASE + 27, "PD27") -#define SUNXI_PINCTRL_PIN_PD28	PINCTRL_PIN(PD_BASE + 28, "PD28") -#define SUNXI_PINCTRL_PIN_PD29	PINCTRL_PIN(PD_BASE + 29, "PD29") -#define SUNXI_PINCTRL_PIN_PD30	PINCTRL_PIN(PD_BASE + 30, "PD30") -#define SUNXI_PINCTRL_PIN_PD31	PINCTRL_PIN(PD_BASE + 31, "PD31") - -#define SUNXI_PINCTRL_PIN_PE0	PINCTRL_PIN(PE_BASE + 0, "PE0") -#define SUNXI_PINCTRL_PIN_PE1	PINCTRL_PIN(PE_BASE + 1, "PE1") -#define SUNXI_PINCTRL_PIN_PE2	PINCTRL_PIN(PE_BASE + 2, "PE2") -#define SUNXI_PINCTRL_PIN_PE3	PINCTRL_PIN(PE_BASE + 3, "PE3") -#define SUNXI_PINCTRL_PIN_PE4	PINCTRL_PIN(PE_BASE + 4, "PE4") -#define SUNXI_PINCTRL_PIN_PE5	PINCTRL_PIN(PE_BASE + 5, "PE5") -#define SUNXI_PINCTRL_PIN_PE6	PINCTRL_PIN(PE_BASE + 6, "PE6") -#define SUNXI_PINCTRL_PIN_PE7	PINCTRL_PIN(PE_BASE + 7, "PE7") -#define SUNXI_PINCTRL_PIN_PE8	PINCTRL_PIN(PE_BASE + 8, "PE8") -#define SUNXI_PINCTRL_PIN_PE9	PINCTRL_PIN(PE_BASE + 9, "PE9") -#define SUNXI_PINCTRL_PIN_PE10	PINCTRL_PIN(PE_BASE + 10, "PE10") -#define SUNXI_PINCTRL_PIN_PE11	PINCTRL_PIN(PE_BASE + 11, "PE11") -#define SUNXI_PINCTRL_PIN_PE12	PINCTRL_PIN(PE_BASE + 12, "PE12") -#define SUNXI_PINCTRL_PIN_PE13	PINCTRL_PIN(PE_BASE + 13, "PE13") -#define SUNXI_PINCTRL_PIN_PE14	PINCTRL_PIN(PE_BASE + 14, "PE14") -#define SUNXI_PINCTRL_PIN_PE15	PINCTRL_PIN(PE_BASE + 15, "PE15") -#define SUNXI_PINCTRL_PIN_PE16	PINCTRL_PIN(PE_BASE + 16, "PE16") -#define SUNXI_PINCTRL_PIN_PE17	PINCTRL_PIN(PE_BASE + 17, "PE17") -#define SUNXI_PINCTRL_PIN_PE18	PINCTRL_PIN(PE_BASE + 18, "PE18") -#define SUNXI_PINCTRL_PIN_PE19	PINCTRL_PIN(PE_BASE + 19, "PE19") -#define SUNXI_PINCTRL_PIN_PE20	PINCTRL_PIN(PE_BASE + 20, "PE20") -#define SUNXI_PINCTRL_PIN_PE21	PINCTRL_PIN(PE_BASE + 21, "PE21") -#define SUNXI_PINCTRL_PIN_PE22	PINCTRL_PIN(PE_BASE + 22, "PE22") -#define SUNXI_PINCTRL_PIN_PE23	PINCTRL_PIN(PE_BASE + 23, "PE23") -#define SUNXI_PINCTRL_PIN_PE24	PINCTRL_PIN(PE_BASE + 24, "PE24") -#define SUNXI_PINCTRL_PIN_PE25	PINCTRL_PIN(PE_BASE + 25, "PE25") -#define SUNXI_PINCTRL_PIN_PE26	PINCTRL_PIN(PE_BASE + 26, "PE26") -#define SUNXI_PINCTRL_PIN_PE27	PINCTRL_PIN(PE_BASE + 27, "PE27") -#define SUNXI_PINCTRL_PIN_PE28	PINCTRL_PIN(PE_BASE + 28, "PE28") -#define SUNXI_PINCTRL_PIN_PE29	PINCTRL_PIN(PE_BASE + 29, "PE29") -#define SUNXI_PINCTRL_PIN_PE30	PINCTRL_PIN(PE_BASE + 30, "PE30") -#define SUNXI_PINCTRL_PIN_PE31	PINCTRL_PIN(PE_BASE + 31, "PE31") - -#define SUNXI_PINCTRL_PIN_PF0	PINCTRL_PIN(PF_BASE + 0, "PF0") -#define SUNXI_PINCTRL_PIN_PF1	PINCTRL_PIN(PF_BASE + 1, "PF1") -#define SUNXI_PINCTRL_PIN_PF2	PINCTRL_PIN(PF_BASE + 2, "PF2") -#define SUNXI_PINCTRL_PIN_PF3	PINCTRL_PIN(PF_BASE + 3, "PF3") -#define SUNXI_PINCTRL_PIN_PF4	PINCTRL_PIN(PF_BASE + 4, "PF4") -#define SUNXI_PINCTRL_PIN_PF5	PINCTRL_PIN(PF_BASE + 5, "PF5") -#define SUNXI_PINCTRL_PIN_PF6	PINCTRL_PIN(PF_BASE + 6, "PF6") -#define SUNXI_PINCTRL_PIN_PF7	PINCTRL_PIN(PF_BASE + 7, "PF7") -#define SUNXI_PINCTRL_PIN_PF8	PINCTRL_PIN(PF_BASE + 8, "PF8") -#define SUNXI_PINCTRL_PIN_PF9	PINCTRL_PIN(PF_BASE + 9, "PF9") -#define SUNXI_PINCTRL_PIN_PF10	PINCTRL_PIN(PF_BASE + 10, "PF10") -#define SUNXI_PINCTRL_PIN_PF11	PINCTRL_PIN(PF_BASE + 11, "PF11") -#define SUNXI_PINCTRL_PIN_PF12	PINCTRL_PIN(PF_BASE + 12, "PF12") -#define SUNXI_PINCTRL_PIN_PF13	PINCTRL_PIN(PF_BASE + 13, "PF13") -#define SUNXI_PINCTRL_PIN_PF14	PINCTRL_PIN(PF_BASE + 14, "PF14") -#define SUNXI_PINCTRL_PIN_PF15	PINCTRL_PIN(PF_BASE + 15, "PF15") -#define SUNXI_PINCTRL_PIN_PF16	PINCTRL_PIN(PF_BASE + 16, "PF16") -#define SUNXI_PINCTRL_PIN_PF17	PINCTRL_PIN(PF_BASE + 17, "PF17") -#define SUNXI_PINCTRL_PIN_PF18	PINCTRL_PIN(PF_BASE + 18, "PF18") -#define SUNXI_PINCTRL_PIN_PF19	PINCTRL_PIN(PF_BASE + 19, "PF19") -#define SUNXI_PINCTRL_PIN_PF20	PINCTRL_PIN(PF_BASE + 20, "PF20") -#define SUNXI_PINCTRL_PIN_PF21	PINCTRL_PIN(PF_BASE + 21, "PF21") -#define SUNXI_PINCTRL_PIN_PF22	PINCTRL_PIN(PF_BASE + 22, "PF22") -#define SUNXI_PINCTRL_PIN_PF23	PINCTRL_PIN(PF_BASE + 23, "PF23") -#define SUNXI_PINCTRL_PIN_PF24	PINCTRL_PIN(PF_BASE + 24, "PF24") -#define SUNXI_PINCTRL_PIN_PF25	PINCTRL_PIN(PF_BASE + 25, "PF25") -#define SUNXI_PINCTRL_PIN_PF26	PINCTRL_PIN(PF_BASE + 26, "PF26") -#define SUNXI_PINCTRL_PIN_PF27	PINCTRL_PIN(PF_BASE + 27, "PF27") -#define SUNXI_PINCTRL_PIN_PF28	PINCTRL_PIN(PF_BASE + 28, "PF28") -#define SUNXI_PINCTRL_PIN_PF29	PINCTRL_PIN(PF_BASE + 29, "PF29") -#define SUNXI_PINCTRL_PIN_PF30	PINCTRL_PIN(PF_BASE + 30, "PF30") -#define SUNXI_PINCTRL_PIN_PF31	PINCTRL_PIN(PF_BASE + 31, "PF31") - -#define SUNXI_PINCTRL_PIN_PG0	PINCTRL_PIN(PG_BASE + 0, "PG0") -#define SUNXI_PINCTRL_PIN_PG1	PINCTRL_PIN(PG_BASE + 1, "PG1") -#define SUNXI_PINCTRL_PIN_PG2	PINCTRL_PIN(PG_BASE + 2, "PG2") -#define SUNXI_PINCTRL_PIN_PG3	PINCTRL_PIN(PG_BASE + 3, "PG3") -#define SUNXI_PINCTRL_PIN_PG4	PINCTRL_PIN(PG_BASE + 4, "PG4") -#define SUNXI_PINCTRL_PIN_PG5	PINCTRL_PIN(PG_BASE + 5, "PG5") -#define SUNXI_PINCTRL_PIN_PG6	PINCTRL_PIN(PG_BASE + 6, "PG6") -#define SUNXI_PINCTRL_PIN_PG7	PINCTRL_PIN(PG_BASE + 7, "PG7") -#define SUNXI_PINCTRL_PIN_PG8	PINCTRL_PIN(PG_BASE + 8, "PG8") -#define SUNXI_PINCTRL_PIN_PG9	PINCTRL_PIN(PG_BASE + 9, "PG9") -#define SUNXI_PINCTRL_PIN_PG10	PINCTRL_PIN(PG_BASE + 10, "PG10") -#define SUNXI_PINCTRL_PIN_PG11	PINCTRL_PIN(PG_BASE + 11, "PG11") -#define SUNXI_PINCTRL_PIN_PG12	PINCTRL_PIN(PG_BASE + 12, "PG12") -#define SUNXI_PINCTRL_PIN_PG13	PINCTRL_PIN(PG_BASE + 13, "PG13") -#define SUNXI_PINCTRL_PIN_PG14	PINCTRL_PIN(PG_BASE + 14, "PG14") -#define SUNXI_PINCTRL_PIN_PG15	PINCTRL_PIN(PG_BASE + 15, "PG15") -#define SUNXI_PINCTRL_PIN_PG16	PINCTRL_PIN(PG_BASE + 16, "PG16") -#define SUNXI_PINCTRL_PIN_PG17	PINCTRL_PIN(PG_BASE + 17, "PG17") -#define SUNXI_PINCTRL_PIN_PG18	PINCTRL_PIN(PG_BASE + 18, "PG18") -#define SUNXI_PINCTRL_PIN_PG19	PINCTRL_PIN(PG_BASE + 19, "PG19") -#define SUNXI_PINCTRL_PIN_PG20	PINCTRL_PIN(PG_BASE + 20, "PG20") -#define SUNXI_PINCTRL_PIN_PG21	PINCTRL_PIN(PG_BASE + 21, "PG21") -#define SUNXI_PINCTRL_PIN_PG22	PINCTRL_PIN(PG_BASE + 22, "PG22") -#define SUNXI_PINCTRL_PIN_PG23	PINCTRL_PIN(PG_BASE + 23, "PG23") -#define SUNXI_PINCTRL_PIN_PG24	PINCTRL_PIN(PG_BASE + 24, "PG24") -#define SUNXI_PINCTRL_PIN_PG25	PINCTRL_PIN(PG_BASE + 25, "PG25") -#define SUNXI_PINCTRL_PIN_PG26	PINCTRL_PIN(PG_BASE + 26, "PG26") -#define SUNXI_PINCTRL_PIN_PG27	PINCTRL_PIN(PG_BASE + 27, "PG27") -#define SUNXI_PINCTRL_PIN_PG28	PINCTRL_PIN(PG_BASE + 28, "PG28") -#define SUNXI_PINCTRL_PIN_PG29	PINCTRL_PIN(PG_BASE + 29, "PG29") -#define SUNXI_PINCTRL_PIN_PG30	PINCTRL_PIN(PG_BASE + 30, "PG30") -#define SUNXI_PINCTRL_PIN_PG31	PINCTRL_PIN(PG_BASE + 31, "PG31") - -#define SUNXI_PINCTRL_PIN_PH0	PINCTRL_PIN(PH_BASE + 0, "PH0") -#define SUNXI_PINCTRL_PIN_PH1	PINCTRL_PIN(PH_BASE + 1, "PH1") -#define SUNXI_PINCTRL_PIN_PH2	PINCTRL_PIN(PH_BASE + 2, "PH2") -#define SUNXI_PINCTRL_PIN_PH3	PINCTRL_PIN(PH_BASE + 3, "PH3") -#define SUNXI_PINCTRL_PIN_PH4	PINCTRL_PIN(PH_BASE + 4, "PH4") -#define SUNXI_PINCTRL_PIN_PH5	PINCTRL_PIN(PH_BASE + 5, "PH5") -#define SUNXI_PINCTRL_PIN_PH6	PINCTRL_PIN(PH_BASE + 6, "PH6") -#define SUNXI_PINCTRL_PIN_PH7	PINCTRL_PIN(PH_BASE + 7, "PH7") -#define SUNXI_PINCTRL_PIN_PH8	PINCTRL_PIN(PH_BASE + 8, "PH8") -#define SUNXI_PINCTRL_PIN_PH9	PINCTRL_PIN(PH_BASE + 9, "PH9") -#define SUNXI_PINCTRL_PIN_PH10	PINCTRL_PIN(PH_BASE + 10, "PH10") -#define SUNXI_PINCTRL_PIN_PH11	PINCTRL_PIN(PH_BASE + 11, "PH11") -#define SUNXI_PINCTRL_PIN_PH12	PINCTRL_PIN(PH_BASE + 12, "PH12") -#define SUNXI_PINCTRL_PIN_PH13	PINCTRL_PIN(PH_BASE + 13, "PH13") -#define SUNXI_PINCTRL_PIN_PH14	PINCTRL_PIN(PH_BASE + 14, "PH14") -#define SUNXI_PINCTRL_PIN_PH15	PINCTRL_PIN(PH_BASE + 15, "PH15") -#define SUNXI_PINCTRL_PIN_PH16	PINCTRL_PIN(PH_BASE + 16, "PH16") -#define SUNXI_PINCTRL_PIN_PH17	PINCTRL_PIN(PH_BASE + 17, "PH17") -#define SUNXI_PINCTRL_PIN_PH18	PINCTRL_PIN(PH_BASE + 18, "PH18") -#define SUNXI_PINCTRL_PIN_PH19	PINCTRL_PIN(PH_BASE + 19, "PH19") -#define SUNXI_PINCTRL_PIN_PH20	PINCTRL_PIN(PH_BASE + 20, "PH20") -#define SUNXI_PINCTRL_PIN_PH21	PINCTRL_PIN(PH_BASE + 21, "PH21") -#define SUNXI_PINCTRL_PIN_PH22	PINCTRL_PIN(PH_BASE + 22, "PH22") -#define SUNXI_PINCTRL_PIN_PH23	PINCTRL_PIN(PH_BASE + 23, "PH23") -#define SUNXI_PINCTRL_PIN_PH24	PINCTRL_PIN(PH_BASE + 24, "PH24") -#define SUNXI_PINCTRL_PIN_PH25	PINCTRL_PIN(PH_BASE + 25, "PH25") -#define SUNXI_PINCTRL_PIN_PH26	PINCTRL_PIN(PH_BASE + 26, "PH26") -#define SUNXI_PINCTRL_PIN_PH27	PINCTRL_PIN(PH_BASE + 27, "PH27") -#define SUNXI_PINCTRL_PIN_PH28	PINCTRL_PIN(PH_BASE + 28, "PH28") -#define SUNXI_PINCTRL_PIN_PH29	PINCTRL_PIN(PH_BASE + 29, "PH29") -#define SUNXI_PINCTRL_PIN_PH30	PINCTRL_PIN(PH_BASE + 30, "PH30") -#define SUNXI_PINCTRL_PIN_PH31	PINCTRL_PIN(PH_BASE + 31, "PH31") - -#define SUNXI_PINCTRL_PIN_PI0	PINCTRL_PIN(PI_BASE + 0, "PI0") -#define SUNXI_PINCTRL_PIN_PI1	PINCTRL_PIN(PI_BASE + 1, "PI1") -#define SUNXI_PINCTRL_PIN_PI2	PINCTRL_PIN(PI_BASE + 2, "PI2") -#define SUNXI_PINCTRL_PIN_PI3	PINCTRL_PIN(PI_BASE + 3, "PI3") -#define SUNXI_PINCTRL_PIN_PI4	PINCTRL_PIN(PI_BASE + 4, "PI4") -#define SUNXI_PINCTRL_PIN_PI5	PINCTRL_PIN(PI_BASE + 5, "PI5") -#define SUNXI_PINCTRL_PIN_PI6	PINCTRL_PIN(PI_BASE + 6, "PI6") -#define SUNXI_PINCTRL_PIN_PI7	PINCTRL_PIN(PI_BASE + 7, "PI7") -#define SUNXI_PINCTRL_PIN_PI8	PINCTRL_PIN(PI_BASE + 8, "PI8") -#define SUNXI_PINCTRL_PIN_PI9	PINCTRL_PIN(PI_BASE + 9, "PI9") -#define SUNXI_PINCTRL_PIN_PI10	PINCTRL_PIN(PI_BASE + 10, "PI10") -#define SUNXI_PINCTRL_PIN_PI11	PINCTRL_PIN(PI_BASE + 11, "PI11") -#define SUNXI_PINCTRL_PIN_PI12	PINCTRL_PIN(PI_BASE + 12, "PI12") -#define SUNXI_PINCTRL_PIN_PI13	PINCTRL_PIN(PI_BASE + 13, "PI13") -#define SUNXI_PINCTRL_PIN_PI14	PINCTRL_PIN(PI_BASE + 14, "PI14") -#define SUNXI_PINCTRL_PIN_PI15	PINCTRL_PIN(PI_BASE + 15, "PI15") -#define SUNXI_PINCTRL_PIN_PI16	PINCTRL_PIN(PI_BASE + 16, "PI16") -#define SUNXI_PINCTRL_PIN_PI17	PINCTRL_PIN(PI_BASE + 17, "PI17") -#define SUNXI_PINCTRL_PIN_PI18	PINCTRL_PIN(PI_BASE + 18, "PI18") -#define SUNXI_PINCTRL_PIN_PI19	PINCTRL_PIN(PI_BASE + 19, "PI19") -#define SUNXI_PINCTRL_PIN_PI20	PINCTRL_PIN(PI_BASE + 20, "PI20") -#define SUNXI_PINCTRL_PIN_PI21	PINCTRL_PIN(PI_BASE + 21, "PI21") -#define SUNXI_PINCTRL_PIN_PI22	PINCTRL_PIN(PI_BASE + 22, "PI22") -#define SUNXI_PINCTRL_PIN_PI23	PINCTRL_PIN(PI_BASE + 23, "PI23") -#define SUNXI_PINCTRL_PIN_PI24	PINCTRL_PIN(PI_BASE + 24, "PI24") -#define SUNXI_PINCTRL_PIN_PI25	PINCTRL_PIN(PI_BASE + 25, "PI25") -#define SUNXI_PINCTRL_PIN_PI26	PINCTRL_PIN(PI_BASE + 26, "PI26") -#define SUNXI_PINCTRL_PIN_PI27	PINCTRL_PIN(PI_BASE + 27, "PI27") -#define SUNXI_PINCTRL_PIN_PI28	PINCTRL_PIN(PI_BASE + 28, "PI28") -#define SUNXI_PINCTRL_PIN_PI29	PINCTRL_PIN(PI_BASE + 29, "PI29") -#define SUNXI_PINCTRL_PIN_PI30	PINCTRL_PIN(PI_BASE + 30, "PI30") -#define SUNXI_PINCTRL_PIN_PI31	PINCTRL_PIN(PI_BASE + 31, "PI31") - -#define SUNXI_PIN_NAME_MAX_LEN	5 - -#define BANK_MEM_SIZE		0x24 -#define MUX_REGS_OFFSET		0x0 -#define DATA_REGS_OFFSET	0x10 -#define DLEVEL_REGS_OFFSET	0x14 -#define PULL_REGS_OFFSET	0x1c - -#define PINS_PER_BANK		32 -#define MUX_PINS_PER_REG	8 -#define MUX_PINS_BITS		4 -#define MUX_PINS_MASK		0x0f -#define DATA_PINS_PER_REG	32 -#define DATA_PINS_BITS		1 -#define DATA_PINS_MASK		0x01 -#define DLEVEL_PINS_PER_REG	16 -#define DLEVEL_PINS_BITS	2 -#define DLEVEL_PINS_MASK	0x03 -#define PULL_PINS_PER_REG	16 -#define PULL_PINS_BITS		2 -#define PULL_PINS_MASK		0x03 - -#define SUNXI_IRQ_NUMBER	32 - -#define IRQ_CFG_REG		0x200 -#define IRQ_CFG_IRQ_PER_REG		8 -#define IRQ_CFG_IRQ_BITS		4 -#define IRQ_CFG_IRQ_MASK		((1 << IRQ_CFG_IRQ_BITS) - 1) -#define IRQ_CTRL_REG		0x210 -#define IRQ_CTRL_IRQ_PER_REG		32 -#define IRQ_CTRL_IRQ_BITS		1 -#define IRQ_CTRL_IRQ_MASK		((1 << IRQ_CTRL_IRQ_BITS) - 1) -#define IRQ_STATUS_REG		0x214 -#define IRQ_STATUS_IRQ_PER_REG		32 -#define IRQ_STATUS_IRQ_BITS		1 -#define IRQ_STATUS_IRQ_MASK		((1 << IRQ_STATUS_IRQ_BITS) - 1) - -#define IRQ_EDGE_RISING		0x00 -#define IRQ_EDGE_FALLING	0x01 -#define IRQ_LEVEL_HIGH		0x02 -#define IRQ_LEVEL_LOW		0x03 -#define IRQ_EDGE_BOTH		0x04 - -struct sunxi_desc_function { -	const char	*name; -	u8		muxval; -	u8		irqnum; -}; - -struct sunxi_desc_pin { -	struct pinctrl_pin_desc		pin; -	struct sunxi_desc_function	*functions; -}; - -struct sunxi_pinctrl_desc { -	const struct sunxi_desc_pin	*pins; -	int				npins; -	struct pinctrl_gpio_range	*ranges; -	int				nranges; -}; - -struct sunxi_pinctrl_function { -	const char	*name; -	const char	**groups; -	unsigned	ngroups; -}; - -struct sunxi_pinctrl_group { -	const char	*name; -	unsigned long	config; -	unsigned	pin; -}; - -struct sunxi_pinctrl { -	void __iomem			*membase; -	struct gpio_chip		*chip; -	struct sunxi_pinctrl_desc	*desc; -	struct device			*dev; -	struct irq_domain		*domain; -	struct sunxi_pinctrl_function	*functions; -	unsigned			nfunctions; -	struct sunxi_pinctrl_group	*groups; -	unsigned			ngroups; -	int				irq; -	int				irq_array[SUNXI_IRQ_NUMBER]; -	spinlock_t			lock; -	struct pinctrl_dev		*pctl_dev; -}; - -#define SUNXI_PIN(_pin, ...)					\ -	{							\ -		.pin = _pin,					\ -		.functions = (struct sunxi_desc_function[]){	\ -			__VA_ARGS__, { } },			\ -	} - -#define SUNXI_FUNCTION(_val, _name)				\ -	{							\ -		.name = _name,					\ -		.muxval = _val,					\ -	} - -#define SUNXI_FUNCTION_IRQ(_val, _irq)				\ -	{							\ -		.name = "irq",					\ -		.muxval = _val,					\ -		.irqnum = _irq,					\ -	} - -/* - * The sunXi PIO registers are organized as is: - * 0x00 - 0x0c	Muxing values. - *		8 pins per register, each pin having a 4bits value - * 0x10		Pin values - *		32 bits per register, each pin corresponding to one bit - * 0x14 - 0x18	Drive level - *		16 pins per register, each pin having a 2bits value - * 0x1c - 0x20	Pull-Up values - *		16 pins per register, each pin having a 2bits value - * - * This is for the first bank. Each bank will have the same layout, - * with an offset being a multiple of 0x24. - * - * The following functions calculate from the pin number the register - * and the bit offset that we should access. - */ -static inline u32 sunxi_mux_reg(u16 pin) -{ -	u8 bank = pin / PINS_PER_BANK; -	u32 offset = bank * BANK_MEM_SIZE; -	offset += MUX_REGS_OFFSET; -	offset += pin % PINS_PER_BANK / MUX_PINS_PER_REG * 0x04; -	return round_down(offset, 4); -} - -static inline u32 sunxi_mux_offset(u16 pin) -{ -	u32 pin_num = pin % MUX_PINS_PER_REG; -	return pin_num * MUX_PINS_BITS; -} - -static inline u32 sunxi_data_reg(u16 pin) -{ -	u8 bank = pin / PINS_PER_BANK; -	u32 offset = bank * BANK_MEM_SIZE; -	offset += DATA_REGS_OFFSET; -	offset += pin % PINS_PER_BANK / DATA_PINS_PER_REG * 0x04; -	return round_down(offset, 4); -} - -static inline u32 sunxi_data_offset(u16 pin) -{ -	u32 pin_num = pin % DATA_PINS_PER_REG; -	return pin_num * DATA_PINS_BITS; -} - -static inline u32 sunxi_dlevel_reg(u16 pin) -{ -	u8 bank = pin / PINS_PER_BANK; -	u32 offset = bank * BANK_MEM_SIZE; -	offset += DLEVEL_REGS_OFFSET; -	offset += pin % PINS_PER_BANK / DLEVEL_PINS_PER_REG * 0x04; -	return round_down(offset, 4); -} - -static inline u32 sunxi_dlevel_offset(u16 pin) -{ -	u32 pin_num = pin % DLEVEL_PINS_PER_REG; -	return pin_num * DLEVEL_PINS_BITS; -} - -static inline u32 sunxi_pull_reg(u16 pin) -{ -	u8 bank = pin / PINS_PER_BANK; -	u32 offset = bank * BANK_MEM_SIZE; -	offset += PULL_REGS_OFFSET; -	offset += pin % PINS_PER_BANK / PULL_PINS_PER_REG * 0x04; -	return round_down(offset, 4); -} - -static inline u32 sunxi_pull_offset(u16 pin) -{ -	u32 pin_num = pin % PULL_PINS_PER_REG; -	return pin_num * PULL_PINS_BITS; -} - -static inline u32 sunxi_irq_cfg_reg(u16 irq) -{ -	u8 reg = irq / IRQ_CFG_IRQ_PER_REG; -	return reg + IRQ_CFG_REG; -} - -static inline u32 sunxi_irq_cfg_offset(u16 irq) -{ -	u32 irq_num = irq % IRQ_CFG_IRQ_PER_REG; -	return irq_num * IRQ_CFG_IRQ_BITS; -} - -static inline u32 sunxi_irq_ctrl_reg(u16 irq) -{ -	u8 reg = irq / IRQ_CTRL_IRQ_PER_REG; -	return reg + IRQ_CTRL_REG; -} - -static inline u32 sunxi_irq_ctrl_offset(u16 irq) -{ -	u32 irq_num = irq % IRQ_CTRL_IRQ_PER_REG; -	return irq_num * IRQ_CTRL_IRQ_BITS; -} - -static inline u32 sunxi_irq_status_reg(u16 irq) -{ -	u8 reg = irq / IRQ_STATUS_IRQ_PER_REG; -	return reg + IRQ_STATUS_REG; -} - -static inline u32 sunxi_irq_status_offset(u16 irq) -{ -	u32 irq_num = irq % IRQ_STATUS_IRQ_PER_REG; -	return irq_num * IRQ_STATUS_IRQ_BITS; -} - -#endif /* __PINCTRL_SUNXI_H */ diff --git a/drivers/pinctrl/pinctrl-tb10x.c b/drivers/pinctrl/pinctrl-tb10x.c new file mode 100644 index 00000000000..26ca6855f47 --- /dev/null +++ b/drivers/pinctrl/pinctrl-tb10x.c @@ -0,0 +1,874 @@ +/* + * Abilis Systems TB10x pin control driver + * + * Copyright (C) Abilis Systems 2012 + * + * Author: Christian Ruppert <christian.ruppert@abilis.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. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA + */ + +#include <linux/stringify.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> +#include <linux/pinctrl/machine.h> +#include <linux/platform_device.h> +#include <linux/module.h> +#include <linux/mutex.h> +#include <linux/err.h> +#include <linux/io.h> +#include <linux/of.h> +#include <linux/slab.h> + +#include "pinctrl-utils.h" + +#define TB10X_PORT1 (0) +#define TB10X_PORT2 (16) +#define TB10X_PORT3 (32) +#define TB10X_PORT4 (48) +#define TB10X_PORT5 (128) +#define TB10X_PORT6 (64) +#define TB10X_PORT7 (80) +#define TB10X_PORT8 (96) +#define TB10X_PORT9 (112) +#define TB10X_GPIOS (256) + +#define PCFG_PORT_BITWIDTH (2) +#define PCFG_PORT_MASK(PORT) \ +	(((1 << PCFG_PORT_BITWIDTH) - 1) << (PCFG_PORT_BITWIDTH * (PORT))) + +static const struct pinctrl_pin_desc tb10x_pins[] = { +	/* Port 1 */ +	PINCTRL_PIN(TB10X_PORT1 +  0, "MICLK_S0"), +	PINCTRL_PIN(TB10X_PORT1 +  1, "MISTRT_S0"), +	PINCTRL_PIN(TB10X_PORT1 +  2, "MIVAL_S0"), +	PINCTRL_PIN(TB10X_PORT1 +  3, "MDI_S0"), +	PINCTRL_PIN(TB10X_PORT1 +  4, "GPIOA0"), +	PINCTRL_PIN(TB10X_PORT1 +  5, "GPIOA1"), +	PINCTRL_PIN(TB10X_PORT1 +  6, "GPIOA2"), +	PINCTRL_PIN(TB10X_PORT1 +  7, "MDI_S1"), +	PINCTRL_PIN(TB10X_PORT1 +  8, "MIVAL_S1"), +	PINCTRL_PIN(TB10X_PORT1 +  9, "MISTRT_S1"), +	PINCTRL_PIN(TB10X_PORT1 + 10, "MICLK_S1"), +	/* Port 2 */ +	PINCTRL_PIN(TB10X_PORT2 +  0, "MICLK_S2"), +	PINCTRL_PIN(TB10X_PORT2 +  1, "MISTRT_S2"), +	PINCTRL_PIN(TB10X_PORT2 +  2, "MIVAL_S2"), +	PINCTRL_PIN(TB10X_PORT2 +  3, "MDI_S2"), +	PINCTRL_PIN(TB10X_PORT2 +  4, "GPIOC0"), +	PINCTRL_PIN(TB10X_PORT2 +  5, "GPIOC1"), +	PINCTRL_PIN(TB10X_PORT2 +  6, "GPIOC2"), +	PINCTRL_PIN(TB10X_PORT2 +  7, "MDI_S3"), +	PINCTRL_PIN(TB10X_PORT2 +  8, "MIVAL_S3"), +	PINCTRL_PIN(TB10X_PORT2 +  9, "MISTRT_S3"), +	PINCTRL_PIN(TB10X_PORT2 + 10, "MICLK_S3"), +	/* Port 3 */ +	PINCTRL_PIN(TB10X_PORT3 +  0, "MICLK_S4"), +	PINCTRL_PIN(TB10X_PORT3 +  1, "MISTRT_S4"), +	PINCTRL_PIN(TB10X_PORT3 +  2, "MIVAL_S4"), +	PINCTRL_PIN(TB10X_PORT3 +  3, "MDI_S4"), +	PINCTRL_PIN(TB10X_PORT3 +  4, "GPIOE0"), +	PINCTRL_PIN(TB10X_PORT3 +  5, "GPIOE1"), +	PINCTRL_PIN(TB10X_PORT3 +  6, "GPIOE2"), +	PINCTRL_PIN(TB10X_PORT3 +  7, "MDI_S5"), +	PINCTRL_PIN(TB10X_PORT3 +  8, "MIVAL_S5"), +	PINCTRL_PIN(TB10X_PORT3 +  9, "MISTRT_S5"), +	PINCTRL_PIN(TB10X_PORT3 + 10, "MICLK_S5"), +	/* Port 4 */ +	PINCTRL_PIN(TB10X_PORT4 +  0, "MICLK_S6"), +	PINCTRL_PIN(TB10X_PORT4 +  1, "MISTRT_S6"), +	PINCTRL_PIN(TB10X_PORT4 +  2, "MIVAL_S6"), +	PINCTRL_PIN(TB10X_PORT4 +  3, "MDI_S6"), +	PINCTRL_PIN(TB10X_PORT4 +  4, "GPIOG0"), +	PINCTRL_PIN(TB10X_PORT4 +  5, "GPIOG1"), +	PINCTRL_PIN(TB10X_PORT4 +  6, "GPIOG2"), +	PINCTRL_PIN(TB10X_PORT4 +  7, "MDI_S7"), +	PINCTRL_PIN(TB10X_PORT4 +  8, "MIVAL_S7"), +	PINCTRL_PIN(TB10X_PORT4 +  9, "MISTRT_S7"), +	PINCTRL_PIN(TB10X_PORT4 + 10, "MICLK_S7"), +	/* Port 5 */ +	PINCTRL_PIN(TB10X_PORT5 +  0, "PC_CE1N"), +	PINCTRL_PIN(TB10X_PORT5 +  1, "PC_CE2N"), +	PINCTRL_PIN(TB10X_PORT5 +  2, "PC_REGN"), +	PINCTRL_PIN(TB10X_PORT5 +  3, "PC_INPACKN"), +	PINCTRL_PIN(TB10X_PORT5 +  4, "PC_OEN"), +	PINCTRL_PIN(TB10X_PORT5 +  5, "PC_WEN"), +	PINCTRL_PIN(TB10X_PORT5 +  6, "PC_IORDN"), +	PINCTRL_PIN(TB10X_PORT5 +  7, "PC_IOWRN"), +	PINCTRL_PIN(TB10X_PORT5 +  8, "PC_RDYIRQN"), +	PINCTRL_PIN(TB10X_PORT5 +  9, "PC_WAITN"), +	PINCTRL_PIN(TB10X_PORT5 + 10, "PC_A0"), +	PINCTRL_PIN(TB10X_PORT5 + 11, "PC_A1"), +	PINCTRL_PIN(TB10X_PORT5 + 12, "PC_A2"), +	PINCTRL_PIN(TB10X_PORT5 + 13, "PC_A3"), +	PINCTRL_PIN(TB10X_PORT5 + 14, "PC_A4"), +	PINCTRL_PIN(TB10X_PORT5 + 15, "PC_A5"), +	PINCTRL_PIN(TB10X_PORT5 + 16, "PC_A6"), +	PINCTRL_PIN(TB10X_PORT5 + 17, "PC_A7"), +	PINCTRL_PIN(TB10X_PORT5 + 18, "PC_A8"), +	PINCTRL_PIN(TB10X_PORT5 + 19, "PC_A9"), +	PINCTRL_PIN(TB10X_PORT5 + 20, "PC_A10"), +	PINCTRL_PIN(TB10X_PORT5 + 21, "PC_A11"), +	PINCTRL_PIN(TB10X_PORT5 + 22, "PC_A12"), +	PINCTRL_PIN(TB10X_PORT5 + 23, "PC_A13"), +	PINCTRL_PIN(TB10X_PORT5 + 24, "PC_A14"), +	PINCTRL_PIN(TB10X_PORT5 + 25, "PC_D0"), +	PINCTRL_PIN(TB10X_PORT5 + 26, "PC_D1"), +	PINCTRL_PIN(TB10X_PORT5 + 27, "PC_D2"), +	PINCTRL_PIN(TB10X_PORT5 + 28, "PC_D3"), +	PINCTRL_PIN(TB10X_PORT5 + 29, "PC_D4"), +	PINCTRL_PIN(TB10X_PORT5 + 30, "PC_D5"), +	PINCTRL_PIN(TB10X_PORT5 + 31, "PC_D6"), +	PINCTRL_PIN(TB10X_PORT5 + 32, "PC_D7"), +	PINCTRL_PIN(TB10X_PORT5 + 33, "PC_MOSTRT"), +	PINCTRL_PIN(TB10X_PORT5 + 34, "PC_MOVAL"), +	PINCTRL_PIN(TB10X_PORT5 + 35, "PC_MDO0"), +	PINCTRL_PIN(TB10X_PORT5 + 36, "PC_MDO1"), +	PINCTRL_PIN(TB10X_PORT5 + 37, "PC_MDO2"), +	PINCTRL_PIN(TB10X_PORT5 + 38, "PC_MDO3"), +	PINCTRL_PIN(TB10X_PORT5 + 39, "PC_MDO4"), +	PINCTRL_PIN(TB10X_PORT5 + 40, "PC_MDO5"), +	PINCTRL_PIN(TB10X_PORT5 + 41, "PC_MDO6"), +	PINCTRL_PIN(TB10X_PORT5 + 42, "PC_MDO7"), +	PINCTRL_PIN(TB10X_PORT5 + 43, "PC_MISTRT"), +	PINCTRL_PIN(TB10X_PORT5 + 44, "PC_MIVAL"), +	PINCTRL_PIN(TB10X_PORT5 + 45, "PC_MDI0"), +	PINCTRL_PIN(TB10X_PORT5 + 46, "PC_MDI1"), +	PINCTRL_PIN(TB10X_PORT5 + 47, "PC_MDI2"), +	PINCTRL_PIN(TB10X_PORT5 + 48, "PC_MDI3"), +	PINCTRL_PIN(TB10X_PORT5 + 49, "PC_MDI4"), +	PINCTRL_PIN(TB10X_PORT5 + 50, "PC_MDI5"), +	PINCTRL_PIN(TB10X_PORT5 + 51, "PC_MDI6"), +	PINCTRL_PIN(TB10X_PORT5 + 52, "PC_MDI7"), +	PINCTRL_PIN(TB10X_PORT5 + 53, "PC_MICLK"), +	/* Port 6 */ +	PINCTRL_PIN(TB10X_PORT6 + 0, "T_MOSTRT_S0"), +	PINCTRL_PIN(TB10X_PORT6 + 1, "T_MOVAL_S0"), +	PINCTRL_PIN(TB10X_PORT6 + 2, "T_MDO_S0"), +	PINCTRL_PIN(TB10X_PORT6 + 3, "T_MOSTRT_S1"), +	PINCTRL_PIN(TB10X_PORT6 + 4, "T_MOVAL_S1"), +	PINCTRL_PIN(TB10X_PORT6 + 5, "T_MDO_S1"), +	PINCTRL_PIN(TB10X_PORT6 + 6, "T_MOSTRT_S2"), +	PINCTRL_PIN(TB10X_PORT6 + 7, "T_MOVAL_S2"), +	PINCTRL_PIN(TB10X_PORT6 + 8, "T_MDO_S2"), +	PINCTRL_PIN(TB10X_PORT6 + 9, "T_MOSTRT_S3"), +	/* Port 7 */ +	PINCTRL_PIN(TB10X_PORT7 + 0, "UART0_TXD"), +	PINCTRL_PIN(TB10X_PORT7 + 1, "UART0_RXD"), +	PINCTRL_PIN(TB10X_PORT7 + 2, "UART0_CTS"), +	PINCTRL_PIN(TB10X_PORT7 + 3, "UART0_RTS"), +	PINCTRL_PIN(TB10X_PORT7 + 4, "UART1_TXD"), +	PINCTRL_PIN(TB10X_PORT7 + 5, "UART1_RXD"), +	PINCTRL_PIN(TB10X_PORT7 + 6, "UART1_CTS"), +	PINCTRL_PIN(TB10X_PORT7 + 7, "UART1_RTS"), +	/* Port 8 */ +	PINCTRL_PIN(TB10X_PORT8 + 0, "SPI3_CLK"), +	PINCTRL_PIN(TB10X_PORT8 + 1, "SPI3_MISO"), +	PINCTRL_PIN(TB10X_PORT8 + 2, "SPI3_MOSI"), +	PINCTRL_PIN(TB10X_PORT8 + 3, "SPI3_SSN"), +	/* Port 9 */ +	PINCTRL_PIN(TB10X_PORT9 + 0, "SPI1_CLK"), +	PINCTRL_PIN(TB10X_PORT9 + 1, "SPI1_MISO"), +	PINCTRL_PIN(TB10X_PORT9 + 2, "SPI1_MOSI"), +	PINCTRL_PIN(TB10X_PORT9 + 3, "SPI1_SSN0"), +	PINCTRL_PIN(TB10X_PORT9 + 4, "SPI1_SSN1"), +	/* Unmuxed GPIOs */ +	PINCTRL_PIN(TB10X_GPIOS +  0, "GPIOB0"), +	PINCTRL_PIN(TB10X_GPIOS +  1, "GPIOB1"), + +	PINCTRL_PIN(TB10X_GPIOS +  2, "GPIOD0"), +	PINCTRL_PIN(TB10X_GPIOS +  3, "GPIOD1"), + +	PINCTRL_PIN(TB10X_GPIOS +  4, "GPIOF0"), +	PINCTRL_PIN(TB10X_GPIOS +  5, "GPIOF1"), + +	PINCTRL_PIN(TB10X_GPIOS +  6, "GPIOH0"), +	PINCTRL_PIN(TB10X_GPIOS +  7, "GPIOH1"), + +	PINCTRL_PIN(TB10X_GPIOS +  8, "GPIOI0"), +	PINCTRL_PIN(TB10X_GPIOS +  9, "GPIOI1"), +	PINCTRL_PIN(TB10X_GPIOS + 10, "GPIOI2"), +	PINCTRL_PIN(TB10X_GPIOS + 11, "GPIOI3"), +	PINCTRL_PIN(TB10X_GPIOS + 12, "GPIOI4"), +	PINCTRL_PIN(TB10X_GPIOS + 13, "GPIOI5"), +	PINCTRL_PIN(TB10X_GPIOS + 14, "GPIOI6"), +	PINCTRL_PIN(TB10X_GPIOS + 15, "GPIOI7"), +	PINCTRL_PIN(TB10X_GPIOS + 16, "GPIOI8"), +	PINCTRL_PIN(TB10X_GPIOS + 17, "GPIOI9"), +	PINCTRL_PIN(TB10X_GPIOS + 18, "GPIOI10"), +	PINCTRL_PIN(TB10X_GPIOS + 19, "GPIOI11"), + +	PINCTRL_PIN(TB10X_GPIOS + 20, "GPION0"), +	PINCTRL_PIN(TB10X_GPIOS + 21, "GPION1"), +	PINCTRL_PIN(TB10X_GPIOS + 22, "GPION2"), +	PINCTRL_PIN(TB10X_GPIOS + 23, "GPION3"), +#define MAX_PIN (TB10X_GPIOS + 24) +	PINCTRL_PIN(MAX_PIN,  "GPION4"), +}; + + +/* Port 1 */ +static const unsigned mis0_pins[]  = {	TB10X_PORT1 + 0, TB10X_PORT1 + 1, +					TB10X_PORT1 + 2, TB10X_PORT1 + 3}; +static const unsigned gpioa_pins[] = {	TB10X_PORT1 + 4, TB10X_PORT1 + 5, +					TB10X_PORT1 + 6}; +static const unsigned mis1_pins[]  = {	TB10X_PORT1 + 7, TB10X_PORT1 + 8, +					TB10X_PORT1 + 9, TB10X_PORT1 + 10}; +static const unsigned mip1_pins[]  = {	TB10X_PORT1 + 0, TB10X_PORT1 + 1, +					TB10X_PORT1 + 2, TB10X_PORT1 + 3, +					TB10X_PORT1 + 4, TB10X_PORT1 + 5, +					TB10X_PORT1 + 6, TB10X_PORT1 + 7, +					TB10X_PORT1 + 8, TB10X_PORT1 + 9, +					TB10X_PORT1 + 10}; + +/* Port 2 */ +static const unsigned mis2_pins[]  = {	TB10X_PORT2 + 0, TB10X_PORT2 + 1, +					TB10X_PORT2 + 2, TB10X_PORT2 + 3}; +static const unsigned gpioc_pins[] = {	TB10X_PORT2 + 4, TB10X_PORT2 + 5, +					TB10X_PORT2 + 6}; +static const unsigned mis3_pins[]  = {	TB10X_PORT2 + 7, TB10X_PORT2 + 8, +					TB10X_PORT2 + 9, TB10X_PORT2 + 10}; +static const unsigned mip3_pins[]  = {	TB10X_PORT2 + 0, TB10X_PORT2 + 1, +					TB10X_PORT2 + 2, TB10X_PORT2 + 3, +					TB10X_PORT2 + 4, TB10X_PORT2 + 5, +					TB10X_PORT2 + 6, TB10X_PORT2 + 7, +					TB10X_PORT2 + 8, TB10X_PORT2 + 9, +					TB10X_PORT2 + 10}; + +/* Port 3 */ +static const unsigned mis4_pins[]  = {	TB10X_PORT3 + 0, TB10X_PORT3 + 1, +					TB10X_PORT3 + 2, TB10X_PORT3 + 3}; +static const unsigned gpioe_pins[] = {	TB10X_PORT3 + 4, TB10X_PORT3 + 5, +					TB10X_PORT3 + 6}; +static const unsigned mis5_pins[]  = {	TB10X_PORT3 + 7, TB10X_PORT3 + 8, +					TB10X_PORT3 + 9, TB10X_PORT3 + 10}; +static const unsigned mip5_pins[]  = {	TB10X_PORT3 + 0, TB10X_PORT3 + 1, +					TB10X_PORT3 + 2, TB10X_PORT3 + 3, +					TB10X_PORT3 + 4, TB10X_PORT3 + 5, +					TB10X_PORT3 + 6, TB10X_PORT3 + 7, +					TB10X_PORT3 + 8, TB10X_PORT3 + 9, +					TB10X_PORT3 + 10}; + +/* Port 4 */ +static const unsigned mis6_pins[]  = {	TB10X_PORT4 + 0, TB10X_PORT4 + 1, +					TB10X_PORT4 + 2, TB10X_PORT4 + 3}; +static const unsigned gpiog_pins[] = {	TB10X_PORT4 + 4, TB10X_PORT4 + 5, +					TB10X_PORT4 + 6}; +static const unsigned mis7_pins[]  = {	TB10X_PORT4 + 7, TB10X_PORT4 + 8, +					TB10X_PORT4 + 9, TB10X_PORT4 + 10}; +static const unsigned mip7_pins[]  = {	TB10X_PORT4 + 0, TB10X_PORT4 + 1, +					TB10X_PORT4 + 2, TB10X_PORT4 + 3, +					TB10X_PORT4 + 4, TB10X_PORT4 + 5, +					TB10X_PORT4 + 6, TB10X_PORT4 + 7, +					TB10X_PORT4 + 8, TB10X_PORT4 + 9, +					TB10X_PORT4 + 10}; + +/* Port 6 */ +static const unsigned mop_pins[] = {	TB10X_PORT6 + 0, TB10X_PORT6 + 1, +					TB10X_PORT6 + 2, TB10X_PORT6 + 3, +					TB10X_PORT6 + 4, TB10X_PORT6 + 5, +					TB10X_PORT6 + 6, TB10X_PORT6 + 7, +					TB10X_PORT6 + 8, TB10X_PORT6 + 9}; +static const unsigned mos0_pins[] = {	TB10X_PORT6 + 0, TB10X_PORT6 + 1, +					TB10X_PORT6 + 2}; +static const unsigned mos1_pins[] = {	TB10X_PORT6 + 3, TB10X_PORT6 + 4, +					TB10X_PORT6 + 5}; +static const unsigned mos2_pins[] = {	TB10X_PORT6 + 6, TB10X_PORT6 + 7, +					TB10X_PORT6 + 8}; +static const unsigned mos3_pins[] = {	TB10X_PORT6 + 9}; + +/* Port 7 */ +static const unsigned uart0_pins[] = {	TB10X_PORT7 + 0, TB10X_PORT7 + 1, +					TB10X_PORT7 + 2, TB10X_PORT7 + 3}; +static const unsigned uart1_pins[] = {	TB10X_PORT7 + 4, TB10X_PORT7 + 5, +					TB10X_PORT7 + 6, TB10X_PORT7 + 7}; +static const unsigned gpiol_pins[] = {	TB10X_PORT7 + 0, TB10X_PORT7 + 1, +					TB10X_PORT7 + 2, TB10X_PORT7 + 3}; +static const unsigned gpiom_pins[] = {	TB10X_PORT7 + 4, TB10X_PORT7 + 5, +					TB10X_PORT7 + 6, TB10X_PORT7 + 7}; + +/* Port 8 */ +static const unsigned spi3_pins[] = {	TB10X_PORT8 + 0, TB10X_PORT8 + 1, +					TB10X_PORT8 + 2, TB10X_PORT8 + 3}; +static const unsigned jtag_pins[] = {	TB10X_PORT8 + 0, TB10X_PORT8 + 1, +					TB10X_PORT8 + 2, TB10X_PORT8 + 3}; + +/* Port 9 */ +static const unsigned spi1_pins[] = {	TB10X_PORT9 + 0, TB10X_PORT9 + 1, +					TB10X_PORT9 + 2, TB10X_PORT9 + 3, +					TB10X_PORT9 + 4}; +static const unsigned gpion_pins[] = {	TB10X_PORT9 + 0, TB10X_PORT9 + 1, +					TB10X_PORT9 + 2, TB10X_PORT9 + 3, +					TB10X_PORT9 + 4}; + +/* Port 5 */ +static const unsigned gpioj_pins[] = {	TB10X_PORT5 + 0, TB10X_PORT5 + 1, +					TB10X_PORT5 + 2, TB10X_PORT5 + 3, +					TB10X_PORT5 + 4, TB10X_PORT5 + 5, +					TB10X_PORT5 + 6, TB10X_PORT5 + 7, +					TB10X_PORT5 + 8, TB10X_PORT5 + 9, +					TB10X_PORT5 + 10, TB10X_PORT5 + 11, +					TB10X_PORT5 + 12, TB10X_PORT5 + 13, +					TB10X_PORT5 + 14, TB10X_PORT5 + 15, +					TB10X_PORT5 + 16, TB10X_PORT5 + 17, +					TB10X_PORT5 + 18, TB10X_PORT5 + 19, +					TB10X_PORT5 + 20, TB10X_PORT5 + 21, +					TB10X_PORT5 + 22, TB10X_PORT5 + 23, +					TB10X_PORT5 + 24, TB10X_PORT5 + 25, +					TB10X_PORT5 + 26, TB10X_PORT5 + 27, +					TB10X_PORT5 + 28, TB10X_PORT5 + 29, +					TB10X_PORT5 + 30, TB10X_PORT5 + 31}; +static const unsigned gpiok_pins[] = {	TB10X_PORT5 + 32, TB10X_PORT5 + 33, +					TB10X_PORT5 + 34, TB10X_PORT5 + 35, +					TB10X_PORT5 + 36, TB10X_PORT5 + 37, +					TB10X_PORT5 + 38, TB10X_PORT5 + 39, +					TB10X_PORT5 + 40, TB10X_PORT5 + 41, +					TB10X_PORT5 + 42, TB10X_PORT5 + 43, +					TB10X_PORT5 + 44, TB10X_PORT5 + 45, +					TB10X_PORT5 + 46, TB10X_PORT5 + 47, +					TB10X_PORT5 + 48, TB10X_PORT5 + 49, +					TB10X_PORT5 + 50, TB10X_PORT5 + 51, +					TB10X_PORT5 + 52, TB10X_PORT5 + 53}; +static const unsigned ciplus_pins[] = {	TB10X_PORT5 + 0, TB10X_PORT5 + 1, +					TB10X_PORT5 + 2, TB10X_PORT5 + 3, +					TB10X_PORT5 + 4, TB10X_PORT5 + 5, +					TB10X_PORT5 + 6, TB10X_PORT5 + 7, +					TB10X_PORT5 + 8, TB10X_PORT5 + 9, +					TB10X_PORT5 + 10, TB10X_PORT5 + 11, +					TB10X_PORT5 + 12, TB10X_PORT5 + 13, +					TB10X_PORT5 + 14, TB10X_PORT5 + 15, +					TB10X_PORT5 + 16, TB10X_PORT5 + 17, +					TB10X_PORT5 + 18, TB10X_PORT5 + 19, +					TB10X_PORT5 + 20, TB10X_PORT5 + 21, +					TB10X_PORT5 + 22, TB10X_PORT5 + 23, +					TB10X_PORT5 + 24, TB10X_PORT5 + 25, +					TB10X_PORT5 + 26, TB10X_PORT5 + 27, +					TB10X_PORT5 + 28, TB10X_PORT5 + 29, +					TB10X_PORT5 + 30, TB10X_PORT5 + 31, +					TB10X_PORT5 + 32, TB10X_PORT5 + 33, +					TB10X_PORT5 + 34, TB10X_PORT5 + 35, +					TB10X_PORT5 + 36, TB10X_PORT5 + 37, +					TB10X_PORT5 + 38, TB10X_PORT5 + 39, +					TB10X_PORT5 + 40, TB10X_PORT5 + 41, +					TB10X_PORT5 + 42, TB10X_PORT5 + 43, +					TB10X_PORT5 + 44, TB10X_PORT5 + 45, +					TB10X_PORT5 + 46, TB10X_PORT5 + 47, +					TB10X_PORT5 + 48, TB10X_PORT5 + 49, +					TB10X_PORT5 + 50, TB10X_PORT5 + 51, +					TB10X_PORT5 + 52, TB10X_PORT5 + 53}; +static const unsigned mcard_pins[] = {	TB10X_PORT5 + 3, TB10X_PORT5 + 10, +					TB10X_PORT5 + 11, TB10X_PORT5 + 12, +					TB10X_PORT5 + 22, TB10X_PORT5 + 23, +					TB10X_PORT5 + 33, TB10X_PORT5 + 35, +					TB10X_PORT5 + 36, TB10X_PORT5 + 37, +					TB10X_PORT5 + 38, TB10X_PORT5 + 39, +					TB10X_PORT5 + 40, TB10X_PORT5 + 41, +					TB10X_PORT5 + 42, TB10X_PORT5 + 43, +					TB10X_PORT5 + 45, TB10X_PORT5 + 46, +					TB10X_PORT5 + 47, TB10X_PORT5 + 48, +					TB10X_PORT5 + 49, TB10X_PORT5 + 50, +					TB10X_PORT5 + 51, TB10X_PORT5 + 52, +					TB10X_PORT5 + 53}; +static const unsigned stc0_pins[] = {	TB10X_PORT5 + 34, TB10X_PORT5 + 35, +					TB10X_PORT5 + 36, TB10X_PORT5 + 37, +					TB10X_PORT5 + 38, TB10X_PORT5 + 39, +					TB10X_PORT5 + 40}; +static const unsigned stc1_pins[] = {	TB10X_PORT5 + 25, TB10X_PORT5 + 26, +					TB10X_PORT5 + 27, TB10X_PORT5 + 28, +					TB10X_PORT5 + 29, TB10X_PORT5 + 30, +					TB10X_PORT5 + 44}; + +/* Unmuxed GPIOs */ +static const unsigned gpiob_pins[] = {	TB10X_GPIOS + 0, TB10X_GPIOS + 1}; +static const unsigned gpiod_pins[] = {	TB10X_GPIOS + 2, TB10X_GPIOS + 3}; +static const unsigned gpiof_pins[] = {	TB10X_GPIOS + 4, TB10X_GPIOS + 5}; +static const unsigned gpioh_pins[] = {	TB10X_GPIOS + 6, TB10X_GPIOS + 7}; +static const unsigned gpioi_pins[] = {	TB10X_GPIOS + 8, TB10X_GPIOS + 9, +					TB10X_GPIOS + 10, TB10X_GPIOS + 11, +					TB10X_GPIOS + 12, TB10X_GPIOS + 13, +					TB10X_GPIOS + 14, TB10X_GPIOS + 15, +					TB10X_GPIOS + 16, TB10X_GPIOS + 17, +					TB10X_GPIOS + 18, TB10X_GPIOS + 19}; + +struct tb10x_pinfuncgrp { +	const char *name; +	const unsigned int *pins; +	const unsigned int pincnt; +	const int port; +	const unsigned int mode; +	const int isgpio; +}; +#define DEFPINFUNCGRP(NAME, PORT, MODE, ISGPIO) { \ +		.name = __stringify(NAME), \ +		.pins = NAME##_pins, .pincnt = ARRAY_SIZE(NAME##_pins), \ +		.port = (PORT), .mode = (MODE), \ +		.isgpio = (ISGPIO), \ +	} +static const struct tb10x_pinfuncgrp tb10x_pingroups[] = { +	DEFPINFUNCGRP(mis0,   0, 0, 0), +	DEFPINFUNCGRP(gpioa,  0, 0, 1), +	DEFPINFUNCGRP(mis1,   0, 0, 0), +	DEFPINFUNCGRP(mip1,   0, 1, 0), +	DEFPINFUNCGRP(mis2,   1, 0, 0), +	DEFPINFUNCGRP(gpioc,  1, 0, 1), +	DEFPINFUNCGRP(mis3,   1, 0, 0), +	DEFPINFUNCGRP(mip3,   1, 1, 0), +	DEFPINFUNCGRP(mis4,   2, 0, 0), +	DEFPINFUNCGRP(gpioe,  2, 0, 1), +	DEFPINFUNCGRP(mis5,   2, 0, 0), +	DEFPINFUNCGRP(mip5,   2, 1, 0), +	DEFPINFUNCGRP(mis6,   3, 0, 0), +	DEFPINFUNCGRP(gpiog,  3, 0, 1), +	DEFPINFUNCGRP(mis7,   3, 0, 0), +	DEFPINFUNCGRP(mip7,   3, 1, 0), +	DEFPINFUNCGRP(gpioj,  4, 0, 1), +	DEFPINFUNCGRP(gpiok,  4, 0, 1), +	DEFPINFUNCGRP(ciplus, 4, 1, 0), +	DEFPINFUNCGRP(mcard,  4, 2, 0), +	DEFPINFUNCGRP(stc0,   4, 3, 0), +	DEFPINFUNCGRP(stc1,   4, 3, 0), +	DEFPINFUNCGRP(mop,    5, 0, 0), +	DEFPINFUNCGRP(mos0,   5, 1, 0), +	DEFPINFUNCGRP(mos1,   5, 1, 0), +	DEFPINFUNCGRP(mos2,   5, 1, 0), +	DEFPINFUNCGRP(mos3,   5, 1, 0), +	DEFPINFUNCGRP(uart0,  6, 0, 0), +	DEFPINFUNCGRP(uart1,  6, 0, 0), +	DEFPINFUNCGRP(gpiol,  6, 1, 1), +	DEFPINFUNCGRP(gpiom,  6, 1, 1), +	DEFPINFUNCGRP(spi3,   7, 0, 0), +	DEFPINFUNCGRP(jtag,   7, 1, 0), +	DEFPINFUNCGRP(spi1,   8, 0, 0), +	DEFPINFUNCGRP(gpion,  8, 1, 1), +	DEFPINFUNCGRP(gpiob, -1, 0, 1), +	DEFPINFUNCGRP(gpiod, -1, 0, 1), +	DEFPINFUNCGRP(gpiof, -1, 0, 1), +	DEFPINFUNCGRP(gpioh, -1, 0, 1), +	DEFPINFUNCGRP(gpioi, -1, 0, 1), +}; +#undef DEFPINFUNCGRP + +struct tb10x_of_pinfunc { +	const char *name; +	const char *group; +}; + +#define TB10X_PORTS (9) + +/** + * struct tb10x_port - state of an I/O port + * @mode: Node this port is currently in. + * @count: Number of enabled functions which require this port to be + *         configured in @mode. + */ +struct tb10x_port { +	unsigned int mode; +	unsigned int count; +}; + +/** + * struct tb10x_pinctrl - TB10x pin controller internal state + * @pctl: pointer to the pinctrl_dev structure of this pin controller. + * @base: register set base address. + * @pingroups: pointer to an array of the pin groups this driver manages. + * @pinfuncgrpcnt: number of pingroups in @pingroups. + * @pinfuncs: pointer to an array of pin functions this driver manages. + * @pinfuncnt: number of pin functions in @pinfuncs. + * @mutex: mutex for exclusive access to a pin controller's state. + * @ports: current state of each port. + * @gpios: Indicates if a given pin is currently used as GPIO (1) or not (0). + */ +struct tb10x_pinctrl { +	struct pinctrl_dev *pctl; +	void *base; +	const struct tb10x_pinfuncgrp *pingroups; +	unsigned int pinfuncgrpcnt; +	struct tb10x_of_pinfunc *pinfuncs; +	unsigned int pinfuncnt; +	struct mutex mutex; +	struct tb10x_port ports[TB10X_PORTS]; +	DECLARE_BITMAP(gpios, MAX_PIN + 1); +}; + +static inline void tb10x_pinctrl_set_config(struct tb10x_pinctrl *state, +				unsigned int port, unsigned int mode) +{ +	u32 pcfg; + +	if (state->ports[port].count) +		return; + +	state->ports[port].mode = mode; + +	pcfg = ioread32(state->base) & ~(PCFG_PORT_MASK(port)); +	pcfg |= (mode << (PCFG_PORT_BITWIDTH * port)) & PCFG_PORT_MASK(port); +	iowrite32(pcfg, state->base); +} + +static inline unsigned int tb10x_pinctrl_get_config( +				struct tb10x_pinctrl *state, +				unsigned int port) +{ +	return (ioread32(state->base) & PCFG_PORT_MASK(port)) +		>> (PCFG_PORT_BITWIDTH * port); +} + +static int tb10x_get_groups_count(struct pinctrl_dev *pctl) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	return state->pinfuncgrpcnt; +} + +static const char *tb10x_get_group_name(struct pinctrl_dev *pctl, unsigned n) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	return state->pingroups[n].name; +} + +static int tb10x_get_group_pins(struct pinctrl_dev *pctl, unsigned n, +				unsigned const **pins, +				unsigned * const num_pins) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); + +	*pins = state->pingroups[n].pins; +	*num_pins = state->pingroups[n].pincnt; + +	return 0; +} + +static int tb10x_dt_node_to_map(struct pinctrl_dev *pctl, +				struct device_node *np_config, +				struct pinctrl_map **map, unsigned *num_maps) +{ +	const char *string; +	unsigned reserved_maps = 0; +	int ret = 0; + +	if (of_property_read_string(np_config, "abilis,function", &string)) { +		pr_err("%s: No abilis,function property in device tree.\n", +			np_config->full_name); +		return -EINVAL; +	} + +	*map = NULL; +	*num_maps = 0; + +	ret = pinctrl_utils_reserve_map(pctl, map, &reserved_maps, +					num_maps, 1); +	if (ret) +		goto out; + +	ret = pinctrl_utils_add_map_mux(pctl, map, &reserved_maps, +					num_maps, string, np_config->name); + +out: +	return ret; +} + +static struct pinctrl_ops tb10x_pinctrl_ops = { +	.get_groups_count = tb10x_get_groups_count, +	.get_group_name   = tb10x_get_group_name, +	.get_group_pins   = tb10x_get_group_pins, +	.dt_node_to_map   = tb10x_dt_node_to_map, +	.dt_free_map      = pinctrl_utils_dt_free_map, +}; + +static int tb10x_get_functions_count(struct pinctrl_dev *pctl) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	return state->pinfuncnt; +} + +static const char *tb10x_get_function_name(struct pinctrl_dev *pctl, +					unsigned n) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	return state->pinfuncs[n].name; +} + +static int tb10x_get_function_groups(struct pinctrl_dev *pctl, +				unsigned n, const char * const **groups, +				unsigned * const num_groups) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); + +	*groups = &state->pinfuncs[n].group; +	*num_groups = 1; + +	return 0; +} + +static int tb10x_gpio_request_enable(struct pinctrl_dev *pctl, +					struct pinctrl_gpio_range *range, +					unsigned pin) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	int muxport = -1; +	int muxmode = -1; +	int i; + +	mutex_lock(&state->mutex); + +	/* +	 * Figure out to which port the requested GPIO belongs and how to +	 * configure that port. +	 * This loop also checks for pin conflicts between GPIOs and other +	 * functions. +	 */ +	for (i = 0; i < state->pinfuncgrpcnt; i++) { +		const struct tb10x_pinfuncgrp *pfg = &state->pingroups[i]; +		unsigned int mode = pfg->mode; +		int j, port = pfg->port; + +		/* +		 * Skip pin groups which are always mapped and don't need +		 * to be configured. +		 */ +		if (port < 0) +			continue; + +		for (j = 0; j < pfg->pincnt; j++) { +			if (pin == pfg->pins[j]) { +				if (pfg->isgpio) { +					/* +					 * Remember the GPIO-only setting of +					 * the port this pin belongs to. +					 */ +					muxport = port; +					muxmode = mode; +				} else if (state->ports[port].count +					&& (state->ports[port].mode == mode)) { +					/* +					 * Error: The requested pin is already +					 * used for something else. +					 */ +					mutex_unlock(&state->mutex); +					return -EBUSY; +				} +				break; +			} +		} +	} + +	/* +	 * If we haven't returned an error at this point, the GPIO pin is not +	 * used by another function and the GPIO request can be granted: +	 * Register pin as being used as GPIO so we don't allocate it to +	 * another function later. +	 */ +	set_bit(pin, state->gpios); + +	/* +	 * Potential conflicts between GPIOs and pin functions were caught +	 * earlier in this function and tb10x_pinctrl_set_config will do the +	 * Right Thing, either configure the port in GPIO only mode or leave +	 * another mode compatible with this GPIO request untouched. +	 */ +	if (muxport >= 0) +		tb10x_pinctrl_set_config(state, muxport, muxmode); + +	mutex_unlock(&state->mutex); + +	return 0; +} + +static void tb10x_gpio_disable_free(struct pinctrl_dev *pctl, +					struct pinctrl_gpio_range *range, +					unsigned pin) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); + +	mutex_lock(&state->mutex); + +	clear_bit(pin, state->gpios); + +	mutex_unlock(&state->mutex); +} + +static int tb10x_pctl_enable(struct pinctrl_dev *pctl, +			unsigned func_selector, unsigned group_selector) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector]; +	int i; + +	if (grp->port < 0) +		return 0; + +	mutex_lock(&state->mutex); + +	/* +	 * Check if the requested function is compatible with previously +	 * requested functions. +	 */ +	if (state->ports[grp->port].count +			&& (state->ports[grp->port].mode != grp->mode)) { +		mutex_unlock(&state->mutex); +		return -EBUSY; +	} + +	/* +	 * Check if the requested function is compatible with previously +	 * requested GPIOs. +	 */ +	for (i = 0; i < grp->pincnt; i++) +		if (test_bit(grp->pins[i], state->gpios)) { +			mutex_unlock(&state->mutex); +			return -EBUSY; +		} + +	tb10x_pinctrl_set_config(state, grp->port, grp->mode); + +	state->ports[grp->port].count++; + +	mutex_unlock(&state->mutex); + +	return 0; +} + +static void tb10x_pctl_disable(struct pinctrl_dev *pctl, +			unsigned func_selector, unsigned group_selector) +{ +	struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); +	const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector]; + +	if (grp->port < 0) +		return; + +	mutex_lock(&state->mutex); + +	state->ports[grp->port].count--; + +	mutex_unlock(&state->mutex); +} + +static struct pinmux_ops tb10x_pinmux_ops = { +	.get_functions_count = tb10x_get_functions_count, +	.get_function_name = tb10x_get_function_name, +	.get_function_groups = tb10x_get_function_groups, +	.gpio_request_enable = tb10x_gpio_request_enable, +	.gpio_disable_free = tb10x_gpio_disable_free, +	.enable = tb10x_pctl_enable, +	.disable = tb10x_pctl_disable, +}; + +static struct pinctrl_desc tb10x_pindesc = { +	.name = "TB10x", +	.pins = tb10x_pins, +	.npins = ARRAY_SIZE(tb10x_pins), +	.owner = THIS_MODULE, +	.pctlops = &tb10x_pinctrl_ops, +	.pmxops  = &tb10x_pinmux_ops, +}; + +static int tb10x_pinctrl_probe(struct platform_device *pdev) +{ +	int ret = -EINVAL; +	struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	struct device *dev = &pdev->dev; +	struct device_node *of_node = dev->of_node; +	struct device_node *child; +	struct tb10x_pinctrl *state; +	int i; + +	if (!of_node) { +		dev_err(dev, "No device tree node found.\n"); +		return -EINVAL; +	} + +	if (!mem) { +		dev_err(dev, "No memory resource defined.\n"); +		return -EINVAL; +	} + +	state = devm_kzalloc(dev, sizeof(struct tb10x_pinctrl) + +					of_get_child_count(of_node) +					* sizeof(struct tb10x_of_pinfunc), +				GFP_KERNEL); +	if (!state) +		return -ENOMEM; + +	platform_set_drvdata(pdev, state); +	state->pinfuncs = (struct tb10x_of_pinfunc *)(state + 1); +	mutex_init(&state->mutex); + +	state->base = devm_ioremap_resource(dev, mem); +	if (IS_ERR(state->base)) { +		ret = PTR_ERR(state->base); +		goto fail; +	} + +	state->pingroups = tb10x_pingroups; +	state->pinfuncgrpcnt = ARRAY_SIZE(tb10x_pingroups); + +	for (i = 0; i < TB10X_PORTS; i++) +		state->ports[i].mode = tb10x_pinctrl_get_config(state, i); + +	for_each_child_of_node(of_node, child) { +		const char *name; + +		if (!of_property_read_string(child, "abilis,function", +						&name)) { +			state->pinfuncs[state->pinfuncnt].name = child->name; +			state->pinfuncs[state->pinfuncnt].group = name; +			state->pinfuncnt++; +		} +	} + +	state->pctl = pinctrl_register(&tb10x_pindesc, dev, state); +	if (!state->pctl) { +		dev_err(dev, "could not register TB10x pin driver\n"); +		ret = -EINVAL; +		goto fail; +	} + +	return 0; + +fail: +	mutex_destroy(&state->mutex); +	return ret; +} + +static int tb10x_pinctrl_remove(struct platform_device *pdev) +{ +	struct tb10x_pinctrl *state = platform_get_drvdata(pdev); + +	pinctrl_unregister(state->pctl); +	mutex_destroy(&state->mutex); + +	return 0; +} + + +static const struct of_device_id tb10x_pinctrl_dt_ids[] = { +	{ .compatible = "abilis,tb10x-iomux" }, +	{ } +}; +MODULE_DEVICE_TABLE(of, tb10x_pinctrl_dt_ids); + +static struct platform_driver tb10x_pinctrl_pdrv = { +	.probe   = tb10x_pinctrl_probe, +	.remove  = tb10x_pinctrl_remove, +	.driver  = { +		.name  = "tb10x_pinctrl", +		.of_match_table = of_match_ptr(tb10x_pinctrl_dt_ids), +		.owner = THIS_MODULE +	} +}; + +module_platform_driver(tb10x_pinctrl_pdrv); + +MODULE_AUTHOR("Christian Ruppert <christian.ruppert@abilis.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c index a2e93a2b5ff..2d43bff74f5 100644 --- a/drivers/pinctrl/pinctrl-tegra.c +++ b/drivers/pinctrl/pinctrl-tegra.c @@ -39,6 +39,7 @@ struct tegra_pmx {  	struct pinctrl_dev *pctl;  	const struct tegra_pinctrl_soc_data *soc; +	const char **group_pins;  	int nbanks;  	void __iomem **regs; @@ -294,17 +295,11 @@ static void tegra_pinctrl_disable(struct pinctrl_dev *pctldev,  {  	struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);  	const struct tegra_pingroup *g; -	u32 val;  	g = &pmx->soc->groups[group];  	if (WARN_ON(g->mux_reg < 0))  		return; - -	val = pmx_readl(pmx, g->mux_bank, g->mux_reg); -	val &= ~(0x3 << g->mux_bit); -	val |= g->func_safe << g->mux_bit; -	pmx_writel(pmx, val, g->mux_bank, g->mux_reg);  }  static const struct pinmux_ops tegra_pinmux_ops = { @@ -335,32 +330,32 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx,  		*width = 1;  		break;  	case TEGRA_PINCONF_PARAM_ENABLE_INPUT: -		*bank = g->einput_bank; -		*reg = g->einput_reg; +		*bank = g->mux_bank; +		*reg = g->mux_reg;  		*bit = g->einput_bit;  		*width = 1;  		break;  	case TEGRA_PINCONF_PARAM_OPEN_DRAIN: -		*bank = g->odrain_bank; -		*reg = g->odrain_reg; +		*bank = g->mux_bank; +		*reg = g->mux_reg;  		*bit = g->odrain_bit;  		*width = 1;  		break;  	case TEGRA_PINCONF_PARAM_LOCK: -		*bank = g->lock_bank; -		*reg = g->lock_reg; +		*bank = g->mux_bank; +		*reg = g->mux_reg;  		*bit = g->lock_bit;  		*width = 1;  		break;  	case TEGRA_PINCONF_PARAM_IORESET: -		*bank = g->ioreset_bank; -		*reg = g->ioreset_reg; +		*bank = g->mux_bank; +		*reg = g->mux_reg;  		*bit = g->ioreset_bit;  		*width = 1;  		break;  	case TEGRA_PINCONF_PARAM_RCV_SEL: -		*bank = g->rcv_sel_bank; -		*reg = g->rcv_sel_reg; +		*bank = g->mux_bank; +		*reg = g->mux_reg;  		*bit = g->rcv_sel_bit;  		*width = 1;  		break; @@ -407,8 +402,8 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx,  		*width = g->slwr_width;  		break;  	case TEGRA_PINCONF_PARAM_DRIVE_TYPE: -		*bank = g->drvtype_bank; -		*reg = g->drvtype_reg; +		*bank = g->drv_bank; +		*reg = g->drv_reg;  		*bit = g->drvtype_bit;  		*width = 2;  		break; @@ -417,11 +412,22 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx,  		return -ENOTSUPP;  	} -	if (*reg < 0) { -		if (report_err) +	if (*reg < 0 || *bit > 31) { +		if (report_err) { +			const char *prop = "unknown"; +			int i; + +			for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { +				if (cfg_params[i].param == param) { +					prop = cfg_params[i].property; +					break; +				} +			} +  			dev_err(pmx->dev, -				"Config param %04x not supported on group %s\n", -				param, g->name); +				"Config param %04x (%s) not supported on group %s\n", +				param, prop, g->name); +		}  		return -ENOTSUPP;  	} @@ -620,6 +626,8 @@ int tegra_pinctrl_probe(struct platform_device *pdev,  	struct tegra_pmx *pmx;  	struct resource *res;  	int i; +	const char **group_pins; +	int fn, gn, gfn;  	pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);  	if (!pmx) { @@ -629,6 +637,41 @@ int tegra_pinctrl_probe(struct platform_device *pdev,  	pmx->dev = &pdev->dev;  	pmx->soc = soc_data; +	/* +	 * Each mux group will appear in 4 functions' list of groups. +	 * This over-allocates slightly, since not all groups are mux groups. +	 */ +	pmx->group_pins = devm_kzalloc(&pdev->dev, +		soc_data->ngroups * 4 * sizeof(*pmx->group_pins), +		GFP_KERNEL); +	if (!pmx->group_pins) +		return -ENOMEM; + +	group_pins = pmx->group_pins; +	for (fn = 0; fn < soc_data->nfunctions; fn++) { +		struct tegra_function *func = &soc_data->functions[fn]; + +		func->groups = group_pins; + +		for (gn = 0; gn < soc_data->ngroups; gn++) { +			const struct tegra_pingroup *g = &soc_data->groups[gn]; + +			if (g->mux_reg == -1) +				continue; + +			for (gfn = 0; gfn < 4; gfn++) +				if (g->funcs[gfn] == fn) +					break; +			if (gfn == 4) +				continue; + +			BUG_ON(group_pins - pmx->group_pins >= +				soc_data->ngroups * 4); +			*group_pins++ = g->name; +			func->ngroups++; +		} +	} +  	tegra_pinctrl_gpio_range.npins = pmx->soc->ngpios;  	tegra_pinctrl_desc.name = dev_name(&pdev->dev);  	tegra_pinctrl_desc.pins = pmx->soc->pins; @@ -645,7 +688,7 @@ int tegra_pinctrl_probe(struct platform_device *pdev,  				 GFP_KERNEL);  	if (!pmx->regs) {  		dev_err(&pdev->dev, "Can't alloc regs pointer\n"); -		return -ENODEV; +		return -ENOMEM;  	}  	for (i = 0; i < pmx->nbanks; i++) { diff --git a/drivers/pinctrl/pinctrl-tegra.h b/drivers/pinctrl/pinctrl-tegra.h index 817f7061dc4..8d94d1332e7 100644 --- a/drivers/pinctrl/pinctrl-tegra.h +++ b/drivers/pinctrl/pinctrl-tegra.h @@ -72,104 +72,89 @@ enum tegra_pinconf_tristate {   */  struct tegra_function {  	const char *name; -	const char * const *groups; +	const char **groups;  	unsigned ngroups;  };  /**   * struct tegra_pingroup - Tegra pin group - * @mux_reg:		Mux register offset. -1 if unsupported. - * @mux_bank:		Mux register bank. 0 if unsupported. - * @mux_bit:		Mux register bit. 0 if unsupported. - * @pupd_reg:		Pull-up/down register offset. -1 if unsupported. - * @pupd_bank:		Pull-up/down register bank. 0 if unsupported. - * @pupd_bit:		Pull-up/down register bit. 0 if unsupported. - * @tri_reg:		Tri-state register offset. -1 if unsupported. - * @tri_bank:		Tri-state register bank. 0 if unsupported. - * @tri_bit:		Tri-state register bit. 0 if unsupported. - * @einput_reg:		Enable-input register offset. -1 if unsupported. - * @einput_bank:	Enable-input register bank. 0 if unsupported. - * @einput_bit:		Enable-input register bit. 0 if unsupported. - * @odrain_reg:		Open-drain register offset. -1 if unsupported. - * @odrain_bank:	Open-drain register bank. 0 if unsupported. - * @odrain_bit:		Open-drain register bit. 0 if unsupported. - * @lock_reg:		Lock register offset. -1 if unsupported. - * @lock_bank:		Lock register bank. 0 if unsupported. - * @lock_bit:		Lock register bit. 0 if unsupported. - * @ioreset_reg:	IO reset register offset. -1 if unsupported. - * @ioreset_bank:	IO reset register bank. 0 if unsupported. - * @ioreset_bit:	IO reset register bit. 0 if unsupported. - * @rcv_sel_reg:	Receiver select offset. -1 if unsupported. - * @rcv_sel_bank:	Receiver select bank. 0 if unsupported. - * @rcv_sel_bit:	Receiver select bit. 0 if unsupported. - * @drv_reg:		Drive fields register offset. -1 if unsupported. - *			This register contains the hsm, schmitt, lpmd, drvdn, - *			drvup, slwr, and slwf parameters. - * @drv_bank:		Drive fields register bank. 0 if unsupported. - * @hsm_bit:		High Speed Mode register bit. 0 if unsupported. - * @schmitt_bit:	Scmitt register bit. 0 if unsupported. - * @lpmd_bit:		Low Power Mode register bit. 0 if unsupported. - * @drvdn_bit:		Drive Down register bit. 0 if unsupported. - * @drvdn_width:	Drive Down field width. 0 if unsupported. - * @drvup_bit:		Drive Up register bit. 0 if unsupported. - * @drvup_width:	Drive Up field width. 0 if unsupported. - * @slwr_bit:		Slew Rising register bit. 0 if unsupported. - * @slwr_width:		Slew Rising field width. 0 if unsupported. - * @slwf_bit:		Slew Falling register bit. 0 if unsupported. - * @slwf_width:		Slew Falling field width. 0 if unsupported. - * @drvtype_reg:	Drive type fields register offset. -1 if unsupported. - * @drvtype_bank:	Drive type fields register bank. 0 if unsupported. - * @drvtype_bit:	Drive type register bit. 0 if unsupported. + * @name		The name of the pin group. + * @pins		An array of pin IDs included in this pin group. + * @npins		The number of entries in @pins. + * @funcs		The mux functions which can be muxed onto this group. + * @mux_reg:		Mux register offset. + *			This register contains the mux, einput, odrain, lock, + *			ioreset, rcv_sel parameters. + * @mux_bank:		Mux register bank. + * @mux_bit:		Mux register bit. + * @pupd_reg:		Pull-up/down register offset. + * @pupd_bank:		Pull-up/down register bank. + * @pupd_bit:		Pull-up/down register bit. + * @tri_reg:		Tri-state register offset. + * @tri_bank:		Tri-state register bank. + * @tri_bit:		Tri-state register bit. + * @einput_bit:		Enable-input register bit. + * @odrain_bit:		Open-drain register bit. + * @lock_bit:		Lock register bit. + * @ioreset_bit:	IO reset register bit. + * @rcv_sel_bit:	Receiver select bit. + * @drv_reg:		Drive fields register offset. + *			This register contains hsm, schmitt, lpmd, drvdn, + *			drvup, slwr, slwf, and drvtype parameters. + * @drv_bank:		Drive fields register bank. + * @hsm_bit:		High Speed Mode register bit. + * @schmitt_bit:	Scmitt register bit. + * @lpmd_bit:		Low Power Mode register bit. + * @drvdn_bit:		Drive Down register bit. + * @drvdn_width:	Drive Down field width. + * @drvup_bit:		Drive Up register bit. + * @drvup_width:	Drive Up field width. + * @slwr_bit:		Slew Rising register bit. + * @slwr_width:		Slew Rising field width. + * @slwf_bit:		Slew Falling register bit. + * @slwf_width:		Slew Falling field width. + * @drvtype_bit:	Drive type register bit. + * + * -1 in a *_reg field means that feature is unsupported for this group. + * *_bank and *_reg values are irrelevant when *_reg is -1. + * When *_reg is valid, *_bit may be -1 to indicate an unsupported feature.   *   * A representation of a group of pins (possibly just one pin) in the Tegra   * pin controller. Each group allows some parameter or parameters to be   * configured. The most common is mux function selection. Many others exist   * such as pull-up/down, tri-state, etc. Tegra's pin controller is complex;   * certain groups may only support configuring certain parameters, hence - * each parameter is optional, represented by a -1 "reg" value. + * each parameter is optional.   */  struct tegra_pingroup {  	const char *name;  	const unsigned *pins; -	unsigned npins; -	unsigned funcs[4]; -	unsigned func_safe; +	u8 npins; +	u8 funcs[4];  	s16 mux_reg;  	s16 pupd_reg;  	s16 tri_reg; -	s16 einput_reg; -	s16 odrain_reg; -	s16 lock_reg; -	s16 ioreset_reg; -	s16 rcv_sel_reg;  	s16 drv_reg; -	s16 drvtype_reg;  	u32 mux_bank:2;  	u32 pupd_bank:2;  	u32 tri_bank:2; -	u32 einput_bank:2; -	u32 odrain_bank:2; -	u32 ioreset_bank:2; -	u32 rcv_sel_bank:2; -	u32 lock_bank:2;  	u32 drv_bank:2; -	u32 drvtype_bank:2; -	u32 mux_bit:5; -	u32 pupd_bit:5; -	u32 tri_bit:5; -	u32 einput_bit:5; -	u32 odrain_bit:5; -	u32 lock_bit:5; -	u32 ioreset_bit:5; -	u32 rcv_sel_bit:5; -	u32 hsm_bit:5; -	u32 schmitt_bit:5; -	u32 lpmd_bit:5; -	u32 drvdn_bit:5; -	u32 drvup_bit:5; -	u32 slwr_bit:5; -	u32 slwf_bit:5; -	u32 drvtype_bit:5; +	u32 mux_bit:6; +	u32 pupd_bit:6; +	u32 tri_bit:6; +	u32 einput_bit:6; +	u32 odrain_bit:6; +	u32 lock_bit:6; +	u32 ioreset_bit:6; +	u32 rcv_sel_bit:6; +	u32 hsm_bit:6; +	u32 schmitt_bit:6; +	u32 lpmd_bit:6; +	u32 drvdn_bit:6; +	u32 drvup_bit:6; +	u32 slwr_bit:6; +	u32 slwf_bit:6; +	u32 drvtype_bit:6;  	u32 drvdn_width:6;  	u32 drvup_width:6;  	u32 slwr_width:6; @@ -193,7 +178,7 @@ struct tegra_pinctrl_soc_data {  	unsigned ngpios;  	const struct pinctrl_pin_desc *pins;  	unsigned npins; -	const struct tegra_function *functions; +	struct tegra_function *functions;  	unsigned nfunctions;  	const struct tegra_pingroup *groups;  	unsigned ngroups; diff --git a/drivers/pinctrl/pinctrl-tegra114.c b/drivers/pinctrl/pinctrl-tegra114.c index 622c4854977..33614baab4c 100644 --- a/drivers/pinctrl/pinctrl-tegra114.c +++ b/drivers/pinctrl/pinctrl-tegra114.c @@ -1,10 +1,8 @@  /* - * Pinctrl data and driver for the NVIDIA Tegra114 pinmux + * Pinctrl data for the NVIDIA Tegra114 pinmux   *   * Copyright (c) 2012-2013, NVIDIA CORPORATION.  All rights reserved.   * - * Arthur:  Pritesh Raithatha <praithatha@nvidia.com> - *   * 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. @@ -13,9 +11,6 @@   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for   * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */  #include <linux/module.h> @@ -203,8 +198,8 @@  #define TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5		_GPIO(245)  /* All non-GPIO pins follow */ -#define NUM_GPIOS	(TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5 + 1) -#define _PIN(offset)	(NUM_GPIOS + (offset)) +#define NUM_GPIOS				(TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5 + 1) +#define _PIN(offset)				(NUM_GPIOS + (offset))  /* Non-GPIO pins */  #define TEGRA_PIN_CORE_PWR_REQ			_PIN(0) @@ -212,8 +207,11 @@  #define TEGRA_PIN_PWR_INT_N			_PIN(2)  #define TEGRA_PIN_RESET_OUT_N			_PIN(3)  #define TEGRA_PIN_OWR				_PIN(4) +#define TEGRA_PIN_JTAG_RTCK			_PIN(5) +#define TEGRA_PIN_CLK_32K_IN			_PIN(6) +#define TEGRA_PIN_GMI_CLK_LB			_PIN(7) -static const struct pinctrl_pin_desc  tegra114_pins[] = { +static const struct pinctrl_pin_desc tegra114_pins[] = {  	PINCTRL_PIN(TEGRA_PIN_CLK_32K_OUT_PA0, "CLK_32K_OUT PA0"),  	PINCTRL_PIN(TEGRA_PIN_UART3_CTS_N_PA1, "UART3_CTS_N PA1"),  	PINCTRL_PIN(TEGRA_PIN_DAP2_FS_PA2, "DAP2_FS PA2"), @@ -385,9 +383,12 @@ static const struct pinctrl_pin_desc  tegra114_pins[] = {  	PINCTRL_PIN(TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5, "SDMMC3_CLK_LB_IN PEE5"),  	PINCTRL_PIN(TEGRA_PIN_CORE_PWR_REQ, "CORE_PWR_REQ"),  	PINCTRL_PIN(TEGRA_PIN_CPU_PWR_REQ, "CPU_PWR_REQ"), -	PINCTRL_PIN(TEGRA_PIN_OWR, "OWR"),  	PINCTRL_PIN(TEGRA_PIN_PWR_INT_N, "PWR_INT_N"),  	PINCTRL_PIN(TEGRA_PIN_RESET_OUT_N, "RESET_OUT_N"), +	PINCTRL_PIN(TEGRA_PIN_OWR, "OWR"), +	PINCTRL_PIN(TEGRA_PIN_JTAG_RTCK, "JTAG_RTCK"), +	PINCTRL_PIN(TEGRA_PIN_CLK_32K_IN, "CLK_32K_IN"), +	PINCTRL_PIN(TEGRA_PIN_GMI_CLK_LB, "GMI_CLK_LB"),  };  static const unsigned clk_32k_out_pa0_pins[] = { @@ -1074,10 +1075,6 @@ static const unsigned cpu_pwr_req_pins[] = {  	TEGRA_PIN_CPU_PWR_REQ,  }; -static const unsigned owr_pins[] = { -	TEGRA_PIN_OWR, -}; -  static const unsigned pwr_int_n_pins[] = {  	TEGRA_PIN_PWR_INT_N,  }; @@ -1086,6 +1083,22 @@ static const unsigned reset_out_n_pins[] = {  	TEGRA_PIN_RESET_OUT_N,  }; +static const unsigned owr_pins[] = { +	TEGRA_PIN_OWR, +}; + +static const unsigned jtag_rtck_pins[] = { +	TEGRA_PIN_JTAG_RTCK, +}; + +static const unsigned clk_32k_in_pins[] = { +	TEGRA_PIN_CLK_32K_IN, +}; + +static const unsigned gmi_clk_lb_pins[] = { +	TEGRA_PIN_GMI_CLK_LB, +}; +  static const unsigned drive_ao1_pins[] = {  	TEGRA_PIN_KB_ROW0_PR0,  	TEGRA_PIN_KB_ROW1_PR1, @@ -1127,7 +1140,6 @@ static const unsigned drive_at1_pins[] = {  	TEGRA_PIN_GMI_AD13_PH5,  	TEGRA_PIN_GMI_AD14_PH6,  	TEGRA_PIN_GMI_AD15_PH7, -  	TEGRA_PIN_GMI_IORDY_PI5,  	TEGRA_PIN_GMI_CS7_N_PI6,  }; @@ -1141,15 +1153,12 @@ static const unsigned drive_at2_pins[] = {  	TEGRA_PIN_GMI_AD5_PG5,  	TEGRA_PIN_GMI_AD6_PG6,  	TEGRA_PIN_GMI_AD7_PG7, -  	TEGRA_PIN_GMI_WR_N_PI0,  	TEGRA_PIN_GMI_OE_N_PI1,  	TEGRA_PIN_GMI_CS6_N_PI3,  	TEGRA_PIN_GMI_RST_N_PI4,  	TEGRA_PIN_GMI_WAIT_PI7, -  	TEGRA_PIN_GMI_DQS_P_PJ3, -  	TEGRA_PIN_GMI_ADV_N_PK0,  	TEGRA_PIN_GMI_CLK_PK1,  	TEGRA_PIN_GMI_CS4_N_PK2, @@ -1342,14 +1351,37 @@ static const unsigned drive_uda_pins[] = {  };  static const unsigned drive_dev3_pins[] = { -	TEGRA_PIN_CLK3_OUT_PEE0, -	TEGRA_PIN_CLK3_REQ_PEE1, +}; + +static const unsigned drive_cec_pins[] = { +}; + +static const unsigned drive_at6_pins[] = { +}; + +static const unsigned drive_dap5_pins[] = { +}; + +static const unsigned drive_usb_vbus_en_pins[] = { +}; + +static const unsigned drive_ao3_pins[] = { +}; + +static const unsigned drive_hv0_pins[] = { +}; + +static const unsigned drive_sdio4_pins[] = { +}; + +static const unsigned drive_ao0_pins[] = {  };  enum tegra_mux {  	TEGRA_MUX_BLINK,  	TEGRA_MUX_CEC,  	TEGRA_MUX_CLDVFS, +	TEGRA_MUX_CLK,  	TEGRA_MUX_CLK12,  	TEGRA_MUX_CPU,  	TEGRA_MUX_DAP, @@ -1394,6 +1426,7 @@ enum tegra_mux {  	TEGRA_MUX_RSVD2,  	TEGRA_MUX_RSVD3,  	TEGRA_MUX_RSVD4, +	TEGRA_MUX_RTCK,  	TEGRA_MUX_SDMMC1,  	TEGRA_MUX_SDMMC2,  	TEGRA_MUX_SDMMC3, @@ -1425,944 +1458,16 @@ enum tegra_mux {  	TEGRA_MUX_VI_ALT3,  }; -static const char * const blink_groups[] = { -	"clk_32k_out_pa0", -}; - -static const char * const cec_groups[] = { -	"hdmi_cec_pee3", -}; - -static const char * const cldvfs_groups[] = { -	"gmi_ad9_ph1", -	"gmi_ad10_ph2", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"dvfs_pwm_px0", -	"dvfs_clk_px2", -}; - -static const char * const clk12_groups[] = { -	"sdmmc1_wp_n_pv3", -	"sdmmc1_clk_pz0", -}; - -static const char * const cpu_groups[] = { -	"cpu_pwr_req", -}; - -static const char * const dap_groups[] = { -	"clk1_req_pee2", -	"clk2_req_pcc5", -}; - -static const char * const dap1_groups[] = { -	"clk1_req_pee2", -}; - -static const char * const dap2_groups[] = { -	"clk1_out_pw4", -	"gpio_x4_aud_px4", -}; - -static const char * const dev3_groups[] = { -	"clk3_req_pee1", -}; - -static const char * const displaya_groups[] = { -	"dap3_fs_pp0", -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_sclk_pp3", -	"uart3_rts_n_pc0", -	"pu3", -	"pu4", -	"pu5", -	"pbb3", -	"pbb4", -	"pbb5", -	"pbb6", -	"kb_row3_pr3", -	"kb_row4_pr4", -	"kb_row5_pr5", -	"kb_row6_pr6", -	"kb_col3_pq3", -	"sdmmc3_dat2_pb5", -}; - -static const char * const displaya_alt_groups[] = { -	"kb_row6_pr6", -}; - -static const char * const displayb_groups[] = { -	"dap3_fs_pp0", -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_sclk_pp3", -	"pu3", -	"pu4", -	"pu5", -	"pu6", -	"pbb3", -	"pbb4", -	"pbb5", -	"pbb6", -	"kb_row3_pr3", -	"kb_row4_pr4", -	"kb_row5_pr5", -	"kb_row6_pr6", -	"sdmmc3_dat3_pb4", -}; - -static const char * const dtv_groups[] = { -	"uart3_cts_n_pa1", -	"uart3_rts_n_pc0", -	"dap4_fs_pp4", -	"dap4_dout_pp6", -	"gmi_wait_pi7", -	"gmi_ad8_ph0", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -}; - -static const char * const emc_dll_groups[] = { -	"kb_col0_pq0", -	"kb_col1_pq1", -}; - -static const char * const extperiph1_groups[] = { -	"clk1_out_pw4", -}; - -static const char * const extperiph2_groups[] = { -	"clk2_out_pw5", -}; - -static const char * const extperiph3_groups[] = { -	"clk3_out_pee0", -}; - -static const char * const gmi_groups[] = { -	"gmi_wp_n_pc7", - -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_ad8_ph0", -	"gmi_ad9_ph1", -	"gmi_ad10_ph2", -	"gmi_ad11_ph3", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_wr_n_pi0", -	"gmi_oe_n_pi1", -	"gmi_cs6_n_pi3", -	"gmi_rst_n_pi4", -	"gmi_iordy_pi5", -	"gmi_cs7_n_pi6", -	"gmi_wait_pi7", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -	"gmi_dqs_p_pj3", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs4_n_pk2", -	"gmi_cs2_n_pk3", -	"gmi_cs3_n_pk4", -	"gmi_a16_pj7", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_a19_pk7", -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc4_dat7_paa7", -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -	"dap1_fs_pn0", -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_sclk_pn3", -}; - -static const char * const gmi_alt_groups[] = { -	"gmi_wp_n_pc7", -	"gmi_cs3_n_pk4", -	"gmi_a16_pj7", -}; - -static const char * const hda_groups[] = { -	"dap1_fs_pn0", -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_sclk_pn3", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"dap2_din_pa4", -	"dap2_dout_pa5", -}; - -static const char * const hsi_groups[] = { -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -}; - -static const char * const i2c1_groups[] = { -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"gpio_w2_aud_pw2", -	"gpio_w3_aud_pw3", -}; - -static const char * const i2c2_groups[] = { -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -}; - -static const char * const i2c3_groups[] = { -	"cam_i2c_scl_pbb1", -	"cam_i2c_sda_pbb2", -}; - -static const char * const i2c4_groups[] = { -	"ddc_scl_pv4", -	"ddc_sda_pv5", -}; - -static const char * const i2cpwr_groups[] = { -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -}; - -static const char * const i2s0_groups[] = { -	"dap1_fs_pn0", -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_sclk_pn3", -}; - -static const char * const i2s1_groups[] = { -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"dap2_din_pa4", -	"dap2_dout_pa5", -}; - -static const char * const i2s2_groups[] = { -	"dap3_fs_pp0", -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_sclk_pp3", -}; - -static const char * const i2s3_groups[] = { -	"dap4_fs_pp4", -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_sclk_pp7", -}; - -static const char * const i2s4_groups[] = { -	"pcc1", -	"pbb0", -	"pbb7", -	"pcc2", -}; - -static const char * const irda_groups[] = { -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -}; - -static const char * const kbc_groups[] = { -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row2_pr2", -	"kb_row3_pr3", -	"kb_row4_pr4", -	"kb_row5_pr5", -	"kb_row6_pr6", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -	"kb_row10_ps2", -	"kb_col0_pq0", -	"kb_col1_pq1", -	"kb_col2_pq2", -	"kb_col3_pq3", -	"kb_col4_pq4", -	"kb_col5_pq5", -	"kb_col6_pq6", -	"kb_col7_pq7", -}; - -static const char * const nand_groups[] = { -	"gmi_wp_n_pc7", -	"gmi_wait_pi7", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -	"gmi_cs2_n_pk3", -	"gmi_cs3_n_pk4", -	"gmi_cs4_n_pk2", -	"gmi_cs6_n_pi3", -	"gmi_cs7_n_pi6", -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_ad8_ph0", -	"gmi_ad9_ph1", -	"gmi_ad10_ph2", -	"gmi_ad11_ph3", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_wr_n_pi0", -	"gmi_oe_n_pi1", -	"gmi_dqs_p_pj3", -	"gmi_rst_n_pi4", -}; - -static const char * const nand_alt_groups[] = { -	"gmi_cs6_n_pi3", -	"gmi_cs7_n_pi6", -	"gmi_rst_n_pi4", -}; - -static const char * const owr_groups[] = { -	"pu0", -	"kb_col4_pq4", -	"owr", -	"sdmmc3_cd_n_pv2", -}; - -static const char * const pmi_groups[] = { -	"pwr_int_n", -}; - -static const char * const pwm0_groups[] = { -	"sdmmc1_dat2_py5", -	"uart3_rts_n_pc0", -	"pu3", -	"gmi_ad8_ph0", -	"sdmmc3_dat3_pb4", -}; - -static const char * const pwm1_groups[] = { -	"sdmmc1_dat1_py6", -	"pu4", -	"gmi_ad9_ph1", -	"sdmmc3_dat2_pb5", -}; - -static const char * const pwm2_groups[] = { -	"pu5", -	"gmi_ad10_ph2", -	"kb_col3_pq3", -	"sdmmc3_dat1_pb6", -}; - -static const char * const pwm3_groups[] = { -	"pu6", -	"gmi_ad11_ph3", -	"sdmmc3_cmd_pa7", -}; - -static const char * const pwron_groups[] = { -	"core_pwr_req", -}; - -static const char * const reset_out_n_groups[] = { -	"reset_out_n", -}; - -static const char * const rsvd1_groups[] = { -	"pv1", -	"hdmi_int_pn7", -	"pu1", -	"pu2", -	"gmi_wp_n_pc7", -	"gmi_adv_n_pk0", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_wr_n_pi0", -	"gmi_oe_n_pi1", -	"gpio_x4_aud_px4", -	"gpio_x5_aud_px5", -	"gpio_x7_aud_px7", - -	"reset_out_n", -}; - -static const char * const rsvd2_groups[] = { -	"pv0", -	"pv1", -	"sdmmc1_dat0_py7", -	"clk2_out_pw5", -	"clk2_req_pcc5", -	"hdmi_int_pn7", -	"ddc_scl_pv4", -	"ddc_sda_pv5", -	"uart3_txd_pw6", -	"uart3_rxd_pw7", -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"dap4_fs_pp4", -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_sclk_pp7", -	"clk3_out_pee0", -	"clk3_req_pee1", -	"gmi_iordy_pi5", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -	"sdmmc4_dat7_paa7", -	"pcc1", -	"pbb7", -	"pcc2", -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row2_pr2", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -	"kb_row10_ps2", -	"kb_col1_pq1", -	"kb_col2_pq2", -	"kb_col5_pq5", -	"kb_col6_pq6", -	"kb_col7_pq7", -	"sys_clk_req_pz5", -	"core_pwr_req", -	"cpu_pwr_req", -	"pwr_int_n", -	"owr", -	"spdif_out_pk5", -	"gpio_x1_aud_px1", -	"sdmmc3_clk_pa6", -	"sdmmc3_dat0_pb7", -	"gpio_w2_aud_pw2", -	"usb_vbus_en0_pn4", -	"usb_vbus_en1_pn5", -	"sdmmc3_clk_lb_out_pee4", -	"sdmmc3_clk_lb_in_pee5", -	"reset_out_n", -}; - -static const char * const rsvd3_groups[] = { -	"pv0", -	"pv1", -	"sdmmc1_clk_pz0", -	"clk2_out_pw5", -	"clk2_req_pcc5", -	"hdmi_int_pn7", -	"ddc_scl_pv4", -	"ddc_sda_pv5", -	"uart2_rts_n_pj6", -	"uart2_cts_n_pj5", -	"uart3_txd_pw6", -	"uart3_rxd_pw7", -	"pu0", -	"pu1", -	"pu2", -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"dap4_din_pp5", -	"dap4_sclk_pp7", -	"clk3_out_pee0", -	"clk3_req_pee1", -	"pcc1", -	"cam_i2c_scl_pbb1", -	"cam_i2c_sda_pbb2", -	"pbb7", -	"pcc2", -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row2_pr2", -	"kb_row3_pr3", -	"kb_row9_ps1", -	"kb_row10_ps2", -	"clk_32k_out_pa0", -	"sys_clk_req_pz5", -	"core_pwr_req", -	"cpu_pwr_req", -	"pwr_int_n", -	"owr", -	"clk1_req_pee2", -	"clk1_out_pw4", -	"spdif_out_pk5", -	"spdif_in_pk6", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"dap2_din_pa4", -	"dap2_dout_pa5", -	"dvfs_pwm_px0", -	"gpio_x1_aud_px1", -	"gpio_x3_aud_px3", -	"dvfs_clk_px2", -	"sdmmc3_clk_pa6", -	"sdmmc3_dat0_pb7", -	"hdmi_cec_pee3", -	"sdmmc3_cd_n_pv2", -	"usb_vbus_en0_pn4", -	"usb_vbus_en1_pn5", -	"sdmmc3_clk_lb_out_pee4", -	"sdmmc3_clk_lb_in_pee5", -	"reset_out_n", -}; - -static const char * const rsvd4_groups[] = { -	"pv0", -	"pv1", -	"sdmmc1_clk_pz0", -	"clk2_out_pw5", -	"clk2_req_pcc5", -	"hdmi_int_pn7", -	"ddc_scl_pv4", -	"ddc_sda_pv5", -	"pu0", -	"pu1", -	"pu2", -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"dap4_fs_pp4", -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_sclk_pp7", -	"clk3_out_pee0", -	"clk3_req_pee1", -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_rst_n_pi4", -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc4_dat7_paa7", -	"cam_mclk_pcc0", -	"pcc1", -	"cam_i2c_scl_pbb1", -	"cam_i2c_sda_pbb2", -	"pbb3", -	"pbb4", -	"pbb5", -	"pbb6", -	"pbb7", -	"pcc2", -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row2_pr2", -	"kb_col2_pq2", -	"kb_col5_pq5", -	"kb_col6_pq6", -	"kb_col7_pq7", -	"clk_32k_out_pa0", -	"sys_clk_req_pz5", -	"core_pwr_req", -	"cpu_pwr_req", -	"pwr_int_n", -	"owr", -	"dap1_fs_pn0", -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_sclk_pn3", -	"clk1_req_pee2", -	"clk1_out_pw4", -	"spdif_in_pk6", -	"spdif_out_pk5", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"dap2_din_pa4", -	"dap2_dout_pa5", -	"dvfs_pwm_px0", -	"gpio_x1_aud_px1", -	"gpio_x3_aud_px3", -	"dvfs_clk_px2", -	"gpio_x5_aud_px5", -	"gpio_x6_aud_px6", -	"gpio_x7_aud_px7", -	"sdmmc3_cd_n_pv2", -	"usb_vbus_en0_pn4", -	"usb_vbus_en1_pn5", -	"sdmmc3_clk_lb_in_pee5", -	"sdmmc3_clk_lb_out_pee4", -}; - -static const char * const sdmmc1_groups[] = { - -	"sdmmc1_clk_pz0", -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat3_py4", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat0_py7", -	"uart3_cts_n_pa1", -	"kb_col5_pq5", -	"sdmmc1_wp_n_pv3", -}; - -static const char * const sdmmc2_groups[] = { -	"gmi_iordy_pi5", -	"gmi_clk_pk1", -	"gmi_cs2_n_pk3", -	"gmi_cs3_n_pk4", -	"gmi_cs7_n_pi6", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_dqs_p_pj3", -}; - -static const char * const sdmmc3_groups[] = { -	"kb_col4_pq4", -	"sdmmc3_clk_pa6", -	"sdmmc3_cmd_pa7", -	"sdmmc3_dat0_pb7", -	"sdmmc3_dat1_pb6", -	"sdmmc3_dat2_pb5", -	"sdmmc3_dat3_pb4", -	"hdmi_cec_pee3", -	"sdmmc3_cd_n_pv2", -	"sdmmc3_clk_lb_in_pee5", -	"sdmmc3_clk_lb_out_pee4", -}; - -static const char * const sdmmc4_groups[] = { -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc4_dat7_paa7", -}; - -static const char * const soc_groups[] = { -	"gmi_cs1_n_pj2", -	"gmi_oe_n_pi1", -	"clk_32k_out_pa0", -	"hdmi_cec_pee3", -}; - -static const char * const spdif_groups[] = { -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat3_py4", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -	"spdif_in_pk6", -	"spdif_out_pk5", -}; - -static const char * const spi1_groups[] = { -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -	"gpio_x3_aud_px3", -	"gpio_x4_aud_px4", -	"gpio_x5_aud_px5", -	"gpio_x6_aud_px6", -	"gpio_x7_aud_px7", -	"gpio_w3_aud_pw3", -}; - -static const char * const spi2_groups[] = { -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -	"kb_row4_pr4", -	"kb_row5_pr5", -	"kb_col0_pq0", -	"kb_col1_pq1", -	"kb_col2_pq2", -	"kb_col6_pq6", -	"kb_col7_pq7", -	"gpio_x4_aud_px4", -	"gpio_x5_aud_px5", -	"gpio_x6_aud_px6", -	"gpio_x7_aud_px7", -	"gpio_w2_aud_pw2", -	"gpio_w3_aud_pw3", -}; - -static const char * const spi3_groups[] = { -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc3_clk_pa6", -	"sdmmc3_cmd_pa7", -	"sdmmc3_dat0_pb7", -	"sdmmc3_dat1_pb6", -	"sdmmc3_dat2_pb5", -	"sdmmc3_dat3_pb4", -}; - -static const char * const spi4_groups[] = { -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat3_py4", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat0_py7", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -	"uart2_rts_n_pj6", -	"uart2_cts_n_pj5", -	"uart3_txd_pw6", -	"uart3_rxd_pw7", -	"uart3_cts_n_pa1", -	"gmi_wait_pi7", -	"gmi_cs6_n_pi3", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_a19_pk7", -	"gmi_wr_n_pi0", -	"sdmmc1_wp_n_pv3", -}; - -static const char * const spi5_groups[] = { -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -	"dap3_fs_pp0", -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_sclk_pp3", -}; - -static const char * const spi6_groups[] = { -	"dvfs_pwm_px0", -	"gpio_x1_aud_px1", -	"gpio_x3_aud_px3", -	"dvfs_clk_px2", -	"gpio_x6_aud_px6", -	"gpio_w2_aud_pw2", -	"gpio_w3_aud_pw3", -}; - -static const char * const sysclk_groups[] = { -	"sys_clk_req_pz5", -}; - -static const char * const trace_groups[] = { -	"gmi_iordy_pi5", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs2_n_pk3", -	"gmi_cs4_n_pk2", -	"gmi_a16_pj7", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_a19_pk7", -	"gmi_dqs_p_pj3", -}; - -static const char * const uarta_groups[] = { -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat3_py4", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat0_py7", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -	"uart2_rts_n_pj6", -	"uart2_cts_n_pj5", -	"pu0", -	"pu1", -	"pu2", -	"pu3", -	"pu4", -	"pu5", -	"pu6", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -	"kb_row10_ps2", -	"kb_col3_pq3", -	"kb_col4_pq4", -	"sdmmc3_cmd_pa7", -	"sdmmc3_dat1_pb6", -	"sdmmc1_wp_n_pv3", -}; - -static const char * const uartb_groups[] = { -	"uart2_rts_n_pj6", -	"uart2_cts_n_pj5", -}; - -static const char * const uartc_groups[] = { -	"uart3_txd_pw6", -	"uart3_rxd_pw7", -	"uart3_cts_n_pa1", -	"uart3_rts_n_pc0", -}; - -static const char * const uartd_groups[] = { -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -	"gmi_a16_pj7", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_a19_pk7", -}; - -static const char * const ulpi_groups[] = { -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -}; - -static const char * const usb_groups[] = { -	"pv0", -	"pu6", -	"gmi_cs0_n_pj0", -	"gmi_cs4_n_pk2", -	"gmi_ad11_ph3", -	"kb_col0_pq0", -	"spdif_in_pk6", -	"usb_vbus_en0_pn4", -	"usb_vbus_en1_pn5", -}; - -static const char * const vgp1_groups[] = { -	"cam_i2c_scl_pbb1", -}; - -static const char * const vgp2_groups[] = { -	"cam_i2c_sda_pbb2", -}; - -static const char * const vgp3_groups[] = { -	"pbb3", -}; - -static const char * const vgp4_groups[] = { -	"pbb4", -}; - -static const char * const vgp5_groups[] = { -	"pbb5", -}; - -static const char * const vgp6_groups[] = { -	"pbb6", -}; - -static const char * const vi_groups[] = { -	"cam_mclk_pcc0", -	"pbb0", -}; - -static const char * const vi_alt1_groups[] = { -	"cam_mclk_pcc0", -	"pbb0", -}; - -static const char * const vi_alt3_groups[] = { -	"cam_mclk_pcc0", -	"pbb0", -}; -  #define FUNCTION(fname)					\  	{						\  		.name = #fname,				\ -		.groups = fname##_groups,		\ -		.ngroups = ARRAY_SIZE(fname##_groups),	\  	} -static const struct tegra_function  tegra114_functions[] = { +static struct tegra_function tegra114_functions[] = {  	FUNCTION(blink),  	FUNCTION(cec),  	FUNCTION(cldvfs), +	FUNCTION(clk),  	FUNCTION(clk12),  	FUNCTION(cpu),  	FUNCTION(dap), @@ -2407,6 +1512,7 @@ static const struct tegra_function  tegra114_functions[] = {  	FUNCTION(rsvd2),  	FUNCTION(rsvd3),  	FUNCTION(rsvd4), +	FUNCTION(rtck),  	FUNCTION(sdmmc1),  	FUNCTION(sdmmc2),  	FUNCTION(sdmmc3), @@ -2438,13 +1544,15 @@ static const struct tegra_function  tegra114_functions[] = {  	FUNCTION(vi_alt3),  }; -#define DRV_PINGROUP_REG_START			0x868	/* bank 0 */ -#define PINGROUP_REG_START			0x3000	/* bank 1 */ +#define DRV_PINGROUP_REG_A		0x868	/* bank 0 */ +#define PINGROUP_REG_A			0x3000	/* bank 1 */ + +#define PINGROUP_REG(r)			((r) - PINGROUP_REG_A) -#define PINGROUP_REG_Y(r)			((r) - PINGROUP_REG_START) -#define PINGROUP_REG_N(r)			-1 +#define PINGROUP_BIT_Y(b)		(b) +#define PINGROUP_BIT_N(b)		(-1) -#define PINGROUP(pg_name, f0, f1, f2, f3, f_safe, r, od, ior, rcv_sel)	\ +#define PINGROUP(pg_name, f0, f1, f2, f3, r, od, ior, rcv_sel)		\  	{								\  		.name = #pg_name,					\  		.pins = pg_name##_pins,					\ @@ -2455,42 +1563,29 @@ static const struct tegra_function  tegra114_functions[] = {  			TEGRA_MUX_##f2,					\  			TEGRA_MUX_##f3,					\  		},							\ -		.func_safe = TEGRA_MUX_##f_safe,			\ -		.mux_reg = PINGROUP_REG_Y(r),				\ +		.mux_reg = PINGROUP_REG(r),				\  		.mux_bank = 1,						\  		.mux_bit = 0,						\ -		.pupd_reg = PINGROUP_REG_Y(r),				\ +		.pupd_reg = PINGROUP_REG(r),				\  		.pupd_bank = 1,						\  		.pupd_bit = 2,						\ -		.tri_reg = PINGROUP_REG_Y(r),				\ +		.tri_reg = PINGROUP_REG(r),				\  		.tri_bank = 1,						\  		.tri_bit = 4,						\ -		.einput_reg = PINGROUP_REG_Y(r),			\ -		.einput_bank = 1,					\ -		.einput_bit = 5,					\ -		.odrain_reg = PINGROUP_REG_##od(r),			\ -		.odrain_bank = 1,					\ -		.odrain_bit = 6,					\ -		.lock_reg = PINGROUP_REG_Y(r),				\ -		.lock_bank = 1,						\ -		.lock_bit = 7,						\ -		.ioreset_reg = PINGROUP_REG_##ior(r),			\ -		.ioreset_bank = 1,					\ -		.ioreset_bit = 8,					\ -		.rcv_sel_reg = PINGROUP_REG_##rcv_sel(r),		\ -		.rcv_sel_bank = 1,					\ -		.rcv_sel_bit = 9,					\ +		.einput_bit = PINGROUP_BIT_Y(5),			\ +		.odrain_bit = PINGROUP_BIT_##od(6),			\ +		.lock_bit = PINGROUP_BIT_Y(7),				\ +		.ioreset_bit = PINGROUP_BIT_##ior(8),			\ +		.rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9),		\  		.drv_reg = -1,						\ -		.drvtype_reg = -1,					\  	} -#define DRV_PINGROUP_DVRTYPE_Y(r) ((r) - DRV_PINGROUP_REG_START) -#define DRV_PINGROUP_DVRTYPE_N(r) -1 +#define DRV_PINGROUP_REG(r)		((r) - DRV_PINGROUP_REG_A)  #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b,		\ -			drvdn_b, drvdn_w, drvup_b, drvup_w,		\ -			slwr_b, slwr_w, slwf_b, slwf_w,			\ -			drvtype)					\ +		     drvdn_b, drvdn_w, drvup_b, drvup_w,		\ +		     slwr_b, slwr_w, slwf_b, slwf_w,			\ +		     drvtype)						\  	{								\  		.name = "drive_" #pg_name,				\  		.pins = drive_##pg_name##_pins,				\ @@ -2498,12 +1593,12 @@ static const struct tegra_function  tegra114_functions[] = {  		.mux_reg = -1,						\  		.pupd_reg = -1,						\  		.tri_reg = -1,						\ -		.einput_reg = -1,					\ -		.odrain_reg = -1,					\ -		.lock_reg = -1,						\ -		.ioreset_reg = -1,					\ -		.rcv_sel_reg = -1,					\ -		.drv_reg = DRV_PINGROUP_DVRTYPE_Y(r),			\ +		.einput_bit = -1,					\ +		.odrain_bit = -1,					\ +		.lock_bit = -1,						\ +		.ioreset_bit = -1,					\ +		.rcv_sel_bit = -1,					\ +		.drv_reg = DRV_PINGROUP_REG(r),				\  		.drv_bank = 0,						\  		.hsm_bit = hsm_b,					\  		.schmitt_bit = schmitt_b,				\ @@ -2516,219 +1611,228 @@ static const struct tegra_function  tegra114_functions[] = {  		.slwr_width = slwr_w,					\  		.slwf_bit = slwf_b,					\  		.slwf_width = slwf_w,					\ -		.drvtype_reg = DRV_PINGROUP_DVRTYPE_##drvtype(r),	\ -		.drvtype_bank = 0,					\ -		.drvtype_bit = 6,					\ +		.drvtype_bit = PINGROUP_BIT_##drvtype(6),		\  	}  static const struct tegra_pingroup tegra114_groups[] = { -	/*       pg_name,                f0,         f1,         f2,           f3,          safe,     r,      od, ior, rcv_sel */ -	/* FIXME: Fill in correct data in safe column */ -	PINGROUP(ulpi_data0_po1,         SPI3,       HSI,        UARTA,        ULPI,        ULPI,     0x3000,  N,  N,  N), -	PINGROUP(ulpi_data1_po2,         SPI3,       HSI,        UARTA,        ULPI,        ULPI,     0x3004,  N,  N,  N), -	PINGROUP(ulpi_data2_po3,         SPI3,       HSI,        UARTA,        ULPI,        ULPI,     0x3008,  N,  N,  N), -	PINGROUP(ulpi_data3_po4,         SPI3,       HSI,        UARTA,        ULPI,        ULPI,     0x300c,  N,  N,  N), -	PINGROUP(ulpi_data4_po5,         SPI2,       HSI,        UARTA,        ULPI,        ULPI,     0x3010,  N,  N,  N), -	PINGROUP(ulpi_data5_po6,         SPI2,       HSI,        UARTA,        ULPI,        ULPI,     0x3014,  N,  N,  N), -	PINGROUP(ulpi_data6_po7,         SPI2,       HSI,        UARTA,        ULPI,        ULPI,     0x3018,  N,  N,  N), -	PINGROUP(ulpi_data7_po0,         SPI2,       HSI,        UARTA,        ULPI,        ULPI,     0x301c,  N,  N,  N), -	PINGROUP(ulpi_clk_py0,           SPI1,       SPI5,       UARTD,        ULPI,        ULPI,     0x3020,  N,  N,  N), -	PINGROUP(ulpi_dir_py1,           SPI1,       SPI5,       UARTD,        ULPI,        ULPI,     0x3024,  N,  N,  N), -	PINGROUP(ulpi_nxt_py2,           SPI1,       SPI5,       UARTD,        ULPI,        ULPI,     0x3028,  N,  N,  N), -	PINGROUP(ulpi_stp_py3,           SPI1,       SPI5,       UARTD,        ULPI,        ULPI,     0x302c,  N,  N,  N), -	PINGROUP(dap3_fs_pp0,            I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    I2S2,     0x3030,  N,  N,  N), -	PINGROUP(dap3_din_pp1,           I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    I2S2,     0x3034,  N,  N,  N), -	PINGROUP(dap3_dout_pp2,          I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    I2S2,     0x3038,  N,  N,  N), -	PINGROUP(dap3_sclk_pp3,          I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    I2S2,     0x303c,  N,  N,  N), -	PINGROUP(pv0,                    USB,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3040,  N,  N,  N), -	PINGROUP(pv1,                    RSVD1,      RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3044,  N,  N,  N), -	PINGROUP(sdmmc1_clk_pz0,         SDMMC1,     CLK12,      RSVD3,        RSVD4,       RSVD4,    0x3048,  N,  N,  N), -	PINGROUP(sdmmc1_cmd_pz1,         SDMMC1,     SPDIF,      SPI4,         UARTA,       SDMMC1,   0x304c,  N,  N,  N), -	PINGROUP(sdmmc1_dat3_py4,        SDMMC1,     SPDIF,      SPI4,         UARTA,       SDMMC1,   0x3050,  N,  N,  N), -	PINGROUP(sdmmc1_dat2_py5,        SDMMC1,     PWM0,       SPI4,         UARTA,       SDMMC1,   0x3054,  N,  N,  N), -	PINGROUP(sdmmc1_dat1_py6,        SDMMC1,     PWM1,       SPI4,         UARTA,       SDMMC1,   0x3058,  N,  N,  N), -	PINGROUP(sdmmc1_dat0_py7,        SDMMC1,     RSVD2,      SPI4,         UARTA,       RSVD2,    0x305c,  N,  N,  N), -	PINGROUP(clk2_out_pw5,           EXTPERIPH2, RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3068,  N,  N,  N), -	PINGROUP(clk2_req_pcc5,          DAP,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x306c,  N,  N,  N), -	PINGROUP(hdmi_int_pn7,           RSVD1,      RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3110,  N,  N,  Y), -	PINGROUP(ddc_scl_pv4,            I2C4,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3114,  N,  N,  Y), -	PINGROUP(ddc_sda_pv5,            I2C4,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3118,  N,  N,  Y), -	PINGROUP(uart2_rxd_pc3,          IRDA,       SPDIF,      UARTA,        SPI4,        IRDA,     0x3164,  N,  N,  N), -	PINGROUP(uart2_txd_pc2,          IRDA,       SPDIF,      UARTA,        SPI4,        IRDA,     0x3168,  N,  N,  N), -	PINGROUP(uart2_rts_n_pj6,        UARTA,      UARTB,      RSVD3,        SPI4,        RSVD3,    0x316c,  N,  N,  N), -	PINGROUP(uart2_cts_n_pj5,        UARTA,      UARTB,      RSVD3,        SPI4,        RSVD3,    0x3170,  N,  N,  N), -	PINGROUP(uart3_txd_pw6,          UARTC,      RSVD2,      RSVD3,        SPI4,        RSVD3,    0x3174,  N,  N,  N), -	PINGROUP(uart3_rxd_pw7,          UARTC,      RSVD2,      RSVD3,        SPI4,        RSVD3,    0x3178,  N,  N,  N), -	PINGROUP(uart3_cts_n_pa1,        UARTC,      SDMMC1,     DTV,          SPI4,        UARTC,    0x317c,  N,  N,  N), -	PINGROUP(uart3_rts_n_pc0,        UARTC,      PWM0,       DTV,          DISPLAYA,    UARTC,    0x3180,  N,  N,  N), -	PINGROUP(pu0,                    OWR,        UARTA,      RSVD3,        RSVD4,       RSVD4,    0x3184,  N,  N,  N), -	PINGROUP(pu1,                    RSVD1,      UARTA,      RSVD3,        RSVD4,       RSVD4,    0x3188,  N,  N,  N), -	PINGROUP(pu2,                    RSVD1,      UARTA,      RSVD3,        RSVD4,       RSVD4,    0x318c,  N,  N,  N), -	PINGROUP(pu3,                    PWM0,       UARTA,      DISPLAYA,     DISPLAYB,    PWM0,     0x3190,  N,  N,  N), -	PINGROUP(pu4,                    PWM1,       UARTA,      DISPLAYA,     DISPLAYB,    PWM1,     0x3194,  N,  N,  N), -	PINGROUP(pu5,                    PWM2,       UARTA,      DISPLAYA,     DISPLAYB,    PWM2,     0x3198,  N,  N,  N), -	PINGROUP(pu6,                    PWM3,       UARTA,      USB,          DISPLAYB,    PWM3,     0x319c,  N,  N,  N), -	PINGROUP(gen1_i2c_sda_pc5,       I2C1,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x31a0,  Y,  N,  N), -	PINGROUP(gen1_i2c_scl_pc4,       I2C1,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x31a4,  Y,  N,  N), -	PINGROUP(dap4_fs_pp4,            I2S3,       RSVD2,      DTV,          RSVD4,       RSVD4,    0x31a8,  N,  N,  N), -	PINGROUP(dap4_din_pp5,           I2S3,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x31ac,  N,  N,  N), -	PINGROUP(dap4_dout_pp6,          I2S3,       RSVD2,      DTV,          RSVD4,       RSVD4,    0x31b0,  N,  N,  N), -	PINGROUP(dap4_sclk_pp7,          I2S3,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x31b4,  N,  N,  N), -	PINGROUP(clk3_out_pee0,          EXTPERIPH3, RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x31b8,  N,  N,  N), -	PINGROUP(clk3_req_pee1,          DEV3,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x31bc,  N,  N,  N), -	PINGROUP(gmi_wp_n_pc7,           RSVD1,      NAND,       GMI,          GMI_ALT,     RSVD1,    0x31c0,  N,  N,  N), -	PINGROUP(gmi_iordy_pi5,          SDMMC2,     RSVD2,      GMI,          TRACE,       RSVD2,    0x31c4,  N,  N,  N), -	PINGROUP(gmi_wait_pi7,           SPI4,       NAND,       GMI,          DTV,         NAND,     0x31c8,  N,  N,  N), -	PINGROUP(gmi_adv_n_pk0,          RSVD1,      NAND,       GMI,          TRACE,       RSVD1,    0x31cc,  N,  N,  N), -	PINGROUP(gmi_clk_pk1,            SDMMC2,     NAND,       GMI,          TRACE,       GMI,      0x31d0,  N,  N,  N), -	PINGROUP(gmi_cs0_n_pj0,          RSVD1,      NAND,       GMI,          USB,         RSVD1,    0x31d4,  N,  N,  N), -	PINGROUP(gmi_cs1_n_pj2,          RSVD1,      NAND,       GMI,          SOC,         RSVD1,    0x31d8,  N,  N,  N), -	PINGROUP(gmi_cs2_n_pk3,          SDMMC2,     NAND,       GMI,          TRACE,       GMI,      0x31dc,  N,  N,  N), -	PINGROUP(gmi_cs3_n_pk4,          SDMMC2,     NAND,       GMI,          GMI_ALT,     GMI,      0x31e0,  N,  N,  N), -	PINGROUP(gmi_cs4_n_pk2,          USB,        NAND,       GMI,          TRACE,       GMI,      0x31e4,  N,  N,  N), -	PINGROUP(gmi_cs6_n_pi3,          NAND,       NAND_ALT,   GMI,          SPI4,        NAND,     0x31e8,  N,  N,  N), -	PINGROUP(gmi_cs7_n_pi6,          NAND,       NAND_ALT,   GMI,          SDMMC2,      NAND,     0x31ec,  N,  N,  N), -	PINGROUP(gmi_ad0_pg0,            RSVD1,      NAND,       GMI,          RSVD4,       RSVD4,    0x31f0,  N,  N,  N), -	PINGROUP(gmi_ad1_pg1,            RSVD1,      NAND,       GMI,          RSVD4,       RSVD4,    0x31f4,  N,  N,  N), -	PINGROUP(gmi_ad2_pg2,            RSVD1,      NAND,       GMI,          RSVD4,       RSVD4,    0x31f8,  N,  N,  N), -	PINGROUP(gmi_ad3_pg3,            RSVD1,      NAND,       GMI,          RSVD4,       RSVD4,    0x31fc,  N,  N,  N), -	PINGROUP(gmi_ad4_pg4,            RSVD1,      NAND,       GMI,          RSVD4,       RSVD4,    0x3200,  N,  N,  N), -	PINGROUP(gmi_ad5_pg5,            RSVD1,      NAND,       GMI,          SPI4,        RSVD1,    0x3204,  N,  N,  N), -	PINGROUP(gmi_ad6_pg6,            RSVD1,      NAND,       GMI,          SPI4,        RSVD1,    0x3208,  N,  N,  N), -	PINGROUP(gmi_ad7_pg7,            RSVD1,      NAND,       GMI,          SPI4,        RSVD1,    0x320c,  N,  N,  N), -	PINGROUP(gmi_ad8_ph0,            PWM0,       NAND,       GMI,          DTV,         GMI,      0x3210,  N,  N,  N), -	PINGROUP(gmi_ad9_ph1,            PWM1,       NAND,       GMI,          CLDVFS,      GMI,      0x3214,  N,  N,  N), -	PINGROUP(gmi_ad10_ph2,           PWM2,       NAND,       GMI,          CLDVFS,      GMI,      0x3218,  N,  N,  N), -	PINGROUP(gmi_ad11_ph3,           PWM3,       NAND,       GMI,          USB,         GMI,      0x321c,  N,  N,  N), -	PINGROUP(gmi_ad12_ph4,           SDMMC2,     NAND,       GMI,          RSVD4,       RSVD4,    0x3220,  N,  N,  N), -	PINGROUP(gmi_ad13_ph5,           SDMMC2,     NAND,       GMI,          RSVD4,       RSVD4,    0x3224,  N,  N,  N), -	PINGROUP(gmi_ad14_ph6,           SDMMC2,     NAND,       GMI,          DTV,         GMI,      0x3228,  N,  N,  N), -	PINGROUP(gmi_ad15_ph7,           SDMMC2,     NAND,       GMI,          DTV,         GMI,      0x322c,  N,  N,  N), -	PINGROUP(gmi_a16_pj7,            UARTD,      TRACE,      GMI,          GMI_ALT,     GMI,      0x3230,  N,  N,  N), -	PINGROUP(gmi_a17_pb0,            UARTD,      RSVD2,      GMI,          TRACE,       RSVD2,    0x3234,  N,  N,  N), -	PINGROUP(gmi_a18_pb1,            UARTD,      RSVD2,      GMI,          TRACE,       RSVD2,    0x3238,  N,  N,  N), -	PINGROUP(gmi_a19_pk7,            UARTD,      SPI4,       GMI,          TRACE,       GMI,      0x323c,  N,  N,  N), -	PINGROUP(gmi_wr_n_pi0,           RSVD1,      NAND,       GMI,          SPI4,        RSVD1,    0x3240,  N,  N,  N), -	PINGROUP(gmi_oe_n_pi1,           RSVD1,      NAND,       GMI,          SOC,         RSVD1,    0x3244,  N,  N,  N), -	PINGROUP(gmi_dqs_p_pj3,          SDMMC2,     NAND,       GMI,          TRACE,       NAND,     0x3248,  N,  N,  N), -	PINGROUP(gmi_rst_n_pi4,          NAND,       NAND_ALT,   GMI,          RSVD4,       RSVD4,    0x324c,  N,  N,  N), -	PINGROUP(gen2_i2c_scl_pt5,       I2C2,       RSVD2,      GMI,          RSVD4,       RSVD4,    0x3250,  Y,  N,  N), -	PINGROUP(gen2_i2c_sda_pt6,       I2C2,       RSVD2,      GMI,          RSVD4,       RSVD4,    0x3254,  Y,  N,  N), -	PINGROUP(sdmmc4_clk_pcc4,        SDMMC4,     RSVD2,      GMI,          RSVD4,       RSVD4,    0x3258,  N,  Y,  N), -	PINGROUP(sdmmc4_cmd_pt7,         SDMMC4,     RSVD2,      GMI,          RSVD4,       RSVD4,    0x325c,  N,  Y,  N), -	PINGROUP(sdmmc4_dat0_paa0,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x3260,  N,  Y,  N), -	PINGROUP(sdmmc4_dat1_paa1,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x3264,  N,  Y,  N), -	PINGROUP(sdmmc4_dat2_paa2,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x3268,  N,  Y,  N), -	PINGROUP(sdmmc4_dat3_paa3,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x326c,  N,  Y,  N), -	PINGROUP(sdmmc4_dat4_paa4,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x3270,  N,  Y,  N), -	PINGROUP(sdmmc4_dat5_paa5,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x3274,  N,  Y,  N), -	PINGROUP(sdmmc4_dat6_paa6,       SDMMC4,     SPI3,       GMI,          RSVD4,       RSVD4,    0x3278,  N,  Y,  N), -	PINGROUP(sdmmc4_dat7_paa7,       SDMMC4,     RSVD2,      GMI,          RSVD4,       RSVD4,    0x327c,  N,  Y,  N), -	PINGROUP(cam_mclk_pcc0,          VI,         VI_ALT1,    VI_ALT3,      RSVD4,       RSVD4,    0x3284,  N,  N,  N), -	PINGROUP(pcc1,                   I2S4,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3288,  N,  N,  N), -	PINGROUP(pbb0,                   I2S4,       VI,         VI_ALT1,      VI_ALT3,     I2S4,     0x328c,  N,  N,  N), -	PINGROUP(cam_i2c_scl_pbb1,       VGP1,       I2C3,       RSVD3,        RSVD4,       RSVD4,    0x3290,  Y,  N,  N), -	PINGROUP(cam_i2c_sda_pbb2,       VGP2,       I2C3,       RSVD3,        RSVD4,       RSVD4,    0x3294,  Y,  N,  N), -	PINGROUP(pbb3,                   VGP3,       DISPLAYA,   DISPLAYB,     RSVD4,       RSVD4,    0x3298,  N,  N,  N), -	PINGROUP(pbb4,                   VGP4,       DISPLAYA,   DISPLAYB,     RSVD4,       RSVD4,    0x329c,  N,  N,  N), -	PINGROUP(pbb5,                   VGP5,       DISPLAYA,   DISPLAYB,     RSVD4,       RSVD4,    0x32a0,  N,  N,  N), -	PINGROUP(pbb6,                   VGP6,       DISPLAYA,   DISPLAYB,     RSVD4,       RSVD4,    0x32a4,  N,  N,  N), -	PINGROUP(pbb7,                   I2S4,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32a8,  N,  N,  N), -	PINGROUP(pcc2,                   I2S4,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32ac,  N,  N,  N), -	PINGROUP(pwr_i2c_scl_pz6,        I2CPWR,     RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32b4,  Y,  N,  N), -	PINGROUP(pwr_i2c_sda_pz7,        I2CPWR,     RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32b8,  Y,  N,  N), -	PINGROUP(kb_row0_pr0,            KBC,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32bc,  N,  N,  N), -	PINGROUP(kb_row1_pr1,            KBC,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32c0,  N,  N,  N), -	PINGROUP(kb_row2_pr2,            KBC,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x32c4,  N,  N,  N), -	PINGROUP(kb_row3_pr3,            KBC,        DISPLAYA,   RSVD3,        DISPLAYB,    RSVD3,    0x32c8,  N,  N,  N), -	PINGROUP(kb_row4_pr4,            KBC,        DISPLAYA,   SPI2,         DISPLAYB,    KBC,      0x32cc,  N,  N,  N), -	PINGROUP(kb_row5_pr5,            KBC,        DISPLAYA,   SPI2,         DISPLAYB,    KBC,      0x32d0,  N,  N,  N), -	PINGROUP(kb_row6_pr6,            KBC,        DISPLAYA,   DISPLAYA_ALT, DISPLAYB,    KBC,      0x32d4,  N,  N,  N), -	PINGROUP(kb_row7_pr7,            KBC,        RSVD2,      CLDVFS,       UARTA,       RSVD2,    0x32d8,  N,  N,  N), -	PINGROUP(kb_row8_ps0,            KBC,        RSVD2,      CLDVFS,       UARTA,       RSVD2,    0x32dc,  N,  N,  N), -	PINGROUP(kb_row9_ps1,            KBC,        RSVD2,      RSVD3,        UARTA,       RSVD3,    0x32e0,  N,  N,  N), -	PINGROUP(kb_row10_ps2,           KBC,        RSVD2,      RSVD3,        UARTA,       RSVD3,    0x32e4,  N,  N,  N), -	PINGROUP(kb_col0_pq0,            KBC,        USB,        SPI2,         EMC_DLL,     KBC,      0x32fc,  N,  N,  N), -	PINGROUP(kb_col1_pq1,            KBC,        RSVD2,      SPI2,         EMC_DLL,     RSVD2,    0x3300,  N,  N,  N), -	PINGROUP(kb_col2_pq2,            KBC,        RSVD2,      SPI2,         RSVD4,       RSVD2,    0x3304,  N,  N,  N), -	PINGROUP(kb_col3_pq3,            KBC,        DISPLAYA,   PWM2,         UARTA,       KBC,      0x3308,  N,  N,  N), -	PINGROUP(kb_col4_pq4,            KBC,        OWR,        SDMMC3,       UARTA,       KBC,      0x330c,  N,  N,  N), -	PINGROUP(kb_col5_pq5,            KBC,        RSVD2,      SDMMC1,       RSVD4,       RSVD4,    0x3310,  N,  N,  N), -	PINGROUP(kb_col6_pq6,            KBC,        RSVD2,      SPI2,         RSVD4,       RSVD4,    0x3314,  N,  N,  N), -	PINGROUP(kb_col7_pq7,            KBC,        RSVD2,      SPI2,         RSVD4,       RSVD4,    0x3318,  N,  N,  N), -	PINGROUP(clk_32k_out_pa0,        BLINK,      SOC,        RSVD3,        RSVD4,       RSVD4,    0x331c,  N,  N,  N), -	PINGROUP(sys_clk_req_pz5,        SYSCLK,     RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3320,  N,  N,  N), -	PINGROUP(core_pwr_req,           PWRON,      RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3324,  N,  N,  N), -	PINGROUP(cpu_pwr_req,            CPU,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3328,  N,  N,  N), -	PINGROUP(pwr_int_n,              PMI,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x332c,  N,  N,  N), -	PINGROUP(owr,                    OWR,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3334,  N,  N,  Y), -	PINGROUP(dap1_fs_pn0,            I2S0,       HDA,        GMI,          RSVD4,       RSVD4,    0x3338,  N,  N,  N), -	PINGROUP(dap1_din_pn1,           I2S0,       HDA,        GMI,          RSVD4,       RSVD4,    0x333c,  N,  N,  N), -	PINGROUP(dap1_dout_pn2,          I2S0,       HDA,        GMI,          RSVD4,       RSVD4,    0x3340,  N,  N,  N), -	PINGROUP(dap1_sclk_pn3,          I2S0,       HDA,        GMI,          RSVD4,       RSVD4,    0x3344,  N,  N,  N), -	PINGROUP(clk1_req_pee2,          DAP,        DAP1,       RSVD3,        RSVD4,       RSVD4,    0x3348,  N,  N,  N), -	PINGROUP(clk1_out_pw4,           EXTPERIPH1, DAP2,       RSVD3,        RSVD4,       RSVD4,    0x334c,  N,  N,  N), -	PINGROUP(spdif_in_pk6,           SPDIF,      USB,        RSVD3,        RSVD4,       RSVD4,    0x3350,  N,  N,  N), -	PINGROUP(spdif_out_pk5,          SPDIF,      RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3354,  N,  N,  N), -	PINGROUP(dap2_fs_pa2,            I2S1,       HDA,        RSVD3,        RSVD4,       RSVD4,    0x3358,  N,  N,  N), -	PINGROUP(dap2_din_pa4,           I2S1,       HDA,        RSVD3,        RSVD4,       RSVD4,    0x335c,  N,  N,  N), -	PINGROUP(dap2_dout_pa5,          I2S1,       HDA,        RSVD3,        RSVD4,       RSVD4,    0x3360,  N,  N,  N), -	PINGROUP(dap2_sclk_pa3,          I2S1,       HDA,        RSVD3,        RSVD4,       RSVD4,    0x3364,  N,  N,  N), -	PINGROUP(dvfs_pwm_px0,           SPI6,       CLDVFS,     RSVD3,        RSVD4,       RSVD4,    0x3368,  N,  N,  N), -	PINGROUP(gpio_x1_aud_px1,        SPI6,       RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x336c,  N,  N,  N), -	PINGROUP(gpio_x3_aud_px3,        SPI6,       SPI1,       RSVD3,        RSVD4,       RSVD4,    0x3370,  N,  N,  N), -	PINGROUP(dvfs_clk_px2,           SPI6,       CLDVFS,     RSVD3,        RSVD4,       RSVD4,    0x3374,  N,  N,  N), -	PINGROUP(gpio_x4_aud_px4,        RSVD1,      SPI1,       SPI2,         DAP2,        RSVD1,    0x3378,  N,  N,  N), -	PINGROUP(gpio_x5_aud_px5,        RSVD1,      SPI1,       SPI2,         RSVD4,       RSVD1,    0x337c,  N,  N,  N), -	PINGROUP(gpio_x6_aud_px6,        SPI6,       SPI1,       SPI2,         RSVD4,       RSVD4,    0x3380,  N,  N,  N), -	PINGROUP(gpio_x7_aud_px7,        RSVD1,      SPI1,       SPI2,         RSVD4,       RSVD4,    0x3384,  N,  N,  N), -	PINGROUP(sdmmc3_clk_pa6,         SDMMC3,     RSVD2,      RSVD3,        SPI3,        RSVD3,    0x3390,  N,  N,  N), -	PINGROUP(sdmmc3_cmd_pa7,         SDMMC3,     PWM3,       UARTA,        SPI3,        SDMMC3,   0x3394,  N,  N,  N), -	PINGROUP(sdmmc3_dat0_pb7,        SDMMC3,     RSVD2,      RSVD3,        SPI3,        RSVD3,    0x3398,  N,  N,  N), -	PINGROUP(sdmmc3_dat1_pb6,        SDMMC3,     PWM2,       UARTA,        SPI3,        SDMMC3,   0x339c,  N,  N,  N), -	PINGROUP(sdmmc3_dat2_pb5,        SDMMC3,     PWM1,       DISPLAYA,     SPI3,        SDMMC3,   0x33a0,  N,  N,  N), -	PINGROUP(sdmmc3_dat3_pb4,        SDMMC3,     PWM0,       DISPLAYB,     SPI3,        SDMMC3,   0x33a4,  N,  N,  N), -	PINGROUP(hdmi_cec_pee3,          CEC,        SDMMC3,     RSVD3,        SOC,         RSVD3,    0x33e0,  Y,  N,  N), -	PINGROUP(sdmmc1_wp_n_pv3,        SDMMC1,     CLK12,      SPI4,         UARTA,       SDMMC1,   0x33e4,  N,  N,  N), -	PINGROUP(sdmmc3_cd_n_pv2,        SDMMC3,     OWR,        RSVD3,        RSVD4,       RSVD4,    0x33e8,  N,  N,  N), -	PINGROUP(gpio_w2_aud_pw2,        SPI6,       RSVD2,      SPI2,         I2C1,        RSVD2,    0x33ec,  N,  N,  N), -	PINGROUP(gpio_w3_aud_pw3,        SPI6,       SPI1,       SPI2,         I2C1,        SPI6,     0x33f0,  N,  N,  N), -	PINGROUP(usb_vbus_en0_pn4,       USB,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x33f4,  Y,  N,  N), -	PINGROUP(usb_vbus_en1_pn5,       USB,        RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x33f8,  Y,  N,  N), -	PINGROUP(sdmmc3_clk_lb_in_pee5,  SDMMC3,     RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x33fc,  N,  N,  N), -	PINGROUP(sdmmc3_clk_lb_out_pee4, SDMMC3,     RSVD2,      RSVD3,        RSVD4,       RSVD4,    0x3400,  N,  N,  N), -	PINGROUP(reset_out_n,            RSVD1,      RSVD2,      RSVD3,        RESET_OUT_N, RSVD3,    0x3408,  N,  N,  N), +	/*       pg_name,                f0,         f1,         f2,           f3,          r,      od, ior, rcv_sel */ +	PINGROUP(ulpi_data0_po1,         SPI3,       HSI,        UARTA,        ULPI,        0x3000, N,   N,  N), +	PINGROUP(ulpi_data1_po2,         SPI3,       HSI,        UARTA,        ULPI,        0x3004, N,   N,  N), +	PINGROUP(ulpi_data2_po3,         SPI3,       HSI,        UARTA,        ULPI,        0x3008, N,   N,  N), +	PINGROUP(ulpi_data3_po4,         SPI3,       HSI,        UARTA,        ULPI,        0x300c, N,   N,  N), +	PINGROUP(ulpi_data4_po5,         SPI2,       HSI,        UARTA,        ULPI,        0x3010, N,   N,  N), +	PINGROUP(ulpi_data5_po6,         SPI2,       HSI,        UARTA,        ULPI,        0x3014, N,   N,  N), +	PINGROUP(ulpi_data6_po7,         SPI2,       HSI,        UARTA,        ULPI,        0x3018, N,   N,  N), +	PINGROUP(ulpi_data7_po0,         SPI2,       HSI,        UARTA,        ULPI,        0x301c, N,   N,  N), +	PINGROUP(ulpi_clk_py0,           SPI1,       SPI5,       UARTD,        ULPI,        0x3020, N,   N,  N), +	PINGROUP(ulpi_dir_py1,           SPI1,       SPI5,       UARTD,        ULPI,        0x3024, N,   N,  N), +	PINGROUP(ulpi_nxt_py2,           SPI1,       SPI5,       UARTD,        ULPI,        0x3028, N,   N,  N), +	PINGROUP(ulpi_stp_py3,           SPI1,       SPI5,       UARTD,        ULPI,        0x302c, N,   N,  N), +	PINGROUP(dap3_fs_pp0,            I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    0x3030, N,   N,  N), +	PINGROUP(dap3_din_pp1,           I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    0x3034, N,   N,  N), +	PINGROUP(dap3_dout_pp2,          I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    0x3038, N,   N,  N), +	PINGROUP(dap3_sclk_pp3,          I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    0x303c, N,   N,  N), +	PINGROUP(pv0,                    USB,        RSVD2,      RSVD3,        RSVD4,       0x3040, N,   N,  N), +	PINGROUP(pv1,                    RSVD1,      RSVD2,      RSVD3,        RSVD4,       0x3044, N,   N,  N), +	PINGROUP(sdmmc1_clk_pz0,         SDMMC1,     CLK12,      RSVD3,        RSVD4,       0x3048, N,   N,  N), +	PINGROUP(sdmmc1_cmd_pz1,         SDMMC1,     SPDIF,      SPI4,         UARTA,       0x304c, N,   N,  N), +	PINGROUP(sdmmc1_dat3_py4,        SDMMC1,     SPDIF,      SPI4,         UARTA,       0x3050, N,   N,  N), +	PINGROUP(sdmmc1_dat2_py5,        SDMMC1,     PWM0,       SPI4,         UARTA,       0x3054, N,   N,  N), +	PINGROUP(sdmmc1_dat1_py6,        SDMMC1,     PWM1,       SPI4,         UARTA,       0x3058, N,   N,  N), +	PINGROUP(sdmmc1_dat0_py7,        SDMMC1,     RSVD2,      SPI4,         UARTA,       0x305c, N,   N,  N), +	PINGROUP(clk2_out_pw5,           EXTPERIPH2, RSVD2,      RSVD3,        RSVD4,       0x3068, N,   N,  N), +	PINGROUP(clk2_req_pcc5,          DAP,        RSVD2,      RSVD3,        RSVD4,       0x306c, N,   N,  N), +	PINGROUP(hdmi_int_pn7,           RSVD1,      RSVD2,      RSVD3,        RSVD4,       0x3110, N,   N,  Y), +	PINGROUP(ddc_scl_pv4,            I2C4,       RSVD2,      RSVD3,        RSVD4,       0x3114, N,   N,  Y), +	PINGROUP(ddc_sda_pv5,            I2C4,       RSVD2,      RSVD3,        RSVD4,       0x3118, N,   N,  Y), +	PINGROUP(uart2_rxd_pc3,          IRDA,       SPDIF,      UARTA,        SPI4,        0x3164, N,   N,  N), +	PINGROUP(uart2_txd_pc2,          IRDA,       SPDIF,      UARTA,        SPI4,        0x3168, N,   N,  N), +	PINGROUP(uart2_rts_n_pj6,        UARTA,      UARTB,      RSVD3,        SPI4,        0x316c, N,   N,  N), +	PINGROUP(uart2_cts_n_pj5,        UARTA,      UARTB,      RSVD3,        SPI4,        0x3170, N,   N,  N), +	PINGROUP(uart3_txd_pw6,          UARTC,      RSVD2,      RSVD3,        SPI4,        0x3174, N,   N,  N), +	PINGROUP(uart3_rxd_pw7,          UARTC,      RSVD2,      RSVD3,        SPI4,        0x3178, N,   N,  N), +	PINGROUP(uart3_cts_n_pa1,        UARTC,      SDMMC1,     DTV,          SPI4,        0x317c, N,   N,  N), +	PINGROUP(uart3_rts_n_pc0,        UARTC,      PWM0,       DTV,          DISPLAYA,    0x3180, N,   N,  N), +	PINGROUP(pu0,                    OWR,        UARTA,      RSVD3,        RSVD4,       0x3184, N,   N,  N), +	PINGROUP(pu1,                    RSVD1,      UARTA,      RSVD3,        RSVD4,       0x3188, N,   N,  N), +	PINGROUP(pu2,                    RSVD1,      UARTA,      RSVD3,        RSVD4,       0x318c, N,   N,  N), +	PINGROUP(pu3,                    PWM0,       UARTA,      DISPLAYA,     DISPLAYB,    0x3190, N,   N,  N), +	PINGROUP(pu4,                    PWM1,       UARTA,      DISPLAYA,     DISPLAYB,    0x3194, N,   N,  N), +	PINGROUP(pu5,                    PWM2,       UARTA,      DISPLAYA,     DISPLAYB,    0x3198, N,   N,  N), +	PINGROUP(pu6,                    PWM3,       UARTA,      USB,          DISPLAYB,    0x319c, N,   N,  N), +	PINGROUP(gen1_i2c_sda_pc5,       I2C1,       RSVD2,      RSVD3,        RSVD4,       0x31a0, Y,   N,  N), +	PINGROUP(gen1_i2c_scl_pc4,       I2C1,       RSVD2,      RSVD3,        RSVD4,       0x31a4, Y,   N,  N), +	PINGROUP(dap4_fs_pp4,            I2S3,       RSVD2,      DTV,          RSVD4,       0x31a8, N,   N,  N), +	PINGROUP(dap4_din_pp5,           I2S3,       RSVD2,      RSVD3,        RSVD4,       0x31ac, N,   N,  N), +	PINGROUP(dap4_dout_pp6,          I2S3,       RSVD2,      DTV,          RSVD4,       0x31b0, N,   N,  N), +	PINGROUP(dap4_sclk_pp7,          I2S3,       RSVD2,      RSVD3,        RSVD4,       0x31b4, N,   N,  N), +	PINGROUP(clk3_out_pee0,          EXTPERIPH3, RSVD2,      RSVD3,        RSVD4,       0x31b8, N,   N,  N), +	PINGROUP(clk3_req_pee1,          DEV3,       RSVD2,      RSVD3,        RSVD4,       0x31bc, N,   N,  N), +	PINGROUP(gmi_wp_n_pc7,           RSVD1,      NAND,       GMI,          GMI_ALT,     0x31c0, N,   N,  N), +	PINGROUP(gmi_iordy_pi5,          SDMMC2,     RSVD2,      GMI,          TRACE,       0x31c4, N,   N,  N), +	PINGROUP(gmi_wait_pi7,           SPI4,       NAND,       GMI,          DTV,         0x31c8, N,   N,  N), +	PINGROUP(gmi_adv_n_pk0,          RSVD1,      NAND,       GMI,          TRACE,       0x31cc, N,   N,  N), +	PINGROUP(gmi_clk_pk1,            SDMMC2,     NAND,       GMI,          TRACE,       0x31d0, N,   N,  N), +	PINGROUP(gmi_cs0_n_pj0,          RSVD1,      NAND,       GMI,          USB,         0x31d4, N,   N,  N), +	PINGROUP(gmi_cs1_n_pj2,          RSVD1,      NAND,       GMI,          SOC,         0x31d8, N,   N,  N), +	PINGROUP(gmi_cs2_n_pk3,          SDMMC2,     NAND,       GMI,          TRACE,       0x31dc, N,   N,  N), +	PINGROUP(gmi_cs3_n_pk4,          SDMMC2,     NAND,       GMI,          GMI_ALT,     0x31e0, N,   N,  N), +	PINGROUP(gmi_cs4_n_pk2,          USB,        NAND,       GMI,          TRACE,       0x31e4, N,   N,  N), +	PINGROUP(gmi_cs6_n_pi3,          NAND,       NAND_ALT,   GMI,          SPI4,        0x31e8, N,   N,  N), +	PINGROUP(gmi_cs7_n_pi6,          NAND,       NAND_ALT,   GMI,          SDMMC2,      0x31ec, N,   N,  N), +	PINGROUP(gmi_ad0_pg0,            RSVD1,      NAND,       GMI,          RSVD4,       0x31f0, N,   N,  N), +	PINGROUP(gmi_ad1_pg1,            RSVD1,      NAND,       GMI,          RSVD4,       0x31f4, N,   N,  N), +	PINGROUP(gmi_ad2_pg2,            RSVD1,      NAND,       GMI,          RSVD4,       0x31f8, N,   N,  N), +	PINGROUP(gmi_ad3_pg3,            RSVD1,      NAND,       GMI,          RSVD4,       0x31fc, N,   N,  N), +	PINGROUP(gmi_ad4_pg4,            RSVD1,      NAND,       GMI,          RSVD4,       0x3200, N,   N,  N), +	PINGROUP(gmi_ad5_pg5,            RSVD1,      NAND,       GMI,          SPI4,        0x3204, N,   N,  N), +	PINGROUP(gmi_ad6_pg6,            RSVD1,      NAND,       GMI,          SPI4,        0x3208, N,   N,  N), +	PINGROUP(gmi_ad7_pg7,            RSVD1,      NAND,       GMI,          SPI4,        0x320c, N,   N,  N), +	PINGROUP(gmi_ad8_ph0,            PWM0,       NAND,       GMI,          DTV,         0x3210, N,   N,  N), +	PINGROUP(gmi_ad9_ph1,            PWM1,       NAND,       GMI,          CLDVFS,      0x3214, N,   N,  N), +	PINGROUP(gmi_ad10_ph2,           PWM2,       NAND,       GMI,          CLDVFS,      0x3218, N,   N,  N), +	PINGROUP(gmi_ad11_ph3,           PWM3,       NAND,       GMI,          USB,         0x321c, N,   N,  N), +	PINGROUP(gmi_ad12_ph4,           SDMMC2,     NAND,       GMI,          RSVD4,       0x3220, N,   N,  N), +	PINGROUP(gmi_ad13_ph5,           SDMMC2,     NAND,       GMI,          RSVD4,       0x3224, N,   N,  N), +	PINGROUP(gmi_ad14_ph6,           SDMMC2,     NAND,       GMI,          DTV,         0x3228, N,   N,  N), +	PINGROUP(gmi_ad15_ph7,           SDMMC2,     NAND,       GMI,          DTV,         0x322c, N,   N,  N), +	PINGROUP(gmi_a16_pj7,            UARTD,      TRACE,      GMI,          GMI_ALT,     0x3230, N,   N,  N), +	PINGROUP(gmi_a17_pb0,            UARTD,      RSVD2,      GMI,          TRACE,       0x3234, N,   N,  N), +	PINGROUP(gmi_a18_pb1,            UARTD,      RSVD2,      GMI,          TRACE,       0x3238, N,   N,  N), +	PINGROUP(gmi_a19_pk7,            UARTD,      SPI4,       GMI,          TRACE,       0x323c, N,   N,  N), +	PINGROUP(gmi_wr_n_pi0,           RSVD1,      NAND,       GMI,          SPI4,        0x3240, N,   N,  N), +	PINGROUP(gmi_oe_n_pi1,           RSVD1,      NAND,       GMI,          SOC,         0x3244, N,   N,  N), +	PINGROUP(gmi_dqs_p_pj3,          SDMMC2,     NAND,       GMI,          TRACE,       0x3248, N,   N,  N), +	PINGROUP(gmi_rst_n_pi4,          NAND,       NAND_ALT,   GMI,          RSVD4,       0x324c, N,   N,  N), +	PINGROUP(gen2_i2c_scl_pt5,       I2C2,       RSVD2,      GMI,          RSVD4,       0x3250, Y,   N,  N), +	PINGROUP(gen2_i2c_sda_pt6,       I2C2,       RSVD2,      GMI,          RSVD4,       0x3254, Y,   N,  N), +	PINGROUP(sdmmc4_clk_pcc4,        SDMMC4,     RSVD2,      GMI,          RSVD4,       0x3258, N,   Y,  N), +	PINGROUP(sdmmc4_cmd_pt7,         SDMMC4,     RSVD2,      GMI,          RSVD4,       0x325c, N,   Y,  N), +	PINGROUP(sdmmc4_dat0_paa0,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3260, N,   Y,  N), +	PINGROUP(sdmmc4_dat1_paa1,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3264, N,   Y,  N), +	PINGROUP(sdmmc4_dat2_paa2,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3268, N,   Y,  N), +	PINGROUP(sdmmc4_dat3_paa3,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x326c, N,   Y,  N), +	PINGROUP(sdmmc4_dat4_paa4,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3270, N,   Y,  N), +	PINGROUP(sdmmc4_dat5_paa5,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3274, N,   Y,  N), +	PINGROUP(sdmmc4_dat6_paa6,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3278, N,   Y,  N), +	PINGROUP(sdmmc4_dat7_paa7,       SDMMC4,     RSVD2,      GMI,          RSVD4,       0x327c, N,   Y,  N), +	PINGROUP(cam_mclk_pcc0,          VI,         VI_ALT1,    VI_ALT3,      RSVD4,       0x3284, N,   N,  N), +	PINGROUP(pcc1,                   I2S4,       RSVD2,      RSVD3,        RSVD4,       0x3288, N,   N,  N), +	PINGROUP(pbb0,                   I2S4,       VI,         VI_ALT1,      VI_ALT3,     0x328c, N,   N,  N), +	PINGROUP(cam_i2c_scl_pbb1,       VGP1,       I2C3,       RSVD3,        RSVD4,       0x3290, Y,   N,  N), +	PINGROUP(cam_i2c_sda_pbb2,       VGP2,       I2C3,       RSVD3,        RSVD4,       0x3294, Y,   N,  N), +	PINGROUP(pbb3,                   VGP3,       DISPLAYA,   DISPLAYB,     RSVD4,       0x3298, N,   N,  N), +	PINGROUP(pbb4,                   VGP4,       DISPLAYA,   DISPLAYB,     RSVD4,       0x329c, N,   N,  N), +	PINGROUP(pbb5,                   VGP5,       DISPLAYA,   DISPLAYB,     RSVD4,       0x32a0, N,   N,  N), +	PINGROUP(pbb6,                   VGP6,       DISPLAYA,   DISPLAYB,     RSVD4,       0x32a4, N,   N,  N), +	PINGROUP(pbb7,                   I2S4,       RSVD2,      RSVD3,        RSVD4,       0x32a8, N,   N,  N), +	PINGROUP(pcc2,                   I2S4,       RSVD2,      RSVD3,        RSVD4,       0x32ac, N,   N,  N), +	PINGROUP(jtag_rtck,              RTCK,       RSVD2,      RSVD3,        RSVD4,       0x32b0, N,   N,  N), +	PINGROUP(pwr_i2c_scl_pz6,        I2CPWR,     RSVD2,      RSVD3,        RSVD4,       0x32b4, Y,   N,  N), +	PINGROUP(pwr_i2c_sda_pz7,        I2CPWR,     RSVD2,      RSVD3,        RSVD4,       0x32b8, Y,   N,  N), +	PINGROUP(kb_row0_pr0,            KBC,        RSVD2,      RSVD3,        RSVD4,       0x32bc, N,   N,  N), +	PINGROUP(kb_row1_pr1,            KBC,        RSVD2,      RSVD3,        RSVD4,       0x32c0, N,   N,  N), +	PINGROUP(kb_row2_pr2,            KBC,        RSVD2,      RSVD3,        RSVD4,       0x32c4, N,   N,  N), +	PINGROUP(kb_row3_pr3,            KBC,        DISPLAYA,   RSVD3,        DISPLAYB,    0x32c8, N,   N,  N), +	PINGROUP(kb_row4_pr4,            KBC,        DISPLAYA,   SPI2,         DISPLAYB,    0x32cc, N,   N,  N), +	PINGROUP(kb_row5_pr5,            KBC,        DISPLAYA,   SPI2,         DISPLAYB,    0x32d0, N,   N,  N), +	PINGROUP(kb_row6_pr6,            KBC,        DISPLAYA,   DISPLAYA_ALT, DISPLAYB,    0x32d4, N,   N,  N), +	PINGROUP(kb_row7_pr7,            KBC,        RSVD2,      CLDVFS,       UARTA,       0x32d8, N,   N,  N), +	PINGROUP(kb_row8_ps0,            KBC,        RSVD2,      CLDVFS,       UARTA,       0x32dc, N,   N,  N), +	PINGROUP(kb_row9_ps1,            KBC,        RSVD2,      RSVD3,        UARTA,       0x32e0, N,   N,  N), +	PINGROUP(kb_row10_ps2,           KBC,        RSVD2,      RSVD3,        UARTA,       0x32e4, N,   N,  N), +	PINGROUP(kb_col0_pq0,            KBC,        USB,        SPI2,         EMC_DLL,     0x32fc, N,   N,  N), +	PINGROUP(kb_col1_pq1,            KBC,        RSVD2,      SPI2,         EMC_DLL,     0x3300, N,   N,  N), +	PINGROUP(kb_col2_pq2,            KBC,        RSVD2,      SPI2,         RSVD4,       0x3304, N,   N,  N), +	PINGROUP(kb_col3_pq3,            KBC,        DISPLAYA,   PWM2,         UARTA,       0x3308, N,   N,  N), +	PINGROUP(kb_col4_pq4,            KBC,        OWR,        SDMMC3,       UARTA,       0x330c, N,   N,  N), +	PINGROUP(kb_col5_pq5,            KBC,        RSVD2,      SDMMC1,       RSVD4,       0x3310, N,   N,  N), +	PINGROUP(kb_col6_pq6,            KBC,        RSVD2,      SPI2,         RSVD4,       0x3314, N,   N,  N), +	PINGROUP(kb_col7_pq7,            KBC,        RSVD2,      SPI2,         RSVD4,       0x3318, N,   N,  N), +	PINGROUP(clk_32k_out_pa0,        BLINK,      SOC,        RSVD3,        RSVD4,       0x331c, N,   N,  N), +	PINGROUP(sys_clk_req_pz5,        SYSCLK,     RSVD2,      RSVD3,        RSVD4,       0x3320, N,   N,  N), +	PINGROUP(core_pwr_req,           PWRON,      RSVD2,      RSVD3,        RSVD4,       0x3324, N,   N,  N), +	PINGROUP(cpu_pwr_req,            CPU,        RSVD2,      RSVD3,        RSVD4,       0x3328, N,   N,  N), +	PINGROUP(pwr_int_n,              PMI,        RSVD2,      RSVD3,        RSVD4,       0x332c, N,   N,  N), +	PINGROUP(clk_32k_in,             CLK,        RSVD2,      RSVD3,        RSVD4,       0x3330, N,   N,  N), +	PINGROUP(owr,                    OWR,        RSVD2,      RSVD3,        RSVD4,       0x3334, N,   N,  Y), +	PINGROUP(dap1_fs_pn0,            I2S0,       HDA,        GMI,          RSVD4,       0x3338, N,   N,  N), +	PINGROUP(dap1_din_pn1,           I2S0,       HDA,        GMI,          RSVD4,       0x333c, N,   N,  N), +	PINGROUP(dap1_dout_pn2,          I2S0,       HDA,        GMI,          RSVD4,       0x3340, N,   N,  N), +	PINGROUP(dap1_sclk_pn3,          I2S0,       HDA,        GMI,          RSVD4,       0x3344, N,   N,  N), +	PINGROUP(clk1_req_pee2,          DAP,        DAP1,       RSVD3,        RSVD4,       0x3348, N,   N,  N), +	PINGROUP(clk1_out_pw4,           EXTPERIPH1, DAP2,       RSVD3,        RSVD4,       0x334c, N,   N,  N), +	PINGROUP(spdif_in_pk6,           SPDIF,      USB,        RSVD3,        RSVD4,       0x3350, N,   N,  N), +	PINGROUP(spdif_out_pk5,          SPDIF,      RSVD2,      RSVD3,        RSVD4,       0x3354, N,   N,  N), +	PINGROUP(dap2_fs_pa2,            I2S1,       HDA,        RSVD3,        RSVD4,       0x3358, N,   N,  N), +	PINGROUP(dap2_din_pa4,           I2S1,       HDA,        RSVD3,        RSVD4,       0x335c, N,   N,  N), +	PINGROUP(dap2_dout_pa5,          I2S1,       HDA,        RSVD3,        RSVD4,       0x3360, N,   N,  N), +	PINGROUP(dap2_sclk_pa3,          I2S1,       HDA,        RSVD3,        RSVD4,       0x3364, N,   N,  N), +	PINGROUP(dvfs_pwm_px0,           SPI6,       CLDVFS,     RSVD3,        RSVD4,       0x3368, N,   N,  N), +	PINGROUP(gpio_x1_aud_px1,        SPI6,       RSVD2,      RSVD3,        RSVD4,       0x336c, N,   N,  N), +	PINGROUP(gpio_x3_aud_px3,        SPI6,       SPI1,       RSVD3,        RSVD4,       0x3370, N,   N,  N), +	PINGROUP(dvfs_clk_px2,           SPI6,       CLDVFS,     RSVD3,        RSVD4,       0x3374, N,   N,  N), +	PINGROUP(gpio_x4_aud_px4,        RSVD1,      SPI1,       SPI2,         DAP2,        0x3378, N,   N,  N), +	PINGROUP(gpio_x5_aud_px5,        RSVD1,      SPI1,       SPI2,         RSVD4,       0x337c, N,   N,  N), +	PINGROUP(gpio_x6_aud_px6,        SPI6,       SPI1,       SPI2,         RSVD4,       0x3380, N,   N,  N), +	PINGROUP(gpio_x7_aud_px7,        RSVD1,      SPI1,       SPI2,         RSVD4,       0x3384, N,   N,  N), +	PINGROUP(sdmmc3_clk_pa6,         SDMMC3,     RSVD2,      RSVD3,        SPI3,        0x3390, N,   N,  N), +	PINGROUP(sdmmc3_cmd_pa7,         SDMMC3,     PWM3,       UARTA,        SPI3,        0x3394, N,   N,  N), +	PINGROUP(sdmmc3_dat0_pb7,        SDMMC3,     RSVD2,      RSVD3,        SPI3,        0x3398, N,   N,  N), +	PINGROUP(sdmmc3_dat1_pb6,        SDMMC3,     PWM2,       UARTA,        SPI3,        0x339c, N,   N,  N), +	PINGROUP(sdmmc3_dat2_pb5,        SDMMC3,     PWM1,       DISPLAYA,     SPI3,        0x33a0, N,   N,  N), +	PINGROUP(sdmmc3_dat3_pb4,        SDMMC3,     PWM0,       DISPLAYB,     SPI3,        0x33a4, N,   N,  N), +	PINGROUP(hdmi_cec_pee3,          CEC,        SDMMC3,     RSVD3,        SOC,         0x33e0, Y,   N,  N), +	PINGROUP(sdmmc1_wp_n_pv3,        SDMMC1,     CLK12,      SPI4,         UARTA,       0x33e4, N,   N,  N), +	PINGROUP(sdmmc3_cd_n_pv2,        SDMMC3,     OWR,        RSVD3,        RSVD4,       0x33e8, N,   N,  N), +	PINGROUP(gpio_w2_aud_pw2,        SPI6,       RSVD2,      SPI2,         I2C1,        0x33ec, N,   N,  N), +	PINGROUP(gpio_w3_aud_pw3,        SPI6,       SPI1,       SPI2,         I2C1,        0x33f0, N,   N,  N), +	PINGROUP(usb_vbus_en0_pn4,       USB,        RSVD2,      RSVD3,        RSVD4,       0x33f4, Y,   N,  N), +	PINGROUP(usb_vbus_en1_pn5,       USB,        RSVD2,      RSVD3,        RSVD4,       0x33f8, Y,   N,  N), +	PINGROUP(sdmmc3_clk_lb_in_pee5,  SDMMC3,     RSVD2,      RSVD3,        RSVD4,       0x33fc, N,   N,  N), +	PINGROUP(sdmmc3_clk_lb_out_pee4, SDMMC3,     RSVD2,      RSVD3,        RSVD4,       0x3400, N,   N,  N), +	PINGROUP(gmi_clk_lb,             SDMMC2,     NAND,       GMI,          RSVD4,       0x3404, N,   N,  N), +	PINGROUP(reset_out_n,            RSVD1,      RSVD2,      RSVD3,        RESET_OUT_N, 0x3408, N,   N,  N),  	/* pg_name, r, hsm_b, schmitt_b, lpmd_b, drvdn_b, drvdn_w, drvup_b, drvup_w, slwr_b, slwr_w, slwf_b, slwf_w, drvtype */ -	DRV_PINGROUP(ao1,   0x868,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(ao2,   0x86c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(at1,   0x870,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), -	DRV_PINGROUP(at2,   0x874,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), -	DRV_PINGROUP(at3,   0x878,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), -	DRV_PINGROUP(at4,   0x87c,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), -	DRV_PINGROUP(at5,   0x880,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(cdev1, 0x884,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(cdev2, 0x888,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(dap1,  0x890,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(dap2,  0x894,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(dap3,  0x898,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(dap4,  0x89c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(dbg,   0x8a0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(sdio3, 0x8b0,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  N), -	DRV_PINGROUP(spi,   0x8b4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(uaa,   0x8b8,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(uab,   0x8bc,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(uart2, 0x8c0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(uart3, 0x8c4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(sdio1, 0x8ec,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  N), -	DRV_PINGROUP(ddc,   0x8fc,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(gma,   0x900,  2,  3,  4,  14,  5,  20,  5,  28,  2,  30,  2,  Y), -	DRV_PINGROUP(gme,   0x910,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(gmf,   0x914,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(gmg,   0x918,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(gmh,   0x91c,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(owr,   0x920,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), -	DRV_PINGROUP(uda,   0x924,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao1,         0x868,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao2,         0x86c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(at1,         0x870,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at2,         0x874,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at3,         0x878,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at4,         0x87c,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at5,         0x880,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(cdev1,       0x884,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(cdev2,       0x888,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap1,        0x890,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap2,        0x894,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap3,        0x898,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap4,        0x89c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dbg,         0x8a0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(sdio3,       0x8b0,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  N), +	DRV_PINGROUP(spi,         0x8b4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uaa,         0x8b8,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uab,         0x8bc,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uart2,       0x8c0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uart3,       0x8c4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(sdio1,       0x8ec,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ddc,         0x8fc,  2,  3, -1,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gma,         0x900,  2,  3, -1,  14,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gme,         0x910,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gmf,         0x914,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gmg,         0x918,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gmh,         0x91c,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(owr,         0x920,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uda,         0x924,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dev3,        0x92c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(cec,         0x938,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(at6,         0x994,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(dap5,        0x998,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(usb_vbus_en, 0x99c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao3,         0x9a0,  2,  3,  4,  12,  5,  -1, -1,  28,  2,  -1, -1,  N), +	DRV_PINGROUP(hv0,         0x9a4,  2,  3,  4,  12,  5,  -1, -1,  28,  2,  -1, -1,  N), +	DRV_PINGROUP(sdio4,       0x9a8,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao0,         0x9ac,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N),  };  static const struct tegra_pinctrl_soc_data tegra114_pinctrl = { @@ -2763,7 +1867,6 @@ static struct platform_driver tegra114_pinctrl_driver = {  };  module_platform_driver(tegra114_pinctrl_driver); -MODULE_ALIAS("platform:tegra114-pinctrl");  MODULE_AUTHOR("Pritesh Raithatha <praithatha@nvidia.com>"); -MODULE_DESCRIPTION("NVIDIA Tegra114 pincontrol driver"); +MODULE_DESCRIPTION("NVIDIA Tegra114 pinctrl driver");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-tegra124.c b/drivers/pinctrl/pinctrl-tegra124.c new file mode 100644 index 00000000000..e80797e2001 --- /dev/null +++ b/drivers/pinctrl/pinctrl-tegra124.c @@ -0,0 +1,2018 @@ +/* + * Pinctrl data for the NVIDIA Tegra124 pinmux + * + * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved. + * + * 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. + * + * This program is distributed in the hope 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 <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/pinctrl/pinmux.h> + +#include "pinctrl-tegra.h" + +/* + * Most pins affected by the pinmux can also be GPIOs. Define these first. + * These must match how the GPIO driver names/numbers its pins. + */ +#define _GPIO(offset)				(offset) + +#define TEGRA_PIN_CLK_32K_OUT_PA0		_GPIO(0) +#define TEGRA_PIN_UART3_CTS_N_PA1		_GPIO(1) +#define TEGRA_PIN_DAP2_FS_PA2			_GPIO(2) +#define TEGRA_PIN_DAP2_SCLK_PA3			_GPIO(3) +#define TEGRA_PIN_DAP2_DIN_PA4			_GPIO(4) +#define TEGRA_PIN_DAP2_DOUT_PA5			_GPIO(5) +#define TEGRA_PIN_SDMMC3_CLK_PA6		_GPIO(6) +#define TEGRA_PIN_SDMMC3_CMD_PA7		_GPIO(7) +#define TEGRA_PIN_PB0				_GPIO(8) +#define TEGRA_PIN_PB1				_GPIO(9) +#define TEGRA_PIN_SDMMC3_DAT3_PB4		_GPIO(12) +#define TEGRA_PIN_SDMMC3_DAT2_PB5		_GPIO(13) +#define TEGRA_PIN_SDMMC3_DAT1_PB6		_GPIO(14) +#define TEGRA_PIN_SDMMC3_DAT0_PB7		_GPIO(15) +#define TEGRA_PIN_UART3_RTS_N_PC0		_GPIO(16) +#define TEGRA_PIN_UART2_TXD_PC2			_GPIO(18) +#define TEGRA_PIN_UART2_RXD_PC3			_GPIO(19) +#define TEGRA_PIN_GEN1_I2C_SCL_PC4		_GPIO(20) +#define TEGRA_PIN_GEN1_I2C_SDA_PC5		_GPIO(21) +#define TEGRA_PIN_PC7				_GPIO(23) +#define TEGRA_PIN_PG0				_GPIO(48) +#define TEGRA_PIN_PG1				_GPIO(49) +#define TEGRA_PIN_PG2				_GPIO(50) +#define TEGRA_PIN_PG3				_GPIO(51) +#define TEGRA_PIN_PG4				_GPIO(52) +#define TEGRA_PIN_PG5				_GPIO(53) +#define TEGRA_PIN_PG6				_GPIO(54) +#define TEGRA_PIN_PG7				_GPIO(55) +#define TEGRA_PIN_PH0				_GPIO(56) +#define TEGRA_PIN_PH1				_GPIO(57) +#define TEGRA_PIN_PH2				_GPIO(58) +#define TEGRA_PIN_PH3				_GPIO(59) +#define TEGRA_PIN_PH4				_GPIO(60) +#define TEGRA_PIN_PH5				_GPIO(61) +#define TEGRA_PIN_PH6				_GPIO(62) +#define TEGRA_PIN_PH7				_GPIO(63) +#define TEGRA_PIN_PI0				_GPIO(64) +#define TEGRA_PIN_PI1				_GPIO(65) +#define TEGRA_PIN_PI2				_GPIO(66) +#define TEGRA_PIN_PI3				_GPIO(67) +#define TEGRA_PIN_PI4				_GPIO(68) +#define TEGRA_PIN_PI5				_GPIO(69) +#define TEGRA_PIN_PI6				_GPIO(70) +#define TEGRA_PIN_PI7				_GPIO(71) +#define TEGRA_PIN_PJ0				_GPIO(72) +#define TEGRA_PIN_PJ2				_GPIO(74) +#define TEGRA_PIN_UART2_CTS_N_PJ5		_GPIO(77) +#define TEGRA_PIN_UART2_RTS_N_PJ6		_GPIO(78) +#define TEGRA_PIN_PJ7				_GPIO(79) +#define TEGRA_PIN_PK0				_GPIO(80) +#define TEGRA_PIN_PK1				_GPIO(81) +#define TEGRA_PIN_PK2				_GPIO(82) +#define TEGRA_PIN_PK3				_GPIO(83) +#define TEGRA_PIN_PK4				_GPIO(84) +#define TEGRA_PIN_SPDIF_OUT_PK5			_GPIO(85) +#define TEGRA_PIN_SPDIF_IN_PK6			_GPIO(86) +#define TEGRA_PIN_PK7				_GPIO(87) +#define TEGRA_PIN_DAP1_FS_PN0			_GPIO(104) +#define TEGRA_PIN_DAP1_DIN_PN1			_GPIO(105) +#define TEGRA_PIN_DAP1_DOUT_PN2			_GPIO(106) +#define TEGRA_PIN_DAP1_SCLK_PN3			_GPIO(107) +#define TEGRA_PIN_USB_VBUS_EN0_PN4		_GPIO(108) +#define TEGRA_PIN_USB_VBUS_EN1_PN5		_GPIO(109) +#define TEGRA_PIN_HDMI_INT_PN7			_GPIO(111) +#define TEGRA_PIN_ULPI_DATA7_PO0		_GPIO(112) +#define TEGRA_PIN_ULPI_DATA0_PO1		_GPIO(113) +#define TEGRA_PIN_ULPI_DATA1_PO2		_GPIO(114) +#define TEGRA_PIN_ULPI_DATA2_PO3		_GPIO(115) +#define TEGRA_PIN_ULPI_DATA3_PO4		_GPIO(116) +#define TEGRA_PIN_ULPI_DATA4_PO5		_GPIO(117) +#define TEGRA_PIN_ULPI_DATA5_PO6		_GPIO(118) +#define TEGRA_PIN_ULPI_DATA6_PO7		_GPIO(119) +#define TEGRA_PIN_DAP3_FS_PP0			_GPIO(120) +#define TEGRA_PIN_DAP3_DIN_PP1			_GPIO(121) +#define TEGRA_PIN_DAP3_DOUT_PP2			_GPIO(122) +#define TEGRA_PIN_DAP3_SCLK_PP3			_GPIO(123) +#define TEGRA_PIN_DAP4_FS_PP4			_GPIO(124) +#define TEGRA_PIN_DAP4_DIN_PP5			_GPIO(125) +#define TEGRA_PIN_DAP4_DOUT_PP6			_GPIO(126) +#define TEGRA_PIN_DAP4_SCLK_PP7			_GPIO(127) +#define TEGRA_PIN_KB_COL0_PQ0			_GPIO(128) +#define TEGRA_PIN_KB_COL1_PQ1			_GPIO(129) +#define TEGRA_PIN_KB_COL2_PQ2			_GPIO(130) +#define TEGRA_PIN_KB_COL3_PQ3			_GPIO(131) +#define TEGRA_PIN_KB_COL4_PQ4			_GPIO(132) +#define TEGRA_PIN_KB_COL5_PQ5			_GPIO(133) +#define TEGRA_PIN_KB_COL6_PQ6			_GPIO(134) +#define TEGRA_PIN_KB_COL7_PQ7			_GPIO(135) +#define TEGRA_PIN_KB_ROW0_PR0			_GPIO(136) +#define TEGRA_PIN_KB_ROW1_PR1			_GPIO(137) +#define TEGRA_PIN_KB_ROW2_PR2			_GPIO(138) +#define TEGRA_PIN_KB_ROW3_PR3			_GPIO(139) +#define TEGRA_PIN_KB_ROW4_PR4			_GPIO(140) +#define TEGRA_PIN_KB_ROW5_PR5			_GPIO(141) +#define TEGRA_PIN_KB_ROW6_PR6			_GPIO(142) +#define TEGRA_PIN_KB_ROW7_PR7			_GPIO(143) +#define TEGRA_PIN_KB_ROW8_PS0			_GPIO(144) +#define TEGRA_PIN_KB_ROW9_PS1			_GPIO(145) +#define TEGRA_PIN_KB_ROW10_PS2			_GPIO(146) +#define TEGRA_PIN_KB_ROW11_PS3			_GPIO(147) +#define TEGRA_PIN_KB_ROW12_PS4			_GPIO(148) +#define TEGRA_PIN_KB_ROW13_PS5			_GPIO(149) +#define TEGRA_PIN_KB_ROW14_PS6			_GPIO(150) +#define TEGRA_PIN_KB_ROW15_PS7			_GPIO(151) +#define TEGRA_PIN_KB_ROW16_PT0			_GPIO(152) +#define TEGRA_PIN_KB_ROW17_PT1			_GPIO(153) +#define TEGRA_PIN_GEN2_I2C_SCL_PT5		_GPIO(157) +#define TEGRA_PIN_GEN2_I2C_SDA_PT6		_GPIO(158) +#define TEGRA_PIN_SDMMC4_CMD_PT7		_GPIO(159) +#define TEGRA_PIN_PU0				_GPIO(160) +#define TEGRA_PIN_PU1				_GPIO(161) +#define TEGRA_PIN_PU2				_GPIO(162) +#define TEGRA_PIN_PU3				_GPIO(163) +#define TEGRA_PIN_PU4				_GPIO(164) +#define TEGRA_PIN_PU5				_GPIO(165) +#define TEGRA_PIN_PU6				_GPIO(166) +#define TEGRA_PIN_PV0				_GPIO(168) +#define TEGRA_PIN_PV1				_GPIO(169) +#define TEGRA_PIN_SDMMC3_CD_N_PV2		_GPIO(170) +#define TEGRA_PIN_SDMMC1_WP_N_PV3		_GPIO(171) +#define TEGRA_PIN_DDC_SCL_PV4			_GPIO(172) +#define TEGRA_PIN_DDC_SDA_PV5			_GPIO(173) +#define TEGRA_PIN_GPIO_W2_AUD_PW2		_GPIO(178) +#define TEGRA_PIN_GPIO_W3_AUD_PW3		_GPIO(179) +#define TEGRA_PIN_DAP_MCLK1_PW4			_GPIO(180) +#define TEGRA_PIN_CLK2_OUT_PW5			_GPIO(181) +#define TEGRA_PIN_UART3_TXD_PW6			_GPIO(182) +#define TEGRA_PIN_UART3_RXD_PW7			_GPIO(183) +#define TEGRA_PIN_DVFS_PWM_PX0			_GPIO(184) +#define TEGRA_PIN_GPIO_X1_AUD_PX1		_GPIO(185) +#define TEGRA_PIN_DVFS_CLK_PX2			_GPIO(186) +#define TEGRA_PIN_GPIO_X3_AUD_PX3		_GPIO(187) +#define TEGRA_PIN_GPIO_X4_AUD_PX4		_GPIO(188) +#define TEGRA_PIN_GPIO_X5_AUD_PX5		_GPIO(189) +#define TEGRA_PIN_GPIO_X6_AUD_PX6		_GPIO(190) +#define TEGRA_PIN_GPIO_X7_AUD_PX7		_GPIO(191) +#define TEGRA_PIN_ULPI_CLK_PY0			_GPIO(192) +#define TEGRA_PIN_ULPI_DIR_PY1			_GPIO(193) +#define TEGRA_PIN_ULPI_NXT_PY2			_GPIO(194) +#define TEGRA_PIN_ULPI_STP_PY3			_GPIO(195) +#define TEGRA_PIN_SDMMC1_DAT3_PY4		_GPIO(196) +#define TEGRA_PIN_SDMMC1_DAT2_PY5		_GPIO(197) +#define TEGRA_PIN_SDMMC1_DAT1_PY6		_GPIO(198) +#define TEGRA_PIN_SDMMC1_DAT0_PY7		_GPIO(199) +#define TEGRA_PIN_SDMMC1_CLK_PZ0		_GPIO(200) +#define TEGRA_PIN_SDMMC1_CMD_PZ1		_GPIO(201) +#define TEGRA_PIN_PWR_I2C_SCL_PZ6		_GPIO(206) +#define TEGRA_PIN_PWR_I2C_SDA_PZ7		_GPIO(207) +#define TEGRA_PIN_SDMMC4_DAT0_PAA0		_GPIO(208) +#define TEGRA_PIN_SDMMC4_DAT1_PAA1		_GPIO(209) +#define TEGRA_PIN_SDMMC4_DAT2_PAA2		_GPIO(210) +#define TEGRA_PIN_SDMMC4_DAT3_PAA3		_GPIO(211) +#define TEGRA_PIN_SDMMC4_DAT4_PAA4		_GPIO(212) +#define TEGRA_PIN_SDMMC4_DAT5_PAA5		_GPIO(213) +#define TEGRA_PIN_SDMMC4_DAT6_PAA6		_GPIO(214) +#define TEGRA_PIN_SDMMC4_DAT7_PAA7		_GPIO(215) +#define TEGRA_PIN_PBB0				_GPIO(216) +#define TEGRA_PIN_CAM_I2C_SCL_PBB1		_GPIO(217) +#define TEGRA_PIN_CAM_I2C_SDA_PBB2		_GPIO(218) +#define TEGRA_PIN_PBB3				_GPIO(219) +#define TEGRA_PIN_PBB4				_GPIO(220) +#define TEGRA_PIN_PBB5				_GPIO(221) +#define TEGRA_PIN_PBB6				_GPIO(222) +#define TEGRA_PIN_PBB7				_GPIO(223) +#define TEGRA_PIN_CAM_MCLK_PCC0			_GPIO(224) +#define TEGRA_PIN_PCC1				_GPIO(225) +#define TEGRA_PIN_PCC2				_GPIO(226) +#define TEGRA_PIN_SDMMC4_CLK_PCC4		_GPIO(228) +#define TEGRA_PIN_CLK2_REQ_PCC5			_GPIO(229) +#define TEGRA_PIN_PEX_L0_RST_N_PDD1		_GPIO(233) +#define TEGRA_PIN_PEX_L0_CLKREQ_N_PDD2		_GPIO(234) +#define TEGRA_PIN_PEX_WAKE_N_PDD3		_GPIO(235) +#define TEGRA_PIN_PEX_L1_RST_N_PDD5		_GPIO(237) +#define TEGRA_PIN_PEX_L1_CLKREQ_N_PDD6		_GPIO(238) +#define TEGRA_PIN_CLK3_OUT_PEE0			_GPIO(240) +#define TEGRA_PIN_CLK3_REQ_PEE1			_GPIO(241) +#define TEGRA_PIN_DAP_MCLK1_REQ_PEE2		_GPIO(242) +#define TEGRA_PIN_HDMI_CEC_PEE3			_GPIO(243) +#define TEGRA_PIN_SDMMC3_CLK_LB_OUT_PEE4	_GPIO(244) +#define TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5		_GPIO(245) +#define TEGRA_PIN_DP_HPD_PFF0			_GPIO(248) +#define TEGRA_PIN_USB_VBUS_EN2_PFF1		_GPIO(249) +#define TEGRA_PIN_PFF2				_GPIO(250) + +/* All non-GPIO pins follow */ +#define NUM_GPIOS				(TEGRA_PIN_PFF2 + 1) +#define _PIN(offset)				(NUM_GPIOS + (offset)) + +/* Non-GPIO pins */ +#define TEGRA_PIN_CORE_PWR_REQ			_PIN(0) +#define TEGRA_PIN_CPU_PWR_REQ			_PIN(1) +#define TEGRA_PIN_PWR_INT_N			_PIN(2) +#define TEGRA_PIN_GMI_CLK_LB			_PIN(3) +#define TEGRA_PIN_RESET_OUT_N			_PIN(4) +#define TEGRA_PIN_OWR				_PIN(5) +#define TEGRA_PIN_CLK_32K_IN			_PIN(6) +#define TEGRA_PIN_JTAG_RTCK			_PIN(7) + +static const struct pinctrl_pin_desc tegra124_pins[] = { +	PINCTRL_PIN(TEGRA_PIN_CLK_32K_OUT_PA0, "CLK_32K_OUT PA0"), +	PINCTRL_PIN(TEGRA_PIN_UART3_CTS_N_PA1, "UART3_CTS_N PA1"), +	PINCTRL_PIN(TEGRA_PIN_DAP2_FS_PA2, "DAP2_FS PA2"), +	PINCTRL_PIN(TEGRA_PIN_DAP2_SCLK_PA3, "DAP2_SCLK PA3"), +	PINCTRL_PIN(TEGRA_PIN_DAP2_DIN_PA4, "DAP2_DIN PA4"), +	PINCTRL_PIN(TEGRA_PIN_DAP2_DOUT_PA5, "DAP2_DOUT PA5"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_CLK_PA6, "SDMMC3_CLK PA6"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_CMD_PA7, "SDMMC3_CMD PA7"), +	PINCTRL_PIN(TEGRA_PIN_PB0, "PB0"), +	PINCTRL_PIN(TEGRA_PIN_PB1, "PB1"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_DAT3_PB4, "SDMMC3_DAT3 PB4"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_DAT2_PB5, "SDMMC3_DAT2 PB5"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_DAT1_PB6, "SDMMC3_DAT1 PB6"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_DAT0_PB7, "SDMMC3_DAT0 PB7"), +	PINCTRL_PIN(TEGRA_PIN_UART3_RTS_N_PC0, "UART3_RTS_N PC0"), +	PINCTRL_PIN(TEGRA_PIN_UART2_TXD_PC2, "UART2_TXD PC2"), +	PINCTRL_PIN(TEGRA_PIN_UART2_RXD_PC3, "UART2_RXD PC3"), +	PINCTRL_PIN(TEGRA_PIN_GEN1_I2C_SCL_PC4, "GEN1_I2C_SCL PC4"), +	PINCTRL_PIN(TEGRA_PIN_GEN1_I2C_SDA_PC5, "GEN1_I2C_SDA PC5"), +	PINCTRL_PIN(TEGRA_PIN_PC7, "PC7"), +	PINCTRL_PIN(TEGRA_PIN_PG0, "PG0"), +	PINCTRL_PIN(TEGRA_PIN_PG1, "PG1"), +	PINCTRL_PIN(TEGRA_PIN_PG2, "PG2"), +	PINCTRL_PIN(TEGRA_PIN_PG3, "PG3"), +	PINCTRL_PIN(TEGRA_PIN_PG4, "PG4"), +	PINCTRL_PIN(TEGRA_PIN_PG5, "PG5"), +	PINCTRL_PIN(TEGRA_PIN_PG6, "PG6"), +	PINCTRL_PIN(TEGRA_PIN_PG7, "PG7"), +	PINCTRL_PIN(TEGRA_PIN_PH0, "PH0"), +	PINCTRL_PIN(TEGRA_PIN_PH1, "PH1"), +	PINCTRL_PIN(TEGRA_PIN_PH2, "PH2"), +	PINCTRL_PIN(TEGRA_PIN_PH3, "PH3"), +	PINCTRL_PIN(TEGRA_PIN_PH4, "PH4"), +	PINCTRL_PIN(TEGRA_PIN_PH5, "PH5"), +	PINCTRL_PIN(TEGRA_PIN_PH6, "PH6"), +	PINCTRL_PIN(TEGRA_PIN_PH7, "PH7"), +	PINCTRL_PIN(TEGRA_PIN_PI0, "PI0"), +	PINCTRL_PIN(TEGRA_PIN_PI1, "PI1"), +	PINCTRL_PIN(TEGRA_PIN_PI2, "PI2"), +	PINCTRL_PIN(TEGRA_PIN_PI3, "PI3"), +	PINCTRL_PIN(TEGRA_PIN_PI4, "PI4"), +	PINCTRL_PIN(TEGRA_PIN_PI5, "PI5"), +	PINCTRL_PIN(TEGRA_PIN_PI6, "PI6"), +	PINCTRL_PIN(TEGRA_PIN_PI7, "PI7"), +	PINCTRL_PIN(TEGRA_PIN_PJ0, "PJ0"), +	PINCTRL_PIN(TEGRA_PIN_PJ2, "PJ2"), +	PINCTRL_PIN(TEGRA_PIN_UART2_CTS_N_PJ5, "UART2_CTS_N PJ5"), +	PINCTRL_PIN(TEGRA_PIN_UART2_RTS_N_PJ6, "UART2_RTS_N PJ6"), +	PINCTRL_PIN(TEGRA_PIN_PJ7, "PJ7"), +	PINCTRL_PIN(TEGRA_PIN_PK0, "PK0"), +	PINCTRL_PIN(TEGRA_PIN_PK1, "PK1"), +	PINCTRL_PIN(TEGRA_PIN_PK2, "PK2"), +	PINCTRL_PIN(TEGRA_PIN_PK3, "PK3"), +	PINCTRL_PIN(TEGRA_PIN_PK4, "PK4"), +	PINCTRL_PIN(TEGRA_PIN_SPDIF_OUT_PK5, "SPDIF_OUT PK5"), +	PINCTRL_PIN(TEGRA_PIN_SPDIF_IN_PK6, "SPDIF_IN PK6"), +	PINCTRL_PIN(TEGRA_PIN_PK7, "PK7"), +	PINCTRL_PIN(TEGRA_PIN_DAP1_FS_PN0, "DAP1_FS PN0"), +	PINCTRL_PIN(TEGRA_PIN_DAP1_DIN_PN1, "DAP1_DIN PN1"), +	PINCTRL_PIN(TEGRA_PIN_DAP1_DOUT_PN2, "DAP1_DOUT PN2"), +	PINCTRL_PIN(TEGRA_PIN_DAP1_SCLK_PN3, "DAP1_SCLK PN3"), +	PINCTRL_PIN(TEGRA_PIN_USB_VBUS_EN0_PN4, "USB_VBUS_EN0 PN4"), +	PINCTRL_PIN(TEGRA_PIN_USB_VBUS_EN1_PN5, "USB_VBUS_EN1 PN5"), +	PINCTRL_PIN(TEGRA_PIN_HDMI_INT_PN7, "HDMI_INT PN7"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA7_PO0, "ULPI_DATA7 PO0"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA0_PO1, "ULPI_DATA0 PO1"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA1_PO2, "ULPI_DATA1 PO2"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA2_PO3, "ULPI_DATA2 PO3"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA3_PO4, "ULPI_DATA3 PO4"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA4_PO5, "ULPI_DATA4 PO5"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA5_PO6, "ULPI_DATA5 PO6"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DATA6_PO7, "ULPI_DATA6 PO7"), +	PINCTRL_PIN(TEGRA_PIN_DAP3_FS_PP0, "DAP3_FS PP0"), +	PINCTRL_PIN(TEGRA_PIN_DAP3_DIN_PP1, "DAP3_DIN PP1"), +	PINCTRL_PIN(TEGRA_PIN_DAP3_DOUT_PP2, "DAP3_DOUT PP2"), +	PINCTRL_PIN(TEGRA_PIN_DAP3_SCLK_PP3, "DAP3_SCLK PP3"), +	PINCTRL_PIN(TEGRA_PIN_DAP4_FS_PP4, "DAP4_FS PP4"), +	PINCTRL_PIN(TEGRA_PIN_DAP4_DIN_PP5, "DAP4_DIN PP5"), +	PINCTRL_PIN(TEGRA_PIN_DAP4_DOUT_PP6, "DAP4_DOUT PP6"), +	PINCTRL_PIN(TEGRA_PIN_DAP4_SCLK_PP7, "DAP4_SCLK PP7"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL0_PQ0, "KB_COL0 PQ0"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL1_PQ1, "KB_COL1 PQ1"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL2_PQ2, "KB_COL2 PQ2"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL3_PQ3, "KB_COL3 PQ3"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL4_PQ4, "KB_COL4 PQ4"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL5_PQ5, "KB_COL5 PQ5"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL6_PQ6, "KB_COL6 PQ6"), +	PINCTRL_PIN(TEGRA_PIN_KB_COL7_PQ7, "KB_COL7 PQ7"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW0_PR0, "KB_ROW0 PR0"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW1_PR1, "KB_ROW1 PR1"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW2_PR2, "KB_ROW2 PR2"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW3_PR3, "KB_ROW3 PR3"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW4_PR4, "KB_ROW4 PR4"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW5_PR5, "KB_ROW5 PR5"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW6_PR6, "KB_ROW6 PR6"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW7_PR7, "KB_ROW7 PR7"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW8_PS0, "KB_ROW8 PS0"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW9_PS1, "KB_ROW9 PS1"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW10_PS2, "KB_ROW10 PS2"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW11_PS3, "KB_ROW11 PS3"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW12_PS4, "KB_ROW12 PS4"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW13_PS5, "KB_ROW13 PS5"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW14_PS6, "KB_ROW14 PS6"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW15_PS7, "KB_ROW15 PS7"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW16_PT0, "KB_ROW16 PT0"), +	PINCTRL_PIN(TEGRA_PIN_KB_ROW17_PT1, "KB_ROW17 PT1"), +	PINCTRL_PIN(TEGRA_PIN_GEN2_I2C_SCL_PT5, "GEN2_I2C_SCL PT5"), +	PINCTRL_PIN(TEGRA_PIN_GEN2_I2C_SDA_PT6, "GEN2_I2C_SDA PT6"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_CMD_PT7, "SDMMC4_CMD PT7"), +	PINCTRL_PIN(TEGRA_PIN_PU0, "PU0"), +	PINCTRL_PIN(TEGRA_PIN_PU1, "PU1"), +	PINCTRL_PIN(TEGRA_PIN_PU2, "PU2"), +	PINCTRL_PIN(TEGRA_PIN_PU3, "PU3"), +	PINCTRL_PIN(TEGRA_PIN_PU4, "PU4"), +	PINCTRL_PIN(TEGRA_PIN_PU5, "PU5"), +	PINCTRL_PIN(TEGRA_PIN_PU6, "PU6"), +	PINCTRL_PIN(TEGRA_PIN_PV0, "PV0"), +	PINCTRL_PIN(TEGRA_PIN_PV1, "PV1"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_CD_N_PV2, "SDMMC3_CD_N PV2"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_WP_N_PV3, "SDMMC1_WP_N PV3"), +	PINCTRL_PIN(TEGRA_PIN_DDC_SCL_PV4, "DDC_SCL PV4"), +	PINCTRL_PIN(TEGRA_PIN_DDC_SDA_PV5, "DDC_SDA PV5"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_W2_AUD_PW2, "GPIO_W2_AUD PW2"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_W3_AUD_PW3, "GPIO_W3_AUD PW3"), +	PINCTRL_PIN(TEGRA_PIN_DAP_MCLK1_PW4, "DAP_MCLK1 PW4"), +	PINCTRL_PIN(TEGRA_PIN_CLK2_OUT_PW5, "CLK2_OUT PW5"), +	PINCTRL_PIN(TEGRA_PIN_UART3_TXD_PW6, "UART3_TXD PW6"), +	PINCTRL_PIN(TEGRA_PIN_UART3_RXD_PW7, "UART3_RXD PW7"), +	PINCTRL_PIN(TEGRA_PIN_DVFS_PWM_PX0, "DVFS_PWM PX0"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_X1_AUD_PX1, "GPIO_X1_AUD PX1"), +	PINCTRL_PIN(TEGRA_PIN_DVFS_CLK_PX2, "DVFS_CLK PX2"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_X3_AUD_PX3, "GPIO_X3_AUD PX3"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_X4_AUD_PX4, "GPIO_X4_AUD PX4"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_X5_AUD_PX5, "GPIO_X5_AUD PX5"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_X6_AUD_PX6, "GPIO_X6_AUD PX6"), +	PINCTRL_PIN(TEGRA_PIN_GPIO_X7_AUD_PX7, "GPIO_X7_AUD PX7"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_CLK_PY0, "ULPI_CLK PY0"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_DIR_PY1, "ULPI_DIR PY1"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_NXT_PY2, "ULPI_NXT PY2"), +	PINCTRL_PIN(TEGRA_PIN_ULPI_STP_PY3, "ULPI_STP PY3"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_DAT3_PY4, "SDMMC1_DAT3 PY4"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_DAT2_PY5, "SDMMC1_DAT2 PY5"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_DAT1_PY6, "SDMMC1_DAT1 PY6"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_DAT0_PY7, "SDMMC1_DAT0 PY7"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_CLK_PZ0, "SDMMC1_CLK PZ0"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC1_CMD_PZ1, "SDMMC1_CMD PZ1"), +	PINCTRL_PIN(TEGRA_PIN_PWR_I2C_SCL_PZ6, "PWR_I2C_SCL PZ6"), +	PINCTRL_PIN(TEGRA_PIN_PWR_I2C_SDA_PZ7, "PWR_I2C_SDA PZ7"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT0_PAA0, "SDMMC4_DAT0 PAA0"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT1_PAA1, "SDMMC4_DAT1 PAA1"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT2_PAA2, "SDMMC4_DAT2 PAA2"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT3_PAA3, "SDMMC4_DAT3 PAA3"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT4_PAA4, "SDMMC4_DAT4 PAA4"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT5_PAA5, "SDMMC4_DAT5 PAA5"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT6_PAA6, "SDMMC4_DAT6 PAA6"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_DAT7_PAA7, "SDMMC4_DAT7 PAA7"), +	PINCTRL_PIN(TEGRA_PIN_PBB0, "PBB0"), +	PINCTRL_PIN(TEGRA_PIN_CAM_I2C_SCL_PBB1, "CAM_I2C_SCL PBB1"), +	PINCTRL_PIN(TEGRA_PIN_CAM_I2C_SDA_PBB2, "CAM_I2C_SDA PBB2"), +	PINCTRL_PIN(TEGRA_PIN_PBB3, "PBB3"), +	PINCTRL_PIN(TEGRA_PIN_PBB4, "PBB4"), +	PINCTRL_PIN(TEGRA_PIN_PBB5, "PBB5"), +	PINCTRL_PIN(TEGRA_PIN_PBB6, "PBB6"), +	PINCTRL_PIN(TEGRA_PIN_PBB7, "PBB7"), +	PINCTRL_PIN(TEGRA_PIN_CAM_MCLK_PCC0, "CAM_MCLK PCC0"), +	PINCTRL_PIN(TEGRA_PIN_PCC1, "PCC1"), +	PINCTRL_PIN(TEGRA_PIN_PCC2, "PCC2"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC4_CLK_PCC4, "SDMMC4_CLK PCC4"), +	PINCTRL_PIN(TEGRA_PIN_CLK2_REQ_PCC5, "CLK2_REQ PCC5"), +	PINCTRL_PIN(TEGRA_PIN_PEX_L0_RST_N_PDD1, "PEX_L0_RST_N PDD1"), +	PINCTRL_PIN(TEGRA_PIN_PEX_L0_CLKREQ_N_PDD2, "PEX_L0_CLKREQ_N PDD2"), +	PINCTRL_PIN(TEGRA_PIN_PEX_WAKE_N_PDD3, "PEX_WAKE_N PDD3"), +	PINCTRL_PIN(TEGRA_PIN_PEX_L1_RST_N_PDD5, "PEX_L1_RST_N PDD5"), +	PINCTRL_PIN(TEGRA_PIN_PEX_L1_CLKREQ_N_PDD6, "PEX_L1_CLKREQ_N PDD6"), +	PINCTRL_PIN(TEGRA_PIN_CLK3_OUT_PEE0, "CLK3_OUT PEE0"), +	PINCTRL_PIN(TEGRA_PIN_CLK3_REQ_PEE1, "CLK3_REQ PEE1"), +	PINCTRL_PIN(TEGRA_PIN_DAP_MCLK1_REQ_PEE2, "DAP_MCLK1_REQ PEE2"), +	PINCTRL_PIN(TEGRA_PIN_HDMI_CEC_PEE3, "HDMI_CEC PEE3"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_CLK_LB_OUT_PEE4, "SDMMC3_CLK_LB_OUT PEE4"), +	PINCTRL_PIN(TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5, "SDMMC3_CLK_LB_IN PEE5"), +	PINCTRL_PIN(TEGRA_PIN_DP_HPD_PFF0, "DP_HPD PFF0"), +	PINCTRL_PIN(TEGRA_PIN_USB_VBUS_EN2_PFF1, "USB_VBUS_EN2 PFF1"), +	PINCTRL_PIN(TEGRA_PIN_PFF2, "PFF2"), +	PINCTRL_PIN(TEGRA_PIN_CORE_PWR_REQ, "CORE_PWR_REQ"), +	PINCTRL_PIN(TEGRA_PIN_CPU_PWR_REQ, "CPU_PWR_REQ"), +	PINCTRL_PIN(TEGRA_PIN_PWR_INT_N, "PWR_INT_N"), +	PINCTRL_PIN(TEGRA_PIN_GMI_CLK_LB, "GMI_CLK_LB"), +	PINCTRL_PIN(TEGRA_PIN_RESET_OUT_N, "RESET_OUT_N"), +	PINCTRL_PIN(TEGRA_PIN_OWR, "OWR"), +	PINCTRL_PIN(TEGRA_PIN_CLK_32K_IN, "CLK_32K_IN"), +	PINCTRL_PIN(TEGRA_PIN_JTAG_RTCK, "JTAG_RTCK"), +}; + +static const unsigned clk_32k_out_pa0_pins[] = { +	TEGRA_PIN_CLK_32K_OUT_PA0, +}; + +static const unsigned uart3_cts_n_pa1_pins[] = { +	TEGRA_PIN_UART3_CTS_N_PA1, +}; + +static const unsigned dap2_fs_pa2_pins[] = { +	TEGRA_PIN_DAP2_FS_PA2, +}; + +static const unsigned dap2_sclk_pa3_pins[] = { +	TEGRA_PIN_DAP2_SCLK_PA3, +}; + +static const unsigned dap2_din_pa4_pins[] = { +	TEGRA_PIN_DAP2_DIN_PA4, +}; + +static const unsigned dap2_dout_pa5_pins[] = { +	TEGRA_PIN_DAP2_DOUT_PA5, +}; + +static const unsigned sdmmc3_clk_pa6_pins[] = { +	TEGRA_PIN_SDMMC3_CLK_PA6, +}; + +static const unsigned sdmmc3_cmd_pa7_pins[] = { +	TEGRA_PIN_SDMMC3_CMD_PA7, +}; + +static const unsigned pb0_pins[] = { +	TEGRA_PIN_PB0, +}; + +static const unsigned pb1_pins[] = { +	TEGRA_PIN_PB1, +}; + +static const unsigned sdmmc3_dat3_pb4_pins[] = { +	TEGRA_PIN_SDMMC3_DAT3_PB4, +}; + +static const unsigned sdmmc3_dat2_pb5_pins[] = { +	TEGRA_PIN_SDMMC3_DAT2_PB5, +}; + +static const unsigned sdmmc3_dat1_pb6_pins[] = { +	TEGRA_PIN_SDMMC3_DAT1_PB6, +}; + +static const unsigned sdmmc3_dat0_pb7_pins[] = { +	TEGRA_PIN_SDMMC3_DAT0_PB7, +}; + +static const unsigned uart3_rts_n_pc0_pins[] = { +	TEGRA_PIN_UART3_RTS_N_PC0, +}; + +static const unsigned uart2_txd_pc2_pins[] = { +	TEGRA_PIN_UART2_TXD_PC2, +}; + +static const unsigned uart2_rxd_pc3_pins[] = { +	TEGRA_PIN_UART2_RXD_PC3, +}; + +static const unsigned gen1_i2c_scl_pc4_pins[] = { +	TEGRA_PIN_GEN1_I2C_SCL_PC4, +}; + +static const unsigned gen1_i2c_sda_pc5_pins[] = { +	TEGRA_PIN_GEN1_I2C_SDA_PC5, +}; + +static const unsigned pc7_pins[] = { +	TEGRA_PIN_PC7, +}; + +static const unsigned pg0_pins[] = { +	TEGRA_PIN_PG0, +}; + +static const unsigned pg1_pins[] = { +	TEGRA_PIN_PG1, +}; + +static const unsigned pg2_pins[] = { +	TEGRA_PIN_PG2, +}; + +static const unsigned pg3_pins[] = { +	TEGRA_PIN_PG3, +}; + +static const unsigned pg4_pins[] = { +	TEGRA_PIN_PG4, +}; + +static const unsigned pg5_pins[] = { +	TEGRA_PIN_PG5, +}; + +static const unsigned pg6_pins[] = { +	TEGRA_PIN_PG6, +}; + +static const unsigned pg7_pins[] = { +	TEGRA_PIN_PG7, +}; + +static const unsigned ph0_pins[] = { +	TEGRA_PIN_PH0, +}; + +static const unsigned ph1_pins[] = { +	TEGRA_PIN_PH1, +}; + +static const unsigned ph2_pins[] = { +	TEGRA_PIN_PH2, +}; + +static const unsigned ph3_pins[] = { +	TEGRA_PIN_PH3, +}; + +static const unsigned ph4_pins[] = { +	TEGRA_PIN_PH4, +}; + +static const unsigned ph5_pins[] = { +	TEGRA_PIN_PH5, +}; + +static const unsigned ph6_pins[] = { +	TEGRA_PIN_PH6, +}; + +static const unsigned ph7_pins[] = { +	TEGRA_PIN_PH7, +}; + +static const unsigned pi0_pins[] = { +	TEGRA_PIN_PI0, +}; + +static const unsigned pi1_pins[] = { +	TEGRA_PIN_PI1, +}; + +static const unsigned pi2_pins[] = { +	TEGRA_PIN_PI2, +}; + +static const unsigned pi3_pins[] = { +	TEGRA_PIN_PI3, +}; + +static const unsigned pi4_pins[] = { +	TEGRA_PIN_PI4, +}; + +static const unsigned pi5_pins[] = { +	TEGRA_PIN_PI5, +}; + +static const unsigned pi6_pins[] = { +	TEGRA_PIN_PI6, +}; + +static const unsigned pi7_pins[] = { +	TEGRA_PIN_PI7, +}; + +static const unsigned pj0_pins[] = { +	TEGRA_PIN_PJ0, +}; + +static const unsigned pj2_pins[] = { +	TEGRA_PIN_PJ2, +}; + +static const unsigned uart2_cts_n_pj5_pins[] = { +	TEGRA_PIN_UART2_CTS_N_PJ5, +}; + +static const unsigned uart2_rts_n_pj6_pins[] = { +	TEGRA_PIN_UART2_RTS_N_PJ6, +}; + +static const unsigned pj7_pins[] = { +	TEGRA_PIN_PJ7, +}; + +static const unsigned pk0_pins[] = { +	TEGRA_PIN_PK0, +}; + +static const unsigned pk1_pins[] = { +	TEGRA_PIN_PK1, +}; + +static const unsigned pk2_pins[] = { +	TEGRA_PIN_PK2, +}; + +static const unsigned pk3_pins[] = { +	TEGRA_PIN_PK3, +}; + +static const unsigned pk4_pins[] = { +	TEGRA_PIN_PK4, +}; + +static const unsigned spdif_out_pk5_pins[] = { +	TEGRA_PIN_SPDIF_OUT_PK5, +}; + +static const unsigned spdif_in_pk6_pins[] = { +	TEGRA_PIN_SPDIF_IN_PK6, +}; + +static const unsigned pk7_pins[] = { +	TEGRA_PIN_PK7, +}; + +static const unsigned dap1_fs_pn0_pins[] = { +	TEGRA_PIN_DAP1_FS_PN0, +}; + +static const unsigned dap1_din_pn1_pins[] = { +	TEGRA_PIN_DAP1_DIN_PN1, +}; + +static const unsigned dap1_dout_pn2_pins[] = { +	TEGRA_PIN_DAP1_DOUT_PN2, +}; + +static const unsigned dap1_sclk_pn3_pins[] = { +	TEGRA_PIN_DAP1_SCLK_PN3, +}; + +static const unsigned usb_vbus_en0_pn4_pins[] = { +	TEGRA_PIN_USB_VBUS_EN0_PN4, +}; + +static const unsigned usb_vbus_en1_pn5_pins[] = { +	TEGRA_PIN_USB_VBUS_EN1_PN5, +}; + +static const unsigned hdmi_int_pn7_pins[] = { +	TEGRA_PIN_HDMI_INT_PN7, +}; + +static const unsigned ulpi_data7_po0_pins[] = { +	TEGRA_PIN_ULPI_DATA7_PO0, +}; + +static const unsigned ulpi_data0_po1_pins[] = { +	TEGRA_PIN_ULPI_DATA0_PO1, +}; + +static const unsigned ulpi_data1_po2_pins[] = { +	TEGRA_PIN_ULPI_DATA1_PO2, +}; + +static const unsigned ulpi_data2_po3_pins[] = { +	TEGRA_PIN_ULPI_DATA2_PO3, +}; + +static const unsigned ulpi_data3_po4_pins[] = { +	TEGRA_PIN_ULPI_DATA3_PO4, +}; + +static const unsigned ulpi_data4_po5_pins[] = { +	TEGRA_PIN_ULPI_DATA4_PO5, +}; + +static const unsigned ulpi_data5_po6_pins[] = { +	TEGRA_PIN_ULPI_DATA5_PO6, +}; + +static const unsigned ulpi_data6_po7_pins[] = { +	TEGRA_PIN_ULPI_DATA6_PO7, +}; + +static const unsigned dap3_fs_pp0_pins[] = { +	TEGRA_PIN_DAP3_FS_PP0, +}; + +static const unsigned dap3_din_pp1_pins[] = { +	TEGRA_PIN_DAP3_DIN_PP1, +}; + +static const unsigned dap3_dout_pp2_pins[] = { +	TEGRA_PIN_DAP3_DOUT_PP2, +}; + +static const unsigned dap3_sclk_pp3_pins[] = { +	TEGRA_PIN_DAP3_SCLK_PP3, +}; + +static const unsigned dap4_fs_pp4_pins[] = { +	TEGRA_PIN_DAP4_FS_PP4, +}; + +static const unsigned dap4_din_pp5_pins[] = { +	TEGRA_PIN_DAP4_DIN_PP5, +}; + +static const unsigned dap4_dout_pp6_pins[] = { +	TEGRA_PIN_DAP4_DOUT_PP6, +}; + +static const unsigned dap4_sclk_pp7_pins[] = { +	TEGRA_PIN_DAP4_SCLK_PP7, +}; + +static const unsigned kb_col0_pq0_pins[] = { +	TEGRA_PIN_KB_COL0_PQ0, +}; + +static const unsigned kb_col1_pq1_pins[] = { +	TEGRA_PIN_KB_COL1_PQ1, +}; + +static const unsigned kb_col2_pq2_pins[] = { +	TEGRA_PIN_KB_COL2_PQ2, +}; + +static const unsigned kb_col3_pq3_pins[] = { +	TEGRA_PIN_KB_COL3_PQ3, +}; + +static const unsigned kb_col4_pq4_pins[] = { +	TEGRA_PIN_KB_COL4_PQ4, +}; + +static const unsigned kb_col5_pq5_pins[] = { +	TEGRA_PIN_KB_COL5_PQ5, +}; + +static const unsigned kb_col6_pq6_pins[] = { +	TEGRA_PIN_KB_COL6_PQ6, +}; + +static const unsigned kb_col7_pq7_pins[] = { +	TEGRA_PIN_KB_COL7_PQ7, +}; + +static const unsigned kb_row0_pr0_pins[] = { +	TEGRA_PIN_KB_ROW0_PR0, +}; + +static const unsigned kb_row1_pr1_pins[] = { +	TEGRA_PIN_KB_ROW1_PR1, +}; + +static const unsigned kb_row2_pr2_pins[] = { +	TEGRA_PIN_KB_ROW2_PR2, +}; + +static const unsigned kb_row3_pr3_pins[] = { +	TEGRA_PIN_KB_ROW3_PR3, +}; + +static const unsigned kb_row4_pr4_pins[] = { +	TEGRA_PIN_KB_ROW4_PR4, +}; + +static const unsigned kb_row5_pr5_pins[] = { +	TEGRA_PIN_KB_ROW5_PR5, +}; + +static const unsigned kb_row6_pr6_pins[] = { +	TEGRA_PIN_KB_ROW6_PR6, +}; + +static const unsigned kb_row7_pr7_pins[] = { +	TEGRA_PIN_KB_ROW7_PR7, +}; + +static const unsigned kb_row8_ps0_pins[] = { +	TEGRA_PIN_KB_ROW8_PS0, +}; + +static const unsigned kb_row9_ps1_pins[] = { +	TEGRA_PIN_KB_ROW9_PS1, +}; + +static const unsigned kb_row10_ps2_pins[] = { +	TEGRA_PIN_KB_ROW10_PS2, +}; + +static const unsigned kb_row11_ps3_pins[] = { +	TEGRA_PIN_KB_ROW11_PS3, +}; + +static const unsigned kb_row12_ps4_pins[] = { +	TEGRA_PIN_KB_ROW12_PS4, +}; + +static const unsigned kb_row13_ps5_pins[] = { +	TEGRA_PIN_KB_ROW13_PS5, +}; + +static const unsigned kb_row14_ps6_pins[] = { +	TEGRA_PIN_KB_ROW14_PS6, +}; + +static const unsigned kb_row15_ps7_pins[] = { +	TEGRA_PIN_KB_ROW15_PS7, +}; + +static const unsigned kb_row16_pt0_pins[] = { +	TEGRA_PIN_KB_ROW16_PT0, +}; + +static const unsigned kb_row17_pt1_pins[] = { +	TEGRA_PIN_KB_ROW17_PT1, +}; + +static const unsigned gen2_i2c_scl_pt5_pins[] = { +	TEGRA_PIN_GEN2_I2C_SCL_PT5, +}; + +static const unsigned gen2_i2c_sda_pt6_pins[] = { +	TEGRA_PIN_GEN2_I2C_SDA_PT6, +}; + +static const unsigned sdmmc4_cmd_pt7_pins[] = { +	TEGRA_PIN_SDMMC4_CMD_PT7, +}; + +static const unsigned pu0_pins[] = { +	TEGRA_PIN_PU0, +}; + +static const unsigned pu1_pins[] = { +	TEGRA_PIN_PU1, +}; + +static const unsigned pu2_pins[] = { +	TEGRA_PIN_PU2, +}; + +static const unsigned pu3_pins[] = { +	TEGRA_PIN_PU3, +}; + +static const unsigned pu4_pins[] = { +	TEGRA_PIN_PU4, +}; + +static const unsigned pu5_pins[] = { +	TEGRA_PIN_PU5, +}; + +static const unsigned pu6_pins[] = { +	TEGRA_PIN_PU6, +}; + +static const unsigned pv0_pins[] = { +	TEGRA_PIN_PV0, +}; + +static const unsigned pv1_pins[] = { +	TEGRA_PIN_PV1, +}; + +static const unsigned sdmmc3_cd_n_pv2_pins[] = { +	TEGRA_PIN_SDMMC3_CD_N_PV2, +}; + +static const unsigned sdmmc1_wp_n_pv3_pins[] = { +	TEGRA_PIN_SDMMC1_WP_N_PV3, +}; + +static const unsigned ddc_scl_pv4_pins[] = { +	TEGRA_PIN_DDC_SCL_PV4, +}; + +static const unsigned ddc_sda_pv5_pins[] = { +	TEGRA_PIN_DDC_SDA_PV5, +}; + +static const unsigned gpio_w2_aud_pw2_pins[] = { +	TEGRA_PIN_GPIO_W2_AUD_PW2, +}; + +static const unsigned gpio_w3_aud_pw3_pins[] = { +	TEGRA_PIN_GPIO_W3_AUD_PW3, +}; + +static const unsigned dap_mclk1_pw4_pins[] = { +	TEGRA_PIN_DAP_MCLK1_PW4, +}; + +static const unsigned clk2_out_pw5_pins[] = { +	TEGRA_PIN_CLK2_OUT_PW5, +}; + +static const unsigned uart3_txd_pw6_pins[] = { +	TEGRA_PIN_UART3_TXD_PW6, +}; + +static const unsigned uart3_rxd_pw7_pins[] = { +	TEGRA_PIN_UART3_RXD_PW7, +}; + +static const unsigned dvfs_pwm_px0_pins[] = { +	TEGRA_PIN_DVFS_PWM_PX0, +}; + +static const unsigned gpio_x1_aud_px1_pins[] = { +	TEGRA_PIN_GPIO_X1_AUD_PX1, +}; + +static const unsigned dvfs_clk_px2_pins[] = { +	TEGRA_PIN_DVFS_CLK_PX2, +}; + +static const unsigned gpio_x3_aud_px3_pins[] = { +	TEGRA_PIN_GPIO_X3_AUD_PX3, +}; + +static const unsigned gpio_x4_aud_px4_pins[] = { +	TEGRA_PIN_GPIO_X4_AUD_PX4, +}; + +static const unsigned gpio_x5_aud_px5_pins[] = { +	TEGRA_PIN_GPIO_X5_AUD_PX5, +}; + +static const unsigned gpio_x6_aud_px6_pins[] = { +	TEGRA_PIN_GPIO_X6_AUD_PX6, +}; + +static const unsigned gpio_x7_aud_px7_pins[] = { +	TEGRA_PIN_GPIO_X7_AUD_PX7, +}; + +static const unsigned ulpi_clk_py0_pins[] = { +	TEGRA_PIN_ULPI_CLK_PY0, +}; + +static const unsigned ulpi_dir_py1_pins[] = { +	TEGRA_PIN_ULPI_DIR_PY1, +}; + +static const unsigned ulpi_nxt_py2_pins[] = { +	TEGRA_PIN_ULPI_NXT_PY2, +}; + +static const unsigned ulpi_stp_py3_pins[] = { +	TEGRA_PIN_ULPI_STP_PY3, +}; + +static const unsigned sdmmc1_dat3_py4_pins[] = { +	TEGRA_PIN_SDMMC1_DAT3_PY4, +}; + +static const unsigned sdmmc1_dat2_py5_pins[] = { +	TEGRA_PIN_SDMMC1_DAT2_PY5, +}; + +static const unsigned sdmmc1_dat1_py6_pins[] = { +	TEGRA_PIN_SDMMC1_DAT1_PY6, +}; + +static const unsigned sdmmc1_dat0_py7_pins[] = { +	TEGRA_PIN_SDMMC1_DAT0_PY7, +}; + +static const unsigned sdmmc1_clk_pz0_pins[] = { +	TEGRA_PIN_SDMMC1_CLK_PZ0, +}; + +static const unsigned sdmmc1_cmd_pz1_pins[] = { +	TEGRA_PIN_SDMMC1_CMD_PZ1, +}; + +static const unsigned pwr_i2c_scl_pz6_pins[] = { +	TEGRA_PIN_PWR_I2C_SCL_PZ6, +}; + +static const unsigned pwr_i2c_sda_pz7_pins[] = { +	TEGRA_PIN_PWR_I2C_SDA_PZ7, +}; + +static const unsigned sdmmc4_dat0_paa0_pins[] = { +	TEGRA_PIN_SDMMC4_DAT0_PAA0, +}; + +static const unsigned sdmmc4_dat1_paa1_pins[] = { +	TEGRA_PIN_SDMMC4_DAT1_PAA1, +}; + +static const unsigned sdmmc4_dat2_paa2_pins[] = { +	TEGRA_PIN_SDMMC4_DAT2_PAA2, +}; + +static const unsigned sdmmc4_dat3_paa3_pins[] = { +	TEGRA_PIN_SDMMC4_DAT3_PAA3, +}; + +static const unsigned sdmmc4_dat4_paa4_pins[] = { +	TEGRA_PIN_SDMMC4_DAT4_PAA4, +}; + +static const unsigned sdmmc4_dat5_paa5_pins[] = { +	TEGRA_PIN_SDMMC4_DAT5_PAA5, +}; + +static const unsigned sdmmc4_dat6_paa6_pins[] = { +	TEGRA_PIN_SDMMC4_DAT6_PAA6, +}; + +static const unsigned sdmmc4_dat7_paa7_pins[] = { +	TEGRA_PIN_SDMMC4_DAT7_PAA7, +}; + +static const unsigned pbb0_pins[] = { +	TEGRA_PIN_PBB0, +}; + +static const unsigned cam_i2c_scl_pbb1_pins[] = { +	TEGRA_PIN_CAM_I2C_SCL_PBB1, +}; + +static const unsigned cam_i2c_sda_pbb2_pins[] = { +	TEGRA_PIN_CAM_I2C_SDA_PBB2, +}; + +static const unsigned pbb3_pins[] = { +	TEGRA_PIN_PBB3, +}; + +static const unsigned pbb4_pins[] = { +	TEGRA_PIN_PBB4, +}; + +static const unsigned pbb5_pins[] = { +	TEGRA_PIN_PBB5, +}; + +static const unsigned pbb6_pins[] = { +	TEGRA_PIN_PBB6, +}; + +static const unsigned pbb7_pins[] = { +	TEGRA_PIN_PBB7, +}; + +static const unsigned cam_mclk_pcc0_pins[] = { +	TEGRA_PIN_CAM_MCLK_PCC0, +}; + +static const unsigned pcc1_pins[] = { +	TEGRA_PIN_PCC1, +}; + +static const unsigned pcc2_pins[] = { +	TEGRA_PIN_PCC2, +}; + +static const unsigned sdmmc4_clk_pcc4_pins[] = { +	TEGRA_PIN_SDMMC4_CLK_PCC4, +}; + +static const unsigned clk2_req_pcc5_pins[] = { +	TEGRA_PIN_CLK2_REQ_PCC5, +}; + +static const unsigned pex_l0_rst_n_pdd1_pins[] = { +	TEGRA_PIN_PEX_L0_RST_N_PDD1, +}; + +static const unsigned pex_l0_clkreq_n_pdd2_pins[] = { +	TEGRA_PIN_PEX_L0_CLKREQ_N_PDD2, +}; + +static const unsigned pex_wake_n_pdd3_pins[] = { +	TEGRA_PIN_PEX_WAKE_N_PDD3, +}; + +static const unsigned pex_l1_rst_n_pdd5_pins[] = { +	TEGRA_PIN_PEX_L1_RST_N_PDD5, +}; + +static const unsigned pex_l1_clkreq_n_pdd6_pins[] = { +	TEGRA_PIN_PEX_L1_CLKREQ_N_PDD6, +}; + +static const unsigned clk3_out_pee0_pins[] = { +	TEGRA_PIN_CLK3_OUT_PEE0, +}; + +static const unsigned clk3_req_pee1_pins[] = { +	TEGRA_PIN_CLK3_REQ_PEE1, +}; + +static const unsigned dap_mclk1_req_pee2_pins[] = { +	TEGRA_PIN_DAP_MCLK1_REQ_PEE2, +}; + +static const unsigned hdmi_cec_pee3_pins[] = { +	TEGRA_PIN_HDMI_CEC_PEE3, +}; + +static const unsigned sdmmc3_clk_lb_out_pee4_pins[] = { +	TEGRA_PIN_SDMMC3_CLK_LB_OUT_PEE4, +}; + +static const unsigned sdmmc3_clk_lb_in_pee5_pins[] = { +	TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5, +}; + +static const unsigned dp_hpd_pff0_pins[] = { +	TEGRA_PIN_DP_HPD_PFF0, +}; + +static const unsigned usb_vbus_en2_pff1_pins[] = { +	TEGRA_PIN_USB_VBUS_EN2_PFF1, +}; + +static const unsigned pff2_pins[] = { +	TEGRA_PIN_PFF2, +}; + +static const unsigned core_pwr_req_pins[] = { +	TEGRA_PIN_CORE_PWR_REQ, +}; + +static const unsigned cpu_pwr_req_pins[] = { +	TEGRA_PIN_CPU_PWR_REQ, +}; + +static const unsigned pwr_int_n_pins[] = { +	TEGRA_PIN_PWR_INT_N, +}; + +static const unsigned gmi_clk_lb_pins[] = { +	TEGRA_PIN_GMI_CLK_LB, +}; + +static const unsigned reset_out_n_pins[] = { +	TEGRA_PIN_RESET_OUT_N, +}; + +static const unsigned owr_pins[] = { +	TEGRA_PIN_OWR, +}; + +static const unsigned clk_32k_in_pins[] = { +	TEGRA_PIN_CLK_32K_IN, +}; + +static const unsigned jtag_rtck_pins[] = { +	TEGRA_PIN_JTAG_RTCK, +}; + +static const unsigned drive_ao1_pins[] = { +	TEGRA_PIN_KB_ROW0_PR0, +	TEGRA_PIN_KB_ROW1_PR1, +	TEGRA_PIN_KB_ROW2_PR2, +	TEGRA_PIN_KB_ROW3_PR3, +	TEGRA_PIN_KB_ROW4_PR4, +	TEGRA_PIN_KB_ROW5_PR5, +	TEGRA_PIN_KB_ROW6_PR6, +	TEGRA_PIN_KB_ROW7_PR7, +	TEGRA_PIN_PWR_I2C_SCL_PZ6, +	TEGRA_PIN_PWR_I2C_SDA_PZ7, +}; + +static const unsigned drive_ao2_pins[] = { +	TEGRA_PIN_CLK_32K_OUT_PA0, +	TEGRA_PIN_CLK_32K_IN, +	TEGRA_PIN_KB_COL0_PQ0, +	TEGRA_PIN_KB_COL1_PQ1, +	TEGRA_PIN_KB_COL2_PQ2, +	TEGRA_PIN_KB_COL3_PQ3, +	TEGRA_PIN_KB_COL4_PQ4, +	TEGRA_PIN_KB_COL5_PQ5, +	TEGRA_PIN_KB_COL6_PQ6, +	TEGRA_PIN_KB_COL7_PQ7, +	TEGRA_PIN_KB_ROW8_PS0, +	TEGRA_PIN_KB_ROW9_PS1, +	TEGRA_PIN_KB_ROW10_PS2, +	TEGRA_PIN_KB_ROW11_PS3, +	TEGRA_PIN_KB_ROW12_PS4, +	TEGRA_PIN_KB_ROW13_PS5, +	TEGRA_PIN_KB_ROW14_PS6, +	TEGRA_PIN_KB_ROW15_PS7, +	TEGRA_PIN_KB_ROW16_PT0, +	TEGRA_PIN_KB_ROW17_PT1, +	TEGRA_PIN_SDMMC3_CD_N_PV2, +	TEGRA_PIN_CORE_PWR_REQ, +	TEGRA_PIN_CPU_PWR_REQ, +	TEGRA_PIN_PWR_INT_N, +}; + +static const unsigned drive_at1_pins[] = { +	TEGRA_PIN_PH0, +	TEGRA_PIN_PH1, +	TEGRA_PIN_PH2, +	TEGRA_PIN_PH3, +}; + +static const unsigned drive_at2_pins[] = { +	TEGRA_PIN_PG0, +	TEGRA_PIN_PG1, +	TEGRA_PIN_PG2, +	TEGRA_PIN_PG3, +	TEGRA_PIN_PG4, +	TEGRA_PIN_PG5, +	TEGRA_PIN_PG6, +	TEGRA_PIN_PG7, +	TEGRA_PIN_PI0, +	TEGRA_PIN_PI1, +	TEGRA_PIN_PI3, +	TEGRA_PIN_PI4, +	TEGRA_PIN_PI7, +	TEGRA_PIN_PK0, +	TEGRA_PIN_PK2, +}; + +static const unsigned drive_at3_pins[] = { +	TEGRA_PIN_PC7, +	TEGRA_PIN_PJ0, +}; + +static const unsigned drive_at4_pins[] = { +	TEGRA_PIN_PB0, +	TEGRA_PIN_PB1, +	TEGRA_PIN_PJ0, +	TEGRA_PIN_PJ7, +	TEGRA_PIN_PK7, +}; + +static const unsigned drive_at5_pins[] = { +	TEGRA_PIN_GEN2_I2C_SCL_PT5, +	TEGRA_PIN_GEN2_I2C_SDA_PT6, +}; + +static const unsigned drive_cdev1_pins[] = { +	TEGRA_PIN_DAP_MCLK1_PW4, +	TEGRA_PIN_DAP_MCLK1_REQ_PEE2, +}; + +static const unsigned drive_cdev2_pins[] = { +	TEGRA_PIN_CLK2_OUT_PW5, +	TEGRA_PIN_CLK2_REQ_PCC5, +}; + +static const unsigned drive_dap1_pins[] = { +	TEGRA_PIN_DAP1_FS_PN0, +	TEGRA_PIN_DAP1_DIN_PN1, +	TEGRA_PIN_DAP1_DOUT_PN2, +	TEGRA_PIN_DAP1_SCLK_PN3, +}; + +static const unsigned drive_dap2_pins[] = { +	TEGRA_PIN_DAP2_FS_PA2, +	TEGRA_PIN_DAP2_SCLK_PA3, +	TEGRA_PIN_DAP2_DIN_PA4, +	TEGRA_PIN_DAP2_DOUT_PA5, +}; + +static const unsigned drive_dap3_pins[] = { +	TEGRA_PIN_DAP3_FS_PP0, +	TEGRA_PIN_DAP3_DIN_PP1, +	TEGRA_PIN_DAP3_DOUT_PP2, +	TEGRA_PIN_DAP3_SCLK_PP3, +}; + +static const unsigned drive_dap4_pins[] = { +	TEGRA_PIN_DAP4_FS_PP4, +	TEGRA_PIN_DAP4_DIN_PP5, +	TEGRA_PIN_DAP4_DOUT_PP6, +	TEGRA_PIN_DAP4_SCLK_PP7, +}; + +static const unsigned drive_dbg_pins[] = { +	TEGRA_PIN_GEN1_I2C_SCL_PC4, +	TEGRA_PIN_GEN1_I2C_SDA_PC5, +	TEGRA_PIN_PU0, +	TEGRA_PIN_PU1, +	TEGRA_PIN_PU2, +	TEGRA_PIN_PU3, +	TEGRA_PIN_PU4, +	TEGRA_PIN_PU5, +	TEGRA_PIN_PU6, +}; + +static const unsigned drive_sdio3_pins[] = { +	TEGRA_PIN_SDMMC3_CLK_PA6, +	TEGRA_PIN_SDMMC3_CMD_PA7, +	TEGRA_PIN_SDMMC3_DAT3_PB4, +	TEGRA_PIN_SDMMC3_DAT2_PB5, +	TEGRA_PIN_SDMMC3_DAT1_PB6, +	TEGRA_PIN_SDMMC3_DAT0_PB7, +	TEGRA_PIN_SDMMC3_CLK_LB_OUT_PEE4, +	TEGRA_PIN_SDMMC3_CLK_LB_IN_PEE5, +}; + +static const unsigned drive_spi_pins[] = { +	TEGRA_PIN_DVFS_PWM_PX0, +	TEGRA_PIN_GPIO_X1_AUD_PX1, +	TEGRA_PIN_DVFS_CLK_PX2, +	TEGRA_PIN_GPIO_X3_AUD_PX3, +	TEGRA_PIN_GPIO_X4_AUD_PX4, +	TEGRA_PIN_GPIO_X5_AUD_PX5, +	TEGRA_PIN_GPIO_X6_AUD_PX6, +	TEGRA_PIN_GPIO_X7_AUD_PX7, +	TEGRA_PIN_GPIO_W2_AUD_PW2, +	TEGRA_PIN_GPIO_W3_AUD_PW3, +}; + +static const unsigned drive_uaa_pins[] = { +	TEGRA_PIN_ULPI_DATA0_PO1, +	TEGRA_PIN_ULPI_DATA1_PO2, +	TEGRA_PIN_ULPI_DATA2_PO3, +	TEGRA_PIN_ULPI_DATA3_PO4, +}; + +static const unsigned drive_uab_pins[] = { +	TEGRA_PIN_ULPI_DATA7_PO0, +	TEGRA_PIN_ULPI_DATA4_PO5, +	TEGRA_PIN_ULPI_DATA5_PO6, +	TEGRA_PIN_ULPI_DATA6_PO7, +	TEGRA_PIN_PV0, +	TEGRA_PIN_PV1, +}; + +static const unsigned drive_uart2_pins[] = { +	TEGRA_PIN_UART2_TXD_PC2, +	TEGRA_PIN_UART2_RXD_PC3, +	TEGRA_PIN_UART2_CTS_N_PJ5, +	TEGRA_PIN_UART2_RTS_N_PJ6, +}; + +static const unsigned drive_uart3_pins[] = { +	TEGRA_PIN_UART3_CTS_N_PA1, +	TEGRA_PIN_UART3_RTS_N_PC0, +	TEGRA_PIN_UART3_TXD_PW6, +	TEGRA_PIN_UART3_RXD_PW7, +}; + +static const unsigned drive_sdio1_pins[] = { +	TEGRA_PIN_SDMMC1_DAT3_PY4, +	TEGRA_PIN_SDMMC1_DAT2_PY5, +	TEGRA_PIN_SDMMC1_DAT1_PY6, +	TEGRA_PIN_SDMMC1_DAT0_PY7, +	TEGRA_PIN_SDMMC1_CLK_PZ0, +	TEGRA_PIN_SDMMC1_CMD_PZ1, +}; + +static const unsigned drive_ddc_pins[] = { +	TEGRA_PIN_DDC_SCL_PV4, +	TEGRA_PIN_DDC_SDA_PV5, +}; + +static const unsigned drive_gma_pins[] = { +	TEGRA_PIN_SDMMC4_CLK_PCC4, +	TEGRA_PIN_SDMMC4_CMD_PT7, +	TEGRA_PIN_SDMMC4_DAT0_PAA0, +	TEGRA_PIN_SDMMC4_DAT1_PAA1, +	TEGRA_PIN_SDMMC4_DAT2_PAA2, +	TEGRA_PIN_SDMMC4_DAT3_PAA3, +	TEGRA_PIN_SDMMC4_DAT4_PAA4, +	TEGRA_PIN_SDMMC4_DAT5_PAA5, +	TEGRA_PIN_SDMMC4_DAT6_PAA6, +	TEGRA_PIN_SDMMC4_DAT7_PAA7, +}; + +static const unsigned drive_gme_pins[] = { +	TEGRA_PIN_PBB0, +	TEGRA_PIN_CAM_I2C_SCL_PBB1, +	TEGRA_PIN_CAM_I2C_SDA_PBB2, +	TEGRA_PIN_PBB3, +	TEGRA_PIN_PCC2, +}; + +static const unsigned drive_gmf_pins[] = { +	TEGRA_PIN_PBB4, +	TEGRA_PIN_PBB5, +	TEGRA_PIN_PBB6, +	TEGRA_PIN_PBB7, +}; + +static const unsigned drive_gmg_pins[] = { +	TEGRA_PIN_CAM_MCLK_PCC0, +}; + +static const unsigned drive_gmh_pins[] = { +	TEGRA_PIN_PCC1, +}; + +static const unsigned drive_owr_pins[] = { +	TEGRA_PIN_SDMMC3_CD_N_PV2, +	TEGRA_PIN_OWR, +}; + +static const unsigned drive_uda_pins[] = { +	TEGRA_PIN_ULPI_CLK_PY0, +	TEGRA_PIN_ULPI_DIR_PY1, +	TEGRA_PIN_ULPI_NXT_PY2, +	TEGRA_PIN_ULPI_STP_PY3, +}; + +static const unsigned drive_gpv_pins[] = { +	TEGRA_PIN_PEX_L0_RST_N_PDD1, +	TEGRA_PIN_PEX_L0_CLKREQ_N_PDD2, +	TEGRA_PIN_PEX_WAKE_N_PDD3, +	TEGRA_PIN_PEX_L1_RST_N_PDD5, +	TEGRA_PIN_PEX_L1_CLKREQ_N_PDD6, +	TEGRA_PIN_USB_VBUS_EN2_PFF1, +	TEGRA_PIN_PFF2, +}; + +static const unsigned drive_dev3_pins[] = { +	TEGRA_PIN_CLK3_OUT_PEE0, +	TEGRA_PIN_CLK3_REQ_PEE1, +}; + +static const unsigned drive_cec_pins[] = { +	TEGRA_PIN_HDMI_CEC_PEE3, +}; + +static const unsigned drive_at6_pins[] = { +	TEGRA_PIN_PK1, +	TEGRA_PIN_PK3, +	TEGRA_PIN_PK4, +	TEGRA_PIN_PI2, +	TEGRA_PIN_PI5, +	TEGRA_PIN_PI6, +	TEGRA_PIN_PH4, +	TEGRA_PIN_PH5, +	TEGRA_PIN_PH6, +	TEGRA_PIN_PH7, +}; + +static const unsigned drive_dap5_pins[] = { +	TEGRA_PIN_SPDIF_IN_PK6, +	TEGRA_PIN_SPDIF_OUT_PK5, +	TEGRA_PIN_DP_HPD_PFF0, +}; + +static const unsigned drive_usb_vbus_en_pins[] = { +	TEGRA_PIN_USB_VBUS_EN0_PN4, +	TEGRA_PIN_USB_VBUS_EN1_PN5, +}; + +static const unsigned drive_ao3_pins[] = { +	TEGRA_PIN_RESET_OUT_N, +}; + +static const unsigned drive_ao0_pins[] = { +	TEGRA_PIN_JTAG_RTCK, +}; + +static const unsigned drive_hv0_pins[] = { +	TEGRA_PIN_HDMI_INT_PN7, +}; + +static const unsigned drive_sdio4_pins[] = { +	TEGRA_PIN_SDMMC1_WP_N_PV3, +}; + +static const unsigned drive_ao4_pins[] = { +	TEGRA_PIN_JTAG_RTCK, +}; + +enum tegra_mux { +	TEGRA_MUX_BLINK, +	TEGRA_MUX_CCLA, +	TEGRA_MUX_CEC, +	TEGRA_MUX_CLDVFS, +	TEGRA_MUX_CLK, +	TEGRA_MUX_CLK12, +	TEGRA_MUX_CPU, +	TEGRA_MUX_DAP, +	TEGRA_MUX_DAP1, +	TEGRA_MUX_DAP2, +	TEGRA_MUX_DEV3, +	TEGRA_MUX_DISPLAYA, +	TEGRA_MUX_DISPLAYA_ALT, +	TEGRA_MUX_DISPLAYB, +	TEGRA_MUX_DP, +	TEGRA_MUX_DTV, +	TEGRA_MUX_EXTPERIPH1, +	TEGRA_MUX_EXTPERIPH2, +	TEGRA_MUX_EXTPERIPH3, +	TEGRA_MUX_GMI, +	TEGRA_MUX_GMI_ALT, +	TEGRA_MUX_HDA, +	TEGRA_MUX_HSI, +	TEGRA_MUX_I2C1, +	TEGRA_MUX_I2C2, +	TEGRA_MUX_I2C3, +	TEGRA_MUX_I2C4, +	TEGRA_MUX_I2CPWR, +	TEGRA_MUX_I2S0, +	TEGRA_MUX_I2S1, +	TEGRA_MUX_I2S2, +	TEGRA_MUX_I2S3, +	TEGRA_MUX_I2S4, +	TEGRA_MUX_IRDA, +	TEGRA_MUX_KBC, +	TEGRA_MUX_OWR, +	TEGRA_MUX_PE, +	TEGRA_MUX_PE0, +	TEGRA_MUX_PE1, +	TEGRA_MUX_PMI, +	TEGRA_MUX_PWM0, +	TEGRA_MUX_PWM1, +	TEGRA_MUX_PWM2, +	TEGRA_MUX_PWM3, +	TEGRA_MUX_PWRON, +	TEGRA_MUX_RESET_OUT_N, +	TEGRA_MUX_RSVD1, +	TEGRA_MUX_RSVD2, +	TEGRA_MUX_RSVD3, +	TEGRA_MUX_RSVD4, +	TEGRA_MUX_RTCK, +	TEGRA_MUX_SATA, +	TEGRA_MUX_SDMMC1, +	TEGRA_MUX_SDMMC2, +	TEGRA_MUX_SDMMC3, +	TEGRA_MUX_SDMMC4, +	TEGRA_MUX_SOC, +	TEGRA_MUX_SPDIF, +	TEGRA_MUX_SPI1, +	TEGRA_MUX_SPI2, +	TEGRA_MUX_SPI3, +	TEGRA_MUX_SPI4, +	TEGRA_MUX_SPI5, +	TEGRA_MUX_SPI6, +	TEGRA_MUX_SYS, +	TEGRA_MUX_TMDS, +	TEGRA_MUX_TRACE, +	TEGRA_MUX_UARTA, +	TEGRA_MUX_UARTB, +	TEGRA_MUX_UARTC, +	TEGRA_MUX_UARTD, +	TEGRA_MUX_ULPI, +	TEGRA_MUX_USB, +	TEGRA_MUX_VGP1, +	TEGRA_MUX_VGP2, +	TEGRA_MUX_VGP3, +	TEGRA_MUX_VGP4, +	TEGRA_MUX_VGP5, +	TEGRA_MUX_VGP6, +	TEGRA_MUX_VI, +	TEGRA_MUX_VI_ALT1, +	TEGRA_MUX_VI_ALT3, +	TEGRA_MUX_VIMCLK2, +	TEGRA_MUX_VIMCLK2_ALT, +}; + +#define FUNCTION(fname)					\ +	{						\ +		.name = #fname,				\ +	} + +static struct tegra_function tegra124_functions[] = { +	FUNCTION(blink), +	FUNCTION(ccla), +	FUNCTION(cec), +	FUNCTION(cldvfs), +	FUNCTION(clk), +	FUNCTION(clk12), +	FUNCTION(cpu), +	FUNCTION(dap), +	FUNCTION(dap1), +	FUNCTION(dap2), +	FUNCTION(dev3), +	FUNCTION(displaya), +	FUNCTION(displaya_alt), +	FUNCTION(displayb), +	FUNCTION(dp), +	FUNCTION(dtv), +	FUNCTION(extperiph1), +	FUNCTION(extperiph2), +	FUNCTION(extperiph3), +	FUNCTION(gmi), +	FUNCTION(gmi_alt), +	FUNCTION(hda), +	FUNCTION(hsi), +	FUNCTION(i2c1), +	FUNCTION(i2c2), +	FUNCTION(i2c3), +	FUNCTION(i2c4), +	FUNCTION(i2cpwr), +	FUNCTION(i2s0), +	FUNCTION(i2s1), +	FUNCTION(i2s2), +	FUNCTION(i2s3), +	FUNCTION(i2s4), +	FUNCTION(irda), +	FUNCTION(kbc), +	FUNCTION(owr), +	FUNCTION(pe), +	FUNCTION(pe0), +	FUNCTION(pe1), +	FUNCTION(pmi), +	FUNCTION(pwm0), +	FUNCTION(pwm1), +	FUNCTION(pwm2), +	FUNCTION(pwm3), +	FUNCTION(pwron), +	FUNCTION(reset_out_n), +	FUNCTION(rsvd1), +	FUNCTION(rsvd2), +	FUNCTION(rsvd3), +	FUNCTION(rsvd4), +	FUNCTION(rtck), +	FUNCTION(sata), +	FUNCTION(sdmmc1), +	FUNCTION(sdmmc2), +	FUNCTION(sdmmc3), +	FUNCTION(sdmmc4), +	FUNCTION(soc), +	FUNCTION(spdif), +	FUNCTION(spi1), +	FUNCTION(spi2), +	FUNCTION(spi3), +	FUNCTION(spi4), +	FUNCTION(spi5), +	FUNCTION(spi6), +	FUNCTION(sys), +	FUNCTION(tmds), +	FUNCTION(trace), +	FUNCTION(uarta), +	FUNCTION(uartb), +	FUNCTION(uartc), +	FUNCTION(uartd), +	FUNCTION(ulpi), +	FUNCTION(usb), +	FUNCTION(vgp1), +	FUNCTION(vgp2), +	FUNCTION(vgp3), +	FUNCTION(vgp4), +	FUNCTION(vgp5), +	FUNCTION(vgp6), +	FUNCTION(vi), +	FUNCTION(vi_alt1), +	FUNCTION(vi_alt3), +	FUNCTION(vimclk2), +	FUNCTION(vimclk2_alt), +}; + +#define DRV_PINGROUP_REG_A		0x868	/* bank 0 */ +#define PINGROUP_REG_A			0x3000	/* bank 1 */ + +#define PINGROUP_REG(r)			((r) - PINGROUP_REG_A) + +#define PINGROUP_BIT_Y(b)		(b) +#define PINGROUP_BIT_N(b)		(-1) + +#define PINGROUP(pg_name, f0, f1, f2, f3, r, od, ior, rcv_sel)		\ +	{								\ +		.name = #pg_name,					\ +		.pins = pg_name##_pins,					\ +		.npins = ARRAY_SIZE(pg_name##_pins),			\ +		.funcs = {						\ +			TEGRA_MUX_##f0,					\ +			TEGRA_MUX_##f1,					\ +			TEGRA_MUX_##f2,					\ +			TEGRA_MUX_##f3,					\ +		},							\ +		.mux_reg = PINGROUP_REG(r),				\ +		.mux_bank = 1,						\ +		.mux_bit = 0,						\ +		.pupd_reg = PINGROUP_REG(r),				\ +		.pupd_bank = 1,						\ +		.pupd_bit = 2,						\ +		.tri_reg = PINGROUP_REG(r),				\ +		.tri_bank = 1,						\ +		.tri_bit = 4,						\ +		.einput_bit = PINGROUP_BIT_Y(5),			\ +		.odrain_bit = PINGROUP_BIT_##od(6),			\ +		.lock_bit = PINGROUP_BIT_Y(7),				\ +		.ioreset_bit = PINGROUP_BIT_##ior(8),			\ +		.rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9),		\ +		.drv_reg = -1,						\ +	} + +#define DRV_PINGROUP_REG(r)		((r) - DRV_PINGROUP_REG_A) + +#define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b,		\ +		     drvdn_b, drvdn_w, drvup_b, drvup_w,		\ +		     slwr_b, slwr_w, slwf_b, slwf_w,			\ +		     drvtype)						\ +	{								\ +		.name = "drive_" #pg_name,				\ +		.pins = drive_##pg_name##_pins,				\ +		.npins = ARRAY_SIZE(drive_##pg_name##_pins),		\ +		.mux_reg = -1,						\ +		.pupd_reg = -1,						\ +		.tri_reg = -1,						\ +		.einput_bit = -1,					\ +		.odrain_bit = -1,					\ +		.lock_bit = -1,						\ +		.ioreset_bit = -1,					\ +		.rcv_sel_bit = -1,					\ +		.drv_reg = DRV_PINGROUP_REG(r),				\ +		.drv_bank = 0,						\ +		.hsm_bit = hsm_b,					\ +		.schmitt_bit = schmitt_b,				\ +		.lpmd_bit = lpmd_b,					\ +		.drvdn_bit = drvdn_b,					\ +		.drvdn_width = drvdn_w,					\ +		.drvup_bit = drvup_b,					\ +		.drvup_width = drvup_w,					\ +		.slwr_bit = slwr_b,					\ +		.slwr_width = slwr_w,					\ +		.slwf_bit = slwf_b,					\ +		.slwf_width = slwf_w,					\ +		.drvtype_bit = PINGROUP_BIT_##drvtype(6),		\ +	} + +static const struct tegra_pingroup tegra124_groups[] = { +	/*       pg_name,                f0,         f1,         f2,           f3,          r,      od, ior, rcv_sel */ +	PINGROUP(ulpi_data0_po1,         SPI3,       HSI,        UARTA,        ULPI,        0x3000, N,   N,  N), +	PINGROUP(ulpi_data1_po2,         SPI3,       HSI,        UARTA,        ULPI,        0x3004, N,   N,  N), +	PINGROUP(ulpi_data2_po3,         SPI3,       HSI,        UARTA,        ULPI,        0x3008, N,   N,  N), +	PINGROUP(ulpi_data3_po4,         SPI3,       HSI,        UARTA,        ULPI,        0x300c, N,   N,  N), +	PINGROUP(ulpi_data4_po5,         SPI2,       HSI,        UARTA,        ULPI,        0x3010, N,   N,  N), +	PINGROUP(ulpi_data5_po6,         SPI2,       HSI,        UARTA,        ULPI,        0x3014, N,   N,  N), +	PINGROUP(ulpi_data6_po7,         SPI2,       HSI,        UARTA,        ULPI,        0x3018, N,   N,  N), +	PINGROUP(ulpi_data7_po0,         SPI2,       HSI,        UARTA,        ULPI,        0x301c, N,   N,  N), +	PINGROUP(ulpi_clk_py0,           SPI1,       SPI5,       UARTD,        ULPI,        0x3020, N,   N,  N), +	PINGROUP(ulpi_dir_py1,           SPI1,       SPI5,       UARTD,        ULPI,        0x3024, N,   N,  N), +	PINGROUP(ulpi_nxt_py2,           SPI1,       SPI5,       UARTD,        ULPI,        0x3028, N,   N,  N), +	PINGROUP(ulpi_stp_py3,           SPI1,       SPI5,       UARTD,        ULPI,        0x302c, N,   N,  N), +	PINGROUP(dap3_fs_pp0,            I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    0x3030, N,   N,  N), +	PINGROUP(dap3_din_pp1,           I2S2,       SPI5,       DISPLAYA,     DISPLAYB,    0x3034, N,   N,  N), +	PINGROUP(dap3_dout_pp2,          I2S2,       SPI5,       DISPLAYA,     RSVD4,       0x3038, N,   N,  N), +	PINGROUP(dap3_sclk_pp3,          I2S2,       SPI5,       RSVD3,        DISPLAYB,    0x303c, N,   N,  N), +	PINGROUP(pv0,                    RSVD1,      RSVD2,      RSVD3,        RSVD4,       0x3040, N,   N,  N), +	PINGROUP(pv1,                    RSVD1,      RSVD2,      RSVD3,        RSVD4,       0x3044, N,   N,  N), +	PINGROUP(sdmmc1_clk_pz0,         SDMMC1,     CLK12,      RSVD3,        RSVD4,       0x3048, N,   N,  N), +	PINGROUP(sdmmc1_cmd_pz1,         SDMMC1,     SPDIF,      SPI4,         UARTA,       0x304c, N,   N,  N), +	PINGROUP(sdmmc1_dat3_py4,        SDMMC1,     SPDIF,      SPI4,         UARTA,       0x3050, N,   N,  N), +	PINGROUP(sdmmc1_dat2_py5,        SDMMC1,     PWM0,       SPI4,         UARTA,       0x3054, N,   N,  N), +	PINGROUP(sdmmc1_dat1_py6,        SDMMC1,     PWM1,       SPI4,         UARTA,       0x3058, N,   N,  N), +	PINGROUP(sdmmc1_dat0_py7,        SDMMC1,     RSVD2,      SPI4,         UARTA,       0x305c, N,   N,  N), +	PINGROUP(clk2_out_pw5,           EXTPERIPH2, RSVD2,      RSVD3,        RSVD4,       0x3068, N,   N,  N), +	PINGROUP(clk2_req_pcc5,          DAP,        RSVD2,      RSVD3,        RSVD4,       0x306c, N,   N,  N), +	PINGROUP(hdmi_int_pn7,           RSVD1,      RSVD2,      RSVD3,        RSVD4,       0x3110, N,   N,  Y), +	PINGROUP(ddc_scl_pv4,            I2C4,       RSVD2,      RSVD3,        RSVD4,       0x3114, N,   N,  Y), +	PINGROUP(ddc_sda_pv5,            I2C4,       RSVD2,      RSVD3,        RSVD4,       0x3118, N,   N,  Y), +	PINGROUP(uart2_rxd_pc3,          IRDA,       SPDIF,      UARTA,        SPI4,        0x3164, N,   N,  N), +	PINGROUP(uart2_txd_pc2,          IRDA,       SPDIF,      UARTA,        SPI4,        0x3168, N,   N,  N), +	PINGROUP(uart2_rts_n_pj6,        UARTA,      UARTB,      GMI,          SPI4,        0x316c, N,   N,  N), +	PINGROUP(uart2_cts_n_pj5,        UARTA,      UARTB,      GMI,          SPI4,        0x3170, N,   N,  N), +	PINGROUP(uart3_txd_pw6,          UARTC,      RSVD2,      GMI,          SPI4,        0x3174, N,   N,  N), +	PINGROUP(uart3_rxd_pw7,          UARTC,      RSVD2,      GMI,          SPI4,        0x3178, N,   N,  N), +	PINGROUP(uart3_cts_n_pa1,        UARTC,      SDMMC1,     DTV,          GMI,         0x317c, N,   N,  N), +	PINGROUP(uart3_rts_n_pc0,        UARTC,      PWM0,       DTV,          GMI,         0x3180, N,   N,  N), +	PINGROUP(pu0,                    OWR,        UARTA,      GMI,          RSVD4,       0x3184, N,   N,  N), +	PINGROUP(pu1,                    RSVD1,      UARTA,      GMI,          RSVD4,       0x3188, N,   N,  N), +	PINGROUP(pu2,                    RSVD1,      UARTA,      GMI,          RSVD4,       0x318c, N,   N,  N), +	PINGROUP(pu3,                    PWM0,       UARTA,      GMI,          DISPLAYB,    0x3190, N,   N,  N), +	PINGROUP(pu4,                    PWM1,       UARTA,      GMI,          DISPLAYB,    0x3194, N,   N,  N), +	PINGROUP(pu5,                    PWM2,       UARTA,      GMI,          DISPLAYB,    0x3198, N,   N,  N), +	PINGROUP(pu6,                    PWM3,       UARTA,      RSVD3,        GMI,         0x319c, N,   N,  N), +	PINGROUP(gen1_i2c_sda_pc5,       I2C1,       RSVD2,      RSVD3,        RSVD4,       0x31a0, Y,   N,  N), +	PINGROUP(gen1_i2c_scl_pc4,       I2C1,       RSVD2,      RSVD3,        RSVD4,       0x31a4, Y,   N,  N), +	PINGROUP(dap4_fs_pp4,            I2S3,       GMI,        DTV,          RSVD4,       0x31a8, N,   N,  N), +	PINGROUP(dap4_din_pp5,           I2S3,       GMI,        RSVD3,        RSVD4,       0x31ac, N,   N,  N), +	PINGROUP(dap4_dout_pp6,          I2S3,       GMI,        DTV,          RSVD4,       0x31b0, N,   N,  N), +	PINGROUP(dap4_sclk_pp7,          I2S3,       GMI,        RSVD3,        RSVD4,       0x31b4, N,   N,  N), +	PINGROUP(clk3_out_pee0,          EXTPERIPH3, RSVD2,      RSVD3,        RSVD4,       0x31b8, N,   N,  N), +	PINGROUP(clk3_req_pee1,          DEV3,       RSVD2,      RSVD3,        RSVD4,       0x31bc, N,   N,  N), +	PINGROUP(pc7,                    RSVD1,      RSVD2,      GMI,          GMI_ALT,     0x31c0, N,   N,  N), +	PINGROUP(pi5,                    SDMMC2,     RSVD2,      GMI,          RSVD4,       0x31c4, N,   N,  N), +	PINGROUP(pi7,                    RSVD1,      TRACE,      GMI,          DTV,         0x31c8, N,   N,  N), +	PINGROUP(pk0,                    RSVD1,      SDMMC3,     GMI,          SOC,         0x31cc, N,   N,  N), +	PINGROUP(pk1,                    SDMMC2,     TRACE,      GMI,          RSVD4,       0x31d0, N,   N,  N), +	PINGROUP(pj0,                    RSVD1,      RSVD2,      GMI,          USB,         0x31d4, N,   N,  N), +	PINGROUP(pj2,                    RSVD1,      RSVD2,      GMI,          SOC,         0x31d8, N,   N,  N), +	PINGROUP(pk3,                    SDMMC2,     TRACE,      GMI,          CCLA,        0x31dc, N,   N,  N), +	PINGROUP(pk4,                    SDMMC2,     RSVD2,      GMI,          GMI_ALT,     0x31e0, N,   N,  N), +	PINGROUP(pk2,                    RSVD1,      RSVD2,      GMI,          RSVD4,       0x31e4, N,   N,  N), +	PINGROUP(pi3,                    RSVD1,      RSVD2,      GMI,          SPI4,        0x31e8, N,   N,  N), +	PINGROUP(pi6,                    RSVD1,      RSVD2,      GMI,          SDMMC2,      0x31ec, N,   N,  N), +	PINGROUP(pg0,                    RSVD1,      RSVD2,      GMI,          RSVD4,       0x31f0, N,   N,  N), +	PINGROUP(pg1,                    RSVD1,      RSVD2,      GMI,          RSVD4,       0x31f4, N,   N,  N), +	PINGROUP(pg2,                    RSVD1,      TRACE,      GMI,          RSVD4,       0x31f8, N,   N,  N), +	PINGROUP(pg3,                    RSVD1,      TRACE,      GMI,          RSVD4,       0x31fc, N,   N,  N), +	PINGROUP(pg4,                    RSVD1,      TMDS,       GMI,          SPI4,        0x3200, N,   N,  N), +	PINGROUP(pg5,                    RSVD1,      RSVD2,      GMI,          SPI4,        0x3204, N,   N,  N), +	PINGROUP(pg6,                    RSVD1,      RSVD2,      GMI,          SPI4,        0x3208, N,   N,  N), +	PINGROUP(pg7,                    RSVD1,      RSVD2,      GMI,          SPI4,        0x320c, N,   N,  N), +	PINGROUP(ph0,                    PWM0,       TRACE,      GMI,          DTV,         0x3210, N,   N,  N), +	PINGROUP(ph1,                    PWM1,       TMDS,       GMI,          DISPLAYA,    0x3214, N,   N,  N), +	PINGROUP(ph2,                    PWM2,       TMDS,       GMI,          CLDVFS,      0x3218, N,   N,  N), +	PINGROUP(ph3,                    PWM3,       SPI4,       GMI,          CLDVFS,      0x321c, N,   N,  N), +	PINGROUP(ph4,                    SDMMC2,     RSVD2,      GMI,          RSVD4,       0x3220, N,   N,  N), +	PINGROUP(ph5,                    SDMMC2,     RSVD2,      GMI,          RSVD4,       0x3224, N,   N,  N), +	PINGROUP(ph6,                    SDMMC2,     TRACE,      GMI,          DTV,         0x3228, N,   N,  N), +	PINGROUP(ph7,                    SDMMC2,     TRACE,      GMI,          DTV,         0x322c, N,   N,  N), +	PINGROUP(pj7,                    UARTD,      RSVD2,      GMI,          GMI_ALT,     0x3230, N,   N,  N), +	PINGROUP(pb0,                    UARTD,      RSVD2,      GMI,          RSVD4,       0x3234, N,   N,  N), +	PINGROUP(pb1,                    UARTD,      RSVD2,      GMI,          RSVD4,       0x3238, N,   N,  N), +	PINGROUP(pk7,                    UARTD,      RSVD2,      GMI,          RSVD4,       0x323c, N,   N,  N), +	PINGROUP(pi0,                    RSVD1,      RSVD2,      GMI,          RSVD4,       0x3240, N,   N,  N), +	PINGROUP(pi1,                    RSVD1,      RSVD2,      GMI,          RSVD4,       0x3244, N,   N,  N), +	PINGROUP(pi2,                    SDMMC2,     TRACE,      GMI,          RSVD4,       0x3248, N,   N,  N), +	PINGROUP(pi4,                    SPI4,       TRACE,      GMI,          DISPLAYA,    0x324c, N,   N,  N), +	PINGROUP(gen2_i2c_scl_pt5,       I2C2,       RSVD2,      GMI,          RSVD4,       0x3250, Y,   N,  N), +	PINGROUP(gen2_i2c_sda_pt6,       I2C2,       RSVD2,      GMI,          RSVD4,       0x3254, Y,   N,  N), +	PINGROUP(sdmmc4_clk_pcc4,        SDMMC4,     RSVD2,      GMI,          RSVD4,       0x3258, N,   Y,  N), +	PINGROUP(sdmmc4_cmd_pt7,         SDMMC4,     RSVD2,      GMI,          RSVD4,       0x325c, N,   Y,  N), +	PINGROUP(sdmmc4_dat0_paa0,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3260, N,   Y,  N), +	PINGROUP(sdmmc4_dat1_paa1,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3264, N,   Y,  N), +	PINGROUP(sdmmc4_dat2_paa2,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3268, N,   Y,  N), +	PINGROUP(sdmmc4_dat3_paa3,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x326c, N,   Y,  N), +	PINGROUP(sdmmc4_dat4_paa4,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3270, N,   Y,  N), +	PINGROUP(sdmmc4_dat5_paa5,       SDMMC4,     SPI3,       RSVD3,        RSVD4,       0x3274, N,   Y,  N), +	PINGROUP(sdmmc4_dat6_paa6,       SDMMC4,     SPI3,       GMI,          RSVD4,       0x3278, N,   Y,  N), +	PINGROUP(sdmmc4_dat7_paa7,       SDMMC4,     RSVD2,      GMI,          RSVD4,       0x327c, N,   Y,  N), +	PINGROUP(cam_mclk_pcc0,          VI,         VI_ALT1,    VI_ALT3,      SDMMC2,      0x3284, N,   N,  N), +	PINGROUP(pcc1,                   I2S4,       RSVD2,      RSVD3,        SDMMC2,      0x3288, N,   N,  N), +	PINGROUP(pbb0,                   VGP6,       VIMCLK2,    SDMMC2,       VIMCLK2_ALT, 0x328c, N,   N,  N), +	PINGROUP(cam_i2c_scl_pbb1,       VGP1,       I2C3,       RSVD3,        SDMMC2,      0x3290, Y,   N,  N), +	PINGROUP(cam_i2c_sda_pbb2,       VGP2,       I2C3,       RSVD3,        SDMMC2,      0x3294, Y,   N,  N), +	PINGROUP(pbb3,                   VGP3,       DISPLAYA,   DISPLAYB,     SDMMC2,      0x3298, N,   N,  N), +	PINGROUP(pbb4,                   VGP4,       DISPLAYA,   DISPLAYB,     SDMMC2,      0x329c, N,   N,  N), +	PINGROUP(pbb5,                   VGP5,       DISPLAYA,   RSVD3,        SDMMC2,      0x32a0, N,   N,  N), +	PINGROUP(pbb6,                   I2S4,       RSVD2,      DISPLAYB,     SDMMC2,      0x32a4, N,   N,  N), +	PINGROUP(pbb7,                   I2S4,       RSVD2,      RSVD3,        SDMMC2,      0x32a8, N,   N,  N), +	PINGROUP(pcc2,                   I2S4,       RSVD2,      SDMMC3,       SDMMC2,      0x32ac, N,   N,  N), +	PINGROUP(jtag_rtck,              RTCK,       RSVD2,      RSVD3,        RSVD4,       0x32b0, N,   N,  N), +	PINGROUP(pwr_i2c_scl_pz6,        I2CPWR,     RSVD2,      RSVD3,        RSVD4,       0x32b4, Y,   N,  N), +	PINGROUP(pwr_i2c_sda_pz7,        I2CPWR,     RSVD2,      RSVD3,        RSVD4,       0x32b8, Y,   N,  N), +	PINGROUP(kb_row0_pr0,            KBC,        RSVD2,      RSVD3,        RSVD4,       0x32bc, N,   N,  N), +	PINGROUP(kb_row1_pr1,            KBC,        RSVD2,      RSVD3,        RSVD4,       0x32c0, N,   N,  N), +	PINGROUP(kb_row2_pr2,            KBC,        RSVD2,      RSVD3,        RSVD4,       0x32c4, N,   N,  N), +	PINGROUP(kb_row3_pr3,            KBC,        DISPLAYA,   SYS,          DISPLAYB,    0x32c8, N,   N,  N), +	PINGROUP(kb_row4_pr4,            KBC,        DISPLAYA,   RSVD3,        DISPLAYB,    0x32cc, N,   N,  N), +	PINGROUP(kb_row5_pr5,            KBC,        DISPLAYA,   RSVD3,        DISPLAYB,    0x32d0, N,   N,  N), +	PINGROUP(kb_row6_pr6,            KBC,        DISPLAYA,   DISPLAYA_ALT, DISPLAYB,    0x32d4, N,   N,  N), +	PINGROUP(kb_row7_pr7,            KBC,        RSVD2,      CLDVFS,       UARTA,       0x32d8, N,   N,  N), +	PINGROUP(kb_row8_ps0,            KBC,        RSVD2,      CLDVFS,       UARTA,       0x32dc, N,   N,  N), +	PINGROUP(kb_row9_ps1,            KBC,        RSVD2,      RSVD3,        UARTA,       0x32e0, N,   N,  N), +	PINGROUP(kb_row10_ps2,           KBC,        RSVD2,      RSVD3,        UARTA,       0x32e4, N,   N,  N), +	PINGROUP(kb_row11_ps3,           KBC,        RSVD2,      RSVD3,        IRDA,        0x32e8, N,   N,  N), +	PINGROUP(kb_row12_ps4,           KBC,        RSVD2,      RSVD3,        IRDA,        0x32ec, N,   N,  N), +	PINGROUP(kb_row13_ps5,           KBC,        RSVD2,      SPI2,         RSVD4,       0x32f0, N,   N,  N), +	PINGROUP(kb_row14_ps6,           KBC,        RSVD2,      SPI2,         RSVD4,       0x32f4, N,   N,  N), +	PINGROUP(kb_row15_ps7,           KBC,        SOC,        RSVD3,        RSVD4,       0x32f8, N,   N,  N), +	PINGROUP(kb_col0_pq0,            KBC,        RSVD2,      SPI2,         RSVD4,       0x32fc, N,   N,  N), +	PINGROUP(kb_col1_pq1,            KBC,        RSVD2,      SPI2,         RSVD4,       0x3300, N,   N,  N), +	PINGROUP(kb_col2_pq2,            KBC,        RSVD2,      SPI2,         RSVD4,       0x3304, N,   N,  N), +	PINGROUP(kb_col3_pq3,            KBC,        DISPLAYA,   PWM2,         UARTA,       0x3308, N,   N,  N), +	PINGROUP(kb_col4_pq4,            KBC,        OWR,        SDMMC3,       UARTA,       0x330c, N,   N,  N), +	PINGROUP(kb_col5_pq5,            KBC,        RSVD2,      SDMMC3,       RSVD4,       0x3310, N,   N,  N), +	PINGROUP(kb_col6_pq6,            KBC,        RSVD2,      SPI2,         UARTD,       0x3314, N,   N,  N), +	PINGROUP(kb_col7_pq7,            KBC,        RSVD2,      SPI2,         UARTD,       0x3318, N,   N,  N), +	PINGROUP(clk_32k_out_pa0,        BLINK,      SOC,        RSVD3,        RSVD4,       0x331c, N,   N,  N), +	PINGROUP(core_pwr_req,           PWRON,      RSVD2,      RSVD3,        RSVD4,       0x3324, N,   N,  N), +	PINGROUP(cpu_pwr_req,            CPU,        RSVD2,      RSVD3,        RSVD4,       0x3328, N,   N,  N), +	PINGROUP(pwr_int_n,              PMI,        RSVD2,      RSVD3,        RSVD4,       0x332c, N,   N,  N), +	PINGROUP(clk_32k_in,             CLK,        RSVD2,      RSVD3,        RSVD4,       0x3330, N,   N,  N), +	PINGROUP(owr,                    OWR,        RSVD2,      RSVD3,        RSVD4,       0x3334, N,   N,  Y), +	PINGROUP(dap1_fs_pn0,            I2S0,       HDA,        GMI,          RSVD4,       0x3338, N,   N,  N), +	PINGROUP(dap1_din_pn1,           I2S0,       HDA,        GMI,          RSVD4,       0x333c, N,   N,  N), +	PINGROUP(dap1_dout_pn2,          I2S0,       HDA,        GMI,          SATA,        0x3340, N,   N,  N), +	PINGROUP(dap1_sclk_pn3,          I2S0,       HDA,        GMI,          RSVD4,       0x3344, N,   N,  N), +	PINGROUP(dap_mclk1_req_pee2,     DAP,        DAP1,       SATA,         RSVD4,       0x3348, N,   N,  N), +	PINGROUP(dap_mclk1_pw4,          EXTPERIPH1, DAP2,       RSVD3,        RSVD4,       0x334c, N,   N,  N), +	PINGROUP(spdif_in_pk6,           SPDIF,      RSVD2,      RSVD3,        I2C3,        0x3350, N,   N,  N), +	PINGROUP(spdif_out_pk5,          SPDIF,      RSVD2,      RSVD3,        I2C3,        0x3354, N,   N,  N), +	PINGROUP(dap2_fs_pa2,            I2S1,       HDA,        GMI,          RSVD4,       0x3358, N,   N,  N), +	PINGROUP(dap2_din_pa4,           I2S1,       HDA,        GMI,          RSVD4,       0x335c, N,   N,  N), +	PINGROUP(dap2_dout_pa5,          I2S1,       HDA,        GMI,          RSVD4,       0x3360, N,   N,  N), +	PINGROUP(dap2_sclk_pa3,          I2S1,       HDA,        GMI,          RSVD4,       0x3364, N,   N,  N), +	PINGROUP(dvfs_pwm_px0,           SPI6,       CLDVFS,     GMI,          RSVD4,       0x3368, N,   N,  N), +	PINGROUP(gpio_x1_aud_px1,        SPI6,       RSVD2,      GMI,          RSVD4,       0x336c, N,   N,  N), +	PINGROUP(gpio_x3_aud_px3,        SPI6,       SPI1,       GMI,          RSVD4,       0x3370, N,   N,  N), +	PINGROUP(dvfs_clk_px2,           SPI6,       CLDVFS,     GMI,          RSVD4,       0x3374, N,   N,  N), +	PINGROUP(gpio_x4_aud_px4,        GMI,        SPI1,       SPI2,         DAP2,        0x3378, N,   N,  N), +	PINGROUP(gpio_x5_aud_px5,        GMI,        SPI1,       SPI2,         RSVD4,       0x337c, N,   N,  N), +	PINGROUP(gpio_x6_aud_px6,        SPI6,       SPI1,       SPI2,         GMI,         0x3380, N,   N,  N), +	PINGROUP(gpio_x7_aud_px7,        RSVD1,      SPI1,       SPI2,         RSVD4,       0x3384, N,   N,  N), +	PINGROUP(sdmmc3_clk_pa6,         SDMMC3,     RSVD2,      RSVD3,        SPI3,        0x3390, N,   N,  N), +	PINGROUP(sdmmc3_cmd_pa7,         SDMMC3,     PWM3,       UARTA,        SPI3,        0x3394, N,   N,  N), +	PINGROUP(sdmmc3_dat0_pb7,        SDMMC3,     RSVD2,      RSVD3,        SPI3,        0x3398, N,   N,  N), +	PINGROUP(sdmmc3_dat1_pb6,        SDMMC3,     PWM2,       UARTA,        SPI3,        0x339c, N,   N,  N), +	PINGROUP(sdmmc3_dat2_pb5,        SDMMC3,     PWM1,       DISPLAYA,     SPI3,        0x33a0, N,   N,  N), +	PINGROUP(sdmmc3_dat3_pb4,        SDMMC3,     PWM0,       DISPLAYB,     SPI3,        0x33a4, N,   N,  N), +	PINGROUP(pex_l0_rst_n_pdd1,      PE0,        RSVD2,      RSVD3,        RSVD4,       0x33bc, N,   N,  N), +	PINGROUP(pex_l0_clkreq_n_pdd2,   PE0,        RSVD2,      RSVD3,        RSVD4,       0x33c0, N,   N,  N), +	PINGROUP(pex_wake_n_pdd3,        PE,         RSVD2,      RSVD3,        RSVD4,       0x33c4, N,   N,  N), +	PINGROUP(pex_l1_rst_n_pdd5,      PE1,        RSVD2,      RSVD3,        RSVD4,       0x33cc, N,   N,  N), +	PINGROUP(pex_l1_clkreq_n_pdd6,   PE1,        RSVD2,      RSVD3,        RSVD4,       0x33d0, N,   N,  N), +	PINGROUP(hdmi_cec_pee3,          CEC,        RSVD2,      RSVD3,        RSVD4,       0x33e0, Y,   N,  N), +	PINGROUP(sdmmc1_wp_n_pv3,        SDMMC1,     CLK12,      SPI4,         UARTA,       0x33e4, N,   N,  N), +	PINGROUP(sdmmc3_cd_n_pv2,        SDMMC3,     OWR,        RSVD3,        RSVD4,       0x33e8, N,   N,  N), +	PINGROUP(gpio_w2_aud_pw2,        SPI6,       RSVD2,      SPI2,         I2C1,        0x33ec, N,   N,  N), +	PINGROUP(gpio_w3_aud_pw3,        SPI6,       SPI1,       SPI2,         I2C1,        0x33f0, N,   N,  N), +	PINGROUP(usb_vbus_en0_pn4,       USB,        RSVD2,      RSVD3,        RSVD4,       0x33f4, Y,   N,  N), +	PINGROUP(usb_vbus_en1_pn5,       USB,        RSVD2,      RSVD3,        RSVD4,       0x33f8, Y,   N,  N), +	PINGROUP(sdmmc3_clk_lb_in_pee5,  SDMMC3,     RSVD2,      RSVD3,        RSVD4,       0x33fc, N,   N,  N), +	PINGROUP(sdmmc3_clk_lb_out_pee4, SDMMC3,     RSVD2,      RSVD3,        RSVD4,       0x3400, N,   N,  N), +	PINGROUP(gmi_clk_lb,             SDMMC2,     RSVD2,      GMI,          RSVD4,       0x3404, N,   N,  N), +	PINGROUP(reset_out_n,            RSVD1,      RSVD2,      RSVD3,        RESET_OUT_N, 0x3408, N,   N,  N), +	PINGROUP(kb_row16_pt0,           KBC,        RSVD2,      RSVD3,        UARTC,       0x340c, N,   N,  N), +	PINGROUP(kb_row17_pt1,           KBC,        RSVD2,      RSVD3,        UARTC,       0x3410, N,   N,  N), +	PINGROUP(usb_vbus_en2_pff1,      USB,        RSVD2,      RSVD3,        RSVD4,       0x3414, Y,   N,  N), +	PINGROUP(pff2,                   SATA,       RSVD2,      RSVD3,        RSVD4,       0x3418, Y,   N,  N), +	PINGROUP(dp_hpd_pff0,            DP,         RSVD2,      RSVD3,        RSVD4,       0x3430, N,   N,  N), + +	/* pg_name, r, hsm_b, schmitt_b, lpmd_b, drvdn_b, drvdn_w, drvup_b, drvup_w, slwr_b, slwr_w, slwf_b, slwf_w, drvtype */ +	DRV_PINGROUP(ao1,         0x868,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao2,         0x86c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(at1,         0x870,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at2,         0x874,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at3,         0x878,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at4,         0x87c,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(at5,         0x880,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(cdev1,       0x884,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(cdev2,       0x888,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap1,        0x890,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap2,        0x894,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap3,        0x898,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dap4,        0x89c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dbg,         0x8a0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(sdio3,       0x8b0,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  N), +	DRV_PINGROUP(spi,         0x8b4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uaa,         0x8b8,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uab,         0x8bc,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uart2,       0x8c0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uart3,       0x8c4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(sdio1,       0x8ec,  2,  3, -1,  12,  7,  20,  7,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ddc,         0x8fc,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gma,         0x900,  2,  3,  4,  14,  5,  20,  5,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(gme,         0x910,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gmf,         0x914,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gmg,         0x918,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gmh,         0x91c,  2,  3,  4,  14,  5,  19,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(owr,         0x920,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(uda,         0x924,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(gpv,         0x928,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(dev3,        0x92c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(cec,         0x938,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(at6,         0x994,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +	DRV_PINGROUP(dap5,        0x998,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(usb_vbus_en, 0x99c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao3,         0x9a8,  2,  3,  4,  12,  5,  -1, -1,  28,  2,  -1, -1,  N), +	DRV_PINGROUP(ao0,         0x9b0,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(hv0,         0x9b4,  2,  3,  4,  12,  5,  -1, -1,  28,  2,  -1, -1,  N), +	DRV_PINGROUP(sdio4,       0x9c4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N), +	DRV_PINGROUP(ao4,         0x9c8,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y), +}; + +static const struct tegra_pinctrl_soc_data tegra124_pinctrl = { +	.ngpios = NUM_GPIOS, +	.pins = tegra124_pins, +	.npins = ARRAY_SIZE(tegra124_pins), +	.functions = tegra124_functions, +	.nfunctions = ARRAY_SIZE(tegra124_functions), +	.groups = tegra124_groups, +	.ngroups = ARRAY_SIZE(tegra124_groups), +}; + +static int tegra124_pinctrl_probe(struct platform_device *pdev) +{ +	return tegra_pinctrl_probe(pdev, &tegra124_pinctrl); +} + +static 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 = { +		.name = "tegra124-pinctrl", +		.owner = THIS_MODULE, +		.of_match_table = tegra124_pinctrl_of_match, +	}, +	.probe = tegra124_pinctrl_probe, +	.remove = tegra_pinctrl_remove, +}; +module_platform_driver(tegra124_pinctrl_driver); + +MODULE_AUTHOR("Ashwini Ghuge <aghuge@nvidia.com>"); +MODULE_DESCRIPTION("NVIDIA Tegra124 pinctrl driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/pinctrl/pinctrl-tegra20.c b/drivers/pinctrl/pinctrl-tegra20.c index fcfb7d012c5..7563ebc9c79 100644 --- a/drivers/pinctrl/pinctrl-tegra20.c +++ b/drivers/pinctrl/pinctrl-tegra20.c @@ -1894,637 +1894,12 @@ enum tegra_mux {  	TEGRA_MUX_XIO,  }; -static const char * const ahb_clk_groups[] = { -	"cdev2", -}; - -static const char * const apb_clk_groups[] = { -	"cdev2", -}; - -static const char * const audio_sync_groups[] = { -	"cdev1", -}; - -static const char * const crt_groups[] = { -	"crtp", -	"lm1", -}; - -static const char * const dap1_groups[] = { -	"dap1", -}; - -static const char * const dap2_groups[] = { -	"dap2", -}; - -static const char * const dap3_groups[] = { -	"dap3", -}; - -static const char * const dap4_groups[] = { -	"dap4", -}; - -static const char * const dap5_groups[] = { -	"gme", -}; - -static const char * const displaya_groups[] = { -	"lcsn", -	"ld0", -	"ld1", -	"ld10", -	"ld11", -	"ld12", -	"ld13", -	"ld14", -	"ld15", -	"ld16", -	"ld17", -	"ld2", -	"ld3", -	"ld4", -	"ld5", -	"ld6", -	"ld7", -	"ld8", -	"ld9", -	"ldc", -	"ldi", -	"lhp0", -	"lhp1", -	"lhp2", -	"lhs", -	"lm0", -	"lm1", -	"lpp", -	"lpw0", -	"lpw1", -	"lpw2", -	"lsc0", -	"lsc1", -	"lsck", -	"lsda", -	"lsdi", -	"lspi", -	"lvp0", -	"lvp1", -	"lvs", -}; - -static const char * const displayb_groups[] = { -	"lcsn", -	"ld0", -	"ld1", -	"ld10", -	"ld11", -	"ld12", -	"ld13", -	"ld14", -	"ld15", -	"ld16", -	"ld17", -	"ld2", -	"ld3", -	"ld4", -	"ld5", -	"ld6", -	"ld7", -	"ld8", -	"ld9", -	"ldc", -	"ldi", -	"lhp0", -	"lhp1", -	"lhp2", -	"lhs", -	"lm0", -	"lm1", -	"lpp", -	"lpw0", -	"lpw1", -	"lpw2", -	"lsc0", -	"lsc1", -	"lsck", -	"lsda", -	"lsdi", -	"lspi", -	"lvp0", -	"lvp1", -	"lvs", -}; - -static const char * const emc_test0_dll_groups[] = { -	"kbca", -}; - -static const char * const emc_test1_dll_groups[] = { -	"kbcc", -}; - -static const char * const gmi_groups[] = { -	"ata", -	"atb", -	"atc", -	"atd", -	"ate", -	"dap1", -	"dap2", -	"dap4", -	"gma", -	"gmb", -	"gmc", -	"gmd", -	"gme", -	"gpu", -	"irrx", -	"irtx", -	"pta", -	"spia", -	"spib", -	"spic", -	"spid", -	"spie", -	"uca", -	"ucb", -}; - -static const char * const gmi_int_groups[] = { -	"gmb", -}; - -static const char * const hdmi_groups[] = { -	"hdint", -	"lpw0", -	"lpw2", -	"lsc1", -	"lsck", -	"lsda", -	"lspi", -	"pta", -}; - -static const char * const i2cp_groups[] = { -	"i2cp", -}; - -static const char * const i2c1_groups[] = { -	"rm", -	"spdi", -	"spdo", -	"spig", -	"spih", -}; - -static const char * const i2c2_groups[] = { -	"ddc", -	"pta", -}; - -static const char * const i2c3_groups[] = { -	"dtf", -}; - -static const char * const ide_groups[] = { -	"ata", -	"atb", -	"atc", -	"atd", -	"ate", -	"gmb", -}; - -static const char * const irda_groups[] = { -	"uad", -}; - -static const char * const kbc_groups[] = { -	"kbca", -	"kbcb", -	"kbcc", -	"kbcd", -	"kbce", -	"kbcf", -}; - -static const char * const mio_groups[] = { -	"kbcb", -	"kbcd", -	"kbcf", -}; - -static const char * const mipi_hs_groups[] = { -	"uaa", -	"uab", -}; - -static const char * const nand_groups[] = { -	"ata", -	"atb", -	"atc", -	"atd", -	"ate", -	"gmb", -	"gmd", -	"kbca", -	"kbcb", -	"kbcc", -	"kbcd", -	"kbce", -	"kbcf", -}; - -static const char * const osc_groups[] = { -	"cdev1", -	"cdev2", -}; - -static const char * const owr_groups[] = { -	"kbce", -	"owc", -	"uac", -}; - -static const char * const pcie_groups[] = { -	"gpv", -	"slxa", -	"slxk", -}; - -static const char * const plla_out_groups[] = { -	"cdev1", -}; - -static const char * const pllc_out1_groups[] = { -	"csus", -}; - -static const char * const pllm_out1_groups[] = { -	"cdev1", -}; - -static const char * const pllp_out2_groups[] = { -	"csus", -}; - -static const char * const pllp_out3_groups[] = { -	"csus", -}; - -static const char * const pllp_out4_groups[] = { -	"cdev2", -}; - -static const char * const pwm_groups[] = { -	"gpu", -	"sdb", -	"sdc", -	"sdd", -	"ucb", -}; - -static const char * const pwr_intr_groups[] = { -	"pmc", -}; - -static const char * const pwr_on_groups[] = { -	"pmc", -}; - -static const char * const rsvd1_groups[] = { -	"dta", -	"dtb", -	"dtc", -	"dtd", -	"dte", -	"gmd", -	"gme", -}; - -static const char * const rsvd2_groups[] = { -	"crtp", -	"dap1", -	"dap3", -	"dap4", -	"ddc", -	"dtb", -	"dtc", -	"dte", -	"dtf", -	"gpu7", -	"gpv", -	"hdint", -	"i2cp", -	"owc", -	"rm", -	"sdio1", -	"spdi", -	"spdo", -	"uac", -	"uca", -	"uda", -}; - -static const char * const rsvd3_groups[] = { -	"crtp", -	"dap2", -	"dap3", -	"ddc", -	"gpu7", -	"gpv", -	"hdint", -	"i2cp", -	"ld17", -	"ldc", -	"ldi", -	"lhp0", -	"lhp1", -	"lhp2", -	"lm1", -	"lpp", -	"lpw1", -	"lvp0", -	"lvp1", -	"owc", -	"pmc", -	"rm", -	"uac", -}; - -static const char * const rsvd4_groups[] = { -	"ata", -	"ate", -	"crtp", -	"dap3", -	"dap4", -	"ddc", -	"dta", -	"dtc", -	"dtd", -	"dtf", -	"gpu", -	"gpu7", -	"gpv", -	"hdint", -	"i2cp", -	"kbce", -	"lcsn", -	"ld0", -	"ld1", -	"ld2", -	"ld3", -	"ld4", -	"ld5", -	"ld6", -	"ld7", -	"ld8", -	"ld9", -	"ld10", -	"ld11", -	"ld12", -	"ld13", -	"ld14", -	"ld15", -	"ld16", -	"ld17", -	"ldc", -	"ldi", -	"lhp0", -	"lhp1", -	"lhp2", -	"lhs", -	"lm0", -	"lpp", -	"lpw1", -	"lsc0", -	"lsdi", -	"lvp0", -	"lvp1", -	"lvs", -	"owc", -	"pmc", -	"pta", -	"rm", -	"spif", -	"uac", -	"uca", -	"ucb", -}; - -static const char * const rtck_groups[] = { -	"gpu7", -}; - -static const char * const sdio1_groups[] = { -	"sdio1", -}; - -static const char * const sdio2_groups[] = { -	"dap1", -	"dta", -	"dtd", -	"kbca", -	"kbcb", -	"kbcd", -	"spdi", -	"spdo", -}; - -static const char * const sdio3_groups[] = { -	"sdb", -	"sdc", -	"sdd", -	"slxa", -	"slxc", -	"slxd", -	"slxk", -}; - -static const char * const sdio4_groups[] = { -	"atb", -	"atc", -	"atd", -	"gma", -	"gme", -}; - -static const char * const sflash_groups[] = { -	"gmc", -	"gmd", -}; - -static const char * const spdif_groups[] = { -	"slxc", -	"slxd", -	"spdi", -	"spdo", -	"uad", -}; - -static const char * const spi1_groups[] = { -	"dtb", -	"dte", -	"spia", -	"spib", -	"spic", -	"spid", -	"spie", -	"spif", -	"uda", -}; - -static const char * const spi2_groups[] = { -	"sdb", -	"slxa", -	"slxc", -	"slxd", -	"slxk", -	"spia", -	"spib", -	"spic", -	"spid", -	"spie", -	"spif", -	"spig", -	"spih", -	"uab", -}; - -static const char * const spi2_alt_groups[] = { -	"spid", -	"spie", -	"spig", -	"spih", -}; - -static const char * const spi3_groups[] = { -	"gma", -	"lcsn", -	"lm0", -	"lpw0", -	"lpw2", -	"lsc1", -	"lsck", -	"lsda", -	"lsdi", -	"sdc", -	"sdd", -	"spia", -	"spib", -	"spic", -	"spif", -	"spig", -	"spih", -	"uaa", -}; - -static const char * const spi4_groups[] = { -	"gmc", -	"irrx", -	"irtx", -	"slxa", -	"slxc", -	"slxd", -	"slxk", -	"uad", -}; - -static const char * const trace_groups[] = { -	"kbcc", -	"kbcf", -}; - -static const char * const twc_groups[] = { -	"dap2", -	"sdc", -}; - -static const char * const uarta_groups[] = { -	"gpu", -	"irrx", -	"irtx", -	"sdb", -	"sdd", -	"sdio1", -	"uaa", -	"uab", -	"uad", -}; - -static const char * const uartb_groups[] = { -	"irrx", -	"irtx", -}; - -static const char * const uartc_groups[] = { -	"uca", -	"ucb", -}; - -static const char * const uartd_groups[] = { -	"gmc", -	"uda", -}; - -static const char * const uarte_groups[] = { -	"gma", -	"sdio1", -}; - -static const char * const ulpi_groups[] = { -	"uaa", -	"uab", -	"uda", -}; - -static const char * const vi_groups[] = { -	"dta", -	"dtb", -	"dtc", -	"dtd", -	"dte", -	"dtf", -}; - -static const char * const vi_sensor_clk_groups[] = { -	"csus", -}; - -static const char * const xio_groups[] = { -	"ld0", -	"ld1", -	"ld10", -	"ld11", -	"ld12", -	"ld13", -	"ld14", -	"ld15", -	"ld16", -	"ld2", -	"ld3", -	"ld4", -	"ld5", -	"ld6", -	"ld7", -	"ld8", -	"ld9", -	"lhs", -	"lsc0", -	"lspi", -	"lvs", -}; -  #define FUNCTION(fname)					\  	{						\  		.name = #fname,				\ -		.groups = fname##_groups,		\ -		.ngroups = ARRAY_SIZE(fname##_groups),	\  	} -static const struct tegra_function tegra20_functions[] = { +static struct tegra_function tegra20_functions[] = {  	FUNCTION(ahb_clk),  	FUNCTION(apb_clk),  	FUNCTION(audio_sync), @@ -2598,7 +1973,7 @@ static const struct tegra_function tegra20_functions[] = {  #define PINGROUP_REG_A		0x868  /* Pin group with mux control, and typically tri-state and pull-up/down too */ -#define MUX_PG(pg_name, f0, f1, f2, f3, f_safe,			\ +#define MUX_PG(pg_name, f0, f1, f2, f3,				\  	       tri_r, tri_b, mux_r, mux_b, pupd_r, pupd_b)	\  	{							\  		.name = #pg_name,				\ @@ -2610,7 +1985,6 @@ static const struct tegra_function tegra20_functions[] = {  			TEGRA_MUX_ ## f2,			\  			TEGRA_MUX_ ## f3,			\  		},						\ -		.func_safe = TEGRA_MUX_ ## f_safe,		\  		.mux_reg = ((mux_r) - PIN_MUX_CTL_REG_A),	\  		.mux_bank = 1,					\  		.mux_bit = mux_b,				\ @@ -2620,13 +1994,12 @@ static const struct tegra_function tegra20_functions[] = {  		.tri_reg = ((tri_r) - TRISTATE_REG_A),		\  		.tri_bank = 0,					\  		.tri_bit = tri_b,				\ -		.einput_reg = -1,				\ -		.odrain_reg = -1,				\ -		.lock_reg = -1,					\ -		.ioreset_reg = -1,				\ -		.rcv_sel_reg = -1,				\ +		.einput_bit = -1,				\ +		.odrain_bit = -1,				\ +		.lock_bit = -1,					\ +		.ioreset_bit = -1,				\ +		.rcv_sel_bit = -1,				\  		.drv_reg = -1,					\ -		.drvtype_reg = -1,				\  	}  /* Pin groups with only pull up and pull down control */ @@ -2639,14 +2012,7 @@ static const struct tegra_function tegra20_functions[] = {  		.pupd_reg = ((pupd_r) - PULLUPDOWN_REG_A),	\  		.pupd_bank = 2,					\  		.pupd_bit = pupd_b,				\ -		.tri_reg = -1,					\ -		.einput_reg = -1,				\ -		.odrain_reg = -1,				\ -		.lock_reg = -1,					\ -		.ioreset_reg = -1,				\ -		.rcv_sel_reg = -1,				\  		.drv_reg = -1,					\ -		.drvtype_reg = -1,				\  	}  /* Pin groups for drive strength registers (configurable version) */ @@ -2660,11 +2026,6 @@ static const struct tegra_function tegra20_functions[] = {  		.mux_reg = -1,					\  		.pupd_reg = -1,					\  		.tri_reg = -1,					\ -		.einput_reg = -1,				\ -		.odrain_reg = -1,				\ -		.lock_reg = -1,					\ -		.ioreset_reg = -1,				\ -		.rcv_sel_reg = -1,				\  		.drv_reg = ((r) - PINGROUP_REG_A),		\  		.drv_bank = 3,					\  		.hsm_bit = hsm_b,				\ @@ -2678,7 +2039,7 @@ static const struct tegra_function tegra20_functions[] = {  		.slwr_width = slwr_w,				\  		.slwf_bit = slwf_b,				\  		.slwf_width = slwf_w,				\ -		.drvtype_reg = -1,				\ +		.drvtype_bit = -1,				\  	}  /* Pin groups for drive strength registers (simple version) */ @@ -2686,114 +2047,114 @@ static const struct tegra_function tegra20_functions[] = {  	DRV_PG_EXT(pg_name, r, 2,  3,  4, 12, 20, 28, 2, 30, 2)  static const struct tegra_pingroup tegra20_groups[] = { -	/*     name,   f0,        f1,        f2,        f3,            f_safe,    tri r/b,  mux r/b,  pupd r/b */ -	MUX_PG(ata,    IDE,       NAND,      GMI,       RSVD4,         IDE,       0x14, 0,  0x80, 24, 0xa0, 0), -	MUX_PG(atb,    IDE,       NAND,      GMI,       SDIO4,         IDE,       0x14, 1,  0x80, 16, 0xa0, 2), -	MUX_PG(atc,    IDE,       NAND,      GMI,       SDIO4,         IDE,       0x14, 2,  0x80, 22, 0xa0, 4), -	MUX_PG(atd,    IDE,       NAND,      GMI,       SDIO4,         IDE,       0x14, 3,  0x80, 20, 0xa0, 6), -	MUX_PG(ate,    IDE,       NAND,      GMI,       RSVD4,         IDE,       0x18, 25, 0x80, 12, 0xa0, 8), -	MUX_PG(cdev1,  OSC,       PLLA_OUT,  PLLM_OUT1, AUDIO_SYNC,    OSC,       0x14, 4,  0x88, 2,  0xa8, 0), -	MUX_PG(cdev2,  OSC,       AHB_CLK,   APB_CLK,   PLLP_OUT4,     OSC,       0x14, 5,  0x88, 4,  0xa8, 2), -	MUX_PG(crtp,   CRT,       RSVD2,     RSVD3,     RSVD4,         RSVD2,     0x20, 14, 0x98, 20, 0xa4, 24), -	MUX_PG(csus,   PLLC_OUT1, PLLP_OUT2, PLLP_OUT3, VI_SENSOR_CLK, PLLC_OUT1, 0x14, 6,  0x88, 6,  0xac, 24), -	MUX_PG(dap1,   DAP1,      RSVD2,     GMI,       SDIO2,         DAP1,      0x14, 7,  0x88, 20, 0xa0, 10), -	MUX_PG(dap2,   DAP2,      TWC,       RSVD3,     GMI,           DAP2,      0x14, 8,  0x88, 22, 0xa0, 12), -	MUX_PG(dap3,   DAP3,      RSVD2,     RSVD3,     RSVD4,         DAP3,      0x14, 9,  0x88, 24, 0xa0, 14), -	MUX_PG(dap4,   DAP4,      RSVD2,     GMI,       RSVD4,         DAP4,      0x14, 10, 0x88, 26, 0xa0, 16), -	MUX_PG(ddc,    I2C2,      RSVD2,     RSVD3,     RSVD4,         RSVD4,     0x18, 31, 0x88, 0,  0xb0, 28), -	MUX_PG(dta,    RSVD1,     SDIO2,     VI,        RSVD4,         RSVD4,     0x14, 11, 0x84, 20, 0xa0, 18), -	MUX_PG(dtb,    RSVD1,     RSVD2,     VI,        SPI1,          RSVD1,     0x14, 12, 0x84, 22, 0xa0, 20), -	MUX_PG(dtc,    RSVD1,     RSVD2,     VI,        RSVD4,         RSVD1,     0x14, 13, 0x84, 26, 0xa0, 22), -	MUX_PG(dtd,    RSVD1,     SDIO2,     VI,        RSVD4,         RSVD1,     0x14, 14, 0x84, 28, 0xa0, 24), -	MUX_PG(dte,    RSVD1,     RSVD2,     VI,        SPI1,          RSVD1,     0x14, 15, 0x84, 30, 0xa0, 26), -	MUX_PG(dtf,    I2C3,      RSVD2,     VI,        RSVD4,         RSVD4,     0x20, 12, 0x98, 30, 0xa0, 28), -	MUX_PG(gma,    UARTE,     SPI3,      GMI,       SDIO4,         SPI3,      0x14, 28, 0x84, 0,  0xb0, 20), -	MUX_PG(gmb,    IDE,       NAND,      GMI,       GMI_INT,       GMI,       0x18, 29, 0x88, 28, 0xb0, 22), -	MUX_PG(gmc,    UARTD,     SPI4,      GMI,       SFLASH,        SPI4,      0x14, 29, 0x84, 2,  0xb0, 24), -	MUX_PG(gmd,    RSVD1,     NAND,      GMI,       SFLASH,        GMI,       0x18, 30, 0x88, 30, 0xb0, 26), -	MUX_PG(gme,    RSVD1,     DAP5,      GMI,       SDIO4,         GMI,       0x18, 0,  0x8c, 0,  0xa8, 24), -	MUX_PG(gpu,    PWM,       UARTA,     GMI,       RSVD4,         RSVD4,     0x14, 16, 0x8c, 4,  0xa4, 20), -	MUX_PG(gpu7,   RTCK,      RSVD2,     RSVD3,     RSVD4,         RTCK,      0x20, 11, 0x98, 28, 0xa4, 6), -	MUX_PG(gpv,    PCIE,      RSVD2,     RSVD3,     RSVD4,         PCIE,      0x14, 17, 0x8c, 2,  0xa0, 30), -	MUX_PG(hdint,  HDMI,      RSVD2,     RSVD3,     RSVD4,         HDMI,      0x1c, 23, 0x84, 4,  -1,   -1), -	MUX_PG(i2cp,   I2CP,      RSVD2,     RSVD3,     RSVD4,         RSVD4,     0x14, 18, 0x88, 8,  0xa4, 2), -	MUX_PG(irrx,   UARTA,     UARTB,     GMI,       SPI4,          UARTB,     0x14, 20, 0x88, 18, 0xa8, 22), -	MUX_PG(irtx,   UARTA,     UARTB,     GMI,       SPI4,          UARTB,     0x14, 19, 0x88, 16, 0xa8, 20), -	MUX_PG(kbca,   KBC,       NAND,      SDIO2,     EMC_TEST0_DLL, KBC,       0x14, 22, 0x88, 10, 0xa4, 8), -	MUX_PG(kbcb,   KBC,       NAND,      SDIO2,     MIO,           KBC,       0x14, 21, 0x88, 12, 0xa4, 10), -	MUX_PG(kbcc,   KBC,       NAND,      TRACE,     EMC_TEST1_DLL, KBC,       0x18, 26, 0x88, 14, 0xa4, 12), -	MUX_PG(kbcd,   KBC,       NAND,      SDIO2,     MIO,           KBC,       0x20, 10, 0x98, 26, 0xa4, 14), -	MUX_PG(kbce,   KBC,       NAND,      OWR,       RSVD4,         KBC,       0x14, 26, 0x80, 28, 0xb0, 2), -	MUX_PG(kbcf,   KBC,       NAND,      TRACE,     MIO,           KBC,       0x14, 27, 0x80, 26, 0xb0, 0), -	MUX_PG(lcsn,   DISPLAYA,  DISPLAYB,  SPI3,      RSVD4,         RSVD4,     0x1c, 31, 0x90, 12, -1,   -1), -	MUX_PG(ld0,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 0,  0x94, 0,  -1,   -1), -	MUX_PG(ld1,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 1,  0x94, 2,  -1,   -1), -	MUX_PG(ld2,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 2,  0x94, 4,  -1,   -1), -	MUX_PG(ld3,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 3,  0x94, 6,  -1,   -1), -	MUX_PG(ld4,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 4,  0x94, 8,  -1,   -1), -	MUX_PG(ld5,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 5,  0x94, 10, -1,   -1), -	MUX_PG(ld6,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 6,  0x94, 12, -1,   -1), -	MUX_PG(ld7,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 7,  0x94, 14, -1,   -1), -	MUX_PG(ld8,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 8,  0x94, 16, -1,   -1), -	MUX_PG(ld9,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 9,  0x94, 18, -1,   -1), -	MUX_PG(ld10,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 10, 0x94, 20, -1,   -1), -	MUX_PG(ld11,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 11, 0x94, 22, -1,   -1), -	MUX_PG(ld12,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 12, 0x94, 24, -1,   -1), -	MUX_PG(ld13,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 13, 0x94, 26, -1,   -1), -	MUX_PG(ld14,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 14, 0x94, 28, -1,   -1), -	MUX_PG(ld15,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 15, 0x94, 30, -1,   -1), -	MUX_PG(ld16,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 16, 0x98, 0,  -1,   -1), -	MUX_PG(ld17,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 17, 0x98, 2,  -1,   -1), -	MUX_PG(ldc,    DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 30, 0x90, 14, -1,   -1), -	MUX_PG(ldi,    DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x20, 6,  0x98, 16, -1,   -1), -	MUX_PG(lhp0,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 18, 0x98, 10, -1,   -1), -	MUX_PG(lhp1,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 19, 0x98, 4,  -1,   -1), -	MUX_PG(lhp2,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 20, 0x98, 6,  -1,   -1), -	MUX_PG(lhs,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x20, 7,  0x90, 22, -1,   -1), -	MUX_PG(lm0,    DISPLAYA,  DISPLAYB,  SPI3,      RSVD4,         RSVD4,     0x1c, 24, 0x90, 26, -1,   -1), -	MUX_PG(lm1,    DISPLAYA,  DISPLAYB,  RSVD3,     CRT,           RSVD3,     0x1c, 25, 0x90, 28, -1,   -1), -	MUX_PG(lpp,    DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x20, 8,  0x98, 14, -1,   -1), -	MUX_PG(lpw0,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          DISPLAYA,  0x20, 3,  0x90, 0,  -1,   -1), -	MUX_PG(lpw1,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x20, 4,  0x90, 2,  -1,   -1), -	MUX_PG(lpw2,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          DISPLAYA,  0x20, 5,  0x90, 4,  -1,   -1), -	MUX_PG(lsc0,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 27, 0x90, 18, -1,   -1), -	MUX_PG(lsc1,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          DISPLAYA,  0x1c, 28, 0x90, 20, -1,   -1), -	MUX_PG(lsck,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          DISPLAYA,  0x1c, 29, 0x90, 16, -1,   -1), -	MUX_PG(lsda,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          DISPLAYA,  0x20, 1,  0x90, 8,  -1,   -1), -	MUX_PG(lsdi,   DISPLAYA,  DISPLAYB,  SPI3,      RSVD4,         DISPLAYA,  0x20, 2,  0x90, 6,  -1,   -1), -	MUX_PG(lspi,   DISPLAYA,  DISPLAYB,  XIO,       HDMI,          DISPLAYA,  0x20, 0,  0x90, 10, -1,   -1), -	MUX_PG(lvp0,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 21, 0x90, 30, -1,   -1), -	MUX_PG(lvp1,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         RSVD4,     0x1c, 22, 0x98, 8,  -1,   -1), -	MUX_PG(lvs,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         RSVD4,     0x1c, 26, 0x90, 24, -1,   -1), -	MUX_PG(owc,    OWR,       RSVD2,     RSVD3,     RSVD4,         OWR,       0x14, 31, 0x84, 8,  0xb0, 30), -	MUX_PG(pmc,    PWR_ON,    PWR_INTR,  RSVD3,     RSVD4,         PWR_ON,    0x14, 23, 0x98, 18, -1,   -1), -	MUX_PG(pta,    I2C2,      HDMI,      GMI,       RSVD4,         RSVD4,     0x14, 24, 0x98, 22, 0xa4, 4), -	MUX_PG(rm,     I2C1,      RSVD2,     RSVD3,     RSVD4,         RSVD4,     0x14, 25, 0x80, 14, 0xa4, 0), -	MUX_PG(sdb,    UARTA,     PWM,       SDIO3,     SPI2,          PWM,       0x20, 15, 0x8c, 10, -1,   -1), -	MUX_PG(sdc,    PWM,       TWC,       SDIO3,     SPI3,          TWC,       0x18, 1,  0x8c, 12, 0xac, 28), -	MUX_PG(sdd,    UARTA,     PWM,       SDIO3,     SPI3,          PWM,       0x18, 2,  0x8c, 14, 0xac, 30), -	MUX_PG(sdio1,  SDIO1,     RSVD2,     UARTE,     UARTA,         RSVD2,     0x14, 30, 0x80, 30, 0xb0, 18), -	MUX_PG(slxa,   PCIE,      SPI4,      SDIO3,     SPI2,          PCIE,      0x18, 3,  0x84, 6,  0xa4, 22), -	MUX_PG(slxc,   SPDIF,     SPI4,      SDIO3,     SPI2,          SPI4,      0x18, 5,  0x84, 10, 0xa4, 26), -	MUX_PG(slxd,   SPDIF,     SPI4,      SDIO3,     SPI2,          SPI4,      0x18, 6,  0x84, 12, 0xa4, 28), -	MUX_PG(slxk,   PCIE,      SPI4,      SDIO3,     SPI2,          PCIE,      0x18, 7,  0x84, 14, 0xa4, 30), -	MUX_PG(spdi,   SPDIF,     RSVD2,     I2C1,      SDIO2,         RSVD2,     0x18, 8,  0x8c, 8,  0xa4, 16), -	MUX_PG(spdo,   SPDIF,     RSVD2,     I2C1,      SDIO2,         RSVD2,     0x18, 9,  0x8c, 6,  0xa4, 18), -	MUX_PG(spia,   SPI1,      SPI2,      SPI3,      GMI,           GMI,       0x18, 10, 0x8c, 30, 0xa8, 4), -	MUX_PG(spib,   SPI1,      SPI2,      SPI3,      GMI,           GMI,       0x18, 11, 0x8c, 28, 0xa8, 6), -	MUX_PG(spic,   SPI1,      SPI2,      SPI3,      GMI,           GMI,       0x18, 12, 0x8c, 26, 0xa8, 8), -	MUX_PG(spid,   SPI2,      SPI1,      SPI2_ALT,  GMI,           GMI,       0x18, 13, 0x8c, 24, 0xa8, 10), -	MUX_PG(spie,   SPI2,      SPI1,      SPI2_ALT,  GMI,           GMI,       0x18, 14, 0x8c, 22, 0xa8, 12), -	MUX_PG(spif,   SPI3,      SPI1,      SPI2,      RSVD4,         RSVD4,     0x18, 15, 0x8c, 20, 0xa8, 14), -	MUX_PG(spig,   SPI3,      SPI2,      SPI2_ALT,  I2C1,          SPI2_ALT,  0x18, 16, 0x8c, 18, 0xa8, 16), -	MUX_PG(spih,   SPI3,      SPI2,      SPI2_ALT,  I2C1,          SPI2_ALT,  0x18, 17, 0x8c, 16, 0xa8, 18), -	MUX_PG(uaa,    SPI3,      MIPI_HS,   UARTA,     ULPI,          MIPI_HS,   0x18, 18, 0x80, 0,  0xac, 0), -	MUX_PG(uab,    SPI2,      MIPI_HS,   UARTA,     ULPI,          MIPI_HS,   0x18, 19, 0x80, 2,  0xac, 2), -	MUX_PG(uac,    OWR,       RSVD2,     RSVD3,     RSVD4,         RSVD4,     0x18, 20, 0x80, 4,  0xac, 4), -	MUX_PG(uad,    IRDA,      SPDIF,     UARTA,     SPI4,          SPDIF,     0x18, 21, 0x80, 6,  0xac, 6), -	MUX_PG(uca,    UARTC,     RSVD2,     GMI,       RSVD4,         RSVD4,     0x18, 22, 0x84, 16, 0xac, 8), -	MUX_PG(ucb,    UARTC,     PWM,       GMI,       RSVD4,         RSVD4,     0x18, 23, 0x84, 18, 0xac, 10), -	MUX_PG(uda,    SPI1,      RSVD2,     UARTD,     ULPI,          RSVD2,     0x20, 13, 0x80, 8,  0xb0, 16), +	/*     name,   f0,        f1,        f2,        f3,            tri r/b,  mux r/b,  pupd r/b */ +	MUX_PG(ata,    IDE,       NAND,      GMI,       RSVD4,         0x14, 0,  0x80, 24, 0xa0, 0), +	MUX_PG(atb,    IDE,       NAND,      GMI,       SDIO4,         0x14, 1,  0x80, 16, 0xa0, 2), +	MUX_PG(atc,    IDE,       NAND,      GMI,       SDIO4,         0x14, 2,  0x80, 22, 0xa0, 4), +	MUX_PG(atd,    IDE,       NAND,      GMI,       SDIO4,         0x14, 3,  0x80, 20, 0xa0, 6), +	MUX_PG(ate,    IDE,       NAND,      GMI,       RSVD4,         0x18, 25, 0x80, 12, 0xa0, 8), +	MUX_PG(cdev1,  OSC,       PLLA_OUT,  PLLM_OUT1, AUDIO_SYNC,    0x14, 4,  0x88, 2,  0xa8, 0), +	MUX_PG(cdev2,  OSC,       AHB_CLK,   APB_CLK,   PLLP_OUT4,     0x14, 5,  0x88, 4,  0xa8, 2), +	MUX_PG(crtp,   CRT,       RSVD2,     RSVD3,     RSVD4,         0x20, 14, 0x98, 20, 0xa4, 24), +	MUX_PG(csus,   PLLC_OUT1, PLLP_OUT2, PLLP_OUT3, VI_SENSOR_CLK, 0x14, 6,  0x88, 6,  0xac, 24), +	MUX_PG(dap1,   DAP1,      RSVD2,     GMI,       SDIO2,         0x14, 7,  0x88, 20, 0xa0, 10), +	MUX_PG(dap2,   DAP2,      TWC,       RSVD3,     GMI,           0x14, 8,  0x88, 22, 0xa0, 12), +	MUX_PG(dap3,   DAP3,      RSVD2,     RSVD3,     RSVD4,         0x14, 9,  0x88, 24, 0xa0, 14), +	MUX_PG(dap4,   DAP4,      RSVD2,     GMI,       RSVD4,         0x14, 10, 0x88, 26, 0xa0, 16), +	MUX_PG(ddc,    I2C2,      RSVD2,     RSVD3,     RSVD4,         0x18, 31, 0x88, 0,  0xb0, 28), +	MUX_PG(dta,    RSVD1,     SDIO2,     VI,        RSVD4,         0x14, 11, 0x84, 20, 0xa0, 18), +	MUX_PG(dtb,    RSVD1,     RSVD2,     VI,        SPI1,          0x14, 12, 0x84, 22, 0xa0, 20), +	MUX_PG(dtc,    RSVD1,     RSVD2,     VI,        RSVD4,         0x14, 13, 0x84, 26, 0xa0, 22), +	MUX_PG(dtd,    RSVD1,     SDIO2,     VI,        RSVD4,         0x14, 14, 0x84, 28, 0xa0, 24), +	MUX_PG(dte,    RSVD1,     RSVD2,     VI,        SPI1,          0x14, 15, 0x84, 30, 0xa0, 26), +	MUX_PG(dtf,    I2C3,      RSVD2,     VI,        RSVD4,         0x20, 12, 0x98, 30, 0xa0, 28), +	MUX_PG(gma,    UARTE,     SPI3,      GMI,       SDIO4,         0x14, 28, 0x84, 0,  0xb0, 20), +	MUX_PG(gmb,    IDE,       NAND,      GMI,       GMI_INT,       0x18, 29, 0x88, 28, 0xb0, 22), +	MUX_PG(gmc,    UARTD,     SPI4,      GMI,       SFLASH,        0x14, 29, 0x84, 2,  0xb0, 24), +	MUX_PG(gmd,    RSVD1,     NAND,      GMI,       SFLASH,        0x18, 30, 0x88, 30, 0xb0, 26), +	MUX_PG(gme,    RSVD1,     DAP5,      GMI,       SDIO4,         0x18, 0,  0x8c, 0,  0xa8, 24), +	MUX_PG(gpu,    PWM,       UARTA,     GMI,       RSVD4,         0x14, 16, 0x8c, 4,  0xa4, 20), +	MUX_PG(gpu7,   RTCK,      RSVD2,     RSVD3,     RSVD4,         0x20, 11, 0x98, 28, 0xa4, 6), +	MUX_PG(gpv,    PCIE,      RSVD2,     RSVD3,     RSVD4,         0x14, 17, 0x8c, 2,  0xa0, 30), +	MUX_PG(hdint,  HDMI,      RSVD2,     RSVD3,     RSVD4,         0x1c, 23, 0x84, 4,  -1,   -1), +	MUX_PG(i2cp,   I2CP,      RSVD2,     RSVD3,     RSVD4,         0x14, 18, 0x88, 8,  0xa4, 2), +	MUX_PG(irrx,   UARTA,     UARTB,     GMI,       SPI4,          0x14, 20, 0x88, 18, 0xa8, 22), +	MUX_PG(irtx,   UARTA,     UARTB,     GMI,       SPI4,          0x14, 19, 0x88, 16, 0xa8, 20), +	MUX_PG(kbca,   KBC,       NAND,      SDIO2,     EMC_TEST0_DLL, 0x14, 22, 0x88, 10, 0xa4, 8), +	MUX_PG(kbcb,   KBC,       NAND,      SDIO2,     MIO,           0x14, 21, 0x88, 12, 0xa4, 10), +	MUX_PG(kbcc,   KBC,       NAND,      TRACE,     EMC_TEST1_DLL, 0x18, 26, 0x88, 14, 0xa4, 12), +	MUX_PG(kbcd,   KBC,       NAND,      SDIO2,     MIO,           0x20, 10, 0x98, 26, 0xa4, 14), +	MUX_PG(kbce,   KBC,       NAND,      OWR,       RSVD4,         0x14, 26, 0x80, 28, 0xb0, 2), +	MUX_PG(kbcf,   KBC,       NAND,      TRACE,     MIO,           0x14, 27, 0x80, 26, 0xb0, 0), +	MUX_PG(lcsn,   DISPLAYA,  DISPLAYB,  SPI3,      RSVD4,         0x1c, 31, 0x90, 12, -1,   -1), +	MUX_PG(ld0,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 0,  0x94, 0,  -1,   -1), +	MUX_PG(ld1,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 1,  0x94, 2,  -1,   -1), +	MUX_PG(ld2,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 2,  0x94, 4,  -1,   -1), +	MUX_PG(ld3,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 3,  0x94, 6,  -1,   -1), +	MUX_PG(ld4,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 4,  0x94, 8,  -1,   -1), +	MUX_PG(ld5,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 5,  0x94, 10, -1,   -1), +	MUX_PG(ld6,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 6,  0x94, 12, -1,   -1), +	MUX_PG(ld7,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 7,  0x94, 14, -1,   -1), +	MUX_PG(ld8,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 8,  0x94, 16, -1,   -1), +	MUX_PG(ld9,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 9,  0x94, 18, -1,   -1), +	MUX_PG(ld10,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 10, 0x94, 20, -1,   -1), +	MUX_PG(ld11,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 11, 0x94, 22, -1,   -1), +	MUX_PG(ld12,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 12, 0x94, 24, -1,   -1), +	MUX_PG(ld13,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 13, 0x94, 26, -1,   -1), +	MUX_PG(ld14,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 14, 0x94, 28, -1,   -1), +	MUX_PG(ld15,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 15, 0x94, 30, -1,   -1), +	MUX_PG(ld16,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 16, 0x98, 0,  -1,   -1), +	MUX_PG(ld17,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 17, 0x98, 2,  -1,   -1), +	MUX_PG(ldc,    DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 30, 0x90, 14, -1,   -1), +	MUX_PG(ldi,    DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x20, 6,  0x98, 16, -1,   -1), +	MUX_PG(lhp0,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 18, 0x98, 10, -1,   -1), +	MUX_PG(lhp1,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 19, 0x98, 4,  -1,   -1), +	MUX_PG(lhp2,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 20, 0x98, 6,  -1,   -1), +	MUX_PG(lhs,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x20, 7,  0x90, 22, -1,   -1), +	MUX_PG(lm0,    DISPLAYA,  DISPLAYB,  SPI3,      RSVD4,         0x1c, 24, 0x90, 26, -1,   -1), +	MUX_PG(lm1,    DISPLAYA,  DISPLAYB,  RSVD3,     CRT,           0x1c, 25, 0x90, 28, -1,   -1), +	MUX_PG(lpp,    DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x20, 8,  0x98, 14, -1,   -1), +	MUX_PG(lpw0,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          0x20, 3,  0x90, 0,  -1,   -1), +	MUX_PG(lpw1,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x20, 4,  0x90, 2,  -1,   -1), +	MUX_PG(lpw2,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          0x20, 5,  0x90, 4,  -1,   -1), +	MUX_PG(lsc0,   DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 27, 0x90, 18, -1,   -1), +	MUX_PG(lsc1,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          0x1c, 28, 0x90, 20, -1,   -1), +	MUX_PG(lsck,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          0x1c, 29, 0x90, 16, -1,   -1), +	MUX_PG(lsda,   DISPLAYA,  DISPLAYB,  SPI3,      HDMI,          0x20, 1,  0x90, 8,  -1,   -1), +	MUX_PG(lsdi,   DISPLAYA,  DISPLAYB,  SPI3,      RSVD4,         0x20, 2,  0x90, 6,  -1,   -1), +	MUX_PG(lspi,   DISPLAYA,  DISPLAYB,  XIO,       HDMI,          0x20, 0,  0x90, 10, -1,   -1), +	MUX_PG(lvp0,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 21, 0x90, 30, -1,   -1), +	MUX_PG(lvp1,   DISPLAYA,  DISPLAYB,  RSVD3,     RSVD4,         0x1c, 22, 0x98, 8,  -1,   -1), +	MUX_PG(lvs,    DISPLAYA,  DISPLAYB,  XIO,       RSVD4,         0x1c, 26, 0x90, 24, -1,   -1), +	MUX_PG(owc,    OWR,       RSVD2,     RSVD3,     RSVD4,         0x14, 31, 0x84, 8,  0xb0, 30), +	MUX_PG(pmc,    PWR_ON,    PWR_INTR,  RSVD3,     RSVD4,         0x14, 23, 0x98, 18, -1,   -1), +	MUX_PG(pta,    I2C2,      HDMI,      GMI,       RSVD4,         0x14, 24, 0x98, 22, 0xa4, 4), +	MUX_PG(rm,     I2C1,      RSVD2,     RSVD3,     RSVD4,         0x14, 25, 0x80, 14, 0xa4, 0), +	MUX_PG(sdb,    UARTA,     PWM,       SDIO3,     SPI2,          0x20, 15, 0x8c, 10, -1,   -1), +	MUX_PG(sdc,    PWM,       TWC,       SDIO3,     SPI3,          0x18, 1,  0x8c, 12, 0xac, 28), +	MUX_PG(sdd,    UARTA,     PWM,       SDIO3,     SPI3,          0x18, 2,  0x8c, 14, 0xac, 30), +	MUX_PG(sdio1,  SDIO1,     RSVD2,     UARTE,     UARTA,         0x14, 30, 0x80, 30, 0xb0, 18), +	MUX_PG(slxa,   PCIE,      SPI4,      SDIO3,     SPI2,          0x18, 3,  0x84, 6,  0xa4, 22), +	MUX_PG(slxc,   SPDIF,     SPI4,      SDIO3,     SPI2,          0x18, 5,  0x84, 10, 0xa4, 26), +	MUX_PG(slxd,   SPDIF,     SPI4,      SDIO3,     SPI2,          0x18, 6,  0x84, 12, 0xa4, 28), +	MUX_PG(slxk,   PCIE,      SPI4,      SDIO3,     SPI2,          0x18, 7,  0x84, 14, 0xa4, 30), +	MUX_PG(spdi,   SPDIF,     RSVD2,     I2C1,      SDIO2,         0x18, 8,  0x8c, 8,  0xa4, 16), +	MUX_PG(spdo,   SPDIF,     RSVD2,     I2C1,      SDIO2,         0x18, 9,  0x8c, 6,  0xa4, 18), +	MUX_PG(spia,   SPI1,      SPI2,      SPI3,      GMI,           0x18, 10, 0x8c, 30, 0xa8, 4), +	MUX_PG(spib,   SPI1,      SPI2,      SPI3,      GMI,           0x18, 11, 0x8c, 28, 0xa8, 6), +	MUX_PG(spic,   SPI1,      SPI2,      SPI3,      GMI,           0x18, 12, 0x8c, 26, 0xa8, 8), +	MUX_PG(spid,   SPI2,      SPI1,      SPI2_ALT,  GMI,           0x18, 13, 0x8c, 24, 0xa8, 10), +	MUX_PG(spie,   SPI2,      SPI1,      SPI2_ALT,  GMI,           0x18, 14, 0x8c, 22, 0xa8, 12), +	MUX_PG(spif,   SPI3,      SPI1,      SPI2,      RSVD4,         0x18, 15, 0x8c, 20, 0xa8, 14), +	MUX_PG(spig,   SPI3,      SPI2,      SPI2_ALT,  I2C1,          0x18, 16, 0x8c, 18, 0xa8, 16), +	MUX_PG(spih,   SPI3,      SPI2,      SPI2_ALT,  I2C1,          0x18, 17, 0x8c, 16, 0xa8, 18), +	MUX_PG(uaa,    SPI3,      MIPI_HS,   UARTA,     ULPI,          0x18, 18, 0x80, 0,  0xac, 0), +	MUX_PG(uab,    SPI2,      MIPI_HS,   UARTA,     ULPI,          0x18, 19, 0x80, 2,  0xac, 2), +	MUX_PG(uac,    OWR,       RSVD2,     RSVD3,     RSVD4,         0x18, 20, 0x80, 4,  0xac, 4), +	MUX_PG(uad,    IRDA,      SPDIF,     UARTA,     SPI4,          0x18, 21, 0x80, 6,  0xac, 6), +	MUX_PG(uca,    UARTC,     RSVD2,     GMI,       RSVD4,         0x18, 22, 0x84, 16, 0xac, 8), +	MUX_PG(ucb,    UARTC,     PWM,       GMI,       RSVD4,         0x18, 23, 0x84, 18, 0xac, 10), +	MUX_PG(uda,    SPI1,      RSVD2,     UARTD,     ULPI,          0x20, 13, 0x80, 8,  0xb0, 16),  	/*      pg_name, pupd_r/b */  	PULL_PG(ck32,    0xb0, 14),  	PULL_PG(ddrc,    0xac, 26), @@ -2881,18 +2242,7 @@ static struct platform_driver tegra20_pinctrl_driver = {  	.probe = tegra20_pinctrl_probe,  	.remove = tegra_pinctrl_remove,  }; - -static int __init tegra20_pinctrl_init(void) -{ -	return platform_driver_register(&tegra20_pinctrl_driver); -} -arch_initcall(tegra20_pinctrl_init); - -static void __exit tegra20_pinctrl_exit(void) -{ -	platform_driver_unregister(&tegra20_pinctrl_driver); -} -module_exit(tegra20_pinctrl_exit); +module_platform_driver(tegra20_pinctrl_driver);  MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");  MODULE_DESCRIPTION("NVIDIA Tegra20 pinctrl driver"); diff --git a/drivers/pinctrl/pinctrl-tegra30.c b/drivers/pinctrl/pinctrl-tegra30.c index 2300deba25b..fe2d2cf78ad 100644 --- a/drivers/pinctrl/pinctrl-tegra30.c +++ b/drivers/pinctrl/pinctrl-tegra30.c @@ -25,7 +25,7 @@   * Most pins affected by the pinmux can also be GPIOs. Define these first.   * These must match how the GPIO driver names/numbers its pins.   */ -#define _GPIO(offset)				(offset) +#define _GPIO(offset)			(offset)  #define TEGRA_PIN_CLK_32K_OUT_PA0	_GPIO(0)  #define TEGRA_PIN_UART3_CTS_N_PA1	_GPIO(1) @@ -277,8 +277,8 @@  #define TEGRA_PIN_PEE7			_GPIO(247)  /* All non-GPIO pins follow */ -#define NUM_GPIOS				(TEGRA_PIN_PEE7 + 1) -#define _PIN(offset)				(NUM_GPIOS + (offset)) +#define NUM_GPIOS			(TEGRA_PIN_PEE7 + 1) +#define _PIN(offset)			(NUM_GPIOS + (offset))  /* Non-GPIO pins */  #define TEGRA_PIN_CLK_32K_IN		_PIN(0) @@ -2015,1253 +2015,13 @@ enum tegra_mux {  	TEGRA_MUX_VI_ALT2,  	TEGRA_MUX_VI_ALT3,  }; -static const char * const blink_groups[] = { -	"clk_32k_out_pa0", -}; - -static const char * const cec_groups[] = { -	"hdmi_cec_pee3", -	"owr", -}; - -static const char * const clk_12m_out_groups[] = { -	"pv3", -}; - -static const char * const clk_32k_in_groups[] = { -	"clk_32k_in", -}; - -static const char * const core_pwr_req_groups[] = { -	"core_pwr_req", -}; - -static const char * const cpu_pwr_req_groups[] = { -	"cpu_pwr_req", -}; - -static const char * const crt_groups[] = { -	"crt_hsync_pv6", -	"crt_vsync_pv7", -}; - -static const char * const dap_groups[] = { -	"clk1_req_pee2", -	"clk2_req_pcc5", -}; - -static const char * const ddr_groups[] = { -	"vi_d0_pt4", -	"vi_d1_pd5", -	"vi_d10_pt2", -	"vi_d11_pt3", -	"vi_d2_pl0", -	"vi_d3_pl1", -	"vi_d4_pl2", -	"vi_d5_pl3", -	"vi_d6_pl4", -	"vi_d7_pl5", -	"vi_d8_pl6", -	"vi_d9_pl7", -	"vi_hsync_pd7", -	"vi_vsync_pd6", -}; - -static const char * const dev3_groups[] = { -	"clk3_req_pee1", -}; - -static const char * const displaya_groups[] = { -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_fs_pp0", -	"dap3_sclk_pp3", -	"pbb3", -	"pbb4", -	"pbb5", -	"pbb6", -	"lcd_cs0_n_pn4", -	"lcd_cs1_n_pw0", -	"lcd_d0_pe0", -	"lcd_d1_pe1", -	"lcd_d10_pf2", -	"lcd_d11_pf3", -	"lcd_d12_pf4", -	"lcd_d13_pf5", -	"lcd_d14_pf6", -	"lcd_d15_pf7", -	"lcd_d16_pm0", -	"lcd_d17_pm1", -	"lcd_d18_pm2", -	"lcd_d19_pm3", -	"lcd_d2_pe2", -	"lcd_d20_pm4", -	"lcd_d21_pm5", -	"lcd_d22_pm6", -	"lcd_d23_pm7", -	"lcd_d3_pe3", -	"lcd_d4_pe4", -	"lcd_d5_pe5", -	"lcd_d6_pe6", -	"lcd_d7_pe7", -	"lcd_d8_pf0", -	"lcd_d9_pf1", -	"lcd_dc0_pn6", -	"lcd_dc1_pd2", -	"lcd_de_pj1", -	"lcd_hsync_pj3", -	"lcd_m1_pw1", -	"lcd_pclk_pb3", -	"lcd_pwr0_pb2", -	"lcd_pwr1_pc1", -	"lcd_pwr2_pc6", -	"lcd_sck_pz4", -	"lcd_sdin_pz2", -	"lcd_sdout_pn5", -	"lcd_vsync_pj4", -	"lcd_wr_n_pz3", -}; - -static const char * const displayb_groups[] = { -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_fs_pp0", -	"dap3_sclk_pp3", -	"pbb3", -	"pbb4", -	"pbb5", -	"pbb6", -	"lcd_cs0_n_pn4", -	"lcd_cs1_n_pw0", -	"lcd_d0_pe0", -	"lcd_d1_pe1", -	"lcd_d10_pf2", -	"lcd_d11_pf3", -	"lcd_d12_pf4", -	"lcd_d13_pf5", -	"lcd_d14_pf6", -	"lcd_d15_pf7", -	"lcd_d16_pm0", -	"lcd_d17_pm1", -	"lcd_d18_pm2", -	"lcd_d19_pm3", -	"lcd_d2_pe2", -	"lcd_d20_pm4", -	"lcd_d21_pm5", -	"lcd_d22_pm6", -	"lcd_d23_pm7", -	"lcd_d3_pe3", -	"lcd_d4_pe4", -	"lcd_d5_pe5", -	"lcd_d6_pe6", -	"lcd_d7_pe7", -	"lcd_d8_pf0", -	"lcd_d9_pf1", -	"lcd_dc0_pn6", -	"lcd_dc1_pd2", -	"lcd_de_pj1", -	"lcd_hsync_pj3", -	"lcd_m1_pw1", -	"lcd_pclk_pb3", -	"lcd_pwr0_pb2", -	"lcd_pwr1_pc1", -	"lcd_pwr2_pc6", -	"lcd_sck_pz4", -	"lcd_sdin_pz2", -	"lcd_sdout_pn5", -	"lcd_vsync_pj4", -	"lcd_wr_n_pz3", -}; - -static const char * const dtv_groups[] = { -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -}; - -static const char * const extperiph1_groups[] = { -	"clk1_out_pw4", -}; - -static const char * const extperiph2_groups[] = { -	"clk2_out_pw5", -}; - -static const char * const extperiph3_groups[] = { -	"clk3_out_pee0", -}; - -static const char * const gmi_groups[] = { -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_fs_pn0", -	"dap1_sclk_pn3", -	"dap2_din_pa4", -	"dap2_dout_pa5", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_fs_pp4", -	"dap4_sclk_pp7", -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -	"gmi_a16_pj7", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_a19_pk7", -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad10_ph2", -	"gmi_ad11_ph3", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_ad8_ph0", -	"gmi_ad9_ph1", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -	"gmi_cs2_n_pk3", -	"gmi_cs3_n_pk4", -	"gmi_cs4_n_pk2", -	"gmi_cs6_n_pi3", -	"gmi_cs7_n_pi6", -	"gmi_dqs_pi2", -	"gmi_iordy_pi5", -	"gmi_oe_n_pi1", -	"gmi_rst_n_pi4", -	"gmi_wait_pi7", -	"gmi_wp_n_pc7", -	"gmi_wr_n_pi0", -	"pu0", -	"pu1", -	"pu2", -	"pu3", -	"pu4", -	"pu5", -	"pu6", -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc4_dat7_paa7", -	"spi1_cs0_n_px6", -	"spi1_mosi_px4", -	"spi1_sck_px5", -	"spi2_cs0_n_px3", -	"spi2_miso_px1", -	"spi2_mosi_px0", -	"spi2_sck_px2", -	"uart2_cts_n_pj5", -	"uart2_rts_n_pj6", -	"uart3_cts_n_pa1", -	"uart3_rts_n_pc0", -	"uart3_rxd_pw7", -	"uart3_txd_pw6", -}; - -static const char * const gmi_alt_groups[] = { -	"gmi_a16_pj7", -	"gmi_cs3_n_pk4", -	"gmi_cs7_n_pi6", -	"gmi_wp_n_pc7", -}; - -static const char * const hda_groups[] = { -	"clk1_req_pee2", -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_fs_pn0", -	"dap1_sclk_pn3", -	"dap2_din_pa4", -	"dap2_dout_pa5", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"pex_l0_clkreq_n_pdd2", -	"pex_l0_prsnt_n_pdd0", -	"pex_l0_rst_n_pdd1", -	"pex_l1_clkreq_n_pdd6", -	"pex_l1_prsnt_n_pdd4", -	"pex_l1_rst_n_pdd5", -	"pex_l2_clkreq_n_pcc7", -	"pex_l2_prsnt_n_pdd7", -	"pex_l2_rst_n_pcc6", -	"pex_wake_n_pdd3", -	"spdif_in_pk6", -}; - -static const char * const hdcp_groups[] = { -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -	"lcd_pwr0_pb2", -	"lcd_pwr2_pc6", -	"lcd_sck_pz4", -	"lcd_sdout_pn5", -	"lcd_wr_n_pz3", -}; - -static const char * const hdmi_groups[] = { -	"hdmi_int_pn7", -}; - -static const char * const hsi_groups[] = { -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -}; - -static const char * const i2c1_groups[] = { -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"spdif_in_pk6", -	"spdif_out_pk5", -	"spi2_cs1_n_pw2", -	"spi2_cs2_n_pw3", -}; - -static const char * const i2c2_groups[] = { -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -}; - -static const char * const i2c3_groups[] = { -	"cam_i2c_scl_pbb1", -	"cam_i2c_sda_pbb2", -	"sdmmc4_cmd_pt7", -	"sdmmc4_dat4_paa4", -}; - -static const char * const i2c4_groups[] = { -	"ddc_scl_pv4", -	"ddc_sda_pv5", -}; - -static const char * const i2cpwr_groups[] = { -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -}; - -static const char * const i2s0_groups[] = { -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_fs_pn0", -	"dap1_sclk_pn3", -}; - -static const char * const i2s1_groups[] = { -	"dap2_din_pa4", -	"dap2_dout_pa5", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -}; - -static const char * const i2s2_groups[] = { -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_fs_pp0", -	"dap3_sclk_pp3", -}; - -static const char * const i2s3_groups[] = { -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_fs_pp4", -	"dap4_sclk_pp7", -}; - -static const char * const i2s4_groups[] = { -	"pbb0", -	"pbb7", -	"pcc1", -	"pcc2", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc4_dat7_paa7", -}; - -static const char * const invalid_groups[] = { -	"kb_row3_pr3", -	"sdmmc4_clk_pcc4", -}; - -static const char * const kbc_groups[] = { -	"kb_col0_pq0", -	"kb_col1_pq1", -	"kb_col2_pq2", -	"kb_col3_pq3", -	"kb_col4_pq4", -	"kb_col5_pq5", -	"kb_col6_pq6", -	"kb_col7_pq7", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row10_ps2", -	"kb_row11_ps3", -	"kb_row12_ps4", -	"kb_row13_ps5", -	"kb_row14_ps6", -	"kb_row15_ps7", -	"kb_row2_pr2", -	"kb_row3_pr3", -	"kb_row4_pr4", -	"kb_row5_pr5", -	"kb_row6_pr6", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -}; - -static const char * const mio_groups[] = { -	"kb_col6_pq6", -	"kb_col7_pq7", -	"kb_row10_ps2", -	"kb_row11_ps3", -	"kb_row12_ps4", -	"kb_row13_ps5", -	"kb_row14_ps6", -	"kb_row15_ps7", -	"kb_row6_pr6", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -}; - -static const char * const nand_groups[] = { -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad10_ph2", -	"gmi_ad11_ph3", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_ad8_ph0", -	"gmi_ad9_ph1", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -	"gmi_cs2_n_pk3", -	"gmi_cs3_n_pk4", -	"gmi_cs4_n_pk2", -	"gmi_cs6_n_pi3", -	"gmi_cs7_n_pi6", -	"gmi_dqs_pi2", -	"gmi_iordy_pi5", -	"gmi_oe_n_pi1", -	"gmi_rst_n_pi4", -	"gmi_wait_pi7", -	"gmi_wp_n_pc7", -	"gmi_wr_n_pi0", -	"kb_col0_pq0", -	"kb_col1_pq1", -	"kb_col2_pq2", -	"kb_col3_pq3", -	"kb_col4_pq4", -	"kb_col5_pq5", -	"kb_col6_pq6", -	"kb_col7_pq7", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row10_ps2", -	"kb_row11_ps3", -	"kb_row12_ps4", -	"kb_row13_ps5", -	"kb_row14_ps6", -	"kb_row15_ps7", -	"kb_row2_pr2", -	"kb_row3_pr3", -	"kb_row4_pr4", -	"kb_row5_pr5", -	"kb_row6_pr6", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -}; - -static const char * const nand_alt_groups[] = { -	"gmi_cs6_n_pi3", -	"gmi_cs7_n_pi6", -	"gmi_rst_n_pi4", -}; - -static const char * const owr_groups[] = { -	"pu0", -	"pv2", -	"kb_row5_pr5", -	"owr", -}; - -static const char * const pcie_groups[] = { -	"pex_l0_clkreq_n_pdd2", -	"pex_l0_prsnt_n_pdd0", -	"pex_l0_rst_n_pdd1", -	"pex_l1_clkreq_n_pdd6", -	"pex_l1_prsnt_n_pdd4", -	"pex_l1_rst_n_pdd5", -	"pex_l2_clkreq_n_pcc7", -	"pex_l2_prsnt_n_pdd7", -	"pex_l2_rst_n_pcc6", -	"pex_wake_n_pdd3", -}; - -static const char * const pwm0_groups[] = { -	"gmi_ad8_ph0", -	"pu3", -	"sdmmc3_dat3_pb4", -	"sdmmc3_dat5_pd0", -	"uart3_rts_n_pc0", -}; - -static const char * const pwm1_groups[] = { -	"gmi_ad9_ph1", -	"pu4", -	"sdmmc3_dat2_pb5", -	"sdmmc3_dat4_pd1", -}; - -static const char * const pwm2_groups[] = { -	"gmi_ad10_ph2", -	"pu5", -	"sdmmc3_clk_pa6", -}; - -static const char * const pwm3_groups[] = { -	"gmi_ad11_ph3", -	"pu6", -	"sdmmc3_cmd_pa7", -}; - -static const char * const pwr_int_n_groups[] = { -	"pwr_int_n", -}; - -static const char * const rsvd1_groups[] = { -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs0_n_pj0", -	"gmi_cs1_n_pj2", -	"gmi_cs2_n_pk3", -	"gmi_cs3_n_pk4", -	"gmi_cs4_n_pk2", -	"gmi_dqs_pi2", -	"gmi_iordy_pi5", -	"gmi_oe_n_pi1", -	"gmi_wait_pi7", -	"gmi_wp_n_pc7", -	"gmi_wr_n_pi0", -	"pu1", -	"pu2", -	"pv0", -	"pv1", -	"sdmmc3_dat0_pb7", -	"sdmmc3_dat1_pb6", -	"sdmmc3_dat2_pb5", -	"sdmmc3_dat3_pb4", -	"vi_pclk_pt0", -}; - -static const char * const rsvd2_groups[] = { -	"clk1_out_pw4", -	"clk2_out_pw5", -	"clk2_req_pcc5", -	"clk3_out_pee0", -	"clk3_req_pee1", -	"clk_32k_in", -	"clk_32k_out_pa0", -	"core_pwr_req", -	"cpu_pwr_req", -	"crt_hsync_pv6", -	"crt_vsync_pv7", -	"dap3_din_pp1", -	"dap3_dout_pp2", -	"dap3_fs_pp0", -	"dap3_sclk_pp3", -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_fs_pp4", -	"dap4_sclk_pp7", -	"ddc_scl_pv4", -	"ddc_sda_pv5", -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"pbb0", -	"pbb7", -	"pcc1", -	"pcc2", -	"pv0", -	"pv1", -	"pv2", -	"pv3", -	"hdmi_cec_pee3", -	"hdmi_int_pn7", -	"jtag_rtck_pu7", -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -	"pwr_int_n", -	"sdmmc1_clk_pz0", -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat0_py7", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat3_py4", -	"sdmmc3_dat0_pb7", -	"sdmmc3_dat1_pb6", -	"sdmmc4_rst_n_pcc3", -	"spdif_out_pk5", -	"sys_clk_req_pz5", -	"uart3_cts_n_pa1", -	"uart3_rxd_pw7", -	"uart3_txd_pw6", -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -	"vi_d0_pt4", -	"vi_d10_pt2", -	"vi_d11_pt3", -	"vi_hsync_pd7", -	"vi_vsync_pd6", -}; - -static const char * const rsvd3_groups[] = { -	"cam_i2c_scl_pbb1", -	"cam_i2c_sda_pbb2", -	"clk1_out_pw4", -	"clk1_req_pee2", -	"clk2_out_pw5", -	"clk2_req_pcc5", -	"clk3_out_pee0", -	"clk3_req_pee1", -	"clk_32k_in", -	"clk_32k_out_pa0", -	"core_pwr_req", -	"cpu_pwr_req", -	"crt_hsync_pv6", -	"crt_vsync_pv7", -	"dap2_din_pa4", -	"dap2_dout_pa5", -	"dap2_fs_pa2", -	"dap2_sclk_pa3", -	"ddc_scl_pv4", -	"ddc_sda_pv5", -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"pbb0", -	"pbb7", -	"pcc1", -	"pcc2", -	"pv0", -	"pv1", -	"pv2", -	"pv3", -	"hdmi_cec_pee3", -	"hdmi_int_pn7", -	"jtag_rtck_pu7", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row2_pr2", -	"kb_row3_pr3", -	"lcd_d0_pe0", -	"lcd_d1_pe1", -	"lcd_d10_pf2", -	"lcd_d11_pf3", -	"lcd_d12_pf4", -	"lcd_d13_pf5", -	"lcd_d14_pf6", -	"lcd_d15_pf7", -	"lcd_d16_pm0", -	"lcd_d17_pm1", -	"lcd_d18_pm2", -	"lcd_d19_pm3", -	"lcd_d2_pe2", -	"lcd_d20_pm4", -	"lcd_d21_pm5", -	"lcd_d22_pm6", -	"lcd_d23_pm7", -	"lcd_d3_pe3", -	"lcd_d4_pe4", -	"lcd_d5_pe5", -	"lcd_d6_pe6", -	"lcd_d7_pe7", -	"lcd_d8_pf0", -	"lcd_d9_pf1", -	"lcd_dc0_pn6", -	"lcd_dc1_pd2", -	"lcd_de_pj1", -	"lcd_hsync_pj3", -	"lcd_m1_pw1", -	"lcd_pclk_pb3", -	"lcd_pwr1_pc1", -	"lcd_vsync_pj4", -	"owr", -	"pex_l0_clkreq_n_pdd2", -	"pex_l0_prsnt_n_pdd0", -	"pex_l0_rst_n_pdd1", -	"pex_l1_clkreq_n_pdd6", -	"pex_l1_prsnt_n_pdd4", -	"pex_l1_rst_n_pdd5", -	"pex_l2_clkreq_n_pcc7", -	"pex_l2_prsnt_n_pdd7", -	"pex_l2_rst_n_pcc6", -	"pex_wake_n_pdd3", -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -	"pwr_int_n", -	"sdmmc1_clk_pz0", -	"sdmmc1_cmd_pz1", -	"sdmmc4_rst_n_pcc3", -	"sys_clk_req_pz5", -}; - -static const char * const rsvd4_groups[] = { -	"clk1_out_pw4", -	"clk1_req_pee2", -	"clk2_out_pw5", -	"clk2_req_pcc5", -	"clk3_out_pee0", -	"clk3_req_pee1", -	"clk_32k_in", -	"clk_32k_out_pa0", -	"core_pwr_req", -	"cpu_pwr_req", -	"crt_hsync_pv6", -	"crt_vsync_pv7", -	"dap4_din_pp5", -	"dap4_dout_pp6", -	"dap4_fs_pp4", -	"dap4_sclk_pp7", -	"ddc_scl_pv4", -	"ddc_sda_pv5", -	"gen1_i2c_scl_pc4", -	"gen1_i2c_sda_pc5", -	"gen2_i2c_scl_pt5", -	"gen2_i2c_sda_pt6", -	"gmi_a19_pk7", -	"gmi_ad0_pg0", -	"gmi_ad1_pg1", -	"gmi_ad10_ph2", -	"gmi_ad11_ph3", -	"gmi_ad12_ph4", -	"gmi_ad13_ph5", -	"gmi_ad14_ph6", -	"gmi_ad15_ph7", -	"gmi_ad2_pg2", -	"gmi_ad3_pg3", -	"gmi_ad4_pg4", -	"gmi_ad5_pg5", -	"gmi_ad6_pg6", -	"gmi_ad7_pg7", -	"gmi_ad8_ph0", -	"gmi_ad9_ph1", -	"gmi_adv_n_pk0", -	"gmi_clk_pk1", -	"gmi_cs2_n_pk3", -	"gmi_cs4_n_pk2", -	"gmi_dqs_pi2", -	"gmi_iordy_pi5", -	"gmi_oe_n_pi1", -	"gmi_rst_n_pi4", -	"gmi_wait_pi7", -	"gmi_wr_n_pi0", -	"pcc2", -	"pu0", -	"pu1", -	"pu2", -	"pu3", -	"pu4", -	"pu5", -	"pu6", -	"pv0", -	"pv1", -	"pv2", -	"pv3", -	"hdmi_cec_pee3", -	"hdmi_int_pn7", -	"jtag_rtck_pu7", -	"kb_col2_pq2", -	"kb_col3_pq3", -	"kb_col4_pq4", -	"kb_col5_pq5", -	"kb_row0_pr0", -	"kb_row1_pr1", -	"kb_row2_pr2", -	"kb_row4_pr4", -	"lcd_cs0_n_pn4", -	"lcd_cs1_n_pw0", -	"lcd_d0_pe0", -	"lcd_d1_pe1", -	"lcd_d10_pf2", -	"lcd_d11_pf3", -	"lcd_d12_pf4", -	"lcd_d13_pf5", -	"lcd_d14_pf6", -	"lcd_d15_pf7", -	"lcd_d16_pm0", -	"lcd_d17_pm1", -	"lcd_d18_pm2", -	"lcd_d19_pm3", -	"lcd_d2_pe2", -	"lcd_d20_pm4", -	"lcd_d21_pm5", -	"lcd_d22_pm6", -	"lcd_d23_pm7", -	"lcd_d3_pe3", -	"lcd_d4_pe4", -	"lcd_d5_pe5", -	"lcd_d6_pe6", -	"lcd_d7_pe7", -	"lcd_d8_pf0", -	"lcd_d9_pf1", -	"lcd_dc0_pn6", -	"lcd_dc1_pd2", -	"lcd_de_pj1", -	"lcd_hsync_pj3", -	"lcd_m1_pw1", -	"lcd_pclk_pb3", -	"lcd_pwr1_pc1", -	"lcd_sdin_pz2", -	"lcd_vsync_pj4", -	"owr", -	"pex_l0_clkreq_n_pdd2", -	"pex_l0_prsnt_n_pdd0", -	"pex_l0_rst_n_pdd1", -	"pex_l1_clkreq_n_pdd6", -	"pex_l1_prsnt_n_pdd4", -	"pex_l1_rst_n_pdd5", -	"pex_l2_clkreq_n_pcc7", -	"pex_l2_prsnt_n_pdd7", -	"pex_l2_rst_n_pcc6", -	"pex_wake_n_pdd3", -	"pwr_i2c_scl_pz6", -	"pwr_i2c_sda_pz7", -	"pwr_int_n", -	"spi1_miso_px7", -	"sys_clk_req_pz5", -	"uart3_cts_n_pa1", -	"uart3_rts_n_pc0", -	"uart3_rxd_pw7", -	"uart3_txd_pw6", -	"vi_d0_pt4", -	"vi_d1_pd5", -	"vi_d10_pt2", -	"vi_d11_pt3", -	"vi_d2_pl0", -	"vi_d3_pl1", -	"vi_d4_pl2", -	"vi_d5_pl3", -	"vi_d6_pl4", -	"vi_d7_pl5", -	"vi_d8_pl6", -	"vi_d9_pl7", -	"vi_hsync_pd7", -	"vi_pclk_pt0", -	"vi_vsync_pd6", -}; - -static const char * const rtck_groups[] = { -	"jtag_rtck_pu7", -}; - -static const char * const sata_groups[] = { -	"gmi_cs6_n_pi3", -}; - -static const char * const sdmmc1_groups[] = { -	"sdmmc1_clk_pz0", -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat0_py7", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat3_py4", -}; - -static const char * const sdmmc2_groups[] = { -	"dap1_din_pn1", -	"dap1_dout_pn2", -	"dap1_fs_pn0", -	"dap1_sclk_pn3", -	"kb_row10_ps2", -	"kb_row11_ps3", -	"kb_row12_ps4", -	"kb_row13_ps5", -	"kb_row14_ps6", -	"kb_row15_ps7", -	"kb_row6_pr6", -	"kb_row7_pr7", -	"kb_row8_ps0", -	"kb_row9_ps1", -	"spdif_in_pk6", -	"spdif_out_pk5", -	"vi_d1_pd5", -	"vi_d2_pl0", -	"vi_d3_pl1", -	"vi_d4_pl2", -	"vi_d5_pl3", -	"vi_d6_pl4", -	"vi_d7_pl5", -	"vi_d8_pl6", -	"vi_d9_pl7", -	"vi_pclk_pt0", -}; - -static const char * const sdmmc3_groups[] = { -	"sdmmc3_clk_pa6", -	"sdmmc3_cmd_pa7", -	"sdmmc3_dat0_pb7", -	"sdmmc3_dat1_pb6", -	"sdmmc3_dat2_pb5", -	"sdmmc3_dat3_pb4", -	"sdmmc3_dat4_pd1", -	"sdmmc3_dat5_pd0", -	"sdmmc3_dat6_pd3", -	"sdmmc3_dat7_pd4", -}; - -static const char * const sdmmc4_groups[] = { -	"cam_i2c_scl_pbb1", -	"cam_i2c_sda_pbb2", -	"cam_mclk_pcc0", -	"pbb0", -	"pbb3", -	"pbb4", -	"pbb5", -	"pbb6", -	"pbb7", -	"pcc1", -	"sdmmc4_clk_pcc4", -	"sdmmc4_cmd_pt7", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"sdmmc4_dat4_paa4", -	"sdmmc4_dat5_paa5", -	"sdmmc4_dat6_paa6", -	"sdmmc4_dat7_paa7", -	"sdmmc4_rst_n_pcc3", -}; - -static const char * const spdif_groups[] = { -	"sdmmc3_dat6_pd3", -	"sdmmc3_dat7_pd4", -	"spdif_in_pk6", -	"spdif_out_pk5", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -}; - -static const char * const spi1_groups[] = { -	"spi1_cs0_n_px6", -	"spi1_miso_px7", -	"spi1_mosi_px4", -	"spi1_sck_px5", -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -}; - -static const char * const spi2_groups[] = { -	"sdmmc3_cmd_pa7", -	"sdmmc3_dat4_pd1", -	"sdmmc3_dat5_pd0", -	"sdmmc3_dat6_pd3", -	"sdmmc3_dat7_pd4", -	"spi1_cs0_n_px6", -	"spi1_mosi_px4", -	"spi1_sck_px5", -	"spi2_cs0_n_px3", -	"spi2_cs1_n_pw2", -	"spi2_cs2_n_pw3", -	"spi2_miso_px1", -	"spi2_mosi_px0", -	"spi2_sck_px2", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -}; - -static const char * const spi2_alt_groups[] = { -	"spi1_cs0_n_px6", -	"spi1_miso_px7", -	"spi1_mosi_px4", -	"spi1_sck_px5", -	"spi2_cs1_n_pw2", -	"spi2_cs2_n_pw3", -}; - -static const char * const spi3_groups[] = { -	"sdmmc3_clk_pa6", -	"sdmmc3_dat0_pb7", -	"sdmmc3_dat1_pb6", -	"sdmmc3_dat2_pb5", -	"sdmmc3_dat3_pb4", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -	"spi1_miso_px7", -	"spi2_cs0_n_px3", -	"spi2_cs1_n_pw2", -	"spi2_cs2_n_pw3", -	"spi2_miso_px1", -	"spi2_mosi_px0", -	"spi2_sck_px2", -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -}; - -static const char * const spi4_groups[] = { -	"gmi_a16_pj7", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_a19_pk7", -	"sdmmc3_dat4_pd1", -	"sdmmc3_dat5_pd0", -	"sdmmc3_dat6_pd3", -	"sdmmc3_dat7_pd4", -	"uart2_cts_n_pj5", -	"uart2_rts_n_pj6", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -}; - -static const char * const spi5_groups[] = { -	"lcd_cs0_n_pn4", -	"lcd_cs1_n_pw0", -	"lcd_pwr0_pb2", -	"lcd_pwr2_pc6", -	"lcd_sck_pz4", -	"lcd_sdin_pz2", -	"lcd_sdout_pn5", -	"lcd_wr_n_pz3", -}; - -static const char * const spi6_groups[] = { -	"spi2_cs0_n_px3", -	"spi2_miso_px1", -	"spi2_mosi_px0", -	"spi2_sck_px2", -}; - -static const char * const sysclk_groups[] = { -	"sys_clk_req_pz5", -}; - -static const char * const test_groups[] = { -	"kb_col0_pq0", -	"kb_col1_pq1", -}; - -static const char * const trace_groups[] = { -	"kb_col0_pq0", -	"kb_col1_pq1", -	"kb_col2_pq2", -	"kb_col3_pq3", -	"kb_col4_pq4", -	"kb_col5_pq5", -	"kb_col6_pq6", -	"kb_col7_pq7", -	"kb_row4_pr4", -	"kb_row5_pr5", -}; - -static const char * const uarta_groups[] = { -	"pu0", -	"pu1", -	"pu2", -	"pu3", -	"pu4", -	"pu5", -	"pu6", -	"sdmmc1_clk_pz0", -	"sdmmc1_cmd_pz1", -	"sdmmc1_dat0_py7", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat3_py4", -	"sdmmc3_clk_pa6", -	"sdmmc3_cmd_pa7", -	"uart2_cts_n_pj5", -	"uart2_rts_n_pj6", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -}; - -static const char * const uartb_groups[] = { -	"uart2_cts_n_pj5", -	"uart2_rts_n_pj6", -	"uart2_rxd_pc3", -	"uart2_txd_pc2", -}; - -static const char * const uartc_groups[] = { -	"uart3_cts_n_pa1", -	"uart3_rts_n_pc0", -	"uart3_rxd_pw7", -	"uart3_txd_pw6", -}; - -static const char * const uartd_groups[] = { -	"gmi_a16_pj7", -	"gmi_a17_pb0", -	"gmi_a18_pb1", -	"gmi_a19_pk7", -	"ulpi_clk_py0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -}; - -static const char * const uarte_groups[] = { -	"sdmmc1_dat0_py7", -	"sdmmc1_dat1_py6", -	"sdmmc1_dat2_py5", -	"sdmmc1_dat3_py4", -	"sdmmc4_dat0_paa0", -	"sdmmc4_dat1_paa1", -	"sdmmc4_dat2_paa2", -	"sdmmc4_dat3_paa3", -}; - -static const char * const ulpi_groups[] = { -	"ulpi_clk_py0", -	"ulpi_data0_po1", -	"ulpi_data1_po2", -	"ulpi_data2_po3", -	"ulpi_data3_po4", -	"ulpi_data4_po5", -	"ulpi_data5_po6", -	"ulpi_data6_po7", -	"ulpi_data7_po0", -	"ulpi_dir_py1", -	"ulpi_nxt_py2", -	"ulpi_stp_py3", -}; - -static const char * const vgp1_groups[] = { -	"cam_i2c_scl_pbb1", -}; - -static const char * const vgp2_groups[] = { -	"cam_i2c_sda_pbb2", -}; - -static const char * const vgp3_groups[] = { -	"pbb3", -	"sdmmc4_dat5_paa5", -}; - -static const char * const vgp4_groups[] = { -	"pbb4", -	"sdmmc4_dat6_paa6", -}; - -static const char * const vgp5_groups[] = { -	"pbb5", -	"sdmmc4_dat7_paa7", -}; - -static const char * const vgp6_groups[] = { -	"pbb6", -	"sdmmc4_rst_n_pcc3", -}; - -static const char * const vi_groups[] = { -	"cam_mclk_pcc0", -	"vi_d0_pt4", -	"vi_d1_pd5", -	"vi_d10_pt2", -	"vi_d11_pt3", -	"vi_d2_pl0", -	"vi_d3_pl1", -	"vi_d4_pl2", -	"vi_d5_pl3", -	"vi_d6_pl4", -	"vi_d7_pl5", -	"vi_d8_pl6", -	"vi_d9_pl7", -	"vi_hsync_pd7", -	"vi_mclk_pt1", -	"vi_pclk_pt0", -	"vi_vsync_pd6", -}; - -static const char * const vi_alt1_groups[] = { -	"cam_mclk_pcc0", -	"vi_mclk_pt1", -}; - -static const char * const vi_alt2_groups[] = { -	"vi_mclk_pt1", -}; - -static const char * const vi_alt3_groups[] = { -	"cam_mclk_pcc0", -	"vi_mclk_pt1", -};  #define FUNCTION(fname)					\  	{						\  		.name = #fname,				\ -		.groups = fname##_groups,		\ -		.ngroups = ARRAY_SIZE(fname##_groups),	\  	} -static const struct tegra_function tegra30_functions[] = { +static struct tegra_function tegra30_functions[] = {  	FUNCTION(blink),  	FUNCTION(cec),  	FUNCTION(clk_12m_out), @@ -3345,50 +2105,44 @@ static const struct tegra_function tegra30_functions[] = {  	FUNCTION(vi_alt3),  }; -#define DRV_PINGROUP_REG_A	0x868	/* bank 0 */ -#define PINGROUP_REG_A		0x3000	/* bank 1 */ +#define DRV_PINGROUP_REG_A		0x868	/* bank 0 */ +#define PINGROUP_REG_A			0x3000	/* bank 1 */ -#define PINGROUP_REG_Y(r) ((r) - PINGROUP_REG_A) -#define PINGROUP_REG_N(r) -1 +#define PINGROUP_REG(r)			((r) - PINGROUP_REG_A) -#define PINGROUP(pg_name, f0, f1, f2, f3, f_safe, r, od, ior)	\ +#define PINGROUP_BIT_Y(b)		(b) +#define PINGROUP_BIT_N(b)		(-1) + +#define PINGROUP(pg_name, f0, f1, f2, f3, r, od, ior)		\  	{							\  		.name = #pg_name,				\  		.pins = pg_name##_pins,				\  		.npins = ARRAY_SIZE(pg_name##_pins),		\  		.funcs = {					\ -			TEGRA_MUX_ ## f0,			\ -			TEGRA_MUX_ ## f1,			\ -			TEGRA_MUX_ ## f2,			\ -			TEGRA_MUX_ ## f3,			\ +			TEGRA_MUX_##f0,				\ +			TEGRA_MUX_##f1,				\ +			TEGRA_MUX_##f2,				\ +			TEGRA_MUX_##f3,				\  		},						\ -		.func_safe = TEGRA_MUX_ ## f_safe,		\ -		.mux_reg = PINGROUP_REG_Y(r),			\ +		.mux_reg = PINGROUP_REG(r),			\  		.mux_bank = 1,					\  		.mux_bit = 0,					\ -		.pupd_reg = PINGROUP_REG_Y(r),			\ +		.pupd_reg = PINGROUP_REG(r),			\  		.pupd_bank = 1,					\  		.pupd_bit = 2,					\ -		.tri_reg = PINGROUP_REG_Y(r),			\ +		.tri_reg = PINGROUP_REG(r),			\  		.tri_bank = 1,					\  		.tri_bit = 4,					\ -		.einput_reg = PINGROUP_REG_Y(r),		\ -		.einput_bank = 1,				\ -		.einput_bit = 5,				\ -		.odrain_reg = PINGROUP_REG_##od(r),		\ -		.odrain_bank = 1,				\ -		.odrain_bit = 6,				\ -		.lock_reg = PINGROUP_REG_Y(r),			\ -		.lock_bank = 1,					\ -		.lock_bit = 7,					\ -		.ioreset_reg = PINGROUP_REG_##ior(r),		\ -		.ioreset_bank = 1,				\ -		.ioreset_bit = 8,				\ -		.rcv_sel_reg = -1,				\ +		.einput_bit = PINGROUP_BIT_Y(5),		\ +		.odrain_bit = PINGROUP_BIT_##od(6),		\ +		.lock_bit = PINGROUP_BIT_Y(7),			\ +		.ioreset_bit = PINGROUP_BIT_##ior(8),		\ +		.rcv_sel_bit = -1,				\  		.drv_reg = -1,					\ -		.drvtype_reg = -1,				\  	} +#define DRV_PINGROUP_REG(r)		((r) - DRV_PINGROUP_REG_A) +  #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b,	\  		     drvdn_b, drvdn_w, drvup_b, drvup_w,	\  		     slwr_b, slwr_w, slwf_b, slwf_w)		\ @@ -3399,12 +2153,12 @@ static const struct tegra_function tegra30_functions[] = {  		.mux_reg = -1,					\  		.pupd_reg = -1,					\  		.tri_reg = -1,					\ -		.einput_reg = -1,				\ -		.odrain_reg = -1,				\ -		.lock_reg = -1,					\ -		.ioreset_reg = -1,				\ -		.rcv_sel_reg = -1,				\ -		.drv_reg = ((r) - DRV_PINGROUP_REG_A),		\ +		.einput_bit = -1,				\ +		.odrain_bit = -1,				\ +		.lock_bit = -1,					\ +		.ioreset_bit = -1,				\ +		.rcv_sel_bit = -1,				\ +		.drv_reg = DRV_PINGROUP_REG(r),			\  		.drv_bank = 0,					\  		.hsm_bit = hsm_b,				\  		.schmitt_bit = schmitt_b,			\ @@ -3417,261 +2171,260 @@ static const struct tegra_function tegra30_functions[] = {  		.slwr_width = slwr_w,				\  		.slwf_bit = slwf_b,				\  		.slwf_width = slwf_w,				\ -		.drvtype_reg = -1,				\ +		.drvtype_bit = -1,				\  	}  static const struct tegra_pingroup tegra30_groups[] = { -	/*       pg_name,              f0,           f1,           f2,           f3,           safe,         r,      od, ior */ -	/* FIXME: Fill in correct data in safe column */ -	PINGROUP(clk_32k_out_pa0,      BLINK,        RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x331c, N, N), -	PINGROUP(uart3_cts_n_pa1,      UARTC,        RSVD2,        GMI,          RSVD4,        RSVD4,        0x317c, N, N), -	PINGROUP(dap2_fs_pa2,          I2S1,         HDA,          RSVD3,        GMI,          RSVD3,        0x3358, N, N), -	PINGROUP(dap2_sclk_pa3,        I2S1,         HDA,          RSVD3,        GMI,          RSVD3,        0x3364, N, N), -	PINGROUP(dap2_din_pa4,         I2S1,         HDA,          RSVD3,        GMI,          RSVD3,        0x335c, N, N), -	PINGROUP(dap2_dout_pa5,        I2S1,         HDA,          RSVD3,        GMI,          RSVD3,        0x3360, N, N), -	PINGROUP(sdmmc3_clk_pa6,       UARTA,        PWM2,         SDMMC3,       SPI3,         SPI3,         0x3390, N, N), -	PINGROUP(sdmmc3_cmd_pa7,       UARTA,        PWM3,         SDMMC3,       SPI2,         SPI2,         0x3394, N, N), -	PINGROUP(gmi_a17_pb0,          UARTD,        SPI4,         GMI,          DTV,          DTV,          0x3234, N, N), -	PINGROUP(gmi_a18_pb1,          UARTD,        SPI4,         GMI,          DTV,          DTV,          0x3238, N, N), -	PINGROUP(lcd_pwr0_pb2,         DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         HDCP,         0x3090, N, N), -	PINGROUP(lcd_pclk_pb3,         DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x3094, N, N), -	PINGROUP(sdmmc3_dat3_pb4,      RSVD1,        PWM0,         SDMMC3,       SPI3,         RSVD1,        0x33a4, N, N), -	PINGROUP(sdmmc3_dat2_pb5,      RSVD1,        PWM1,         SDMMC3,       SPI3,         RSVD1,        0x33a0, N, N), -	PINGROUP(sdmmc3_dat1_pb6,      RSVD1,        RSVD2,        SDMMC3,       SPI3,         RSVD2,        0x339c, N, N), -	PINGROUP(sdmmc3_dat0_pb7,      RSVD1,        RSVD2,        SDMMC3,       SPI3,         RSVD2,        0x3398, N, N), -	PINGROUP(uart3_rts_n_pc0,      UARTC,        PWM0,         GMI,          RSVD4,        RSVD4,        0x3180, N, N), -	PINGROUP(lcd_pwr1_pc1,         DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x3070, N, N), -	PINGROUP(uart2_txd_pc2,        UARTB,        SPDIF,        UARTA,        SPI4,         SPI4,         0x3168, N, N), -	PINGROUP(uart2_rxd_pc3,        UARTB,        SPDIF,        UARTA,        SPI4,         SPI4,         0x3164, N, N), -	PINGROUP(gen1_i2c_scl_pc4,     I2C1,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x31a4, Y, N), -	PINGROUP(gen1_i2c_sda_pc5,     I2C1,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x31a0, Y, N), -	PINGROUP(lcd_pwr2_pc6,         DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         HDCP,         0x3074, N, N), -	PINGROUP(gmi_wp_n_pc7,         RSVD1,        NAND,         GMI,          GMI_ALT,      RSVD1,        0x31c0, N, N), -	PINGROUP(sdmmc3_dat5_pd0,      PWM0,         SPI4,         SDMMC3,       SPI2,         SPI2,         0x33ac, N, N), -	PINGROUP(sdmmc3_dat4_pd1,      PWM1,         SPI4,         SDMMC3,       SPI2,         SPI2,         0x33a8, N, N), -	PINGROUP(lcd_dc1_pd2,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x310c, N, N), -	PINGROUP(sdmmc3_dat6_pd3,      SPDIF,        SPI4,         SDMMC3,       SPI2,         SPI2,         0x33b0, N, N), -	PINGROUP(sdmmc3_dat7_pd4,      SPDIF,        SPI4,         SDMMC3,       SPI2,         SPI2,         0x33b4, N, N), -	PINGROUP(vi_d1_pd5,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3128, N, Y), -	PINGROUP(vi_vsync_pd6,         DDR,          RSVD2,        VI,           RSVD4,        RSVD4,        0x315c, N, Y), -	PINGROUP(vi_hsync_pd7,         DDR,          RSVD2,        VI,           RSVD4,        RSVD4,        0x3160, N, Y), -	PINGROUP(lcd_d0_pe0,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30a4, N, N), -	PINGROUP(lcd_d1_pe1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30a8, N, N), -	PINGROUP(lcd_d2_pe2,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30ac, N, N), -	PINGROUP(lcd_d3_pe3,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30b0, N, N), -	PINGROUP(lcd_d4_pe4,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30b4, N, N), -	PINGROUP(lcd_d5_pe5,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30b8, N, N), -	PINGROUP(lcd_d6_pe6,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30bc, N, N), -	PINGROUP(lcd_d7_pe7,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30c0, N, N), -	PINGROUP(lcd_d8_pf0,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30c4, N, N), -	PINGROUP(lcd_d9_pf1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30c8, N, N), -	PINGROUP(lcd_d10_pf2,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30cc, N, N), -	PINGROUP(lcd_d11_pf3,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30d0, N, N), -	PINGROUP(lcd_d12_pf4,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30d4, N, N), -	PINGROUP(lcd_d13_pf5,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30d8, N, N), -	PINGROUP(lcd_d14_pf6,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30dc, N, N), -	PINGROUP(lcd_d15_pf7,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30e0, N, N), -	PINGROUP(gmi_ad0_pg0,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31f0, N, N), -	PINGROUP(gmi_ad1_pg1,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31f4, N, N), -	PINGROUP(gmi_ad2_pg2,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31f8, N, N), -	PINGROUP(gmi_ad3_pg3,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31fc, N, N), -	PINGROUP(gmi_ad4_pg4,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3200, N, N), -	PINGROUP(gmi_ad5_pg5,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3204, N, N), -	PINGROUP(gmi_ad6_pg6,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3208, N, N), -	PINGROUP(gmi_ad7_pg7,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x320c, N, N), -	PINGROUP(gmi_ad8_ph0,          PWM0,         NAND,         GMI,          RSVD4,        RSVD4,        0x3210, N, N), -	PINGROUP(gmi_ad9_ph1,          PWM1,         NAND,         GMI,          RSVD4,        RSVD4,        0x3214, N, N), -	PINGROUP(gmi_ad10_ph2,         PWM2,         NAND,         GMI,          RSVD4,        RSVD4,        0x3218, N, N), -	PINGROUP(gmi_ad11_ph3,         PWM3,         NAND,         GMI,          RSVD4,        RSVD4,        0x321c, N, N), -	PINGROUP(gmi_ad12_ph4,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3220, N, N), -	PINGROUP(gmi_ad13_ph5,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3224, N, N), -	PINGROUP(gmi_ad14_ph6,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3228, N, N), -	PINGROUP(gmi_ad15_ph7,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x322c, N, N), -	PINGROUP(gmi_wr_n_pi0,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3240, N, N), -	PINGROUP(gmi_oe_n_pi1,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3244, N, N), -	PINGROUP(gmi_dqs_pi2,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x3248, N, N), -	PINGROUP(gmi_cs6_n_pi3,        NAND,         NAND_ALT,     GMI,          SATA,         SATA,         0x31e8, N, N), -	PINGROUP(gmi_rst_n_pi4,        NAND,         NAND_ALT,     GMI,          RSVD4,        RSVD4,        0x324c, N, N), -	PINGROUP(gmi_iordy_pi5,        RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31c4, N, N), -	PINGROUP(gmi_cs7_n_pi6,        NAND,         NAND_ALT,     GMI,          GMI_ALT,      GMI_ALT,      0x31ec, N, N), -	PINGROUP(gmi_wait_pi7,         RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31c8, N, N), -	PINGROUP(gmi_cs0_n_pj0,        RSVD1,        NAND,         GMI,          DTV,          RSVD1,        0x31d4, N, N), -	PINGROUP(lcd_de_pj1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x3098, N, N), -	PINGROUP(gmi_cs1_n_pj2,        RSVD1,        NAND,         GMI,          DTV,          RSVD1,        0x31d8, N, N), -	PINGROUP(lcd_hsync_pj3,        DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x309c, N, N), -	PINGROUP(lcd_vsync_pj4,        DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30a0, N, N), -	PINGROUP(uart2_cts_n_pj5,      UARTA,        UARTB,        GMI,          SPI4,         SPI4,         0x3170, N, N), -	PINGROUP(uart2_rts_n_pj6,      UARTA,        UARTB,        GMI,          SPI4,         SPI4,         0x316c, N, N), -	PINGROUP(gmi_a16_pj7,          UARTD,        SPI4,         GMI,          GMI_ALT,      GMI_ALT,      0x3230, N, N), -	PINGROUP(gmi_adv_n_pk0,        RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31cc, N, N), -	PINGROUP(gmi_clk_pk1,          RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31d0, N, N), -	PINGROUP(gmi_cs4_n_pk2,        RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31e4, N, N), -	PINGROUP(gmi_cs2_n_pk3,        RSVD1,        NAND,         GMI,          RSVD4,        RSVD4,        0x31dc, N, N), -	PINGROUP(gmi_cs3_n_pk4,        RSVD1,        NAND,         GMI,          GMI_ALT,      RSVD1,        0x31e0, N, N), -	PINGROUP(spdif_out_pk5,        SPDIF,        RSVD2,        I2C1,         SDMMC2,       RSVD2,        0x3354, N, N), -	PINGROUP(spdif_in_pk6,         SPDIF,        HDA,          I2C1,         SDMMC2,       SDMMC2,       0x3350, N, N), -	PINGROUP(gmi_a19_pk7,          UARTD,        SPI4,         GMI,          RSVD4,        RSVD4,        0x323c, N, N), -	PINGROUP(vi_d2_pl0,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x312c, N, Y), -	PINGROUP(vi_d3_pl1,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3130, N, Y), -	PINGROUP(vi_d4_pl2,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3134, N, Y), -	PINGROUP(vi_d5_pl3,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3138, N, Y), -	PINGROUP(vi_d6_pl4,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x313c, N, Y), -	PINGROUP(vi_d7_pl5,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3140, N, Y), -	PINGROUP(vi_d8_pl6,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3144, N, Y), -	PINGROUP(vi_d9_pl7,            DDR,          SDMMC2,       VI,           RSVD4,        RSVD4,        0x3148, N, Y), -	PINGROUP(lcd_d16_pm0,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30e4, N, N), -	PINGROUP(lcd_d17_pm1,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30e8, N, N), -	PINGROUP(lcd_d18_pm2,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30ec, N, N), -	PINGROUP(lcd_d19_pm3,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30f0, N, N), -	PINGROUP(lcd_d20_pm4,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30f4, N, N), -	PINGROUP(lcd_d21_pm5,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30f8, N, N), -	PINGROUP(lcd_d22_pm6,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x30fc, N, N), -	PINGROUP(lcd_d23_pm7,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x3100, N, N), -	PINGROUP(dap1_fs_pn0,          I2S0,         HDA,          GMI,          SDMMC2,       SDMMC2,       0x3338, N, N), -	PINGROUP(dap1_din_pn1,         I2S0,         HDA,          GMI,          SDMMC2,       SDMMC2,       0x333c, N, N), -	PINGROUP(dap1_dout_pn2,        I2S0,         HDA,          GMI,          SDMMC2,       SDMMC2,       0x3340, N, N), -	PINGROUP(dap1_sclk_pn3,        I2S0,         HDA,          GMI,          SDMMC2,       SDMMC2,       0x3344, N, N), -	PINGROUP(lcd_cs0_n_pn4,        DISPLAYA,     DISPLAYB,     SPI5,         RSVD4,        RSVD4,        0x3084, N, N), -	PINGROUP(lcd_sdout_pn5,        DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         HDCP,         0x307c, N, N), -	PINGROUP(lcd_dc0_pn6,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x3088, N, N), -	PINGROUP(hdmi_int_pn7,         HDMI,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3110, N, N), -	PINGROUP(ulpi_data7_po0,       SPI2,         HSI,          UARTA,        ULPI,         ULPI,         0x301c, N, N), -	PINGROUP(ulpi_data0_po1,       SPI3,         HSI,          UARTA,        ULPI,         ULPI,         0x3000, N, N), -	PINGROUP(ulpi_data1_po2,       SPI3,         HSI,          UARTA,        ULPI,         ULPI,         0x3004, N, N), -	PINGROUP(ulpi_data2_po3,       SPI3,         HSI,          UARTA,        ULPI,         ULPI,         0x3008, N, N), -	PINGROUP(ulpi_data3_po4,       SPI3,         HSI,          UARTA,        ULPI,         ULPI,         0x300c, N, N), -	PINGROUP(ulpi_data4_po5,       SPI2,         HSI,          UARTA,        ULPI,         ULPI,         0x3010, N, N), -	PINGROUP(ulpi_data5_po6,       SPI2,         HSI,          UARTA,        ULPI,         ULPI,         0x3014, N, N), -	PINGROUP(ulpi_data6_po7,       SPI2,         HSI,          UARTA,        ULPI,         ULPI,         0x3018, N, N), -	PINGROUP(dap3_fs_pp0,          I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     RSVD2,        0x3030, N, N), -	PINGROUP(dap3_din_pp1,         I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     RSVD2,        0x3034, N, N), -	PINGROUP(dap3_dout_pp2,        I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     RSVD2,        0x3038, N, N), -	PINGROUP(dap3_sclk_pp3,        I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     RSVD2,        0x303c, N, N), -	PINGROUP(dap4_fs_pp4,          I2S3,         RSVD2,        GMI,          RSVD4,        RSVD4,        0x31a8, N, N), -	PINGROUP(dap4_din_pp5,         I2S3,         RSVD2,        GMI,          RSVD4,        RSVD4,        0x31ac, N, N), -	PINGROUP(dap4_dout_pp6,        I2S3,         RSVD2,        GMI,          RSVD4,        RSVD4,        0x31b0, N, N), -	PINGROUP(dap4_sclk_pp7,        I2S3,         RSVD2,        GMI,          RSVD4,        RSVD4,        0x31b4, N, N), -	PINGROUP(kb_col0_pq0,          KBC,          NAND,         TRACE,        TEST,         TEST,         0x32fc, N, N), -	PINGROUP(kb_col1_pq1,          KBC,          NAND,         TRACE,        TEST,         TEST,         0x3300, N, N), -	PINGROUP(kb_col2_pq2,          KBC,          NAND,         TRACE,        RSVD4,        RSVD4,        0x3304, N, N), -	PINGROUP(kb_col3_pq3,          KBC,          NAND,         TRACE,        RSVD4,        RSVD4,        0x3308, N, N), -	PINGROUP(kb_col4_pq4,          KBC,          NAND,         TRACE,        RSVD4,        RSVD4,        0x330c, N, N), -	PINGROUP(kb_col5_pq5,          KBC,          NAND,         TRACE,        RSVD4,        RSVD4,        0x3310, N, N), -	PINGROUP(kb_col6_pq6,          KBC,          NAND,         TRACE,        MIO,          MIO,          0x3314, N, N), -	PINGROUP(kb_col7_pq7,          KBC,          NAND,         TRACE,        MIO,          MIO,          0x3318, N, N), -	PINGROUP(kb_row0_pr0,          KBC,          NAND,         RSVD3,        RSVD4,        RSVD4,        0x32bc, N, N), -	PINGROUP(kb_row1_pr1,          KBC,          NAND,         RSVD3,        RSVD4,        RSVD4,        0x32c0, N, N), -	PINGROUP(kb_row2_pr2,          KBC,          NAND,         RSVD3,        RSVD4,        RSVD4,        0x32c4, N, N), -	PINGROUP(kb_row3_pr3,          KBC,          NAND,         RSVD3,        INVALID,      RSVD3,        0x32c8, N, N), -	PINGROUP(kb_row4_pr4,          KBC,          NAND,         TRACE,        RSVD4,        RSVD4,        0x32cc, N, N), -	PINGROUP(kb_row5_pr5,          KBC,          NAND,         TRACE,        OWR,          OWR,          0x32d0, N, N), -	PINGROUP(kb_row6_pr6,          KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32d4, N, N), -	PINGROUP(kb_row7_pr7,          KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32d8, N, N), -	PINGROUP(kb_row8_ps0,          KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32dc, N, N), -	PINGROUP(kb_row9_ps1,          KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32e0, N, N), -	PINGROUP(kb_row10_ps2,         KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32e4, N, N), -	PINGROUP(kb_row11_ps3,         KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32e8, N, N), -	PINGROUP(kb_row12_ps4,         KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32ec, N, N), -	PINGROUP(kb_row13_ps5,         KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32f0, N, N), -	PINGROUP(kb_row14_ps6,         KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32f4, N, N), -	PINGROUP(kb_row15_ps7,         KBC,          NAND,         SDMMC2,       MIO,          MIO,          0x32f8, N, N), -	PINGROUP(vi_pclk_pt0,          RSVD1,        SDMMC2,       VI,           RSVD4,        RSVD4,        0x3154, N, Y), -	PINGROUP(vi_mclk_pt1,          VI,           VI_ALT1,      VI_ALT2,      VI_ALT3,      VI_ALT3,      0x3158, N, Y), -	PINGROUP(vi_d10_pt2,           DDR,          RSVD2,        VI,           RSVD4,        RSVD4,        0x314c, N, Y), -	PINGROUP(vi_d11_pt3,           DDR,          RSVD2,        VI,           RSVD4,        RSVD4,        0x3150, N, Y), -	PINGROUP(vi_d0_pt4,            DDR,          RSVD2,        VI,           RSVD4,        RSVD4,        0x3124, N, Y), -	PINGROUP(gen2_i2c_scl_pt5,     I2C2,         HDCP,         GMI,          RSVD4,        RSVD4,        0x3250, Y, N), -	PINGROUP(gen2_i2c_sda_pt6,     I2C2,         HDCP,         GMI,          RSVD4,        RSVD4,        0x3254, Y, N), -	PINGROUP(sdmmc4_cmd_pt7,       I2C3,         NAND,         GMI,          SDMMC4,       SDMMC4,       0x325c, N, Y), -	PINGROUP(pu0,                  OWR,          UARTA,        GMI,          RSVD4,        RSVD4,        0x3184, N, N), -	PINGROUP(pu1,                  RSVD1,        UARTA,        GMI,          RSVD4,        RSVD4,        0x3188, N, N), -	PINGROUP(pu2,                  RSVD1,        UARTA,        GMI,          RSVD4,        RSVD4,        0x318c, N, N), -	PINGROUP(pu3,                  PWM0,         UARTA,        GMI,          RSVD4,        RSVD4,        0x3190, N, N), -	PINGROUP(pu4,                  PWM1,         UARTA,        GMI,          RSVD4,        RSVD4,        0x3194, N, N), -	PINGROUP(pu5,                  PWM2,         UARTA,        GMI,          RSVD4,        RSVD4,        0x3198, N, N), -	PINGROUP(pu6,                  PWM3,         UARTA,        GMI,          RSVD4,        RSVD4,        0x319c, N, N), -	PINGROUP(jtag_rtck_pu7,        RTCK,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x32b0, N, N), -	PINGROUP(pv0,                  RSVD1,        RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3040, N, N), -	PINGROUP(pv1,                  RSVD1,        RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3044, N, N), -	PINGROUP(pv2,                  OWR,          RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3060, N, N), -	PINGROUP(pv3,                  CLK_12M_OUT,  RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3064, N, N), -	PINGROUP(ddc_scl_pv4,          I2C4,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3114, N, N), -	PINGROUP(ddc_sda_pv5,          I2C4,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3118, N, N), -	PINGROUP(crt_hsync_pv6,        CRT,          RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x311c, N, N), -	PINGROUP(crt_vsync_pv7,        CRT,          RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3120, N, N), -	PINGROUP(lcd_cs1_n_pw0,        DISPLAYA,     DISPLAYB,     SPI5,         RSVD4,        RSVD4,        0x3104, N, N), -	PINGROUP(lcd_m1_pw1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        RSVD4,        0x3108, N, N), -	PINGROUP(spi2_cs1_n_pw2,       SPI3,         SPI2,         SPI2_ALT,     I2C1,         I2C1,         0x3388, N, N), -	PINGROUP(spi2_cs2_n_pw3,       SPI3,         SPI2,         SPI2_ALT,     I2C1,         I2C1,         0x338c, N, N), -	PINGROUP(clk1_out_pw4,         EXTPERIPH1,   RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x334c, N, N), -	PINGROUP(clk2_out_pw5,         EXTPERIPH2,   RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3068, N, N), -	PINGROUP(uart3_txd_pw6,        UARTC,        RSVD2,        GMI,          RSVD4,        RSVD4,        0x3174, N, N), -	PINGROUP(uart3_rxd_pw7,        UARTC,        RSVD2,        GMI,          RSVD4,        RSVD4,        0x3178, N, N), -	PINGROUP(spi2_mosi_px0,        SPI6,         SPI2,         SPI3,         GMI,          GMI,          0x3368, N, N), -	PINGROUP(spi2_miso_px1,        SPI6,         SPI2,         SPI3,         GMI,          GMI,          0x336c, N, N), -	PINGROUP(spi2_sck_px2,         SPI6,         SPI2,         SPI3,         GMI,          GMI,          0x3374, N, N), -	PINGROUP(spi2_cs0_n_px3,       SPI6,         SPI2,         SPI3,         GMI,          GMI,          0x3370, N, N), -	PINGROUP(spi1_mosi_px4,        SPI2,         SPI1,         SPI2_ALT,     GMI,          GMI,          0x3378, N, N), -	PINGROUP(spi1_sck_px5,         SPI2,         SPI1,         SPI2_ALT,     GMI,          GMI,          0x337c, N, N), -	PINGROUP(spi1_cs0_n_px6,       SPI2,         SPI1,         SPI2_ALT,     GMI,          GMI,          0x3380, N, N), -	PINGROUP(spi1_miso_px7,        SPI3,         SPI1,         SPI2_ALT,     RSVD4,        RSVD4,        0x3384, N, N), -	PINGROUP(ulpi_clk_py0,         SPI1,         RSVD2,        UARTD,        ULPI,         RSVD2,        0x3020, N, N), -	PINGROUP(ulpi_dir_py1,         SPI1,         RSVD2,        UARTD,        ULPI,         RSVD2,        0x3024, N, N), -	PINGROUP(ulpi_nxt_py2,         SPI1,         RSVD2,        UARTD,        ULPI,         RSVD2,        0x3028, N, N), -	PINGROUP(ulpi_stp_py3,         SPI1,         RSVD2,        UARTD,        ULPI,         RSVD2,        0x302c, N, N), -	PINGROUP(sdmmc1_dat3_py4,      SDMMC1,       RSVD2,        UARTE,        UARTA,        RSVD2,        0x3050, N, N), -	PINGROUP(sdmmc1_dat2_py5,      SDMMC1,       RSVD2,        UARTE,        UARTA,        RSVD2,        0x3054, N, N), -	PINGROUP(sdmmc1_dat1_py6,      SDMMC1,       RSVD2,        UARTE,        UARTA,        RSVD2,        0x3058, N, N), -	PINGROUP(sdmmc1_dat0_py7,      SDMMC1,       RSVD2,        UARTE,        UARTA,        RSVD2,        0x305c, N, N), -	PINGROUP(sdmmc1_clk_pz0,       SDMMC1,       RSVD2,        RSVD3,        UARTA,        RSVD3,        0x3048, N, N), -	PINGROUP(sdmmc1_cmd_pz1,       SDMMC1,       RSVD2,        RSVD3,        UARTA,        RSVD3,        0x304c, N, N), -	PINGROUP(lcd_sdin_pz2,         DISPLAYA,     DISPLAYB,     SPI5,         RSVD4,        RSVD4,        0x3078, N, N), -	PINGROUP(lcd_wr_n_pz3,         DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         HDCP,         0x3080, N, N), -	PINGROUP(lcd_sck_pz4,          DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         HDCP,         0x308c, N, N), -	PINGROUP(sys_clk_req_pz5,      SYSCLK,       RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3320, N, N), -	PINGROUP(pwr_i2c_scl_pz6,      I2CPWR,       RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x32b4, Y, N), -	PINGROUP(pwr_i2c_sda_pz7,      I2CPWR,       RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x32b8, Y, N), -	PINGROUP(sdmmc4_dat0_paa0,     UARTE,        SPI3,         GMI,          SDMMC4,       SDMMC4,       0x3260, N, Y), -	PINGROUP(sdmmc4_dat1_paa1,     UARTE,        SPI3,         GMI,          SDMMC4,       SDMMC4,       0x3264, N, Y), -	PINGROUP(sdmmc4_dat2_paa2,     UARTE,        SPI3,         GMI,          SDMMC4,       SDMMC4,       0x3268, N, Y), -	PINGROUP(sdmmc4_dat3_paa3,     UARTE,        SPI3,         GMI,          SDMMC4,       SDMMC4,       0x326c, N, Y), -	PINGROUP(sdmmc4_dat4_paa4,     I2C3,         I2S4,         GMI,          SDMMC4,       SDMMC4,       0x3270, N, Y), -	PINGROUP(sdmmc4_dat5_paa5,     VGP3,         I2S4,         GMI,          SDMMC4,       SDMMC4,       0x3274, N, Y), -	PINGROUP(sdmmc4_dat6_paa6,     VGP4,         I2S4,         GMI,          SDMMC4,       SDMMC4,       0x3278, N, Y), -	PINGROUP(sdmmc4_dat7_paa7,     VGP5,         I2S4,         GMI,          SDMMC4,       SDMMC4,       0x327c, N, Y), -	PINGROUP(pbb0,                 I2S4,         RSVD2,        RSVD3,        SDMMC4,       RSVD3,        0x328c, N, N), -	PINGROUP(cam_i2c_scl_pbb1,     VGP1,         I2C3,         RSVD3,        SDMMC4,       RSVD3,        0x3290, Y, N), -	PINGROUP(cam_i2c_sda_pbb2,     VGP2,         I2C3,         RSVD3,        SDMMC4,       RSVD3,        0x3294, Y, N), -	PINGROUP(pbb3,                 VGP3,         DISPLAYA,     DISPLAYB,     SDMMC4,       SDMMC4,       0x3298, N, N), -	PINGROUP(pbb4,                 VGP4,         DISPLAYA,     DISPLAYB,     SDMMC4,       SDMMC4,       0x329c, N, N), -	PINGROUP(pbb5,                 VGP5,         DISPLAYA,     DISPLAYB,     SDMMC4,       SDMMC4,       0x32a0, N, N), -	PINGROUP(pbb6,                 VGP6,         DISPLAYA,     DISPLAYB,     SDMMC4,       SDMMC4,       0x32a4, N, N), -	PINGROUP(pbb7,                 I2S4,         RSVD2,        RSVD3,        SDMMC4,       RSVD3,        0x32a8, N, N), -	PINGROUP(cam_mclk_pcc0,        VI,           VI_ALT1,      VI_ALT3,      SDMMC4,       SDMMC4,       0x3284, N, N), -	PINGROUP(pcc1,                 I2S4,         RSVD2,        RSVD3,        SDMMC4,       RSVD3,        0x3288, N, N), -	PINGROUP(pcc2,                 I2S4,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x32ac, N, N), -	PINGROUP(sdmmc4_rst_n_pcc3,    VGP6,         RSVD2,        RSVD3,        SDMMC4,       RSVD3,        0x3280, N, Y), -	PINGROUP(sdmmc4_clk_pcc4,      INVALID,      NAND,         GMI,          SDMMC4,       SDMMC4,       0x3258, N, Y), -	PINGROUP(clk2_req_pcc5,        DAP,          RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x306c, N, N), -	PINGROUP(pex_l2_rst_n_pcc6,    PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33d8, N, N), -	PINGROUP(pex_l2_clkreq_n_pcc7, PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33dc, N, N), -	PINGROUP(pex_l0_prsnt_n_pdd0,  PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33b8, N, N), -	PINGROUP(pex_l0_rst_n_pdd1,    PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33bc, N, N), -	PINGROUP(pex_l0_clkreq_n_pdd2, PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33c0, N, N), -	PINGROUP(pex_wake_n_pdd3,      PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33c4, N, N), -	PINGROUP(pex_l1_prsnt_n_pdd4,  PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33c8, N, N), -	PINGROUP(pex_l1_rst_n_pdd5,    PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33cc, N, N), -	PINGROUP(pex_l1_clkreq_n_pdd6, PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33d0, N, N), -	PINGROUP(pex_l2_prsnt_n_pdd7,  PCIE,         HDA,          RSVD3,        RSVD4,        RSVD4,        0x33d4, N, N), -	PINGROUP(clk3_out_pee0,        EXTPERIPH3,   RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x31b8, N, N), -	PINGROUP(clk3_req_pee1,        DEV3,         RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x31bc, N, N), -	PINGROUP(clk1_req_pee2,        DAP,          HDA,          RSVD3,        RSVD4,        RSVD4,        0x3348, N, N), -	PINGROUP(hdmi_cec_pee3,        CEC,          RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x33e0, Y, N), -	PINGROUP(clk_32k_in,           CLK_32K_IN,   RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3330, N, N), -	PINGROUP(core_pwr_req,         CORE_PWR_REQ, RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3324, N, N), -	PINGROUP(cpu_pwr_req,          CPU_PWR_REQ,  RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x3328, N, N), -	PINGROUP(owr,                  OWR,          CEC,          RSVD3,        RSVD4,        RSVD4,        0x3334, N, N), -	PINGROUP(pwr_int_n,            PWR_INT_N,    RSVD2,        RSVD3,        RSVD4,        RSVD4,        0x332c, N, N), +	/*       pg_name,              f0,           f1,           f2,           f3,           r,      od, ior */ +	PINGROUP(clk_32k_out_pa0,      BLINK,        RSVD2,        RSVD3,        RSVD4,        0x331c, N, N), +	PINGROUP(uart3_cts_n_pa1,      UARTC,        RSVD2,        GMI,          RSVD4,        0x317c, N, N), +	PINGROUP(dap2_fs_pa2,          I2S1,         HDA,          RSVD3,        GMI,          0x3358, N, N), +	PINGROUP(dap2_sclk_pa3,        I2S1,         HDA,          RSVD3,        GMI,          0x3364, N, N), +	PINGROUP(dap2_din_pa4,         I2S1,         HDA,          RSVD3,        GMI,          0x335c, N, N), +	PINGROUP(dap2_dout_pa5,        I2S1,         HDA,          RSVD3,        GMI,          0x3360, N, N), +	PINGROUP(sdmmc3_clk_pa6,       UARTA,        PWM2,         SDMMC3,       SPI3,         0x3390, N, N), +	PINGROUP(sdmmc3_cmd_pa7,       UARTA,        PWM3,         SDMMC3,       SPI2,         0x3394, N, N), +	PINGROUP(gmi_a17_pb0,          UARTD,        SPI4,         GMI,          DTV,          0x3234, N, N), +	PINGROUP(gmi_a18_pb1,          UARTD,        SPI4,         GMI,          DTV,          0x3238, N, N), +	PINGROUP(lcd_pwr0_pb2,         DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         0x3090, N, N), +	PINGROUP(lcd_pclk_pb3,         DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x3094, N, N), +	PINGROUP(sdmmc3_dat3_pb4,      RSVD1,        PWM0,         SDMMC3,       SPI3,         0x33a4, N, N), +	PINGROUP(sdmmc3_dat2_pb5,      RSVD1,        PWM1,         SDMMC3,       SPI3,         0x33a0, N, N), +	PINGROUP(sdmmc3_dat1_pb6,      RSVD1,        RSVD2,        SDMMC3,       SPI3,         0x339c, N, N), +	PINGROUP(sdmmc3_dat0_pb7,      RSVD1,        RSVD2,        SDMMC3,       SPI3,         0x3398, N, N), +	PINGROUP(uart3_rts_n_pc0,      UARTC,        PWM0,         GMI,          RSVD4,        0x3180, N, N), +	PINGROUP(lcd_pwr1_pc1,         DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x3070, N, N), +	PINGROUP(uart2_txd_pc2,        UARTB,        SPDIF,        UARTA,        SPI4,         0x3168, N, N), +	PINGROUP(uart2_rxd_pc3,        UARTB,        SPDIF,        UARTA,        SPI4,         0x3164, N, N), +	PINGROUP(gen1_i2c_scl_pc4,     I2C1,         RSVD2,        RSVD3,        RSVD4,        0x31a4, Y, N), +	PINGROUP(gen1_i2c_sda_pc5,     I2C1,         RSVD2,        RSVD3,        RSVD4,        0x31a0, Y, N), +	PINGROUP(lcd_pwr2_pc6,         DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         0x3074, N, N), +	PINGROUP(gmi_wp_n_pc7,         RSVD1,        NAND,         GMI,          GMI_ALT,      0x31c0, N, N), +	PINGROUP(sdmmc3_dat5_pd0,      PWM0,         SPI4,         SDMMC3,       SPI2,         0x33ac, N, N), +	PINGROUP(sdmmc3_dat4_pd1,      PWM1,         SPI4,         SDMMC3,       SPI2,         0x33a8, N, N), +	PINGROUP(lcd_dc1_pd2,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x310c, N, N), +	PINGROUP(sdmmc3_dat6_pd3,      SPDIF,        SPI4,         SDMMC3,       SPI2,         0x33b0, N, N), +	PINGROUP(sdmmc3_dat7_pd4,      SPDIF,        SPI4,         SDMMC3,       SPI2,         0x33b4, N, N), +	PINGROUP(vi_d1_pd5,            DDR,          SDMMC2,       VI,           RSVD4,        0x3128, N, Y), +	PINGROUP(vi_vsync_pd6,         DDR,          RSVD2,        VI,           RSVD4,        0x315c, N, Y), +	PINGROUP(vi_hsync_pd7,         DDR,          RSVD2,        VI,           RSVD4,        0x3160, N, Y), +	PINGROUP(lcd_d0_pe0,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30a4, N, N), +	PINGROUP(lcd_d1_pe1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30a8, N, N), +	PINGROUP(lcd_d2_pe2,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30ac, N, N), +	PINGROUP(lcd_d3_pe3,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30b0, N, N), +	PINGROUP(lcd_d4_pe4,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30b4, N, N), +	PINGROUP(lcd_d5_pe5,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30b8, N, N), +	PINGROUP(lcd_d6_pe6,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30bc, N, N), +	PINGROUP(lcd_d7_pe7,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30c0, N, N), +	PINGROUP(lcd_d8_pf0,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30c4, N, N), +	PINGROUP(lcd_d9_pf1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30c8, N, N), +	PINGROUP(lcd_d10_pf2,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30cc, N, N), +	PINGROUP(lcd_d11_pf3,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30d0, N, N), +	PINGROUP(lcd_d12_pf4,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30d4, N, N), +	PINGROUP(lcd_d13_pf5,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30d8, N, N), +	PINGROUP(lcd_d14_pf6,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30dc, N, N), +	PINGROUP(lcd_d15_pf7,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30e0, N, N), +	PINGROUP(gmi_ad0_pg0,          RSVD1,        NAND,         GMI,          RSVD4,        0x31f0, N, N), +	PINGROUP(gmi_ad1_pg1,          RSVD1,        NAND,         GMI,          RSVD4,        0x31f4, N, N), +	PINGROUP(gmi_ad2_pg2,          RSVD1,        NAND,         GMI,          RSVD4,        0x31f8, N, N), +	PINGROUP(gmi_ad3_pg3,          RSVD1,        NAND,         GMI,          RSVD4,        0x31fc, N, N), +	PINGROUP(gmi_ad4_pg4,          RSVD1,        NAND,         GMI,          RSVD4,        0x3200, N, N), +	PINGROUP(gmi_ad5_pg5,          RSVD1,        NAND,         GMI,          RSVD4,        0x3204, N, N), +	PINGROUP(gmi_ad6_pg6,          RSVD1,        NAND,         GMI,          RSVD4,        0x3208, N, N), +	PINGROUP(gmi_ad7_pg7,          RSVD1,        NAND,         GMI,          RSVD4,        0x320c, N, N), +	PINGROUP(gmi_ad8_ph0,          PWM0,         NAND,         GMI,          RSVD4,        0x3210, N, N), +	PINGROUP(gmi_ad9_ph1,          PWM1,         NAND,         GMI,          RSVD4,        0x3214, N, N), +	PINGROUP(gmi_ad10_ph2,         PWM2,         NAND,         GMI,          RSVD4,        0x3218, N, N), +	PINGROUP(gmi_ad11_ph3,         PWM3,         NAND,         GMI,          RSVD4,        0x321c, N, N), +	PINGROUP(gmi_ad12_ph4,         RSVD1,        NAND,         GMI,          RSVD4,        0x3220, N, N), +	PINGROUP(gmi_ad13_ph5,         RSVD1,        NAND,         GMI,          RSVD4,        0x3224, N, N), +	PINGROUP(gmi_ad14_ph6,         RSVD1,        NAND,         GMI,          RSVD4,        0x3228, N, N), +	PINGROUP(gmi_ad15_ph7,         RSVD1,        NAND,         GMI,          RSVD4,        0x322c, N, N), +	PINGROUP(gmi_wr_n_pi0,         RSVD1,        NAND,         GMI,          RSVD4,        0x3240, N, N), +	PINGROUP(gmi_oe_n_pi1,         RSVD1,        NAND,         GMI,          RSVD4,        0x3244, N, N), +	PINGROUP(gmi_dqs_pi2,          RSVD1,        NAND,         GMI,          RSVD4,        0x3248, N, N), +	PINGROUP(gmi_cs6_n_pi3,        NAND,         NAND_ALT,     GMI,          SATA,         0x31e8, N, N), +	PINGROUP(gmi_rst_n_pi4,        NAND,         NAND_ALT,     GMI,          RSVD4,        0x324c, N, N), +	PINGROUP(gmi_iordy_pi5,        RSVD1,        NAND,         GMI,          RSVD4,        0x31c4, N, N), +	PINGROUP(gmi_cs7_n_pi6,        NAND,         NAND_ALT,     GMI,          GMI_ALT,      0x31ec, N, N), +	PINGROUP(gmi_wait_pi7,         RSVD1,        NAND,         GMI,          RSVD4,        0x31c8, N, N), +	PINGROUP(gmi_cs0_n_pj0,        RSVD1,        NAND,         GMI,          DTV,          0x31d4, N, N), +	PINGROUP(lcd_de_pj1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x3098, N, N), +	PINGROUP(gmi_cs1_n_pj2,        RSVD1,        NAND,         GMI,          DTV,          0x31d8, N, N), +	PINGROUP(lcd_hsync_pj3,        DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x309c, N, N), +	PINGROUP(lcd_vsync_pj4,        DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30a0, N, N), +	PINGROUP(uart2_cts_n_pj5,      UARTA,        UARTB,        GMI,          SPI4,         0x3170, N, N), +	PINGROUP(uart2_rts_n_pj6,      UARTA,        UARTB,        GMI,          SPI4,         0x316c, N, N), +	PINGROUP(gmi_a16_pj7,          UARTD,        SPI4,         GMI,          GMI_ALT,      0x3230, N, N), +	PINGROUP(gmi_adv_n_pk0,        RSVD1,        NAND,         GMI,          RSVD4,        0x31cc, N, N), +	PINGROUP(gmi_clk_pk1,          RSVD1,        NAND,         GMI,          RSVD4,        0x31d0, N, N), +	PINGROUP(gmi_cs4_n_pk2,        RSVD1,        NAND,         GMI,          RSVD4,        0x31e4, N, N), +	PINGROUP(gmi_cs2_n_pk3,        RSVD1,        NAND,         GMI,          RSVD4,        0x31dc, N, N), +	PINGROUP(gmi_cs3_n_pk4,        RSVD1,        NAND,         GMI,          GMI_ALT,      0x31e0, N, N), +	PINGROUP(spdif_out_pk5,        SPDIF,        RSVD2,        I2C1,         SDMMC2,       0x3354, N, N), +	PINGROUP(spdif_in_pk6,         SPDIF,        HDA,          I2C1,         SDMMC2,       0x3350, N, N), +	PINGROUP(gmi_a19_pk7,          UARTD,        SPI4,         GMI,          RSVD4,        0x323c, N, N), +	PINGROUP(vi_d2_pl0,            DDR,          SDMMC2,       VI,           RSVD4,        0x312c, N, Y), +	PINGROUP(vi_d3_pl1,            DDR,          SDMMC2,       VI,           RSVD4,        0x3130, N, Y), +	PINGROUP(vi_d4_pl2,            DDR,          SDMMC2,       VI,           RSVD4,        0x3134, N, Y), +	PINGROUP(vi_d5_pl3,            DDR,          SDMMC2,       VI,           RSVD4,        0x3138, N, Y), +	PINGROUP(vi_d6_pl4,            DDR,          SDMMC2,       VI,           RSVD4,        0x313c, N, Y), +	PINGROUP(vi_d7_pl5,            DDR,          SDMMC2,       VI,           RSVD4,        0x3140, N, Y), +	PINGROUP(vi_d8_pl6,            DDR,          SDMMC2,       VI,           RSVD4,        0x3144, N, Y), +	PINGROUP(vi_d9_pl7,            DDR,          SDMMC2,       VI,           RSVD4,        0x3148, N, Y), +	PINGROUP(lcd_d16_pm0,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30e4, N, N), +	PINGROUP(lcd_d17_pm1,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30e8, N, N), +	PINGROUP(lcd_d18_pm2,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30ec, N, N), +	PINGROUP(lcd_d19_pm3,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30f0, N, N), +	PINGROUP(lcd_d20_pm4,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30f4, N, N), +	PINGROUP(lcd_d21_pm5,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30f8, N, N), +	PINGROUP(lcd_d22_pm6,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x30fc, N, N), +	PINGROUP(lcd_d23_pm7,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x3100, N, N), +	PINGROUP(dap1_fs_pn0,          I2S0,         HDA,          GMI,          SDMMC2,       0x3338, N, N), +	PINGROUP(dap1_din_pn1,         I2S0,         HDA,          GMI,          SDMMC2,       0x333c, N, N), +	PINGROUP(dap1_dout_pn2,        I2S0,         HDA,          GMI,          SDMMC2,       0x3340, N, N), +	PINGROUP(dap1_sclk_pn3,        I2S0,         HDA,          GMI,          SDMMC2,       0x3344, N, N), +	PINGROUP(lcd_cs0_n_pn4,        DISPLAYA,     DISPLAYB,     SPI5,         RSVD4,        0x3084, N, N), +	PINGROUP(lcd_sdout_pn5,        DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         0x307c, N, N), +	PINGROUP(lcd_dc0_pn6,          DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x3088, N, N), +	PINGROUP(hdmi_int_pn7,         HDMI,         RSVD2,        RSVD3,        RSVD4,        0x3110, N, N), +	PINGROUP(ulpi_data7_po0,       SPI2,         HSI,          UARTA,        ULPI,         0x301c, N, N), +	PINGROUP(ulpi_data0_po1,       SPI3,         HSI,          UARTA,        ULPI,         0x3000, N, N), +	PINGROUP(ulpi_data1_po2,       SPI3,         HSI,          UARTA,        ULPI,         0x3004, N, N), +	PINGROUP(ulpi_data2_po3,       SPI3,         HSI,          UARTA,        ULPI,         0x3008, N, N), +	PINGROUP(ulpi_data3_po4,       SPI3,         HSI,          UARTA,        ULPI,         0x300c, N, N), +	PINGROUP(ulpi_data4_po5,       SPI2,         HSI,          UARTA,        ULPI,         0x3010, N, N), +	PINGROUP(ulpi_data5_po6,       SPI2,         HSI,          UARTA,        ULPI,         0x3014, N, N), +	PINGROUP(ulpi_data6_po7,       SPI2,         HSI,          UARTA,        ULPI,         0x3018, N, N), +	PINGROUP(dap3_fs_pp0,          I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     0x3030, N, N), +	PINGROUP(dap3_din_pp1,         I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     0x3034, N, N), +	PINGROUP(dap3_dout_pp2,        I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     0x3038, N, N), +	PINGROUP(dap3_sclk_pp3,        I2S2,         RSVD2,        DISPLAYA,     DISPLAYB,     0x303c, N, N), +	PINGROUP(dap4_fs_pp4,          I2S3,         RSVD2,        GMI,          RSVD4,        0x31a8, N, N), +	PINGROUP(dap4_din_pp5,         I2S3,         RSVD2,        GMI,          RSVD4,        0x31ac, N, N), +	PINGROUP(dap4_dout_pp6,        I2S3,         RSVD2,        GMI,          RSVD4,        0x31b0, N, N), +	PINGROUP(dap4_sclk_pp7,        I2S3,         RSVD2,        GMI,          RSVD4,        0x31b4, N, N), +	PINGROUP(kb_col0_pq0,          KBC,          NAND,         TRACE,        TEST,         0x32fc, N, N), +	PINGROUP(kb_col1_pq1,          KBC,          NAND,         TRACE,        TEST,         0x3300, N, N), +	PINGROUP(kb_col2_pq2,          KBC,          NAND,         TRACE,        RSVD4,        0x3304, N, N), +	PINGROUP(kb_col3_pq3,          KBC,          NAND,         TRACE,        RSVD4,        0x3308, N, N), +	PINGROUP(kb_col4_pq4,          KBC,          NAND,         TRACE,        RSVD4,        0x330c, N, N), +	PINGROUP(kb_col5_pq5,          KBC,          NAND,         TRACE,        RSVD4,        0x3310, N, N), +	PINGROUP(kb_col6_pq6,          KBC,          NAND,         TRACE,        MIO,          0x3314, N, N), +	PINGROUP(kb_col7_pq7,          KBC,          NAND,         TRACE,        MIO,          0x3318, N, N), +	PINGROUP(kb_row0_pr0,          KBC,          NAND,         RSVD3,        RSVD4,        0x32bc, N, N), +	PINGROUP(kb_row1_pr1,          KBC,          NAND,         RSVD3,        RSVD4,        0x32c0, N, N), +	PINGROUP(kb_row2_pr2,          KBC,          NAND,         RSVD3,        RSVD4,        0x32c4, N, N), +	PINGROUP(kb_row3_pr3,          KBC,          NAND,         RSVD3,        INVALID,      0x32c8, N, N), +	PINGROUP(kb_row4_pr4,          KBC,          NAND,         TRACE,        RSVD4,        0x32cc, N, N), +	PINGROUP(kb_row5_pr5,          KBC,          NAND,         TRACE,        OWR,          0x32d0, N, N), +	PINGROUP(kb_row6_pr6,          KBC,          NAND,         SDMMC2,       MIO,          0x32d4, N, N), +	PINGROUP(kb_row7_pr7,          KBC,          NAND,         SDMMC2,       MIO,          0x32d8, N, N), +	PINGROUP(kb_row8_ps0,          KBC,          NAND,         SDMMC2,       MIO,          0x32dc, N, N), +	PINGROUP(kb_row9_ps1,          KBC,          NAND,         SDMMC2,       MIO,          0x32e0, N, N), +	PINGROUP(kb_row10_ps2,         KBC,          NAND,         SDMMC2,       MIO,          0x32e4, N, N), +	PINGROUP(kb_row11_ps3,         KBC,          NAND,         SDMMC2,       MIO,          0x32e8, N, N), +	PINGROUP(kb_row12_ps4,         KBC,          NAND,         SDMMC2,       MIO,          0x32ec, N, N), +	PINGROUP(kb_row13_ps5,         KBC,          NAND,         SDMMC2,       MIO,          0x32f0, N, N), +	PINGROUP(kb_row14_ps6,         KBC,          NAND,         SDMMC2,       MIO,          0x32f4, N, N), +	PINGROUP(kb_row15_ps7,         KBC,          NAND,         SDMMC2,       MIO,          0x32f8, N, N), +	PINGROUP(vi_pclk_pt0,          RSVD1,        SDMMC2,       VI,           RSVD4,        0x3154, N, Y), +	PINGROUP(vi_mclk_pt1,          VI,           VI_ALT1,      VI_ALT2,      VI_ALT3,      0x3158, N, Y), +	PINGROUP(vi_d10_pt2,           DDR,          RSVD2,        VI,           RSVD4,        0x314c, N, Y), +	PINGROUP(vi_d11_pt3,           DDR,          RSVD2,        VI,           RSVD4,        0x3150, N, Y), +	PINGROUP(vi_d0_pt4,            DDR,          RSVD2,        VI,           RSVD4,        0x3124, N, Y), +	PINGROUP(gen2_i2c_scl_pt5,     I2C2,         HDCP,         GMI,          RSVD4,        0x3250, Y, N), +	PINGROUP(gen2_i2c_sda_pt6,     I2C2,         HDCP,         GMI,          RSVD4,        0x3254, Y, N), +	PINGROUP(sdmmc4_cmd_pt7,       I2C3,         NAND,         GMI,          SDMMC4,       0x325c, N, Y), +	PINGROUP(pu0,                  OWR,          UARTA,        GMI,          RSVD4,        0x3184, N, N), +	PINGROUP(pu1,                  RSVD1,        UARTA,        GMI,          RSVD4,        0x3188, N, N), +	PINGROUP(pu2,                  RSVD1,        UARTA,        GMI,          RSVD4,        0x318c, N, N), +	PINGROUP(pu3,                  PWM0,         UARTA,        GMI,          RSVD4,        0x3190, N, N), +	PINGROUP(pu4,                  PWM1,         UARTA,        GMI,          RSVD4,        0x3194, N, N), +	PINGROUP(pu5,                  PWM2,         UARTA,        GMI,          RSVD4,        0x3198, N, N), +	PINGROUP(pu6,                  PWM3,         UARTA,        GMI,          RSVD4,        0x319c, N, N), +	PINGROUP(jtag_rtck_pu7,        RTCK,         RSVD2,        RSVD3,        RSVD4,        0x32b0, N, N), +	PINGROUP(pv0,                  RSVD1,        RSVD2,        RSVD3,        RSVD4,        0x3040, N, N), +	PINGROUP(pv1,                  RSVD1,        RSVD2,        RSVD3,        RSVD4,        0x3044, N, N), +	PINGROUP(pv2,                  OWR,          RSVD2,        RSVD3,        RSVD4,        0x3060, N, N), +	PINGROUP(pv3,                  CLK_12M_OUT,  RSVD2,        RSVD3,        RSVD4,        0x3064, N, N), +	PINGROUP(ddc_scl_pv4,          I2C4,         RSVD2,        RSVD3,        RSVD4,        0x3114, N, N), +	PINGROUP(ddc_sda_pv5,          I2C4,         RSVD2,        RSVD3,        RSVD4,        0x3118, N, N), +	PINGROUP(crt_hsync_pv6,        CRT,          RSVD2,        RSVD3,        RSVD4,        0x311c, N, N), +	PINGROUP(crt_vsync_pv7,        CRT,          RSVD2,        RSVD3,        RSVD4,        0x3120, N, N), +	PINGROUP(lcd_cs1_n_pw0,        DISPLAYA,     DISPLAYB,     SPI5,         RSVD4,        0x3104, N, N), +	PINGROUP(lcd_m1_pw1,           DISPLAYA,     DISPLAYB,     RSVD3,        RSVD4,        0x3108, N, N), +	PINGROUP(spi2_cs1_n_pw2,       SPI3,         SPI2,         SPI2_ALT,     I2C1,         0x3388, N, N), +	PINGROUP(spi2_cs2_n_pw3,       SPI3,         SPI2,         SPI2_ALT,     I2C1,         0x338c, N, N), +	PINGROUP(clk1_out_pw4,         EXTPERIPH1,   RSVD2,        RSVD3,        RSVD4,        0x334c, N, N), +	PINGROUP(clk2_out_pw5,         EXTPERIPH2,   RSVD2,        RSVD3,        RSVD4,        0x3068, N, N), +	PINGROUP(uart3_txd_pw6,        UARTC,        RSVD2,        GMI,          RSVD4,        0x3174, N, N), +	PINGROUP(uart3_rxd_pw7,        UARTC,        RSVD2,        GMI,          RSVD4,        0x3178, N, N), +	PINGROUP(spi2_mosi_px0,        SPI6,         SPI2,         SPI3,         GMI,          0x3368, N, N), +	PINGROUP(spi2_miso_px1,        SPI6,         SPI2,         SPI3,         GMI,          0x336c, N, N), +	PINGROUP(spi2_sck_px2,         SPI6,         SPI2,         SPI3,         GMI,          0x3374, N, N), +	PINGROUP(spi2_cs0_n_px3,       SPI6,         SPI2,         SPI3,         GMI,          0x3370, N, N), +	PINGROUP(spi1_mosi_px4,        SPI2,         SPI1,         SPI2_ALT,     GMI,          0x3378, N, N), +	PINGROUP(spi1_sck_px5,         SPI2,         SPI1,         SPI2_ALT,     GMI,          0x337c, N, N), +	PINGROUP(spi1_cs0_n_px6,       SPI2,         SPI1,         SPI2_ALT,     GMI,          0x3380, N, N), +	PINGROUP(spi1_miso_px7,        SPI3,         SPI1,         SPI2_ALT,     RSVD4,        0x3384, N, N), +	PINGROUP(ulpi_clk_py0,         SPI1,         RSVD2,        UARTD,        ULPI,         0x3020, N, N), +	PINGROUP(ulpi_dir_py1,         SPI1,         RSVD2,        UARTD,        ULPI,         0x3024, N, N), +	PINGROUP(ulpi_nxt_py2,         SPI1,         RSVD2,        UARTD,        ULPI,         0x3028, N, N), +	PINGROUP(ulpi_stp_py3,         SPI1,         RSVD2,        UARTD,        ULPI,         0x302c, N, N), +	PINGROUP(sdmmc1_dat3_py4,      SDMMC1,       RSVD2,        UARTE,        UARTA,        0x3050, N, N), +	PINGROUP(sdmmc1_dat2_py5,      SDMMC1,       RSVD2,        UARTE,        UARTA,        0x3054, N, N), +	PINGROUP(sdmmc1_dat1_py6,      SDMMC1,       RSVD2,        UARTE,        UARTA,        0x3058, N, N), +	PINGROUP(sdmmc1_dat0_py7,      SDMMC1,       RSVD2,        UARTE,        UARTA,        0x305c, N, N), +	PINGROUP(sdmmc1_clk_pz0,       SDMMC1,       RSVD2,        RSVD3,        UARTA,        0x3048, N, N), +	PINGROUP(sdmmc1_cmd_pz1,       SDMMC1,       RSVD2,        RSVD3,        UARTA,        0x304c, N, N), +	PINGROUP(lcd_sdin_pz2,         DISPLAYA,     DISPLAYB,     SPI5,         RSVD4,        0x3078, N, N), +	PINGROUP(lcd_wr_n_pz3,         DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         0x3080, N, N), +	PINGROUP(lcd_sck_pz4,          DISPLAYA,     DISPLAYB,     SPI5,         HDCP,         0x308c, N, N), +	PINGROUP(sys_clk_req_pz5,      SYSCLK,       RSVD2,        RSVD3,        RSVD4,        0x3320, N, N), +	PINGROUP(pwr_i2c_scl_pz6,      I2CPWR,       RSVD2,        RSVD3,        RSVD4,        0x32b4, Y, N), +	PINGROUP(pwr_i2c_sda_pz7,      I2CPWR,       RSVD2,        RSVD3,        RSVD4,        0x32b8, Y, N), +	PINGROUP(sdmmc4_dat0_paa0,     UARTE,        SPI3,         GMI,          SDMMC4,       0x3260, N, Y), +	PINGROUP(sdmmc4_dat1_paa1,     UARTE,        SPI3,         GMI,          SDMMC4,       0x3264, N, Y), +	PINGROUP(sdmmc4_dat2_paa2,     UARTE,        SPI3,         GMI,          SDMMC4,       0x3268, N, Y), +	PINGROUP(sdmmc4_dat3_paa3,     UARTE,        SPI3,         GMI,          SDMMC4,       0x326c, N, Y), +	PINGROUP(sdmmc4_dat4_paa4,     I2C3,         I2S4,         GMI,          SDMMC4,       0x3270, N, Y), +	PINGROUP(sdmmc4_dat5_paa5,     VGP3,         I2S4,         GMI,          SDMMC4,       0x3274, N, Y), +	PINGROUP(sdmmc4_dat6_paa6,     VGP4,         I2S4,         GMI,          SDMMC4,       0x3278, N, Y), +	PINGROUP(sdmmc4_dat7_paa7,     VGP5,         I2S4,         GMI,          SDMMC4,       0x327c, N, Y), +	PINGROUP(pbb0,                 I2S4,         RSVD2,        RSVD3,        SDMMC4,       0x328c, N, N), +	PINGROUP(cam_i2c_scl_pbb1,     VGP1,         I2C3,         RSVD3,        SDMMC4,       0x3290, Y, N), +	PINGROUP(cam_i2c_sda_pbb2,     VGP2,         I2C3,         RSVD3,        SDMMC4,       0x3294, Y, N), +	PINGROUP(pbb3,                 VGP3,         DISPLAYA,     DISPLAYB,     SDMMC4,       0x3298, N, N), +	PINGROUP(pbb4,                 VGP4,         DISPLAYA,     DISPLAYB,     SDMMC4,       0x329c, N, N), +	PINGROUP(pbb5,                 VGP5,         DISPLAYA,     DISPLAYB,     SDMMC4,       0x32a0, N, N), +	PINGROUP(pbb6,                 VGP6,         DISPLAYA,     DISPLAYB,     SDMMC4,       0x32a4, N, N), +	PINGROUP(pbb7,                 I2S4,         RSVD2,        RSVD3,        SDMMC4,       0x32a8, N, N), +	PINGROUP(cam_mclk_pcc0,        VI,           VI_ALT1,      VI_ALT3,      SDMMC4,       0x3284, N, N), +	PINGROUP(pcc1,                 I2S4,         RSVD2,        RSVD3,        SDMMC4,       0x3288, N, N), +	PINGROUP(pcc2,                 I2S4,         RSVD2,        RSVD3,        RSVD4,        0x32ac, N, N), +	PINGROUP(sdmmc4_rst_n_pcc3,    VGP6,         RSVD2,        RSVD3,        SDMMC4,       0x3280, N, Y), +	PINGROUP(sdmmc4_clk_pcc4,      INVALID,      NAND,         GMI,          SDMMC4,       0x3258, N, Y), +	PINGROUP(clk2_req_pcc5,        DAP,          RSVD2,        RSVD3,        RSVD4,        0x306c, N, N), +	PINGROUP(pex_l2_rst_n_pcc6,    PCIE,         HDA,          RSVD3,        RSVD4,        0x33d8, N, N), +	PINGROUP(pex_l2_clkreq_n_pcc7, PCIE,         HDA,          RSVD3,        RSVD4,        0x33dc, N, N), +	PINGROUP(pex_l0_prsnt_n_pdd0,  PCIE,         HDA,          RSVD3,        RSVD4,        0x33b8, N, N), +	PINGROUP(pex_l0_rst_n_pdd1,    PCIE,         HDA,          RSVD3,        RSVD4,        0x33bc, N, N), +	PINGROUP(pex_l0_clkreq_n_pdd2, PCIE,         HDA,          RSVD3,        RSVD4,        0x33c0, N, N), +	PINGROUP(pex_wake_n_pdd3,      PCIE,         HDA,          RSVD3,        RSVD4,        0x33c4, N, N), +	PINGROUP(pex_l1_prsnt_n_pdd4,  PCIE,         HDA,          RSVD3,        RSVD4,        0x33c8, N, N), +	PINGROUP(pex_l1_rst_n_pdd5,    PCIE,         HDA,          RSVD3,        RSVD4,        0x33cc, N, N), +	PINGROUP(pex_l1_clkreq_n_pdd6, PCIE,         HDA,          RSVD3,        RSVD4,        0x33d0, N, N), +	PINGROUP(pex_l2_prsnt_n_pdd7,  PCIE,         HDA,          RSVD3,        RSVD4,        0x33d4, N, N), +	PINGROUP(clk3_out_pee0,        EXTPERIPH3,   RSVD2,        RSVD3,        RSVD4,        0x31b8, N, N), +	PINGROUP(clk3_req_pee1,        DEV3,         RSVD2,        RSVD3,        RSVD4,        0x31bc, N, N), +	PINGROUP(clk1_req_pee2,        DAP,          HDA,          RSVD3,        RSVD4,        0x3348, N, N), +	PINGROUP(hdmi_cec_pee3,        CEC,          RSVD2,        RSVD3,        RSVD4,        0x33e0, Y, N), +	PINGROUP(clk_32k_in,           CLK_32K_IN,   RSVD2,        RSVD3,        RSVD4,        0x3330, N, N), +	PINGROUP(core_pwr_req,         CORE_PWR_REQ, RSVD2,        RSVD3,        RSVD4,        0x3324, N, N), +	PINGROUP(cpu_pwr_req,          CPU_PWR_REQ,  RSVD2,        RSVD3,        RSVD4,        0x3328, N, N), +	PINGROUP(owr,                  OWR,          CEC,          RSVD3,        RSVD4,        0x3334, N, N), +	PINGROUP(pwr_int_n,            PWR_INT_N,    RSVD2,        RSVD3,        RSVD4,        0x332c, N, N),  	/* pg_name, r, hsm_b, schmitt_b, lpmd_b, drvdn_b, drvdn_w, drvup_b, drvup_w, slwr_b, slwr_w, slwf_b, slwf_w */  	DRV_PINGROUP(ao1,   0x868,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2),  	DRV_PINGROUP(ao2,   0x86c,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2), @@ -3735,6 +2488,7 @@ static 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 = { @@ -3745,20 +2499,8 @@ static struct platform_driver tegra30_pinctrl_driver = {  	.probe = tegra30_pinctrl_probe,  	.remove = tegra_pinctrl_remove,  }; - -static int __init tegra30_pinctrl_init(void) -{ -	return platform_driver_register(&tegra30_pinctrl_driver); -} -arch_initcall(tegra30_pinctrl_init); - -static void __exit tegra30_pinctrl_exit(void) -{ -	platform_driver_unregister(&tegra30_pinctrl_driver); -} -module_exit(tegra30_pinctrl_exit); +module_platform_driver(tegra30_pinctrl_driver);  MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>");  MODULE_DESCRIPTION("NVIDIA Tegra30 pinctrl driver");  MODULE_LICENSE("GPL v2"); -MODULE_DEVICE_TABLE(of, tegra30_pinctrl_of_match); diff --git a/drivers/pinctrl/pinctrl-vf610.c b/drivers/pinctrl/pinctrl-vf610.c index 68a970b1dbc..bddd913d28b 100644 --- a/drivers/pinctrl/pinctrl-vf610.c +++ b/drivers/pinctrl/pinctrl-vf610.c @@ -316,7 +316,7 @@ static struct platform_driver vf610_pinctrl_driver = {  	.driver = {  		.name = "vf610-pinctrl",  		.owner = THIS_MODULE, -		.of_match_table = of_match_ptr(vf610_pinctrl_of_match), +		.of_match_table = vf610_pinctrl_of_match,  	},  	.probe = vf610_pinctrl_probe,  	.remove = imx_pinctrl_remove, diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c index ed2d1ba69ce..e66f4cae763 100644 --- a/drivers/pinctrl/pinctrl-xway.c +++ b/drivers/pinctrl/pinctrl-xway.c @@ -332,10 +332,10 @@ static const struct ltq_pin_group xway_grps[] = {  	GRP_MUX("mdio", MDIO, pins_mdio),  	GRP_MUX("gphy0 led0", GPHY, pins_gphy0_led0),  	GRP_MUX("gphy0 led1", GPHY, pins_gphy0_led1), -	GRP_MUX("gphy0 lde2", GPHY, pins_gphy0_led2), +	GRP_MUX("gphy0 led2", GPHY, pins_gphy0_led2),  	GRP_MUX("gphy1 led0", GPHY, pins_gphy1_led0),  	GRP_MUX("gphy1 led1", GPHY, pins_gphy1_led1), -	GRP_MUX("gphy1 lde2", GPHY, pins_gphy1_led2), +	GRP_MUX("gphy1 led2", GPHY, pins_gphy1_led2),  };  static const struct ltq_pin_group ase_grps[] = { diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index 9d144a263dc..051e8592990 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c @@ -391,14 +391,16 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)  	struct pinctrl_dev *pctldev = setting->pctldev;  	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;  	const struct pinmux_ops *ops = pctldev->desc->pmxops; -	int ret; -	const unsigned *pins; -	unsigned num_pins; +	int ret = 0; +	const unsigned *pins = NULL; +	unsigned num_pins = 0;  	int i;  	struct pin_desc *desc; -	ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, -				      &pins, &num_pins); +	if (pctlops->get_group_pins) +		ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, +					      &pins, &num_pins); +  	if (ret) {  		const char *gname; @@ -470,14 +472,15 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)  	struct pinctrl_dev *pctldev = setting->pctldev;  	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;  	const struct pinmux_ops *ops = pctldev->desc->pmxops; -	int ret; -	const unsigned *pins; -	unsigned num_pins; +	int ret = 0; +	const unsigned *pins = NULL; +	unsigned num_pins = 0;  	int i;  	struct pin_desc *desc; -	ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, -				      &pins, &num_pins); +	if (pctlops->get_group_pins) +		ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, +					      &pins, &num_pins);  	if (ret) {  		const char *gname; @@ -505,16 +508,14 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)  			pin_free(pctldev, pins[i], NULL);  		} else {  			const char *gname; -			const char *pname; -			pname = desc ? desc->name : "non-existing";  			gname = pctlops->get_group_name(pctldev,  						setting->data.mux.group);  			dev_warn(pctldev->dev,  				 "not freeing pin %d (%s) as part of "  				 "deactivating group %s - it is already "  				 "used for some other setting", -				 pins[i], pname, gname); +				 pins[i], desc->name, gname);  		}  	} diff --git a/drivers/pinctrl/sh-pfc/Kconfig b/drivers/pinctrl/sh-pfc/Kconfig index 636a882b406..26187aa5cf5 100644 --- a/drivers/pinctrl/sh-pfc/Kconfig +++ b/drivers/pinctrl/sh-pfc/Kconfig @@ -45,6 +45,11 @@ config PINCTRL_PFC_R8A7790  	depends on ARCH_R8A7790  	select PINCTRL_SH_PFC +config PINCTRL_PFC_R8A7791 +	def_bool y +	depends on ARCH_R8A7791 +	select PINCTRL_SH_PFC +  config PINCTRL_PFC_SH7203  	def_bool y  	depends on CPU_SUBTYPE_SH7203 diff --git a/drivers/pinctrl/sh-pfc/Makefile b/drivers/pinctrl/sh-pfc/Makefile index 5e0c222c12d..ad8f4cf9faa 100644 --- a/drivers/pinctrl/sh-pfc/Makefile +++ b/drivers/pinctrl/sh-pfc/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_PINCTRL_PFC_R8A7740)	+= pfc-r8a7740.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 +obj-$(CONFIG_PINCTRL_PFC_R8A7791)	+= pfc-r8a7791.o  obj-$(CONFIG_PINCTRL_PFC_SH7203)	+= pfc-sh7203.o  obj-$(CONFIG_PINCTRL_PFC_SH7264)	+= pfc-sh7264.o  obj-$(CONFIG_PINCTRL_PFC_SH7269)	+= pfc-sh7269.o diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c index 738f14f65cf..b9b464d0578 100644 --- a/drivers/pinctrl/sh-pfc/core.c +++ b/drivers/pinctrl/sh-pfc/core.c @@ -26,29 +26,67 @@  #include "core.h" -static int sh_pfc_ioremap(struct sh_pfc *pfc, struct platform_device *pdev) +static int sh_pfc_map_resources(struct sh_pfc *pfc, +				struct platform_device *pdev)  { +	unsigned int num_windows = 0; +	unsigned int num_irqs = 0; +	struct sh_pfc_window *windows; +	unsigned int *irqs = NULL;  	struct resource *res; -	int k; +	unsigned int i; + +	/* Count the MEM and IRQ resources. */ +	for (i = 0; i < pdev->num_resources; ++i) { +		switch (resource_type(&pdev->resource[i])) { +		case IORESOURCE_MEM: +			num_windows++; +			break; -	if (pdev->num_resources == 0) +		case IORESOURCE_IRQ: +			num_irqs++; +			break; +		} +	} + +	if (num_windows == 0)  		return -EINVAL; -	pfc->window = devm_kzalloc(pfc->dev, pdev->num_resources * -				   sizeof(*pfc->window), GFP_NOWAIT); -	if (!pfc->window) +	/* Allocate memory windows and IRQs arrays. */ +	windows = devm_kzalloc(pfc->dev, num_windows * sizeof(*windows), +			       GFP_KERNEL); +	if (windows == NULL)  		return -ENOMEM; -	pfc->num_windows = pdev->num_resources; +	pfc->num_windows = num_windows; +	pfc->windows = windows; -	for (k = 0, res = pdev->resource; k < pdev->num_resources; k++, res++) { -		WARN_ON(resource_type(res) != IORESOURCE_MEM); -		pfc->window[k].phys = res->start; -		pfc->window[k].size = resource_size(res); -		pfc->window[k].virt = devm_ioremap_nocache(pfc->dev, res->start, -							   resource_size(res)); -		if (!pfc->window[k].virt) +	if (num_irqs) { +		irqs = devm_kzalloc(pfc->dev, num_irqs * sizeof(*irqs), +				    GFP_KERNEL); +		if (irqs == NULL)  			return -ENOMEM; + +		pfc->num_irqs = num_irqs; +		pfc->irqs = irqs; +	} + +	/* Fill them. */ +	for (i = 0, res = pdev->resource; i < pdev->num_resources; i++, res++) { +		switch (resource_type(res)) { +		case IORESOURCE_MEM: +			windows->phys = res->start; +			windows->size = resource_size(res); +			windows->virt = devm_ioremap_resource(pfc->dev, res); +			if (IS_ERR(windows->virt)) +				return -ENOMEM; +			windows++; +			break; + +		case IORESOURCE_IRQ: +			*irqs++ = res->start; +			break; +		}  	}  	return 0; @@ -62,7 +100,7 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc,  	/* scan through physical windows and convert address */  	for (i = 0; i < pfc->num_windows; i++) { -		window = pfc->window + i; +		window = pfc->windows + i;  		if (address < window->phys)  			continue; @@ -147,7 +185,7 @@ static void sh_pfc_config_reg_helper(struct sh_pfc *pfc,  				     unsigned long *maskp,  				     unsigned long *posp)  { -	int k; +	unsigned int k;  	*mapped_regp = sh_pfc_phys_to_virt(pfc, crp->reg); @@ -196,7 +234,7 @@ static int sh_pfc_get_config_reg(struct sh_pfc *pfc, u16 enum_id,  {  	const struct pinmux_cfg_reg *config_reg;  	unsigned long r_width, f_width, curr_width, ncomb; -	int k, m, n, pos, bit_pos; +	unsigned int k, m, n, pos, bit_pos;  	k = 0;  	while (1) { @@ -238,7 +276,7 @@ static int sh_pfc_mark_to_enum(struct sh_pfc *pfc, u16 mark, int pos,  			      u16 *enum_idp)  {  	const u16 *data = pfc->info->gpio_data; -	int k; +	unsigned int k;  	if (pos) {  		*enum_idp = data[pos + 1]; @@ -431,6 +469,12 @@ static const struct of_device_id sh_pfc_of_table[] = {  		.data = &r8a7790_pinmux_info,  	},  #endif +#ifdef CONFIG_PINCTRL_PFC_R8A7791 +	{ +		.compatible = "renesas,pfc-r8a7791", +		.data = &r8a7791_pinmux_info, +	}, +#endif  #ifdef CONFIG_PINCTRL_PFC_SH7372  	{  		.compatible = "renesas,pfc-sh7372", @@ -475,7 +519,7 @@ static int sh_pfc_probe(struct platform_device *pdev)  	pfc->info = info;  	pfc->dev = &pdev->dev; -	ret = sh_pfc_ioremap(pfc, pdev); +	ret = sh_pfc_map_resources(pfc, pdev);  	if (unlikely(ret < 0))  		return ret; @@ -558,6 +602,9 @@ static const struct platform_device_id sh_pfc_id_table[] = {  #ifdef CONFIG_PINCTRL_PFC_R8A7790  	{ "pfc-r8a7790", (kernel_ulong_t)&r8a7790_pinmux_info },  #endif +#ifdef CONFIG_PINCTRL_PFC_R8A7791 +	{ "pfc-r8a7791", (kernel_ulong_t)&r8a7791_pinmux_info }, +#endif  #ifdef CONFIG_PINCTRL_PFC_SH7203  	{ "pfc-sh7203", (kernel_ulong_t)&sh7203_pinmux_info },  #endif diff --git a/drivers/pinctrl/sh-pfc/core.h b/drivers/pinctrl/sh-pfc/core.h index a1b23762ac9..b7b0e6ccf30 100644 --- a/drivers/pinctrl/sh-pfc/core.h +++ b/drivers/pinctrl/sh-pfc/core.h @@ -37,7 +37,9 @@ struct sh_pfc {  	spinlock_t lock;  	unsigned int num_windows; -	struct sh_pfc_window *window; +	struct sh_pfc_window *windows; +	unsigned int num_irqs; +	unsigned int *irqs;  	struct sh_pfc_pin_range *ranges;  	unsigned int nr_ranges; @@ -69,6 +71,7 @@ extern const struct sh_pfc_soc_info r8a7740_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; +extern const struct sh_pfc_soc_info r8a7791_pinmux_info;  extern const struct sh_pfc_soc_info sh7203_pinmux_info;  extern const struct sh_pfc_soc_info sh7264_pinmux_info;  extern const struct sh_pfc_soc_info sh7269_pinmux_info; diff --git a/drivers/pinctrl/sh-pfc/gpio.c b/drivers/pinctrl/sh-pfc/gpio.c index 04bf52b64fb..a9288ab01f7 100644 --- a/drivers/pinctrl/sh-pfc/gpio.c +++ b/drivers/pinctrl/sh-pfc/gpio.c @@ -204,18 +204,24 @@ static void gpio_pin_set(struct gpio_chip *gc, unsigned offset, int value)  static int gpio_pin_to_irq(struct gpio_chip *gc, unsigned offset)  {  	struct sh_pfc *pfc = gpio_to_pfc(gc); -	int i, k; +	unsigned int i, k;  	for (i = 0; i < pfc->info->gpio_irq_size; i++) { -		unsigned short *gpios = pfc->info->gpio_irq[i].gpios; +		const short *gpios = pfc->info->gpio_irq[i].gpios; -		for (k = 0; gpios[k]; k++) { +		for (k = 0; gpios[k] >= 0; k++) {  			if (gpios[k] == offset) -				return pfc->info->gpio_irq[i].irq; +				goto found;  		}  	}  	return -ENOSYS; + +found: +	if (pfc->num_irqs) +		return pfc->irqs[i]; +	else +		return pfc->info->gpio_irq[i].irq;  }  static int gpio_pin_setup(struct sh_pfc_chip *chip) @@ -347,7 +353,7 @@ int sh_pfc_register_gpiochip(struct sh_pfc *pfc)  	 * GPIOs.  	 */  	for (i = 0; i < pfc->num_windows; ++i) { -		struct sh_pfc_window *window = &pfc->window[i]; +		struct sh_pfc_window *window = &pfc->windows[i];  		if (pfc->info->data_regs[0].reg >= window->phys &&  		    pfc->info->data_regs[0].reg < window->phys + window->size) @@ -357,8 +363,14 @@ int sh_pfc_register_gpiochip(struct sh_pfc *pfc)  	if (i == pfc->num_windows)  		return 0; +	/* If we have IRQ resources make sure their number is correct. */ +	if (pfc->num_irqs && pfc->num_irqs != pfc->info->gpio_irq_size) { +		dev_err(pfc->dev, "invalid number of IRQ resources\n"); +		return -EINVAL; +	} +  	/* Register the real GPIOs chip. */ -	chip = sh_pfc_add_gpiochip(pfc, gpio_pin_setup, &pfc->window[i]); +	chip = sh_pfc_add_gpiochip(pfc, gpio_pin_setup, &pfc->windows[i]);  	if (IS_ERR(chip))  		return PTR_ERR(chip); diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c b/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c index d25fd4ea0a1..ce9fb7aa8ba 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c @@ -20,7 +20,10 @@  #include <linux/io.h>  #include <linux/kernel.h>  #include <linux/pinctrl/pinconf-generic.h> + +#ifndef CONFIG_ARCH_MULTIPLATFORM  #include <mach/irqs.h> +#endif  #include "core.h"  #include "sh_pfc.h" @@ -1272,7 +1275,7 @@ static const u16 pinmux_data[] = {  #define R8A73A4_PIN_IO_PU_PD(pin)       SH_PFC_PIN_CFG(pin, __IO | __PUD)  #define R8A73A4_PIN_O(pin)              SH_PFC_PIN_CFG(pin, __O) -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	R8A73A4_PIN_IO_PU_PD(0), R8A73A4_PIN_IO_PU_PD(1),  	R8A73A4_PIN_IO_PU_PD(2), R8A73A4_PIN_IO_PU_PD(3),  	R8A73A4_PIN_IO_PU_PD(4), R8A73A4_PIN_IO_PU_PD(5), @@ -2061,17 +2064,6 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(sdhi2),  }; -#undef PORTCR -#define PORTCR(nr, reg)							\ -	{								\ -		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\ -			_PCRH(PORT##nr##_IN, 0, 0, PORT##nr##_OUT),	\ -				PORT##nr##_FN0, PORT##nr##_FN1,		\ -				PORT##nr##_FN2, PORT##nr##_FN3,		\ -				PORT##nr##_FN4, PORT##nr##_FN5,		\ -				PORT##nr##_FN6, PORT##nr##_FN7 }	\ -	} -  static const struct pinmux_cfg_reg pinmux_config_regs[] = {  	PORTCR(0, 0xe6050000),  	PORTCR(1, 0xe6050001), @@ -2691,7 +2683,7 @@ static unsigned int r8a73a4_pinmux_get_bias(struct sh_pfc *pfc,  {  	void __iomem *addr; -	addr = pfc->window->virt + r8a73a4_portcr_offsets[pin >> 5] + pin; +	addr = pfc->windows->virt + r8a73a4_portcr_offsets[pin >> 5] + pin;  	switch (ioread8(addr) & PORTCR_PULMD_MASK) {  	case PORTCR_PULMD_UP: @@ -2710,7 +2702,7 @@ static void r8a73a4_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,  	void __iomem *addr;  	u32 value; -	addr = pfc->window->virt + r8a73a4_portcr_offsets[pin >> 5] + pin; +	addr = pfc->windows->virt + r8a73a4_portcr_offsets[pin >> 5] + pin;  	value = ioread8(addr) & ~PORTCR_PULMD_MASK;  	switch (bias) { diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c index 009174d0776..e4c1ef47705 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c @@ -22,7 +22,9 @@  #include <linux/kernel.h>  #include <linux/pinctrl/pinconf-generic.h> +#ifndef CONFIG_ARCH_MULTIPLATFORM  #include <mach/irqs.h> +#endif  #include "core.h"  #include "sh_pfc.h" @@ -1543,7 +1545,7 @@ static const u16 pinmux_data[] = {  #define R8A7740_PIN_O(pin)		SH_PFC_PIN_CFG(pin, __O)  #define R8A7740_PIN_O_PU_PD(pin)	SH_PFC_PIN_CFG(pin, __O | __PUD) -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* Table 56-1 (I/O and Pull U/D) */  	R8A7740_PIN_IO_PD(0),		R8A7740_PIN_IO_PD(1),  	R8A7740_PIN_IO_PD(2),		R8A7740_PIN_IO_PD(3), @@ -3234,17 +3236,6 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(tpu0),  }; -#undef PORTCR -#define PORTCR(nr, reg)							\ -	{								\ -		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\ -			_PCRH(PORT##nr##_IN, 0, 0, PORT##nr##_OUT),	\ -				PORT##nr##_FN0, PORT##nr##_FN1,		\ -				PORT##nr##_FN2, PORT##nr##_FN3,		\ -				PORT##nr##_FN4, PORT##nr##_FN5,		\ -				PORT##nr##_FN6, PORT##nr##_FN7 }	\ -	} -  static const struct pinmux_cfg_reg pinmux_config_regs[] = {  	PORTCR(0,	0xe6050000), /* PORT0CR */  	PORTCR(1,	0xe6050001), /* PORT1CR */ @@ -3720,8 +3711,8 @@ static void __iomem *r8a7740_pinmux_portcr(struct sh_pfc *pfc, unsigned int pin)  		const struct r8a7740_portcr_group *group =  			&r8a7740_portcr_offsets[i]; -		if (i <= group->end_pin) -			return pfc->window->virt + group->offset + pin; +		if (pin <= group->end_pin) +			return pfc->windows->virt + group->offset + pin;  	}  	return NULL; diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c index 428d2a6857e..c7d610d1f3e 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c @@ -1260,7 +1260,7 @@ static const u16 pinmux_data[] = {   */  #define PIN_NUMBER(row, col)		(1000+((row)-1)*25+(col)-1) -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	PINMUX_GPIO_GP_ALL(),  	/* Pins not associated with a GPIO port */ @@ -1288,6 +1288,49 @@ static struct sh_pfc_pin pinmux_pins[] = {  						     arg5##_MARK, arg6##_MARK, \  						     arg7##_MARK, arg8##_MARK, } +/* - AUDIO macro -------------------------------------------------------------*/ +#define AUDIO_PFC_PIN(name, pin)	SH_PFC_PINS(name, pin) +#define AUDIO_PFC_DAT(name, pin)	SH_PFC_MUX1(name, pin) + +/* - AUDIO clock -------------------------------------------------------------*/ +AUDIO_PFC_PIN(audio_clk_a,	RCAR_GP_PIN(2, 22)); +AUDIO_PFC_DAT(audio_clk_a,	AUDIO_CLKA); +AUDIO_PFC_PIN(audio_clk_b,	RCAR_GP_PIN(2, 23)); +AUDIO_PFC_DAT(audio_clk_b,	AUDIO_CLKB); +AUDIO_PFC_PIN(audio_clk_c,	RCAR_GP_PIN(2, 7)); +AUDIO_PFC_DAT(audio_clk_c,	AUDIO_CLKC); +AUDIO_PFC_PIN(audio_clkout_a,	RCAR_GP_PIN(2, 16)); +AUDIO_PFC_DAT(audio_clkout_a,	AUDIO_CLKOUT_A); +AUDIO_PFC_PIN(audio_clkout_b,	RCAR_GP_PIN(1, 16)); +AUDIO_PFC_DAT(audio_clkout_b,	AUDIO_CLKOUT_B); + +/* - CAN macro --------_----------------------------------------------------- */ +#define CAN_PFC_PINS(name, args...)		SH_PFC_PINS(name, args) +#define CAN_PFC_DATA(name, tx, rx)		SH_PFC_MUX2(name, tx, rx) +#define CAN_PFC_CLK(name, clk)			SH_PFC_MUX1(name, clk) + +/* - CAN0 ------------------------------------------------------------------- */ +CAN_PFC_PINS(can0_data_a,	RCAR_GP_PIN(1, 30),	RCAR_GP_PIN(1, 31)); +CAN_PFC_DATA(can0_data_a,	CAN0_TX_A,		CAN0_RX_A); +CAN_PFC_PINS(can0_data_b,	RCAR_GP_PIN(2, 26),	RCAR_GP_PIN(2, 27)); +CAN_PFC_DATA(can0_data_b,	CAN0_TX_B,		CAN0_RX_B); + +/* - CAN1 ------------------------------------------------------------------- */ +CAN_PFC_PINS(can1_data_a,	RCAR_GP_PIN(4, 20),	RCAR_GP_PIN(4, 19)); +CAN_PFC_DATA(can1_data_a,	CAN1_TX_A,		CAN1_RX_A); +CAN_PFC_PINS(can1_data_b,	RCAR_GP_PIN(2, 28),	RCAR_GP_PIN(2, 29)); +CAN_PFC_DATA(can1_data_b,	CAN1_TX_B,		CAN1_RX_B); + +/* - CAN_CLK  --------------------------------------------------------------- */ +CAN_PFC_PINS(can_clk_a,		RCAR_GP_PIN(3, 24)); +CAN_PFC_CLK(can_clk_a,		CAN_CLK_A); +CAN_PFC_PINS(can_clk_b,		RCAR_GP_PIN(1, 16)); +CAN_PFC_CLK(can_clk_b,		CAN_CLK_B); +CAN_PFC_PINS(can_clk_c,		RCAR_GP_PIN(4, 24)); +CAN_PFC_CLK(can_clk_c,		CAN_CLK_C); +CAN_PFC_PINS(can_clk_d,		RCAR_GP_PIN(2, 25)); +CAN_PFC_CLK(can_clk_d,		CAN_CLK_D); +  /* - Ether ------------------------------------------------------------------ */  SH_PFC_PINS(ether_rmii,		RCAR_GP_PIN(4, 10),	RCAR_GP_PIN(4, 11),  				RCAR_GP_PIN(4, 13),	RCAR_GP_PIN(4, 9), @@ -1577,6 +1620,59 @@ SDHI_PFC_WPPN(sdhi2_wp_a,	SD2_WP_A);  SDHI_PFC_PINS(sdhi2_wp_b,	RCAR_GP_PIN(3, 28));  SDHI_PFC_WPPN(sdhi2_wp_b,	SD2_WP_B); +/* - SSI macro -------------------------------------------------------------- */ +#define SSI_PFC_PINS(name, args...)		SH_PFC_PINS(name, args) +#define SSI_PFC_CTRL(name, sck, ws)		SH_PFC_MUX2(name, sck, ws) +#define SSI_PFC_DATA(name, d)			SH_PFC_MUX1(name, d) + +/* - SSI 0/1/2 -------------------------------------------------------------- */ +SSI_PFC_PINS(ssi012_ctrl,	RCAR_GP_PIN(3, 6),	RCAR_GP_PIN(3, 7)); +SSI_PFC_CTRL(ssi012_ctrl,	SSI_SCK012,		SSI_WS012); +SSI_PFC_PINS(ssi0_data,		RCAR_GP_PIN(3, 10)); +SSI_PFC_DATA(ssi0_data,		SSI_SDATA0); +SSI_PFC_PINS(ssi1_a_ctrl,	RCAR_GP_PIN(2, 20),	RCAR_GP_PIN(2, 21)); +SSI_PFC_CTRL(ssi1_a_ctrl,	SSI_SCK1_A,		SSI_WS1_A); +SSI_PFC_PINS(ssi1_b_ctrl,	PIN_NUMBER(3, 20),	RCAR_GP_PIN(1, 3)); +SSI_PFC_CTRL(ssi1_b_ctrl,	SSI_SCK1_B,		SSI_WS1_B); +SSI_PFC_PINS(ssi1_data,		RCAR_GP_PIN(3, 9)); +SSI_PFC_DATA(ssi1_data,		SSI_SDATA1); +SSI_PFC_PINS(ssi2_a_ctrl,	RCAR_GP_PIN(2, 26),	RCAR_GP_PIN(3, 4)); +SSI_PFC_CTRL(ssi2_a_ctrl,	SSI_SCK2_A,		SSI_WS2_A); +SSI_PFC_PINS(ssi2_b_ctrl,	RCAR_GP_PIN(2, 6),	RCAR_GP_PIN(2, 17)); +SSI_PFC_CTRL(ssi2_b_ctrl,	SSI_SCK2_B,		SSI_WS2_B); +SSI_PFC_PINS(ssi2_data,		RCAR_GP_PIN(3, 8)); +SSI_PFC_DATA(ssi2_data,		SSI_SDATA2); + +/* - SSI 3/4 ---------------------------------------------------------------- */ +SSI_PFC_PINS(ssi34_ctrl,	RCAR_GP_PIN(3, 2),	RCAR_GP_PIN(3, 3)); +SSI_PFC_CTRL(ssi34_ctrl,	SSI_SCK34,		SSI_WS34); +SSI_PFC_PINS(ssi3_data,		RCAR_GP_PIN(3, 5)); +SSI_PFC_DATA(ssi3_data,		SSI_SDATA3); +SSI_PFC_PINS(ssi4_ctrl,		RCAR_GP_PIN(1, 22),     RCAR_GP_PIN(1, 23)); +SSI_PFC_CTRL(ssi4_ctrl,		SSI_SCK4,               SSI_WS4); +SSI_PFC_PINS(ssi4_data,		RCAR_GP_PIN(3, 4)); +SSI_PFC_DATA(ssi4_data,		SSI_SDATA4); + +/* - SSI 5 ------------------------------------------------------------------ */ +SSI_PFC_PINS(ssi5_ctrl,		RCAR_GP_PIN(2, 31),	RCAR_GP_PIN(3, 0)); +SSI_PFC_CTRL(ssi5_ctrl,		SSI_SCK5,		SSI_WS5); +SSI_PFC_PINS(ssi5_data,		RCAR_GP_PIN(3, 1)); +SSI_PFC_DATA(ssi5_data,		SSI_SDATA5); + +/* - SSI 6 ------------------------------------------------------------------ */ +SSI_PFC_PINS(ssi6_ctrl,		RCAR_GP_PIN(2, 28),	RCAR_GP_PIN(2, 29)); +SSI_PFC_CTRL(ssi6_ctrl,		SSI_SCK6,		SSI_WS6); +SSI_PFC_PINS(ssi6_data,		RCAR_GP_PIN(2, 30)); +SSI_PFC_DATA(ssi6_data,		SSI_SDATA6); + +/* - SSI 7/8  --------------------------------------------------------------- */ +SSI_PFC_PINS(ssi78_ctrl,	RCAR_GP_PIN(2, 24),	RCAR_GP_PIN(2, 25)); +SSI_PFC_CTRL(ssi78_ctrl,	SSI_SCK78,		SSI_WS78); +SSI_PFC_PINS(ssi7_data,		RCAR_GP_PIN(2, 27)); +SSI_PFC_DATA(ssi7_data,		SSI_SDATA7); +SSI_PFC_PINS(ssi8_data,		RCAR_GP_PIN(2, 26)); +SSI_PFC_DATA(ssi8_data,		SSI_SDATA8); +  /* - USB0 ------------------------------------------------------------------- */  SH_PFC_PINS(usb0,		RCAR_GP_PIN(0, 1));  SH_PFC_MUX1(usb0,		PENC0); @@ -1624,6 +1720,19 @@ VIN_PFC_PINS(vin1_sync,		RCAR_GP_PIN(3, 21),	RCAR_GP_PIN(3, 22));  VIN_PFC_SYNC(vin1_sync,		VI1_HSYNC,		VI1_VSYNC);  static const struct sh_pfc_pin_group pinmux_groups[] = { +	SH_PFC_PIN_GROUP(audio_clk_a), +	SH_PFC_PIN_GROUP(audio_clk_b), +	SH_PFC_PIN_GROUP(audio_clk_c), +	SH_PFC_PIN_GROUP(audio_clkout_a), +	SH_PFC_PIN_GROUP(audio_clkout_b), +	SH_PFC_PIN_GROUP(can0_data_a), +	SH_PFC_PIN_GROUP(can0_data_b), +	SH_PFC_PIN_GROUP(can1_data_a), +	SH_PFC_PIN_GROUP(can1_data_b), +	SH_PFC_PIN_GROUP(can_clk_a), +	SH_PFC_PIN_GROUP(can_clk_b), +	SH_PFC_PIN_GROUP(can_clk_c), +	SH_PFC_PIN_GROUP(can_clk_d),  	SH_PFC_PIN_GROUP(ether_rmii),  	SH_PFC_PIN_GROUP(ether_link),  	SH_PFC_PIN_GROUP(ether_magic), @@ -1713,6 +1822,25 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(sdhi2_data4_b),  	SH_PFC_PIN_GROUP(sdhi2_wp_a),  	SH_PFC_PIN_GROUP(sdhi2_wp_b), +	SH_PFC_PIN_GROUP(ssi012_ctrl), +	SH_PFC_PIN_GROUP(ssi0_data), +	SH_PFC_PIN_GROUP(ssi1_a_ctrl), +	SH_PFC_PIN_GROUP(ssi1_b_ctrl), +	SH_PFC_PIN_GROUP(ssi1_data), +	SH_PFC_PIN_GROUP(ssi2_a_ctrl), +	SH_PFC_PIN_GROUP(ssi2_b_ctrl), +	SH_PFC_PIN_GROUP(ssi2_data), +	SH_PFC_PIN_GROUP(ssi34_ctrl), +	SH_PFC_PIN_GROUP(ssi3_data), +	SH_PFC_PIN_GROUP(ssi4_ctrl), +	SH_PFC_PIN_GROUP(ssi4_data), +	SH_PFC_PIN_GROUP(ssi5_ctrl), +	SH_PFC_PIN_GROUP(ssi5_data), +	SH_PFC_PIN_GROUP(ssi6_ctrl), +	SH_PFC_PIN_GROUP(ssi6_data), +	SH_PFC_PIN_GROUP(ssi78_ctrl), +	SH_PFC_PIN_GROUP(ssi7_data), +	SH_PFC_PIN_GROUP(ssi8_data),  	SH_PFC_PIN_GROUP(usb0),  	SH_PFC_PIN_GROUP(usb0_ovc),  	SH_PFC_PIN_GROUP(usb1), @@ -1725,6 +1853,32 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(vin1_sync),  }; +static const char * const audio_clk_groups[] = { +	"audio_clk_a", +	"audio_clk_b", +	"audio_clk_c", +	"audio_clkout_a", +	"audio_clkout_b", +}; + +static const char * const can0_groups[] = { +	"can0_data_a", +	"can0_data_b", +	"can_clk_a", +	"can_clk_b", +	"can_clk_c", +	"can_clk_d", +}; + +static const char * const can1_groups[] = { +	"can1_data_a", +	"can1_data_b", +	"can_clk_a", +	"can_clk_b", +	"can_clk_c", +	"can_clk_d", +}; +  static const char * const ether_groups[] = {  	"ether_rmii",  	"ether_link", @@ -1875,6 +2029,28 @@ static const char * const sdhi2_groups[] = {  	"sdhi2_wp_b",  }; +static const char * const ssi_groups[] = { +	"ssi012_ctrl", +	"ssi0_data", +	"ssi1_a_ctrl", +	"ssi1_b_ctrl", +	"ssi1_data", +	"ssi2_a_ctrl", +	"ssi2_b_ctrl", +	"ssi2_data", +	"ssi34_ctrl", +	"ssi3_data", +	"ssi4_ctrl", +	"ssi4_data", +	"ssi5_ctrl", +	"ssi5_data", +	"ssi6_ctrl", +	"ssi6_data", +	"ssi78_ctrl", +	"ssi7_data", +	"ssi8_data", +}; +  static const char * const usb0_groups[] = {  	"usb0",  	"usb0_ovc", @@ -1898,6 +2074,9 @@ static const char * const vin1_groups[] = {  };  static const struct sh_pfc_function pinmux_functions[] = { +	SH_PFC_FUNCTION(audio_clk), +	SH_PFC_FUNCTION(can0), +	SH_PFC_FUNCTION(can1),  	SH_PFC_FUNCTION(ether),  	SH_PFC_FUNCTION(hscif0),  	SH_PFC_FUNCTION(hscif1), @@ -1918,13 +2097,14 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(sdhi0),  	SH_PFC_FUNCTION(sdhi1),  	SH_PFC_FUNCTION(sdhi2), +	SH_PFC_FUNCTION(ssi),  	SH_PFC_FUNCTION(usb0),  	SH_PFC_FUNCTION(usb1),  	SH_PFC_FUNCTION(vin0),  	SH_PFC_FUNCTION(vin1),  }; -static struct pinmux_cfg_reg pinmux_config_regs[] = { +static const struct pinmux_cfg_reg pinmux_config_regs[] = {  	{ PINMUX_CFG_REG("GPSR0", 0xfffc0004, 32, 1) {  		GP_0_31_FN,	FN_IP1_14_11,  		GP_0_30_FN,	FN_IP1_10_8, diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c index d3e94e307d7..f5c01e1e261 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c @@ -1410,7 +1410,7 @@ static const u16 pinmux_data[] = {  	PINMUX_IPSR_MODSEL_DATA(IP12_17_15, SCK4_B, SEL_SCIF4_1),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	PINMUX_GPIO_GP_ALL(),  }; diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c index 64fcc00693b..9a179c94b4d 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c @@ -781,6 +781,9 @@ enum {  	ADICS_SAMP_MARK, DU2_CDE_MARK, QPOLB_MARK, SCIFA2_RXD_B_MARK,  	USB1_PWEN_MARK, AUDIO_CLKOUT_D_MARK, USB1_OVC_MARK,  	TCLK1_B_MARK, + +	IIC0_SCL_MARK, IIC0_SDA_MARK, I2C0_SCL_MARK, I2C0_SDA_MARK, +	IIC3_SCL_MARK, IIC3_SDA_MARK, I2C3_SCL_MARK, I2C3_SDA_MARK,  	PINMUX_MARK_END,  }; @@ -1719,12 +1722,83 @@ static const u16 pinmux_data[] = {  	PINMUX_IPSR_DATA(IP16_6, AUDIO_CLKOUT_D),  	PINMUX_IPSR_DATA(IP16_7, USB1_OVC),  	PINMUX_IPSR_MODSEL_DATA(IP16_7, TCLK1_B, SEL_TMU1_1), + +	PINMUX_DATA(IIC0_SCL_MARK, FN_SEL_IIC0_0), +	PINMUX_DATA(IIC0_SDA_MARK, FN_SEL_IIC0_0), +	PINMUX_DATA(I2C0_SCL_MARK, FN_SEL_IIC0_1), +	PINMUX_DATA(I2C0_SDA_MARK, FN_SEL_IIC0_1), + +	PINMUX_DATA(IIC3_SCL_MARK, FN_SEL_IICDVFS_0), +	PINMUX_DATA(IIC3_SDA_MARK, FN_SEL_IICDVFS_0), +	PINMUX_DATA(I2C3_SCL_MARK, FN_SEL_IICDVFS_1), +	PINMUX_DATA(I2C3_SDA_MARK, FN_SEL_IICDVFS_1),  }; -static struct sh_pfc_pin pinmux_pins[] = { +/* R8A7790 has 6 banks with 32 GPIOs in each = 192 GPIOs */ +#define ROW_GROUP_A(r) ('Z' - 'A' + 1 + (r)) +#define PIN_NUMBER(r, c) (((r) - 'A') * 31 + (c) + 200) +#define PIN_A_NUMBER(r, c) PIN_NUMBER(ROW_GROUP_A(r), c) + +static const struct sh_pfc_pin pinmux_pins[] = {  	PINMUX_GPIO_GP_ALL(), + +	/* Pins not associated with a GPIO port */ +	SH_PFC_PIN_NAMED(ROW_GROUP_A('F'), 15, AF15), +	SH_PFC_PIN_NAMED(ROW_GROUP_A('G'), 15, AG15), +	SH_PFC_PIN_NAMED(ROW_GROUP_A('H'), 15, AH15), +	SH_PFC_PIN_NAMED(ROW_GROUP_A('J'), 15, AJ15),  }; +/* - AUDIO CLOCK ------------------------------------------------------------ */ +static const unsigned int audio_clk_a_pins[] = { +	/* CLK A */ +	RCAR_GP_PIN(4, 25), +}; +static const unsigned int audio_clk_a_mux[] = { +	AUDIO_CLKA_MARK, +}; +static const unsigned int audio_clk_b_pins[] = { +	/* CLK B */ +	RCAR_GP_PIN(4, 26), +}; +static const unsigned int audio_clk_b_mux[] = { +	AUDIO_CLKB_MARK, +}; +static const unsigned int audio_clk_c_pins[] = { +	/* CLK C */ +	RCAR_GP_PIN(5, 27), +}; +static const unsigned int audio_clk_c_mux[] = { +	AUDIO_CLKC_MARK, +}; +static const unsigned int audio_clkout_pins[] = { +	/* CLK OUT */ +	RCAR_GP_PIN(5, 16), +}; +static const unsigned int audio_clkout_mux[] = { +	AUDIO_CLKOUT_MARK, +}; +static const unsigned int audio_clkout_b_pins[] = { +	/* CLK OUT B */ +	RCAR_GP_PIN(0, 23), +}; +static const unsigned int audio_clkout_b_mux[] = { +	AUDIO_CLKOUT_B_MARK, +}; +static const unsigned int audio_clkout_c_pins[] = { +	/* CLK OUT C */ +	RCAR_GP_PIN(5, 27), +}; +static const unsigned int audio_clkout_c_mux[] = { +	AUDIO_CLKOUT_C_MARK, +}; +static const unsigned int audio_clkout_d_pins[] = { +	/* CLK OUT D */ +	RCAR_GP_PIN(5, 20), +}; +static const unsigned int audio_clkout_d_mux[] = { +	AUDIO_CLKOUT_D_MARK, +};  /* - DU RGB ----------------------------------------------------------------- */  static const unsigned int du_rgb666_pins[] = {  	/* R[7:2], G[7:2], B[7:2] */ @@ -1990,6 +2064,154 @@ static const unsigned int hscif1_ctrl_b_pins[] = {  static const unsigned int hscif1_ctrl_b_mux[] = {  	HRTS1_N_B_MARK, HCTS1_N_B_MARK,  }; +/* - I2C0 ------------------------------------------------------------------- */ +static const unsigned int i2c0_pins[] = { +	/* SCL, SDA */ +	PIN_A_NUMBER('G', 15), PIN_A_NUMBER('F', 15), +}; +static const unsigned int i2c0_mux[] = { +	I2C0_SCL_MARK, I2C0_SDA_MARK, +}; +/* - I2C1 ------------------------------------------------------------------- */ +static const unsigned int i2c1_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(1, 16), RCAR_GP_PIN(1, 17), +}; +static const unsigned int i2c1_mux[] = { +	I2C1_SCL_MARK, I2C1_SDA_MARK, +}; +static const unsigned int i2c1_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7), +}; +static const unsigned int i2c1_b_mux[] = { +	I2C1_SCL_B_MARK, I2C1_SDA_B_MARK, +}; +static const unsigned int i2c1_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 27), +}; +static const unsigned int i2c1_c_mux[] = { +	I2C1_SCL_C_MARK, I2C1_SDA_C_MARK, +}; +/* - I2C2 ------------------------------------------------------------------- */ +static const unsigned int i2c2_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6), +}; +static const unsigned int i2c2_mux[] = { +	I2C2_SCL_MARK, I2C2_SDA_MARK, +}; +static const unsigned int i2c2_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 0), RCAR_GP_PIN(4, 1), +}; +static const unsigned int i2c2_b_mux[] = { +	I2C2_SCL_B_MARK, I2C2_SDA_B_MARK, +}; +static const unsigned int i2c2_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7), +}; +static const unsigned int i2c2_c_mux[] = { +	I2C2_SCL_C_MARK, I2C2_SDA_C_MARK, +}; +static const unsigned int i2c2_d_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15), +}; +static const unsigned int i2c2_d_mux[] = { +	I2C2_SCL_D_MARK, I2C2_SDA_D_MARK, +}; +static const unsigned int i2c2_e_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 18), RCAR_GP_PIN(2, 19), +}; +static const unsigned int i2c2_e_mux[] = { +	I2C2_SCL_E_MARK, I2C2_SDA_E_MARK, +}; +/* - I2C3 ------------------------------------------------------------------- */ +static const unsigned int i2c3_pins[] = { +	/* SCL, SDA */ +	PIN_A_NUMBER('J', 15), PIN_A_NUMBER('H', 15), +}; +static const unsigned int i2c3_mux[] = { +	I2C3_SCL_MARK, I2C3_SDA_MARK, +}; +/* - IIC0 (I2C4) ------------------------------------------------------------ */ +static const unsigned int iic0_pins[] = { +	/* SCL, SDA */ +	PIN_A_NUMBER('G', 15), PIN_A_NUMBER('F', 15), +}; +static const unsigned int iic0_mux[] = { +	IIC0_SCL_MARK, IIC0_SDA_MARK, +}; +/* - IIC1 (I2C5) ------------------------------------------------------------ */ +static const unsigned int iic1_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(1, 16), RCAR_GP_PIN(1, 17), +}; +static const unsigned int iic1_mux[] = { +	IIC1_SCL_MARK, IIC1_SDA_MARK, +}; +static const unsigned int iic1_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7), +}; +static const unsigned int iic1_b_mux[] = { +	IIC1_SCL_B_MARK, IIC1_SDA_B_MARK, +}; +static const unsigned int iic1_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 27), +}; +static const unsigned int iic1_c_mux[] = { +	IIC1_SCL_C_MARK, IIC1_SDA_C_MARK, +}; +/* - IIC2 (I2C6) ------------------------------------------------------------ */ +static const unsigned int iic2_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6), +}; +static const unsigned int iic2_mux[] = { +	IIC2_SCL_MARK, IIC2_SDA_MARK, +}; +static const unsigned int iic2_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 0), RCAR_GP_PIN(4, 1), +}; +static const unsigned int iic2_b_mux[] = { +	IIC2_SCL_B_MARK, IIC2_SDA_B_MARK, +}; +static const unsigned int iic2_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7), +}; +static const unsigned int iic2_c_mux[] = { +	IIC2_SCL_C_MARK, IIC2_SDA_C_MARK, +}; +static const unsigned int iic2_d_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15), +}; +static const unsigned int iic2_d_mux[] = { +	IIC2_SCL_D_MARK, IIC2_SDA_D_MARK, +}; +static const unsigned int iic2_e_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 18), RCAR_GP_PIN(2, 19), +}; +static const unsigned int iic2_e_mux[] = { +	IIC2_SCL_E_MARK, IIC2_SDA_E_MARK, +}; +/* - IIC3 (I2C7) ------------------------------------------------------------ */ +static const unsigned int iic3_pins[] = { +/* SCL, SDA */ +	PIN_A_NUMBER('J', 15), PIN_A_NUMBER('H', 15), +}; +static const unsigned int iic3_mux[] = { +	IIC3_SCL_MARK, IIC3_SDA_MARK, +};  /* - INTC ------------------------------------------------------------------- */  static const unsigned int intc_irq0_pins[] = {  	/* IRQ */ @@ -2130,6 +2352,42 @@ static const unsigned int msiof0_tx_pins[] = {  static const unsigned int msiof0_tx_mux[] = {  	MSIOF0_TXD_MARK,  }; + +static const unsigned int msiof0_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(1, 23), +}; +static const unsigned int msiof0_clk_b_mux[] = { +	MSIOF0_SCK_B_MARK, +}; +static const unsigned int msiof0_ss1_b_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(1, 12), +}; +static const unsigned int msiof0_ss1_b_mux[] = { +	MSIOF0_SS1_B_MARK, +}; +static const unsigned int msiof0_ss2_b_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(1, 10), +}; +static const unsigned int msiof0_ss2_b_mux[] = { +	MSIOF0_SS2_B_MARK, +}; +static const unsigned int msiof0_rx_b_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(1, 29), +}; +static const unsigned int msiof0_rx_b_mux[] = { +	MSIOF0_RXD_B_MARK, +}; +static const unsigned int msiof0_tx_b_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(1, 28), +}; +static const unsigned int msiof0_tx_b_mux[] = { +	MSIOF0_TXD_B_MARK, +};  /* - MSIOF1 ----------------------------------------------------------------- */  static const unsigned int msiof1_clk_pins[] = {  	/* SCK */ @@ -2173,6 +2431,42 @@ static const unsigned int msiof1_tx_pins[] = {  static const unsigned int msiof1_tx_mux[] = {  	MSIOF1_TXD_MARK,  }; + +static const unsigned int msiof1_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(1, 16), +}; +static const unsigned int msiof1_clk_b_mux[] = { +	MSIOF1_SCK_B_MARK, +}; +static const unsigned int msiof1_ss1_b_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(0, 18), +}; +static const unsigned int msiof1_ss1_b_mux[] = { +	MSIOF1_SS1_B_MARK, +}; +static const unsigned int msiof1_ss2_b_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(0, 19), +}; +static const unsigned int msiof1_ss2_b_mux[] = { +	MSIOF1_SS2_B_MARK, +}; +static const unsigned int msiof1_rx_b_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(1, 17), +}; +static const unsigned int msiof1_rx_b_mux[] = { +	MSIOF1_RXD_B_MARK, +}; +static const unsigned int msiof1_tx_b_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(0, 20), +}; +static const unsigned int msiof1_tx_b_mux[] = { +	MSIOF1_TXD_B_MARK, +};  /* - MSIOF2 ----------------------------------------------------------------- */  static const unsigned int msiof2_clk_pins[] = {  	/* SCK */ @@ -2259,6 +2553,58 @@ static const unsigned int msiof3_tx_pins[] = {  static const unsigned int msiof3_tx_mux[] = {  	MSIOF3_TXD_MARK,  }; + +static const unsigned int msiof3_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(0, 0), +}; +static const unsigned int msiof3_clk_b_mux[] = { +	MSIOF3_SCK_B_MARK, +}; +static const unsigned int msiof3_sync_b_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(0, 1), +}; +static const unsigned int msiof3_sync_b_mux[] = { +	MSIOF3_SYNC_B_MARK, +}; +static const unsigned int msiof3_rx_b_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(0, 2), +}; +static const unsigned int msiof3_rx_b_mux[] = { +	MSIOF3_RXD_B_MARK, +}; +static const unsigned int msiof3_tx_b_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(0, 3), +}; +static const unsigned int msiof3_tx_b_mux[] = { +	MSIOF3_TXD_B_MARK, +}; +/* - QSPI ------------------------------------------------------------------- */ +static const unsigned int qspi_ctrl_pins[] = { +	/* SPCLK, SSL */ +	RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 9), +}; +static const unsigned int qspi_ctrl_mux[] = { +	SPCLK_MARK, SSL_MARK, +}; +static const unsigned int qspi_data2_pins[] = { +	/* MOSI_IO0, MISO_IO1 */ +	RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6), +}; +static const unsigned int qspi_data2_mux[] = { +	MOSI_IO0_MARK, MISO_IO1_MARK, +}; +static const unsigned int qspi_data4_pins[] = { +	/* MOSI_IO0, MISO_IO1, IO2, IO3 */ +	RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7), +	RCAR_GP_PIN(1, 8), +}; +static const unsigned int qspi_data4_mux[] = { +	MOSI_IO0_MARK, MISO_IO1_MARK, IO2_MARK, IO3_MARK, +};  /* - SCIF0 ------------------------------------------------------------------ */  static const unsigned int scif0_data_pins[] = {  	/* RX, TX */ @@ -2881,6 +3227,189 @@ static const unsigned int sdhi3_wp_pins[] = {  static const unsigned int sdhi3_wp_mux[] = {  	SD3_WP_MARK,  }; +/* - SSI -------------------------------------------------------------------- */ +static const unsigned int ssi0_data_pins[] = { +	/* SDATA0 */ +	RCAR_GP_PIN(4, 5), +}; +static const unsigned int ssi0_data_mux[] = { +	SSI_SDATA0_MARK, +}; +static const unsigned int ssi0129_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(4, 3), RCAR_GP_PIN(4, 4), +}; +static const unsigned int ssi0129_ctrl_mux[] = { +	SSI_SCK0129_MARK, SSI_WS0129_MARK, +}; +static const unsigned int ssi1_data_pins[] = { +	/* SDATA1 */ +	RCAR_GP_PIN(4, 6), +}; +static const unsigned int ssi1_data_mux[] = { +	SSI_SDATA1_MARK, +}; +static const unsigned int ssi1_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(4, 7), RCAR_GP_PIN(4, 24), +}; +static const unsigned int ssi1_ctrl_mux[] = { +	SSI_SCK1_MARK, SSI_WS1_MARK, +}; +static const unsigned int ssi2_data_pins[] = { +	/* SDATA2 */ +	RCAR_GP_PIN(4, 7), +}; +static const unsigned int ssi2_data_mux[] = { +	SSI_SDATA2_MARK, +}; +static const unsigned int ssi2_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(5, 13), RCAR_GP_PIN(5, 17), +}; +static const unsigned int ssi2_ctrl_mux[] = { +	SSI_SCK2_MARK, SSI_WS2_MARK, +}; +static const unsigned int ssi3_data_pins[] = { +	/* SDATA3 */ +	RCAR_GP_PIN(4, 10), +}; +static const unsigned int ssi3_data_mux[] = { +	SSI_SDATA3_MARK +}; +static const unsigned int ssi34_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(4, 8), RCAR_GP_PIN(4, 9), +}; +static const unsigned int ssi34_ctrl_mux[] = { +	SSI_SCK34_MARK, SSI_WS34_MARK, +}; +static const unsigned int ssi4_data_pins[] = { +	/* SDATA4 */ +	RCAR_GP_PIN(4, 13), +}; +static const unsigned int ssi4_data_mux[] = { +	SSI_SDATA4_MARK, +}; +static const unsigned int ssi4_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(4, 11), RCAR_GP_PIN(4, 12), +}; +static const unsigned int ssi4_ctrl_mux[] = { +	SSI_SCK4_MARK, SSI_WS4_MARK, +}; +static const unsigned int ssi5_pins[] = { +	/* SDATA5, SCK, WS */ +	RCAR_GP_PIN(4, 16), RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 15), +}; +static const unsigned int ssi5_mux[] = { +	SSI_SDATA5_MARK, SSI_SCK5_MARK, SSI_WS5_MARK, +}; +static const unsigned int ssi5_b_pins[] = { +	/* SDATA5, SCK, WS */ +	RCAR_GP_PIN(0, 26), RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 25), +}; +static const unsigned int ssi5_b_mux[] = { +	SSI_SDATA5_B_MARK, SSI_SCK5_B_MARK, SSI_WS5_B_MARK +}; +static const unsigned int ssi5_c_pins[] = { +	/* SDATA5, SCK, WS */ +	RCAR_GP_PIN(4, 24), RCAR_GP_PIN(4, 11), RCAR_GP_PIN(4, 12), +}; +static const unsigned int ssi5_c_mux[] = { +	SSI_SDATA5_C_MARK, SSI_SCK5_C_MARK, SSI_WS5_C_MARK, +}; +static const unsigned int ssi6_pins[] = { +	/* SDATA6, SCK, WS */ +	RCAR_GP_PIN(4, 19), RCAR_GP_PIN(4, 17), RCAR_GP_PIN(4, 18), +}; +static const unsigned int ssi6_mux[] = { +	SSI_SDATA6_MARK, SSI_SCK6_MARK, SSI_WS6_MARK, +}; +static const unsigned int ssi6_b_pins[] = { +	/* SDATA6, SCK, WS */ +	RCAR_GP_PIN(1, 29), RCAR_GP_PIN(1, 25), RCAR_GP_PIN(1, 27), +}; +static const unsigned int ssi6_b_mux[] = { +	SSI_SDATA6_B_MARK, SSI_SCK6_B_MARK, SSI_WS6_B_MARK, +}; +static const unsigned int ssi7_data_pins[] = { +	/* SDATA7 */ +	RCAR_GP_PIN(4, 22), +}; +static const unsigned int ssi7_data_mux[] = { +	SSI_SDATA7_MARK, +}; +static const unsigned int ssi7_b_data_pins[] = { +	/* SDATA7 */ +	RCAR_GP_PIN(4, 22), +}; +static const unsigned int ssi7_b_data_mux[] = { +	SSI_SDATA7_B_MARK, +}; +static const unsigned int ssi7_c_data_pins[] = { +	/* SDATA7 */ +	RCAR_GP_PIN(1, 26), +}; +static const unsigned int ssi7_c_data_mux[] = { +	SSI_SDATA7_C_MARK, +}; +static const unsigned int ssi78_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(4, 20), RCAR_GP_PIN(4, 21), +}; +static const unsigned int ssi78_ctrl_mux[] = { +	SSI_SCK78_MARK, SSI_WS78_MARK, +}; +static const unsigned int ssi78_b_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 24), +}; +static const unsigned int ssi78_b_ctrl_mux[] = { +	SSI_SCK78_B_MARK, SSI_WS78_B_MARK, +}; +static const unsigned int ssi78_c_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(1, 24), RCAR_GP_PIN(1, 25), +}; +static const unsigned int ssi78_c_ctrl_mux[] = { +	SSI_SCK78_C_MARK, SSI_WS78_C_MARK, +}; +static const unsigned int ssi8_data_pins[] = { +	/* SDATA8 */ +	RCAR_GP_PIN(4, 23), +}; +static const unsigned int ssi8_data_mux[] = { +	SSI_SDATA8_MARK, +}; +static const unsigned int ssi8_b_data_pins[] = { +	/* SDATA8 */ +	RCAR_GP_PIN(4, 23), +}; +static const unsigned int ssi8_b_data_mux[] = { +	SSI_SDATA8_B_MARK, +}; +static const unsigned int ssi8_c_data_pins[] = { +	/* SDATA8 */ +	RCAR_GP_PIN(1, 27), +}; +static const unsigned int ssi8_c_data_mux[] = { +	SSI_SDATA8_C_MARK, +}; +static const unsigned int ssi9_data_pins[] = { +	/* SDATA9 */ +	RCAR_GP_PIN(4, 24), +}; +static const unsigned int ssi9_data_mux[] = { +	SSI_SDATA9_MARK, +}; +static const unsigned int ssi9_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(5, 10), RCAR_GP_PIN(5, 11), +}; +static const unsigned int ssi9_ctrl_mux[] = { +	SSI_SCK9_MARK, SSI_WS9_MARK, +};  /* - TPU0 ------------------------------------------------------------------- */  static const unsigned int tpu0_to0_pins[] = {  	/* TO */ @@ -2918,6 +3447,13 @@ static const unsigned int usb0_pins[] = {  static const unsigned int usb0_mux[] = {  	USB0_PWEN_MARK, USB0_OVC_VBUS_MARK,  }; +static const unsigned int usb0_ovc_vbus_pins[] = { +	/* OVC/VBUS */ +	RCAR_GP_PIN(5, 19), +}; +static const unsigned int usb0_ovc_vbus_mux[] = { +	USB0_OVC_VBUS_MARK, +};  /* - USB1 ------------------------------------------------------------------- */  static const unsigned int usb1_pins[] = {  	/* PWEN, OVC */ @@ -2934,59 +3470,110 @@ static const unsigned int usb2_pins[] = {  static const unsigned int usb2_mux[] = {  	USB2_PWEN_MARK, USB2_OVC_MARK,  }; -/* - VIN0 ------------------------------------------------------------------- */ -static const unsigned int vin0_data_g_pins[] = { -	RCAR_GP_PIN(0, 8), RCAR_GP_PIN(0, 9), RCAR_GP_PIN(0, 10), -	RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1), -	RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3), -}; -static const unsigned int vin0_data_g_mux[] = { -	VI0_G0_MARK, VI0_G1_MARK, VI0_G2_MARK, -	VI0_G3_MARK, VI0_G4_MARK, VI0_G5_MARK, -	VI0_G6_MARK, VI0_G7_MARK, + +union vin_data { +	unsigned int data24[24]; +	unsigned int data20[20]; +	unsigned int data16[16]; +	unsigned int data12[12]; +	unsigned int data10[10]; +	unsigned int data8[8]; +	unsigned int data4[4];  }; -static const unsigned int vin0_data_r_pins[] = { -	RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5), RCAR_GP_PIN(0, 6), -	RCAR_GP_PIN(0, 7), RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 25), -	RCAR_GP_PIN(0, 26), RCAR_GP_PIN(1, 11), + +#define VIN_DATA_PIN_GROUP(n, s)				\ +	{							\ +		.name = #n#s,					\ +		.pins = n##_pins.data##s,			\ +		.mux = n##_mux.data##s,				\ +		.nr_pins = ARRAY_SIZE(n##_pins.data##s),	\ +	} + +/* - VIN0 ------------------------------------------------------------------- */ +static const union vin_data vin0_data_pins = { +	.data24 = { +		/* B */ +		RCAR_GP_PIN(2, 1), RCAR_GP_PIN(2, 2), +		RCAR_GP_PIN(2, 3), RCAR_GP_PIN(2, 4), +		RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 6), +		RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8), +		/* G */ +		RCAR_GP_PIN(0, 8), RCAR_GP_PIN(0, 9), +		RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11), +		RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1), +		RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3), +		/* R */ +		RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5), +		RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7), +		RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 25), +		RCAR_GP_PIN(0, 26), RCAR_GP_PIN(1, 11), +	},  }; -static const unsigned int vin0_data_r_mux[] = { -	VI0_R0_MARK, VI0_R1_MARK, VI0_R2_MARK, -	VI0_R3_MARK, VI0_R4_MARK, VI0_R5_MARK, -	VI0_R6_MARK, VI0_R7_MARK, +static const union vin_data vin0_data_mux = { +	.data24 = { +		/* B */ +		VI0_DATA0_VI0_B0_MARK, VI0_DATA1_VI0_B1_MARK, +		VI0_DATA2_VI0_B2_MARK, VI0_DATA3_VI0_B3_MARK, +		VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK, +		VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK, +		/* G */ +		VI0_G0_MARK, VI0_G1_MARK, +		VI0_G2_MARK, VI0_G3_MARK, +		VI0_G4_MARK, VI0_G5_MARK, +		VI0_G6_MARK, VI0_G7_MARK, +		/* R */ +		VI0_R0_MARK, VI0_R1_MARK, +		VI0_R2_MARK, VI0_R3_MARK, +		VI0_R4_MARK, VI0_R5_MARK, +		VI0_R6_MARK, VI0_R7_MARK, +	},  }; -static const unsigned int vin0_data_b_pins[] = { -	RCAR_GP_PIN(2, 1), RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 3), -	RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 6), +static const unsigned int vin0_data18_pins[] = { +	/* B */ +	RCAR_GP_PIN(2, 3), RCAR_GP_PIN(2, 4), +	RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 6),  	RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8), +	/* G */ +	RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11), +	RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1), +	RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3), +	/* R */ +	RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7), +	RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 25), +	RCAR_GP_PIN(0, 26), RCAR_GP_PIN(1, 11),  }; -static const unsigned int vin0_data_b_mux[] = { -	VI0_DATA0_VI0_B0_MARK, VI0_DATA1_VI0_B1_MARK, VI0_DATA2_VI0_B2_MARK, -	VI0_DATA3_VI0_B3_MARK, VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK, +static const unsigned int vin0_data18_mux[] = { +	/* B */ +	VI0_DATA2_VI0_B2_MARK, VI0_DATA3_VI0_B3_MARK, +	VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK,  	VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK, +	/* G */ +	VI0_G2_MARK, VI0_G3_MARK, +	VI0_G4_MARK, VI0_G5_MARK, +	VI0_G6_MARK, VI0_G7_MARK, +	/* R */ +	VI0_R2_MARK, VI0_R3_MARK, +	VI0_R4_MARK, VI0_R5_MARK, +	VI0_R6_MARK, VI0_R7_MARK,  }; -static const unsigned int vin0_hsync_signal_pins[] = { -	RCAR_GP_PIN(0, 12), +static const unsigned int vin0_sync_pins[] = { +	RCAR_GP_PIN(0, 12), /* HSYNC */ +	RCAR_GP_PIN(0, 13), /* VSYNC */  }; -static const unsigned int vin0_hsync_signal_mux[] = { +static const unsigned int vin0_sync_mux[] = {  	VI0_HSYNC_N_MARK, -}; -static const unsigned int vin0_vsync_signal_pins[] = { -	RCAR_GP_PIN(0, 13), -}; -static const unsigned int vin0_vsync_signal_mux[] = {  	VI0_VSYNC_N_MARK,  }; -static const unsigned int vin0_field_signal_pins[] = { +static const unsigned int vin0_field_pins[] = {  	RCAR_GP_PIN(0, 15),  }; -static const unsigned int vin0_field_signal_mux[] = { +static const unsigned int vin0_field_mux[] = {  	VI0_FIELD_MARK,  }; -static const unsigned int vin0_data_enable_pins[] = { +static const unsigned int vin0_clkenb_pins[] = {  	RCAR_GP_PIN(0, 14),  }; -static const unsigned int vin0_data_enable_mux[] = { +static const unsigned int vin0_clkenb_mux[] = {  	VI0_CLKENB_MARK,  };  static const unsigned int vin0_clk_pins[] = { @@ -2996,15 +3583,91 @@ static const unsigned int vin0_clk_mux[] = {  	VI0_CLK_MARK,  };  /* - VIN1 ------------------------------------------------------------------- */ -static const unsigned int vin1_data_pins[] = { -	RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 12), -	RCAR_GP_PIN(2, 13), RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 15), -	RCAR_GP_PIN(2, 16), RCAR_GP_PIN(2, 17), +static const union vin_data vin1_data_pins = { +	.data24 = { +		/* B */ +		RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11), +		RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13), +		RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 15), +		RCAR_GP_PIN(2, 16), RCAR_GP_PIN(2, 17), +		/* G */ +		RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15), +		RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 20), +		RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 12), +		RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 7), +		/* R */ +		RCAR_GP_PIN(0, 27), RCAR_GP_PIN(0, 28), +		RCAR_GP_PIN(0, 29), RCAR_GP_PIN(1, 4), +		RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6), +		RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 8), +	}, +}; +static const union vin_data vin1_data_mux = { +	.data24 = { +		/* B */ +		VI1_DATA0_VI1_B0_MARK, VI1_DATA1_VI1_B1_MARK, +		VI1_DATA2_VI1_B2_MARK, VI1_DATA3_VI1_B3_MARK, +		VI1_DATA4_VI1_B4_MARK, VI1_DATA5_VI1_B5_MARK, +		VI1_DATA6_VI1_B6_MARK, VI1_DATA7_VI1_B7_MARK, +		/* G */ +		VI1_G0_MARK, VI1_G1_MARK, +		VI1_G2_MARK, VI1_G3_MARK, +		VI1_G4_MARK, VI1_G5_MARK, +		VI1_G6_MARK, VI1_G7_MARK, +		/* R */ +		VI1_R0_MARK, VI1_R1_MARK, +		VI1_R2_MARK, VI1_R3_MARK, +		VI1_R4_MARK, VI1_R5_MARK, +		VI1_R6_MARK, VI1_R7_MARK, +	},  }; -static const unsigned int vin1_data_mux[] = { -	VI1_DATA0_VI1_B0_MARK, VI1_DATA1_VI1_B1_MARK, VI1_DATA2_VI1_B2_MARK, -	VI1_DATA3_VI1_B3_MARK, VI1_DATA4_VI1_B4_MARK, VI1_DATA5_VI1_B5_MARK, +static const unsigned int vin1_data18_pins[] = { +	/* B */ +	RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13), +	RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 15), +	RCAR_GP_PIN(2, 16), RCAR_GP_PIN(2, 17), +	/* G */ +	RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 20), +	RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 12), +	RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 7), +	/* R */ +	RCAR_GP_PIN(0, 29), RCAR_GP_PIN(1, 4), +	RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6), +	RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 8), +}; +static const unsigned int vin1_data18_mux[] = { +	/* B */ +	VI1_DATA2_VI1_B2_MARK, VI1_DATA3_VI1_B3_MARK, +	VI1_DATA4_VI1_B4_MARK, VI1_DATA5_VI1_B5_MARK,  	VI1_DATA6_VI1_B6_MARK, VI1_DATA7_VI1_B7_MARK, +	/* G */ +	VI1_G2_MARK, VI1_G3_MARK, +	VI1_G4_MARK, VI1_G5_MARK, +	VI1_G6_MARK, VI1_G7_MARK, +	/* R */ +	VI1_R2_MARK, VI1_R3_MARK, +	VI1_R4_MARK, VI1_R5_MARK, +	VI1_R6_MARK, VI1_R7_MARK, +}; +static const unsigned int vin1_sync_pins[] = { +	RCAR_GP_PIN(1, 24), /* HSYNC */ +	RCAR_GP_PIN(1, 25), /* VSYNC */ +}; +static const unsigned int vin1_sync_mux[] = { +	VI1_HSYNC_N_MARK, +	VI1_VSYNC_N_MARK, +}; +static const unsigned int vin1_field_pins[] = { +	RCAR_GP_PIN(1, 13), +}; +static const unsigned int vin1_field_mux[] = { +	VI1_FIELD_MARK, +}; +static const unsigned int vin1_clkenb_pins[] = { +	RCAR_GP_PIN(1, 26), +}; +static const unsigned int vin1_clkenb_mux[] = { +	VI1_CLKENB_MARK,  };  static const unsigned int vin1_clk_pins[] = {  	RCAR_GP_PIN(2, 9), @@ -3012,8 +3675,147 @@ static const unsigned int vin1_clk_pins[] = {  static const unsigned int vin1_clk_mux[] = {  	VI1_CLK_MARK,  }; +/* - VIN2 ----------------------------------------------------------------- */ +static const union vin_data vin2_data_pins = { +	.data24 = { +		/* B */ +		RCAR_GP_PIN(0, 8), RCAR_GP_PIN(0, 9), +		RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11), +		RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13), +		RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15), +		/* G */ +		RCAR_GP_PIN(0, 27), RCAR_GP_PIN(0, 28), +		RCAR_GP_PIN(0, 29), RCAR_GP_PIN(1, 10), +		RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5), +		RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7), +		/* R */ +		RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 13), +		RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15), +		RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 20), +		RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 24), +	}, +}; +static const union vin_data vin2_data_mux = { +	.data24 = { +		/* B */ +		VI2_DATA0_VI2_B0_MARK, VI2_DATA1_VI2_B1_MARK, +		VI2_DATA2_VI2_B2_MARK, VI2_DATA3_VI2_B3_MARK, +		VI2_DATA4_VI2_B4_MARK, VI2_DATA5_VI2_B5_MARK, +		VI2_DATA6_VI2_B6_MARK, VI2_DATA7_VI2_B7_MARK, +		/* G */ +		VI2_G0_MARK, VI2_G1_MARK, +		VI2_G2_MARK, VI2_G3_MARK, +		VI2_G4_MARK, VI2_G5_MARK, +		VI2_G6_MARK, VI2_G7_MARK, +		/* R */ +		VI2_R0_MARK, VI2_R1_MARK, +		VI2_R2_MARK, VI2_R3_MARK, +		VI2_R4_MARK, VI2_R5_MARK, +		VI2_R6_MARK, VI2_R7_MARK, +	}, +}; +static const unsigned int vin2_data18_pins[] = { +	/* B */ +	RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11), +	RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 13), +	RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15), +	/* G */ +	RCAR_GP_PIN(0, 29), RCAR_GP_PIN(1, 10), +	RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 5), +	RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7), +	/* R */ +	RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 15), +	RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 20), +	RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 24), +}; +static const unsigned int vin2_data18_mux[] = { +	/* B */ +	VI2_DATA2_VI2_B2_MARK, VI2_DATA3_VI2_B3_MARK, +	VI2_DATA4_VI2_B4_MARK, VI2_DATA5_VI2_B5_MARK, +	VI2_DATA6_VI2_B6_MARK, VI2_DATA7_VI2_B7_MARK, +	/* G */ +	VI2_G2_MARK, VI2_G3_MARK, +	VI2_G4_MARK, VI2_G5_MARK, +	VI2_G6_MARK, VI2_G7_MARK, +	/* R */ +	VI2_R2_MARK, VI2_R3_MARK, +	VI2_R4_MARK, VI2_R5_MARK, +	VI2_R6_MARK, VI2_R7_MARK, +}; +static const unsigned int vin2_sync_pins[] = { +	RCAR_GP_PIN(1, 16), /* HSYNC */ +	RCAR_GP_PIN(1, 21), /* VSYNC */ +}; +static const unsigned int vin2_sync_mux[] = { +	VI2_HSYNC_N_MARK, +	VI2_VSYNC_N_MARK, +}; +static const unsigned int vin2_field_pins[] = { +	RCAR_GP_PIN(1, 9), +}; +static const unsigned int vin2_field_mux[] = { +	VI2_FIELD_MARK, +}; +static const unsigned int vin2_clkenb_pins[] = { +	RCAR_GP_PIN(1, 8), +}; +static const unsigned int vin2_clkenb_mux[] = { +	VI2_CLKENB_MARK, +}; +static const unsigned int vin2_clk_pins[] = { +	RCAR_GP_PIN(1, 11), +}; +static const unsigned int vin2_clk_mux[] = { +	VI2_CLK_MARK, +}; +/* - VIN3 ----------------------------------------------------------------- */ +static const unsigned int vin3_data8_pins[] = { +	RCAR_GP_PIN(0, 0), RCAR_GP_PIN(0, 1), +	RCAR_GP_PIN(0, 2), RCAR_GP_PIN(0, 3), +	RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5), +	RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7), +}; +static const unsigned int vin3_data8_mux[] = { +	VI3_DATA0_MARK, VI3_DATA1_MARK, +	VI3_DATA2_MARK, VI3_DATA3_MARK, +	VI3_DATA4_MARK, VI3_DATA5_MARK, +	VI3_DATA6_MARK, VI3_DATA7_MARK, +}; +static const unsigned int vin3_sync_pins[] = { +	RCAR_GP_PIN(1, 16), /* HSYNC */ +	RCAR_GP_PIN(1, 17), /* VSYNC */ +}; +static const unsigned int vin3_sync_mux[] = { +	VI3_HSYNC_N_MARK, +	VI3_VSYNC_N_MARK, +}; +static const unsigned int vin3_field_pins[] = { +	RCAR_GP_PIN(1, 15), +}; +static const unsigned int vin3_field_mux[] = { +	VI3_FIELD_MARK, +}; +static const unsigned int vin3_clkenb_pins[] = { +	RCAR_GP_PIN(1, 14), +}; +static const unsigned int vin3_clkenb_mux[] = { +	VI3_CLKENB_MARK, +}; +static const unsigned int vin3_clk_pins[] = { +	RCAR_GP_PIN(1, 23), +}; +static const unsigned int vin3_clk_mux[] = { +	VI3_CLK_MARK, +};  static const struct sh_pfc_pin_group pinmux_groups[] = { +	SH_PFC_PIN_GROUP(audio_clk_a), +	SH_PFC_PIN_GROUP(audio_clk_b), +	SH_PFC_PIN_GROUP(audio_clk_c), +	SH_PFC_PIN_GROUP(audio_clkout), +	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(du_rgb666),  	SH_PFC_PIN_GROUP(du_rgb888),  	SH_PFC_PIN_GROUP(du_clk_out_0), @@ -3047,6 +3849,26 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(hscif1_data_b),  	SH_PFC_PIN_GROUP(hscif1_clk_b),  	SH_PFC_PIN_GROUP(hscif1_ctrl_b), +	SH_PFC_PIN_GROUP(i2c0), +	SH_PFC_PIN_GROUP(i2c1), +	SH_PFC_PIN_GROUP(i2c1_b), +	SH_PFC_PIN_GROUP(i2c1_c), +	SH_PFC_PIN_GROUP(i2c2), +	SH_PFC_PIN_GROUP(i2c2_b), +	SH_PFC_PIN_GROUP(i2c2_c), +	SH_PFC_PIN_GROUP(i2c2_d), +	SH_PFC_PIN_GROUP(i2c2_e), +	SH_PFC_PIN_GROUP(i2c3), +	SH_PFC_PIN_GROUP(iic0), +	SH_PFC_PIN_GROUP(iic1), +	SH_PFC_PIN_GROUP(iic1_b), +	SH_PFC_PIN_GROUP(iic1_c), +	SH_PFC_PIN_GROUP(iic2), +	SH_PFC_PIN_GROUP(iic2_b), +	SH_PFC_PIN_GROUP(iic2_c), +	SH_PFC_PIN_GROUP(iic2_d), +	SH_PFC_PIN_GROUP(iic2_e), +	SH_PFC_PIN_GROUP(iic3),  	SH_PFC_PIN_GROUP(intc_irq0),  	SH_PFC_PIN_GROUP(intc_irq1),  	SH_PFC_PIN_GROUP(intc_irq2), @@ -3065,12 +3887,22 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(msiof0_ss2),  	SH_PFC_PIN_GROUP(msiof0_rx),  	SH_PFC_PIN_GROUP(msiof0_tx), +	SH_PFC_PIN_GROUP(msiof0_clk_b), +	SH_PFC_PIN_GROUP(msiof0_ss1_b), +	SH_PFC_PIN_GROUP(msiof0_ss2_b), +	SH_PFC_PIN_GROUP(msiof0_rx_b), +	SH_PFC_PIN_GROUP(msiof0_tx_b),  	SH_PFC_PIN_GROUP(msiof1_clk),  	SH_PFC_PIN_GROUP(msiof1_sync),  	SH_PFC_PIN_GROUP(msiof1_ss1),  	SH_PFC_PIN_GROUP(msiof1_ss2),  	SH_PFC_PIN_GROUP(msiof1_rx),  	SH_PFC_PIN_GROUP(msiof1_tx), +	SH_PFC_PIN_GROUP(msiof1_clk_b), +	SH_PFC_PIN_GROUP(msiof1_ss1_b), +	SH_PFC_PIN_GROUP(msiof1_ss2_b), +	SH_PFC_PIN_GROUP(msiof1_rx_b), +	SH_PFC_PIN_GROUP(msiof1_tx_b),  	SH_PFC_PIN_GROUP(msiof2_clk),  	SH_PFC_PIN_GROUP(msiof2_sync),  	SH_PFC_PIN_GROUP(msiof2_ss1), @@ -3083,6 +3915,13 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(msiof3_ss2),  	SH_PFC_PIN_GROUP(msiof3_rx),  	SH_PFC_PIN_GROUP(msiof3_tx), +	SH_PFC_PIN_GROUP(msiof3_clk_b), +	SH_PFC_PIN_GROUP(msiof3_sync_b), +	SH_PFC_PIN_GROUP(msiof3_rx_b), +	SH_PFC_PIN_GROUP(msiof3_tx_b), +	SH_PFC_PIN_GROUP(qspi_ctrl), +	SH_PFC_PIN_GROUP(qspi_data2), +	SH_PFC_PIN_GROUP(qspi_data4),  	SH_PFC_PIN_GROUP(scif0_data),  	SH_PFC_PIN_GROUP(scif0_clk),  	SH_PFC_PIN_GROUP(scif0_ctrl), @@ -3170,23 +4009,88 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(sdhi3_ctrl),  	SH_PFC_PIN_GROUP(sdhi3_cd),  	SH_PFC_PIN_GROUP(sdhi3_wp), +	SH_PFC_PIN_GROUP(ssi0_data), +	SH_PFC_PIN_GROUP(ssi0129_ctrl), +	SH_PFC_PIN_GROUP(ssi1_data), +	SH_PFC_PIN_GROUP(ssi1_ctrl), +	SH_PFC_PIN_GROUP(ssi2_data), +	SH_PFC_PIN_GROUP(ssi2_ctrl), +	SH_PFC_PIN_GROUP(ssi3_data), +	SH_PFC_PIN_GROUP(ssi34_ctrl), +	SH_PFC_PIN_GROUP(ssi4_data), +	SH_PFC_PIN_GROUP(ssi4_ctrl), +	SH_PFC_PIN_GROUP(ssi5), +	SH_PFC_PIN_GROUP(ssi5_b), +	SH_PFC_PIN_GROUP(ssi5_c), +	SH_PFC_PIN_GROUP(ssi6), +	SH_PFC_PIN_GROUP(ssi6_b), +	SH_PFC_PIN_GROUP(ssi7_data), +	SH_PFC_PIN_GROUP(ssi7_b_data), +	SH_PFC_PIN_GROUP(ssi7_c_data), +	SH_PFC_PIN_GROUP(ssi78_ctrl), +	SH_PFC_PIN_GROUP(ssi78_b_ctrl), +	SH_PFC_PIN_GROUP(ssi78_c_ctrl), +	SH_PFC_PIN_GROUP(ssi8_data), +	SH_PFC_PIN_GROUP(ssi8_b_data), +	SH_PFC_PIN_GROUP(ssi8_c_data), +	SH_PFC_PIN_GROUP(ssi9_data), +	SH_PFC_PIN_GROUP(ssi9_ctrl),  	SH_PFC_PIN_GROUP(tpu0_to0),  	SH_PFC_PIN_GROUP(tpu0_to1),  	SH_PFC_PIN_GROUP(tpu0_to2),  	SH_PFC_PIN_GROUP(tpu0_to3),  	SH_PFC_PIN_GROUP(usb0), +	SH_PFC_PIN_GROUP(usb0_ovc_vbus),  	SH_PFC_PIN_GROUP(usb1),  	SH_PFC_PIN_GROUP(usb2), -	SH_PFC_PIN_GROUP(vin0_data_g), -	SH_PFC_PIN_GROUP(vin0_data_r), -	SH_PFC_PIN_GROUP(vin0_data_b), -	SH_PFC_PIN_GROUP(vin0_hsync_signal), -	SH_PFC_PIN_GROUP(vin0_vsync_signal), -	SH_PFC_PIN_GROUP(vin0_field_signal), -	SH_PFC_PIN_GROUP(vin0_data_enable), +	VIN_DATA_PIN_GROUP(vin0_data, 24), +	VIN_DATA_PIN_GROUP(vin0_data, 20), +	SH_PFC_PIN_GROUP(vin0_data18), +	VIN_DATA_PIN_GROUP(vin0_data, 16), +	VIN_DATA_PIN_GROUP(vin0_data, 12), +	VIN_DATA_PIN_GROUP(vin0_data, 10), +	VIN_DATA_PIN_GROUP(vin0_data, 8), +	VIN_DATA_PIN_GROUP(vin0_data, 4), +	SH_PFC_PIN_GROUP(vin0_sync), +	SH_PFC_PIN_GROUP(vin0_field), +	SH_PFC_PIN_GROUP(vin0_clkenb),  	SH_PFC_PIN_GROUP(vin0_clk), -	SH_PFC_PIN_GROUP(vin1_data), +	VIN_DATA_PIN_GROUP(vin1_data, 24), +	VIN_DATA_PIN_GROUP(vin1_data, 20), +	SH_PFC_PIN_GROUP(vin1_data18), +	VIN_DATA_PIN_GROUP(vin1_data, 16), +	VIN_DATA_PIN_GROUP(vin1_data, 12), +	VIN_DATA_PIN_GROUP(vin1_data, 10), +	VIN_DATA_PIN_GROUP(vin1_data, 8), +	VIN_DATA_PIN_GROUP(vin1_data, 4), +	SH_PFC_PIN_GROUP(vin1_sync), +	SH_PFC_PIN_GROUP(vin1_field), +	SH_PFC_PIN_GROUP(vin1_clkenb),  	SH_PFC_PIN_GROUP(vin1_clk), +	VIN_DATA_PIN_GROUP(vin2_data, 24), +	SH_PFC_PIN_GROUP(vin2_data18), +	VIN_DATA_PIN_GROUP(vin2_data, 16), +	VIN_DATA_PIN_GROUP(vin2_data, 8), +	VIN_DATA_PIN_GROUP(vin2_data, 4), +	SH_PFC_PIN_GROUP(vin2_sync), +	SH_PFC_PIN_GROUP(vin2_field), +	SH_PFC_PIN_GROUP(vin2_clkenb), +	SH_PFC_PIN_GROUP(vin2_clk), +	SH_PFC_PIN_GROUP(vin3_data8), +	SH_PFC_PIN_GROUP(vin3_sync), +	SH_PFC_PIN_GROUP(vin3_field), +	SH_PFC_PIN_GROUP(vin3_clkenb), +	SH_PFC_PIN_GROUP(vin3_clk), +}; + +static const char * const audio_clk_groups[] = { +	"audio_clk_a", +	"audio_clk_b", +	"audio_clk_c", +	"audio_clkout", +	"audio_clkout_b", +	"audio_clkout_c", +	"audio_clkout_d",  };  static const char * const du_groups[] = { @@ -3243,6 +4147,50 @@ static const char * const hscif1_groups[] = {  	"hscif1_ctrl_b",  }; +static const char * const i2c0_groups[] = { +	"i2c0", +}; + +static const char * const i2c1_groups[] = { +	"i2c1", +	"i2c1_b", +	"i2c1_c", +}; + +static const char * const i2c2_groups[] = { +	"i2c2", +	"i2c2_b", +	"i2c2_c", +	"i2c2_d", +	"i2c2_e", +}; + +static const char * const i2c3_groups[] = { +	"i2c3", +}; + +static const char * const iic0_groups[] = { +	"iic0", +}; + +static const char * const iic1_groups[] = { +	"iic1", +	"iic1_b", +	"iic1_c", +}; + +static const char * const iic2_groups[] = { +	"iic2", +	"iic2_b", +	"iic2_c", +	"iic2_d", +	"iic2_e", +}; + +static const char * const iic3_groups[] = { +	"iic3", +}; +  static const char * const intc_groups[] = {  	"intc_irq0",  	"intc_irq1", @@ -3271,6 +4219,11 @@ static const char * const msiof0_groups[] = {  	"msiof0_ss2",  	"msiof0_rx",  	"msiof0_tx", +	"msiof0_clk_b", +	"msiof0_ss1_b", +	"msiof0_ss2_b", +	"msiof0_rx_b", +	"msiof0_tx_b",  };  static const char * const msiof1_groups[] = { @@ -3280,6 +4233,11 @@ static const char * const msiof1_groups[] = {  	"msiof1_ss2",  	"msiof1_rx",  	"msiof1_tx", +	"msiof1_clk_b", +	"msiof1_ss1_b", +	"msiof1_ss2_b", +	"msiof1_rx_b", +	"msiof1_tx_b",  };  static const char * const msiof2_groups[] = { @@ -3298,6 +4256,16 @@ static const char * const msiof3_groups[] = {  	"msiof3_ss2",  	"msiof3_rx",  	"msiof3_tx", +	"msiof3_clk_b", +	"msiof3_sync_b", +	"msiof3_rx_b", +	"msiof3_tx_b", +}; + +static const char * const qspi_groups[] = { +	"qspi_ctrl", +	"qspi_data2", +	"qspi_data4",  };  static const char * const scif0_groups[] = { @@ -3426,6 +4394,35 @@ static const char * const sdhi3_groups[] = {  	"sdhi3_wp",  }; +static const char * const ssi_groups[] = { +	"ssi0_data", +	"ssi0129_ctrl", +	"ssi1_data", +	"ssi1_ctrl", +	"ssi2_data", +	"ssi2_ctrl", +	"ssi3_data", +	"ssi34_ctrl", +	"ssi4_data", +	"ssi4_ctrl", +	"ssi5", +	"ssi5_b", +	"ssi5_c", +	"ssi6", +	"ssi6_b", +	"ssi7_data", +	"ssi7_b_data", +	"ssi7_c_data", +	"ssi78_ctrl", +	"ssi78_b_ctrl", +	"ssi78_c_ctrl", +	"ssi8_data", +	"ssi8_b_data", +	"ssi8_c_data", +	"ssi9_data", +	"ssi9_ctrl", +}; +  static const char * const tpu0_groups[] = {  	"tpu0_to0",  	"tpu0_to1", @@ -3435,6 +4432,7 @@ static const char * const tpu0_groups[] = {  static const char * const usb0_groups[] = {  	"usb0", +	"usb0_ovc_vbus",  };  static const char * const usb1_groups[] = { @@ -3446,22 +4444,57 @@ static const char * const usb2_groups[] = {  };  static const char * const vin0_groups[] = { -	"vin0_data_g", -	"vin0_data_r", -	"vin0_data_b", -	"vin0_hsync_signal", -	"vin0_vsync_signal", -	"vin0_field_signal", -	"vin0_data_enable", +	"vin0_data24", +	"vin0_data20", +	"vin0_data18", +	"vin0_data16", +	"vin0_data12", +	"vin0_data10", +	"vin0_data8", +	"vin0_data4", +	"vin0_sync", +	"vin0_field", +	"vin0_clkenb",  	"vin0_clk",  };  static const char * const vin1_groups[] = { -	"vin1_data", +	"vin1_data24", +	"vin1_data20", +	"vin1_data18", +	"vin1_data16", +	"vin1_data12", +	"vin1_data10", +	"vin1_data8", +	"vin1_data4", +	"vin1_sync", +	"vin1_field", +	"vin1_clkenb",  	"vin1_clk",  }; +static const char * const vin2_groups[] = { +	"vin2_data24", +	"vin2_data18", +	"vin2_data16", +	"vin2_data8", +	"vin2_data4", +	"vin2_sync", +	"vin2_field", +	"vin2_clkenb", +	"vin2_clk", +}; + +static const char * const vin3_groups[] = { +	"vin3_data8", +	"vin3_sync", +	"vin3_field", +	"vin3_clkenb", +	"vin3_clk", +}; +  static const struct sh_pfc_function pinmux_functions[] = { +	SH_PFC_FUNCTION(audio_clk),  	SH_PFC_FUNCTION(du),  	SH_PFC_FUNCTION(du0),  	SH_PFC_FUNCTION(du1), @@ -3469,6 +4502,14 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(eth),  	SH_PFC_FUNCTION(hscif0),  	SH_PFC_FUNCTION(hscif1), +	SH_PFC_FUNCTION(i2c0), +	SH_PFC_FUNCTION(i2c1), +	SH_PFC_FUNCTION(i2c2), +	SH_PFC_FUNCTION(i2c3), +	SH_PFC_FUNCTION(iic0), +	SH_PFC_FUNCTION(iic1), +	SH_PFC_FUNCTION(iic2), +	SH_PFC_FUNCTION(iic3),  	SH_PFC_FUNCTION(intc),  	SH_PFC_FUNCTION(mmc0),  	SH_PFC_FUNCTION(mmc1), @@ -3476,6 +4517,7 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(msiof1),  	SH_PFC_FUNCTION(msiof2),  	SH_PFC_FUNCTION(msiof3), +	SH_PFC_FUNCTION(qspi),  	SH_PFC_FUNCTION(scif0),  	SH_PFC_FUNCTION(scif1),  	SH_PFC_FUNCTION(scif2), @@ -3489,15 +4531,18 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(sdhi1),  	SH_PFC_FUNCTION(sdhi2),  	SH_PFC_FUNCTION(sdhi3), +	SH_PFC_FUNCTION(ssi),  	SH_PFC_FUNCTION(tpu0),  	SH_PFC_FUNCTION(usb0),  	SH_PFC_FUNCTION(usb1),  	SH_PFC_FUNCTION(usb2),  	SH_PFC_FUNCTION(vin0),  	SH_PFC_FUNCTION(vin1), +	SH_PFC_FUNCTION(vin2), +	SH_PFC_FUNCTION(vin3),  }; -static struct pinmux_cfg_reg pinmux_config_regs[] = { +static const struct pinmux_cfg_reg pinmux_config_regs[] = {  	{ PINMUX_CFG_REG("GPSR0", 0xE6060004, 32, 1) {  		GP_0_31_FN, FN_IP3_17_15,  		GP_0_30_FN, FN_IP3_14_12, @@ -3883,8 +4928,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {  		FN_MSIOF0_SCK_B, 0,  		/* IP5_23_21 [3] */  		FN_WE1_N, FN_IERX, FN_CAN1_RX, FN_VI1_G4, -		FN_VI1_G4_B, FN_VI2_R6, FN_SCIFA0_CTS_N_B, -		FN_IERX_C, 0, +		FN_VI1_G4_B, FN_VI2_R6, FN_SCIFA0_CTS_N_B, FN_IERX_C,  		/* IP5_20_18 [3] */  		FN_WE0_N, FN_IECLK, FN_CAN_CLK,  		FN_VI2_VSYNC_N, FN_SCIFA0_TXD_B, FN_VI2_VSYNC_N_B, 0, 0, diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c new file mode 100644 index 00000000000..2e688dc4a3c --- /dev/null +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c @@ -0,0 +1,5771 @@ +/* + * r8a7791 processor support - PFC hardware block. + * + * Copyright (C) 2013 Renesas Electronics Corporation + * + * 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/kernel.h> +#include <linux/platform_data/gpio-rcar.h> + +#include "core.h" +#include "sh_pfc.h" + +#define CPU_ALL_PORT(fn, sfx)						\ +	PORT_GP_32(0, fn, sfx),						\ +	PORT_GP_32(1, fn, sfx),						\ +	PORT_GP_32(2, fn, sfx),						\ +	PORT_GP_32(3, fn, sfx),						\ +	PORT_GP_32(4, fn, sfx),						\ +	PORT_GP_32(5, fn, sfx),						\ +	PORT_GP_32(6, fn, sfx),						\ +	PORT_GP_32(7, fn, sfx) + +enum { +	PINMUX_RESERVED = 0, + +	PINMUX_DATA_BEGIN, +	GP_ALL(DATA), +	PINMUX_DATA_END, + +	PINMUX_FUNCTION_BEGIN, +	GP_ALL(FN), + +	/* GPSR0 */ +	FN_IP0_0, FN_IP0_1, FN_IP0_2, FN_IP0_3, FN_IP0_4, FN_IP0_5, +	FN_IP0_6, FN_IP0_7, FN_IP0_8, FN_IP0_9, FN_IP0_10, FN_IP0_11, +	FN_IP0_12, FN_IP0_13, FN_IP0_14, FN_IP0_15, FN_IP0_18_16, FN_IP0_20_19, +	FN_IP0_22_21, FN_IP0_24_23, FN_IP0_26_25, FN_IP0_28_27, FN_IP0_30_29, +	FN_IP1_1_0, FN_IP1_3_2, FN_IP1_5_4, FN_IP1_7_6, FN_IP1_10_8, +	FN_IP1_13_11, FN_IP1_16_14, FN_IP1_19_17, FN_IP1_22_20, + +	/* GPSR1 */ +	FN_IP1_25_23, FN_IP1_28_26, FN_IP1_31_29, FN_IP2_2_0, FN_IP2_4_3, +	FN_IP2_6_5, FN_IP2_9_7, FN_IP2_12_10, FN_IP2_15_13, FN_IP2_18_16, +	FN_IP2_20_19, FN_IP2_22_21, FN_EX_CS0_N, FN_IP2_24_23, FN_IP2_26_25, +	FN_IP2_29_27, FN_IP3_2_0, FN_IP3_5_3, FN_IP3_8_6, FN_RD_N, +	FN_IP3_11_9, FN_IP3_13_12, FN_IP3_15_14 , FN_IP3_17_16 , FN_IP3_19_18, +	FN_IP3_21_20, + +	/* GPSR2 */ +	FN_IP3_27_25, FN_IP3_30_28, FN_IP4_1_0, FN_IP4_4_2, FN_IP4_7_5, +	FN_IP4_9_8, FN_IP4_12_10, FN_IP4_15_13, FN_IP4_18_16, FN_IP4_19, +	FN_IP4_20, FN_IP4_21, FN_IP4_23_22, FN_IP4_25_24, FN_IP4_27_26, +	FN_IP4_30_28, FN_IP5_2_0, FN_IP5_5_3, FN_IP5_8_6, FN_IP5_11_9, +	FN_IP5_14_12, FN_IP5_16_15, FN_IP5_19_17, FN_IP5_21_20, FN_IP5_23_22, +	FN_IP5_25_24, FN_IP5_28_26, FN_IP5_31_29, FN_AUDIO_CLKA, FN_IP6_2_0, +	FN_IP6_5_3, FN_IP6_7_6, + +	/* GPSR3 */ +	FN_IP7_5_3, FN_IP7_8_6, FN_IP7_10_9, FN_IP7_12_11, FN_IP7_14_13, +	FN_IP7_16_15, FN_IP7_18_17, FN_IP7_20_19, FN_IP7_23_21, FN_IP7_26_24, +	FN_IP7_29_27, FN_IP8_2_0, FN_IP8_5_3, FN_IP8_8_6, FN_IP8_11_9, +	FN_IP8_14_12, FN_IP8_17_15, FN_IP8_20_18, FN_IP8_23_21, FN_IP8_25_24, +	FN_IP8_27_26, FN_IP8_30_28, FN_IP9_2_0, FN_IP9_5_3, FN_IP9_6, FN_IP9_7, +	FN_IP9_10_8, FN_IP9_11, FN_IP9_12, FN_IP9_15_13, FN_IP9_16, +	FN_IP9_18_17, + +	/* GPSR4 */ +	FN_VI0_CLK, FN_IP9_20_19, FN_IP9_22_21, FN_IP9_24_23, FN_IP9_26_25, +	FN_VI0_DATA0_VI0_B0, FN_VI0_DATA1_VI0_B1, FN_VI0_DATA2_VI0_B2, +	FN_IP9_28_27, FN_VI0_DATA4_VI0_B4, FN_VI0_DATA5_VI0_B5, +	FN_VI0_DATA6_VI0_B6, FN_VI0_DATA7_VI0_B7, FN_IP9_31_29, FN_IP10_2_0, +	FN_IP10_5_3, FN_IP10_8_6, FN_IP10_11_9, FN_IP10_14_12, FN_IP10_16_15, +	FN_IP10_18_17, FN_IP10_21_19, FN_IP10_24_22, FN_IP10_26_25, +	FN_IP10_28_27, FN_IP10_31_29, FN_IP11_2_0, FN_IP11_5_3, FN_IP11_8_6, +	FN_IP15_1_0, FN_IP15_3_2, FN_IP15_5_4, + +	/* GPSR5 */ +	FN_IP11_11_9, FN_IP11_14_12, FN_IP11_16_15, FN_IP11_18_17, FN_IP11_19, +	FN_IP11_20, FN_IP11_21, FN_IP11_22, FN_IP11_23, FN_IP11_24, +	FN_IP11_25, FN_IP11_26, FN_IP11_27, FN_IP11_29_28, FN_IP11_31_30, +	FN_IP12_1_0, FN_IP12_3_2, FN_IP12_6_4, FN_IP12_9_7, FN_IP12_12_10, +	FN_IP12_15_13, FN_IP12_17_16, FN_IP12_19_18, FN_IP12_21_20, +	FN_IP12_23_22, FN_IP12_26_24, FN_IP12_29_27, FN_IP13_2_0, FN_IP13_4_3, +	FN_IP13_6_5, FN_IP13_9_7, FN_IP3_24_22, + +	/* GPSR6 */ +	FN_IP13_10, FN_IP13_11, FN_IP13_12, FN_IP13_13, FN_IP13_14, +	FN_IP13_15, FN_IP13_18_16, FN_IP13_21_19, +	FN_IP13_22, FN_IP13_24_23, FN_SD1_CLK, +	FN_IP13_25, FN_IP13_26, FN_IP13_27, FN_IP13_30_28, FN_IP14_1_0, +	FN_IP14_2, FN_IP14_3, FN_IP14_4, FN_IP14_5, FN_IP14_6, FN_IP14_7, +	FN_IP14_10_8, FN_IP14_13_11, FN_IP14_16_14, FN_IP14_19_17, +	FN_IP14_22_20, FN_IP14_25_23, FN_IP14_28_26, FN_IP14_31_29, +	FN_USB1_OVC, FN_DU0_DOTCLKIN, + +	/* GPSR7 */ +	FN_IP15_17_15, FN_IP15_20_18, FN_IP15_23_21, FN_IP15_26_24, +	FN_IP15_29_27, FN_IP16_2_0, FN_IP16_5_3, FN_IP16_7_6, FN_IP16_9_8, +	FN_IP16_11_10, FN_IP6_9_8, FN_IP6_11_10, FN_IP6_13_12, FN_IP6_15_14, +	FN_IP6_18_16, FN_IP6_20_19, FN_IP6_23_21, FN_IP6_26_24, FN_IP6_29_27, +	FN_IP7_2_0, FN_IP15_8_6, FN_IP15_11_9, FN_IP15_14_12, +	FN_USB0_PWEN, FN_USB0_OVC, FN_USB1_PWEN, + +	/* IPSR0 */ +	FN_D0, FN_D1, FN_D2, FN_D3, FN_D4, FN_D5, FN_D6, FN_D7, FN_D8, +	FN_D9, FN_D10, FN_D11, FN_D12, FN_D13, FN_D14, FN_D15, +	FN_A0, FN_ATAWR0_N_C, FN_MSIOF0_SCK_B, FN_SCL0_C, FN_PWM2_B, +	FN_A1, FN_MSIOF0_SYNC_B, FN_A2, FN_MSIOF0_SS1_B, +	FN_A3, FN_MSIOF0_SS2_B, FN_A4, FN_MSIOF0_TXD_B, +	FN_A5, FN_MSIOF0_RXD_B, FN_A6, FN_MSIOF1_SCK, + +	/* IPSR1 */ +	FN_A7, FN_MSIOF1_SYNC, FN_A8, FN_MSIOF1_SS1, FN_SCL0, +	FN_A9, FN_MSIOF1_SS2, FN_SDA0, +	FN_A10, FN_MSIOF1_TXD, FN_MSIOF1_TXD_D, +	FN_A11, FN_MSIOF1_RXD, FN_SCL3_D, FN_MSIOF1_RXD_D, +	FN_A12, FN_FMCLK, FN_SDA3_D, FN_MSIOF1_SCK_D, +	FN_A13, FN_ATAG0_N_C, FN_BPFCLK, FN_MSIOF1_SS1_D, +	FN_A14, FN_ATADIR0_N_C, FN_FMIN, FN_FMIN_C, FN_MSIOF1_SYNC_D, +	FN_A15, FN_BPFCLK_C, +	FN_A16, FN_DREQ2_B, FN_FMCLK_C, FN_SCIFA1_SCK_B, +	FN_A17, FN_DACK2_B, FN_SDA0_C, +	FN_A18, FN_DREQ1, FN_SCIFA1_RXD_C, FN_SCIFB1_RXD_C, + +	/* IPSR2 */ +	FN_A19, FN_DACK1, FN_SCIFA1_TXD_C, FN_SCIFB1_TXD_C, FN_SCIFB1_SCK_B, +	FN_A20, FN_SPCLK, +	FN_A21, FN_ATAWR0_N_B, FN_MOSI_IO0, +	FN_A22, FN_MISO_IO1, FN_FMCLK_B, FN_TX0, FN_SCIFA0_TXD, +	FN_A23, FN_IO2, FN_BPFCLK_B, FN_RX0, FN_SCIFA0_RXD, +	FN_A24, FN_DREQ2, FN_IO3, FN_TX1, FN_SCIFA1_TXD, +	FN_A25, FN_DACK2, FN_SSL, FN_DREQ1_C, FN_RX1, FN_SCIFA1_RXD, +	FN_CS0_N, FN_ATAG0_N_B, FN_SCL1, +	FN_CS1_N_A26, FN_ATADIR0_N_B, FN_SDA1, +	FN_EX_CS1_N, FN_MSIOF2_SCK, +	FN_EX_CS2_N, FN_ATAWR0_N, FN_MSIOF2_SYNC, +	FN_EX_CS3_N, FN_ATADIR0_N, FN_MSIOF2_TXD, FN_ATAG0_N, FN_EX_WAIT1, + +	/* IPSR3 */ +	FN_EX_CS4_N, FN_ATARD0_N, FN_MSIOF2_RXD, FN_EX_WAIT2, +	FN_EX_CS5_N, FN_ATACS00_N, FN_MSIOF2_SS1, FN_HRX1_B, +	FN_SCIFB1_RXD_B, FN_PWM1, FN_TPU_TO1, +	FN_BS_N, FN_ATACS10_N, FN_MSIOF2_SS2, FN_HTX1_B, +	FN_SCIFB1_TXD_B, FN_PWM2, FN_TPU_TO2, +	FN_RD_WR_N, FN_HRX2_B, FN_FMIN_B, FN_SCIFB0_RXD_B, FN_DREQ1_D, +	FN_WE0_N, FN_HCTS2_N_B, FN_SCIFB0_TXD_B, +	FN_WE1_N, FN_ATARD0_N_B, FN_HTX2_B, FN_SCIFB0_RTS_N_B, +	FN_EX_WAIT0, FN_HRTS2_N_B, FN_SCIFB0_CTS_N_B, +	FN_DREQ0, FN_PWM3, FN_TPU_TO3, +	FN_DACK0, FN_DRACK0, FN_REMOCON, +	FN_SPEEDIN, FN_HSCK0_C, FN_HSCK2_C, FN_SCIFB0_SCK_B, +	FN_SCIFB2_SCK_B, FN_DREQ2_C, FN_HTX2_D, +	FN_SSI_SCK0129, FN_HRX0_C, FN_HRX2_C, FN_SCIFB0_RXD_C, FN_SCIFB2_RXD_C, +	FN_SSI_WS0129, FN_HTX0_C, FN_HTX2_C, FN_SCIFB0_TXD_C, FN_SCIFB2_TXD_C, + +	/* IPSR4 */ +	FN_SSI_SDATA0, FN_SCL0_B, FN_SCL7_B, FN_MSIOF2_SCK_C, +	FN_SSI_SCK1, FN_SDA0_B, FN_SDA7_B, FN_MSIOF2_SYNC_C, FN_GLO_I0_D, +	FN_SSI_WS1, FN_SCL1_B, FN_SCL8_B, FN_MSIOF2_TXD_C, FN_GLO_I1_D, +	FN_SSI_SDATA1, FN_SDA1_B, FN_SDA8_B, FN_MSIOF2_RXD_C, +	FN_SSI_SCK2, FN_SCL2, FN_GPS_CLK_B, FN_GLO_Q0_D, FN_HSCK1_E, +	FN_SSI_WS2, FN_SDA2, FN_GPS_SIGN_B, FN_RX2_E, +	FN_GLO_Q1_D, FN_HCTS1_N_E, +	FN_SSI_SDATA2, FN_GPS_MAG_B, FN_TX2_E, FN_HRTS1_N_E, +	FN_SSI_SCK34, FN_SSI_WS34, FN_SSI_SDATA3, +	FN_SSI_SCK4, FN_GLO_SS_D, +	FN_SSI_WS4, FN_GLO_RFON_D, +	FN_SSI_SDATA4, FN_MSIOF2_SCK_D, +	FN_SSI_SCK5, FN_MSIOF1_SCK_C, FN_TS_SDATA0, FN_GLO_I0, +	FN_MSIOF2_SYNC_D, FN_VI1_R2_B, + +	/* IPSR5 */ +	FN_SSI_WS5, FN_MSIOF1_SYNC_C, FN_TS_SCK0, FN_GLO_I1, +	FN_MSIOF2_TXD_D, FN_VI1_R3_B, +	FN_SSI_SDATA5, FN_MSIOF1_TXD_C, FN_TS_SDEN0, FN_GLO_Q0, +	FN_MSIOF2_SS1_D, FN_VI1_R4_B, +	FN_SSI_SCK6, FN_MSIOF1_RXD_C, FN_TS_SPSYNC0, FN_GLO_Q1, +	FN_MSIOF2_RXD_D, FN_VI1_R5_B, +	FN_SSI_WS6, FN_GLO_SCLK, FN_MSIOF2_SS2_D, FN_VI1_R6_B, +	FN_SSI_SDATA6, FN_STP_IVCXO27_0_B, FN_GLO_SDATA, FN_VI1_R7_B, +	FN_SSI_SCK78, FN_STP_ISCLK_0_B, FN_GLO_SS, +	FN_SSI_WS78, FN_TX0_D, FN_STP_ISD_0_B, FN_GLO_RFON, +	FN_SSI_SDATA7, FN_RX0_D, FN_STP_ISEN_0_B, +	FN_SSI_SDATA8, FN_TX1_D, FN_STP_ISSYNC_0_B, +	FN_SSI_SCK9, FN_RX1_D, FN_GLO_SCLK_D, +	FN_SSI_WS9, FN_TX3_D, FN_CAN0_TX_D, FN_GLO_SDATA_D, +	FN_SSI_SDATA9, FN_RX3_D, FN_CAN0_RX_D, + +	/* IPSR6 */ +	FN_AUDIO_CLKB, FN_STP_OPWM_0_B, FN_MSIOF1_SCK_B, +	FN_SCIF_CLK, FN_BPFCLK_E, +	FN_AUDIO_CLKC, FN_SCIFB0_SCK_C, FN_MSIOF1_SYNC_B, FN_RX2, +	FN_SCIFA2_RXD, FN_FMIN_E, +	FN_AUDIO_CLKOUT, FN_MSIOF1_SS1_B, FN_TX2, FN_SCIFA2_TXD, +	FN_IRQ0, FN_SCIFB1_RXD_D, FN_INTC_IRQ0_N, +	FN_IRQ1, FN_SCIFB1_SCK_C, FN_INTC_IRQ1_N, +	FN_IRQ2, FN_SCIFB1_TXD_D, FN_INTC_IRQ2_N, +	FN_IRQ3, FN_SCL4_C, FN_MSIOF2_TXD_E, FN_INTC_IRQ3_N, +	FN_IRQ4, FN_HRX1_C, FN_SDA4_C, FN_MSIOF2_RXD_E, FN_INTC_IRQ4_N, +	FN_IRQ5, FN_HTX1_C, FN_SCL1_E, FN_MSIOF2_SCK_E, +	FN_IRQ6, FN_HSCK1_C, FN_MSIOF1_SS2_B, FN_SDA1_E, FN_MSIOF2_SYNC_E, +	FN_IRQ7, FN_HCTS1_N_C, FN_MSIOF1_TXD_B, FN_GPS_CLK_C, FN_GPS_CLK_D, +	FN_IRQ8, FN_HRTS1_N_C, FN_MSIOF1_RXD_B, FN_GPS_SIGN_C, FN_GPS_SIGN_D, + +	/* IPSR7 */ +	FN_IRQ9, FN_DU1_DOTCLKIN_B, FN_CAN_CLK_D, FN_GPS_MAG_C, +	FN_SCIF_CLK_B, FN_GPS_MAG_D, +	FN_DU1_DR0, FN_LCDOUT0, FN_VI1_DATA0_B, FN_TX0_B, +	FN_SCIFA0_TXD_B, FN_MSIOF2_SCK_B, +	FN_DU1_DR1, FN_LCDOUT1, FN_VI1_DATA1_B, FN_RX0_B, +	FN_SCIFA0_RXD_B, FN_MSIOF2_SYNC_B, +	FN_DU1_DR2, FN_LCDOUT2, FN_SSI_SCK0129_B, +	FN_DU1_DR3, FN_LCDOUT3, FN_SSI_WS0129_B, +	FN_DU1_DR4, FN_LCDOUT4, FN_SSI_SDATA0_B, +	FN_DU1_DR5, FN_LCDOUT5, FN_SSI_SCK1_B, +	FN_DU1_DR6, FN_LCDOUT6, FN_SSI_WS1_B, +	FN_DU1_DR7, FN_LCDOUT7, FN_SSI_SDATA1_B, +	FN_DU1_DG0, FN_LCDOUT8, FN_VI1_DATA2_B, FN_TX1_B, +	FN_SCIFA1_TXD_B, FN_MSIOF2_SS1_B, +	FN_DU1_DG1, FN_LCDOUT9, FN_VI1_DATA3_B, FN_RX1_B, +	FN_SCIFA1_RXD_B, FN_MSIOF2_SS2_B, +	FN_DU1_DG2, FN_LCDOUT10, FN_VI1_DATA4_B, FN_SCIF1_SCK_B, +	FN_SCIFA1_SCK, FN_SSI_SCK78_B, + +	/* IPSR8 */ +	FN_DU1_DG3, FN_LCDOUT11, FN_VI1_DATA5_B, FN_SSI_WS78_B, +	FN_DU1_DG4, FN_LCDOUT12, FN_VI1_DATA6_B, FN_HRX0_B, +	FN_SCIFB2_RXD_B, FN_SSI_SDATA7_B, +	FN_DU1_DG5, FN_LCDOUT13, FN_VI1_DATA7_B, FN_HCTS0_N_B, +	FN_SCIFB2_TXD_B, FN_SSI_SDATA8_B, +	FN_DU1_DG6, FN_LCDOUT14, FN_HRTS0_N_B, +	FN_SCIFB2_CTS_N_B, FN_SSI_SCK9_B, +	FN_DU1_DG7, FN_LCDOUT15, FN_HTX0_B, FN_SCIFB2_RTS_N_B, FN_SSI_WS9_B, +	FN_DU1_DB0, FN_LCDOUT16, FN_VI1_CLK_B, FN_TX2_B, +	FN_SCIFA2_TXD_B, FN_MSIOF2_TXD_B, +	FN_DU1_DB1, FN_LCDOUT17, FN_VI1_HSYNC_N_B, FN_RX2_B, +	FN_SCIFA2_RXD_B, FN_MSIOF2_RXD_B, +	FN_DU1_DB2, FN_LCDOUT18, FN_VI1_VSYNC_N_B, FN_SCIF2_SCK_B, +	FN_SCIFA2_SCK, FN_SSI_SDATA9_B, +	FN_DU1_DB3, FN_LCDOUT19, FN_VI1_CLKENB_B, +	FN_DU1_DB4, FN_LCDOUT20, FN_VI1_FIELD_B, FN_CAN1_RX, +	FN_DU1_DB5, FN_LCDOUT21, FN_TX3, FN_SCIFA3_TXD, FN_CAN1_TX, + +	/* IPSR9 */ +	FN_DU1_DB6, FN_LCDOUT22, FN_SCL3_C, FN_RX3, FN_SCIFA3_RXD, +	FN_DU1_DB7, FN_LCDOUT23, FN_SDA3_C, FN_SCIF3_SCK, FN_SCIFA3_SCK, +	FN_DU1_DOTCLKIN, FN_QSTVA_QVS, +	FN_DU1_DOTCLKOUT0, FN_QCLK, +	FN_DU1_DOTCLKOUT1, FN_QSTVB_QVE, FN_CAN0_TX, +	FN_TX3_B, FN_SCL2_B, FN_PWM4, +	FN_DU1_EXHSYNC_DU1_HSYNC, FN_QSTH_QHS, +	FN_DU1_EXVSYNC_DU1_VSYNC, FN_QSTB_QHE, +	FN_DU1_EXODDF_DU1_ODDF_DISP_CDE, FN_QCPV_QDE, +	FN_CAN0_RX, FN_RX3_B, FN_SDA2_B, +	FN_DU1_DISP, FN_QPOLA, +	FN_DU1_CDE, FN_QPOLB, FN_PWM4_B, +	FN_VI0_CLKENB, FN_TX4, FN_SCIFA4_TXD, FN_TS_SDATA0_D, +	FN_VI0_FIELD, FN_RX4, FN_SCIFA4_RXD, FN_TS_SCK0_D, +	FN_VI0_HSYNC_N, FN_TX5, FN_SCIFA5_TXD, FN_TS_SDEN0_D, +	FN_VI0_VSYNC_N, FN_RX5, FN_SCIFA5_RXD, FN_TS_SPSYNC0_D, +	FN_VI0_DATA3_VI0_B3, FN_SCIF3_SCK_B, FN_SCIFA3_SCK_B, +	FN_VI0_G0, FN_SCL8, FN_STP_IVCXO27_0_C, FN_SCL4, +	FN_HCTS2_N, FN_SCIFB2_CTS_N, FN_ATAWR1_N, + +	/* IPSR10 */ +	FN_VI0_G1, FN_SDA8, FN_STP_ISCLK_0_C, FN_SDA4, +	FN_HRTS2_N, FN_SCIFB2_RTS_N, FN_ATADIR1_N, +	FN_VI0_G2, FN_VI2_HSYNC_N, FN_STP_ISD_0_C, FN_SCL3_B, +	FN_HSCK2, FN_SCIFB2_SCK, FN_ATARD1_N, +	FN_VI0_G3, FN_VI2_VSYNC_N, FN_STP_ISEN_0_C, FN_SDA3_B, +	FN_HRX2, FN_SCIFB2_RXD, FN_ATACS01_N, +	FN_VI0_G4, FN_VI2_CLKENB, FN_STP_ISSYNC_0_C, +	FN_HTX2, FN_SCIFB2_TXD, FN_SCIFB0_SCK_D, +	FN_VI0_G5, FN_VI2_FIELD, FN_STP_OPWM_0_C, FN_FMCLK_D, +	FN_CAN0_TX_E, FN_HTX1_D, FN_SCIFB0_TXD_D, +	FN_VI0_G6, FN_VI2_CLK, FN_BPFCLK_D, +	FN_VI0_G7, FN_VI2_DATA0, FN_FMIN_D, +	FN_VI0_R0, FN_VI2_DATA1, FN_GLO_I0_B, +	FN_TS_SDATA0_C, FN_ATACS11_N, +	FN_VI0_R1, FN_VI2_DATA2, FN_GLO_I1_B, +	FN_TS_SCK0_C, FN_ATAG1_N, +	FN_VI0_R2, FN_VI2_DATA3, FN_GLO_Q0_B, FN_TS_SDEN0_C, +	FN_VI0_R3, FN_VI2_DATA4, FN_GLO_Q1_B, FN_TS_SPSYNC0_C, +	FN_VI0_R4, FN_VI2_DATA5, FN_GLO_SCLK_B, FN_TX0_C, FN_SCL1_D, + +	/* IPSR11 */ +	FN_VI0_R5, FN_VI2_DATA6, FN_GLO_SDATA_B, FN_RX0_C, FN_SDA1_D, +	FN_VI0_R6, FN_VI2_DATA7, FN_GLO_SS_B, FN_TX1_C, FN_SCL4_B, +	FN_VI0_R7, FN_GLO_RFON_B, FN_RX1_C, FN_CAN0_RX_E, +	FN_SDA4_B, FN_HRX1_D, FN_SCIFB0_RXD_D, +	FN_VI1_HSYNC_N, FN_AVB_RXD0, FN_TS_SDATA0_B, FN_TX4_B, FN_SCIFA4_TXD_B, +	FN_VI1_VSYNC_N, FN_AVB_RXD1, FN_TS_SCK0_B, FN_RX4_B, FN_SCIFA4_RXD_B, +	FN_VI1_CLKENB, FN_AVB_RXD2, FN_TS_SDEN0_B, +	FN_VI1_FIELD, FN_AVB_RXD3, FN_TS_SPSYNC0_B, +	FN_VI1_CLK, FN_AVB_RXD4, FN_VI1_DATA0, FN_AVB_RXD5, +	FN_VI1_DATA1, FN_AVB_RXD6, FN_VI1_DATA2, FN_AVB_RXD7, +	FN_VI1_DATA3, FN_AVB_RX_ER, FN_VI1_DATA4, FN_AVB_MDIO, +	FN_VI1_DATA5, FN_AVB_RX_DV, FN_VI1_DATA6, FN_AVB_MAGIC, +	FN_VI1_DATA7, FN_AVB_MDC, +	FN_ETH_MDIO, FN_AVB_RX_CLK, FN_SCL2_C, +	FN_ETH_CRS_DV, FN_AVB_LINK, FN_SDA2_C, + +	/* IPSR12 */ +	FN_ETH_RX_ER, FN_AVB_CRS, FN_SCL3, FN_SCL7, +	FN_ETH_RXD0, FN_AVB_PHY_INT, FN_SDA3, FN_SDA7, +	FN_ETH_RXD1, FN_AVB_GTXREFCLK, FN_CAN0_TX_C, +	FN_SCL2_D, FN_MSIOF1_RXD_E, +	FN_ETH_LINK, FN_AVB_TXD0, FN_CAN0_RX_C, FN_SDA2_D, FN_MSIOF1_SCK_E, +	FN_ETH_REFCLK, FN_AVB_TXD1, FN_SCIFA3_RXD_B, +	FN_CAN1_RX_C, FN_MSIOF1_SYNC_E, +	FN_ETH_TXD1, FN_AVB_TXD2, FN_SCIFA3_TXD_B, +	FN_CAN1_TX_C, FN_MSIOF1_TXD_E, +	FN_ETH_TX_EN, FN_AVB_TXD3, FN_TCLK1_B, FN_CAN_CLK_B, +	FN_ETH_MAGIC, FN_AVB_TXD4, FN_IETX_C, +	FN_ETH_TXD0, FN_AVB_TXD5, FN_IECLK_C, +	FN_ETH_MDC, FN_AVB_TXD6, FN_IERX_C, +	FN_STP_IVCXO27_0, FN_AVB_TXD7, FN_SCIFB2_TXD_D, +	FN_ADIDATA_B, FN_MSIOF0_SYNC_C, +	FN_STP_ISCLK_0, FN_AVB_TX_EN, FN_SCIFB2_RXD_D, +	FN_ADICS_SAMP_B, FN_MSIOF0_SCK_C, + +	/* IPSR13 */ +	FN_STP_ISD_0, FN_AVB_TX_ER, FN_SCIFB2_SCK_C, +	FN_ADICLK_B, FN_MSIOF0_SS1_C, +	FN_STP_ISEN_0, FN_AVB_TX_CLK, FN_ADICHS0_B, FN_MSIOF0_SS2_C, +	FN_STP_ISSYNC_0, FN_AVB_COL, FN_ADICHS1_B, FN_MSIOF0_RXD_C, +	FN_STP_OPWM_0, FN_AVB_GTX_CLK, FN_PWM0_B, +	FN_ADICHS2_B, FN_MSIOF0_TXD_C, +	FN_SD0_CLK, FN_SPCLK_B, FN_SD0_CMD, FN_MOSI_IO0_B, +	FN_SD0_DATA0, FN_MISO_IO1_B, FN_SD0_DATA1, FN_IO2_B, +	FN_SD0_DATA2, FN_IO3_B, FN_SD0_DATA3, FN_SSL_B, +	FN_SD0_CD, FN_MMC_D6_B, FN_SIM0_RST_B, FN_CAN0_RX_F, +	FN_SCIFA5_TXD_B, FN_TX3_C, +	FN_SD0_WP, FN_MMC_D7_B, FN_SIM0_D_B, FN_CAN0_TX_F, +	FN_SCIFA5_RXD_B, FN_RX3_C, +	FN_SD1_CMD, FN_REMOCON_B, FN_SD1_DATA0, FN_SPEEDIN_B, +	FN_SD1_DATA1, FN_IETX_B, FN_SD1_DATA2, FN_IECLK_B, +	FN_SD1_DATA3, FN_IERX_B, +	FN_SD1_CD, FN_PWM0, FN_TPU_TO0, FN_SCL1_C, + +	/* IPSR14 */ +	FN_SD1_WP, FN_PWM1_B, FN_SDA1_C, +	FN_SD2_CLK, FN_MMC_CLK, FN_SD2_CMD, FN_MMC_CMD, +	FN_SD2_DATA0, FN_MMC_D0, FN_SD2_DATA1, FN_MMC_D1, +	FN_SD2_DATA2, FN_MMC_D2, FN_SD2_DATA3, FN_MMC_D3, +	FN_SD2_CD, FN_MMC_D4, FN_SCL8_C, FN_TX5_B, FN_SCIFA5_TXD_C, +	FN_SD2_WP, FN_MMC_D5, FN_SDA8_C, FN_RX5_B, FN_SCIFA5_RXD_C, +	FN_MSIOF0_SCK, FN_RX2_C, FN_ADIDATA, FN_VI1_CLK_C, FN_VI1_G0_B, +	FN_MSIOF0_SYNC, FN_TX2_C, FN_ADICS_SAMP, FN_VI1_CLKENB_C, FN_VI1_G1_B, +	FN_MSIOF0_TXD, FN_ADICLK, FN_VI1_FIELD_C, FN_VI1_G2_B, +	FN_MSIOF0_RXD, FN_ADICHS0, FN_VI1_DATA0_C, FN_VI1_G3_B, +	FN_MSIOF0_SS1, FN_MMC_D6, FN_ADICHS1, FN_TX0_E, +	FN_VI1_HSYNC_N_C, FN_SCL7_C, FN_VI1_G4_B, +	FN_MSIOF0_SS2, FN_MMC_D7, FN_ADICHS2, FN_RX0_E, +	FN_VI1_VSYNC_N_C, FN_SDA7_C, FN_VI1_G5_B, + +	/* IPSR15 */ +	FN_SIM0_RST, FN_IETX, FN_CAN1_TX_D, +	FN_SIM0_CLK, FN_IECLK, FN_CAN_CLK_C, +	FN_SIM0_D, FN_IERX, FN_CAN1_RX_D, +	FN_GPS_CLK, FN_DU1_DOTCLKIN_C, FN_AUDIO_CLKB_B, +	FN_PWM5_B, FN_SCIFA3_TXD_C, +	FN_GPS_SIGN, FN_TX4_C, FN_SCIFA4_TXD_C, FN_PWM5, +	FN_VI1_G6_B, FN_SCIFA3_RXD_C, +	FN_GPS_MAG, FN_RX4_C, FN_SCIFA4_RXD_C, FN_PWM6, +	FN_VI1_G7_B, FN_SCIFA3_SCK_C, +	FN_HCTS0_N, FN_SCIFB0_CTS_N, FN_GLO_I0_C, FN_TCLK1, FN_VI1_DATA1_C, +	FN_HRTS0_N, FN_SCIFB0_RTS_N, FN_GLO_I1_C, FN_VI1_DATA2_C, +	FN_HSCK0, FN_SCIFB0_SCK, FN_GLO_Q0_C, FN_CAN_CLK, +	FN_TCLK2, FN_VI1_DATA3_C, +	FN_HRX0, FN_SCIFB0_RXD, FN_GLO_Q1_C, FN_CAN0_RX_B, FN_VI1_DATA4_C, +	FN_HTX0, FN_SCIFB0_TXD, FN_GLO_SCLK_C, FN_CAN0_TX_B, FN_VI1_DATA5_C, + +	/* IPSR16 */ +	FN_HRX1, FN_SCIFB1_RXD, FN_VI1_R0_B, FN_GLO_SDATA_C, FN_VI1_DATA6_C, +	FN_HTX1, FN_SCIFB1_TXD, FN_VI1_R1_B, FN_GLO_SS_C, FN_VI1_DATA7_C, +	FN_HSCK1, FN_SCIFB1_SCK, FN_MLB_CK, FN_GLO_RFON_C, +	FN_HCTS1_N, FN_SCIFB1_CTS_N, FN_MLB_SIG, FN_CAN1_TX_B, +	FN_HRTS1_N, FN_SCIFB1_RTS_N, FN_MLB_DAT, FN_CAN1_RX_B, + +	/* MOD_SEL */ +	FN_SEL_SCIF1_0, FN_SEL_SCIF1_1, FN_SEL_SCIF1_2, FN_SEL_SCIF1_3, +	FN_SEL_SCIFB_0, FN_SEL_SCIFB_1, FN_SEL_SCIFB_2, FN_SEL_SCIFB_3, +	FN_SEL_SCIFB2_0, FN_SEL_SCIFB2_1, FN_SEL_SCIFB2_2, FN_SEL_SCIFB2_3, +	FN_SEL_SCIFB1_0, FN_SEL_SCIFB1_1, FN_SEL_SCIFB1_2, FN_SEL_SCIFB1_3, +	FN_SEL_SCIFA1_0, FN_SEL_SCIFA1_1, FN_SEL_SCIFA1_2, +	FN_SEL_SSI9_0, FN_SEL_SSI9_1, +	FN_SEL_SCFA_0, FN_SEL_SCFA_1, +	FN_SEL_QSP_0, FN_SEL_QSP_1, +	FN_SEL_SSI7_0, FN_SEL_SSI7_1, +	FN_SEL_HSCIF1_0, FN_SEL_HSCIF1_1, FN_SEL_HSCIF1_2, FN_SEL_HSCIF1_3, +	FN_SEL_HSCIF1_4, +	FN_SEL_VI1_0, FN_SEL_VI1_1, FN_SEL_VI1_2, +	FN_SEL_TMU1_0, FN_SEL_TMU1_1, +	FN_SEL_LBS_0, FN_SEL_LBS_1, FN_SEL_LBS_2, FN_SEL_LBS_3, +	FN_SEL_TSIF0_0, FN_SEL_TSIF0_1, FN_SEL_TSIF0_2, FN_SEL_TSIF0_3, +	FN_SEL_SOF0_0, FN_SEL_SOF0_1, FN_SEL_SOF0_2, + +	/* MOD_SEL2 */ +	FN_SEL_SCIF0_0, FN_SEL_SCIF0_1, FN_SEL_SCIF0_2, FN_SEL_SCIF0_3, +	FN_SEL_SCIF0_4, +	FN_SEL_SCIF_0, FN_SEL_SCIF_1, +	FN_SEL_CAN0_0, FN_SEL_CAN0_1, FN_SEL_CAN0_2, FN_SEL_CAN0_3, +	FN_SEL_CAN0_4, FN_SEL_CAN0_5, +	FN_SEL_CAN1_0, FN_SEL_CAN1_1, FN_SEL_CAN1_2, FN_SEL_CAN1_3, +	FN_SEL_SCIFA2_0, FN_SEL_SCIFA2_1, +	FN_SEL_SCIF4_0, FN_SEL_SCIF4_1, FN_SEL_SCIF4_2, +	FN_SEL_ADG_0, FN_SEL_ADG_1, +	FN_SEL_FM_0, FN_SEL_FM_1, FN_SEL_FM_2, FN_SEL_FM_3, FN_SEL_FM_4, +	FN_SEL_SCIFA5_0, FN_SEL_SCIFA5_1, FN_SEL_SCIFA5_2, +	FN_SEL_GPS_0, FN_SEL_GPS_1, FN_SEL_GPS_2, FN_SEL_GPS_3, +	FN_SEL_SCIFA4_0, FN_SEL_SCIFA4_1, FN_SEL_SCIFA4_2, +	FN_SEL_SCIFA3_0, FN_SEL_SCIFA3_1, FN_SEL_SCIFA3_2, +	FN_SEL_SIM_0, FN_SEL_SIM_1, +	FN_SEL_SSI8_0, FN_SEL_SSI8_1, + +	/* MOD_SEL3 */ +	FN_SEL_HSCIF2_0, FN_SEL_HSCIF2_1, FN_SEL_HSCIF2_2, FN_SEL_HSCIF2_3, +	FN_SEL_CANCLK_0, FN_SEL_CANCLK_1, FN_SEL_CANCLK_2, FN_SEL_CANCLK_3, +	FN_SEL_IIC8_0, FN_SEL_IIC8_1, FN_SEL_IIC8_2, +	FN_SEL_IIC7_0, FN_SEL_IIC7_1, FN_SEL_IIC7_2, +	FN_SEL_IIC4_0, FN_SEL_IIC4_1, FN_SEL_IIC4_2, +	FN_SEL_IIC3_0, FN_SEL_IIC3_1, FN_SEL_IIC3_2, FN_SEL_IIC3_3, +	FN_SEL_SCIF3_0, FN_SEL_SCIF3_1, FN_SEL_SCIF3_2, FN_SEL_SCIF3_3, +	FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, +	FN_SEL_MMC_0, FN_SEL_MMC_1, +	FN_SEL_SCIF5_0, FN_SEL_SCIF5_1, +	FN_SEL_IIC2_0, FN_SEL_IIC2_1, FN_SEL_IIC2_2, FN_SEL_IIC2_3, +	FN_SEL_IIC1_0, FN_SEL_IIC1_1, FN_SEL_IIC1_2, FN_SEL_IIC1_3, +	FN_SEL_IIC1_4, +	FN_SEL_IIC0_0, FN_SEL_IIC0_1, FN_SEL_IIC0_2, + +	/* MOD_SEL4 */ +	FN_SEL_SOF1_0, FN_SEL_SOF1_1, FN_SEL_SOF1_2, FN_SEL_SOF1_3, +	FN_SEL_SOF1_4, +	FN_SEL_HSCIF0_0, FN_SEL_HSCIF0_1, FN_SEL_HSCIF0_2, +	FN_SEL_DIS_0, FN_SEL_DIS_1, FN_SEL_DIS_2, +	FN_SEL_RAD_0, FN_SEL_RAD_1, +	FN_SEL_RCN_0, FN_SEL_RCN_1, +	FN_SEL_RSP_0, FN_SEL_RSP_1, +	FN_SEL_SCIF2_0, FN_SEL_SCIF2_1, FN_SEL_SCIF2_2, FN_SEL_SCIF2_3, +	FN_SEL_SCIF2_4, +	FN_SEL_SOF2_0, FN_SEL_SOF2_1, FN_SEL_SOF2_2, FN_SEL_SOF2_3, +	FN_SEL_SOF2_4, +	FN_SEL_SSI1_0, FN_SEL_SSI1_1, +	FN_SEL_SSI0_0, FN_SEL_SSI0_1, +	FN_SEL_SSP_0, FN_SEL_SSP_1, FN_SEL_SSP_2, +	PINMUX_FUNCTION_END, + +	PINMUX_MARK_BEGIN, + +	EX_CS0_N_MARK, RD_N_MARK, + +	AUDIO_CLKA_MARK, + +	VI0_CLK_MARK, VI0_DATA0_VI0_B0_MARK, VI0_DATA1_VI0_B1_MARK, +	VI0_DATA2_VI0_B2_MARK, VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK, +	VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK, + +	SD1_CLK_MARK, + +	USB0_PWEN_MARK, USB0_OVC_MARK, USB1_PWEN_MARK, USB1_OVC_MARK, +	DU0_DOTCLKIN_MARK, + +	/* IPSR0 */ +	D0_MARK, D1_MARK, D2_MARK, D3_MARK, D4_MARK, D5_MARK, +	D6_MARK, D7_MARK, D8_MARK, +	D9_MARK, D10_MARK, D11_MARK, D12_MARK, D13_MARK, D14_MARK, D15_MARK, +	A0_MARK, ATAWR0_N_C_MARK, MSIOF0_SCK_B_MARK, SCL0_C_MARK, PWM2_B_MARK, +	A1_MARK, MSIOF0_SYNC_B_MARK, A2_MARK, MSIOF0_SS1_B_MARK, +	A3_MARK, MSIOF0_SS2_B_MARK, A4_MARK, MSIOF0_TXD_B_MARK, +	A5_MARK, MSIOF0_RXD_B_MARK, A6_MARK, MSIOF1_SCK_MARK, + +	/* IPSR1 */ +	A7_MARK, MSIOF1_SYNC_MARK, A8_MARK, MSIOF1_SS1_MARK, SCL0_MARK, +	A9_MARK, MSIOF1_SS2_MARK, SDA0_MARK, +	A10_MARK, MSIOF1_TXD_MARK, MSIOF1_TXD_D_MARK, +	A11_MARK, MSIOF1_RXD_MARK, SCL3_D_MARK, MSIOF1_RXD_D_MARK, +	A12_MARK, FMCLK_MARK, SDA3_D_MARK, MSIOF1_SCK_D_MARK, +	A13_MARK, ATAG0_N_C_MARK, BPFCLK_MARK, MSIOF1_SS1_D_MARK, +	A14_MARK, ATADIR0_N_C_MARK, FMIN_MARK, FMIN_C_MARK, MSIOF1_SYNC_D_MARK, +	A15_MARK, BPFCLK_C_MARK, +	A16_MARK, DREQ2_B_MARK, FMCLK_C_MARK, SCIFA1_SCK_B_MARK, +	A17_MARK, DACK2_B_MARK, SDA0_C_MARK, +	A18_MARK, DREQ1_MARK, SCIFA1_RXD_C_MARK, SCIFB1_RXD_C_MARK, + +	/* IPSR2 */ +	A19_MARK, DACK1_MARK, SCIFA1_TXD_C_MARK, +	SCIFB1_TXD_C_MARK, SCIFB1_SCK_B_MARK, +	A20_MARK, SPCLK_MARK, +	A21_MARK, ATAWR0_N_B_MARK, MOSI_IO0_MARK, +	A22_MARK, MISO_IO1_MARK, FMCLK_B_MARK, TX0_MARK, SCIFA0_TXD_MARK, +	A23_MARK, IO2_MARK, BPFCLK_B_MARK, RX0_MARK, SCIFA0_RXD_MARK, +	A24_MARK, DREQ2_MARK, IO3_MARK, TX1_MARK, SCIFA1_TXD_MARK, +	A25_MARK, DACK2_MARK, SSL_MARK, DREQ1_C_MARK, +	RX1_MARK, SCIFA1_RXD_MARK, +	CS0_N_MARK, ATAG0_N_B_MARK, SCL1_MARK, +	CS1_N_A26_MARK, ATADIR0_N_B_MARK, SDA1_MARK, +	EX_CS1_N_MARK, MSIOF2_SCK_MARK, +	EX_CS2_N_MARK, ATAWR0_N_MARK, MSIOF2_SYNC_MARK, +	EX_CS3_N_MARK, ATADIR0_N_MARK, MSIOF2_TXD_MARK, +	ATAG0_N_MARK, EX_WAIT1_MARK, + +	/* IPSR3 */ +	EX_CS4_N_MARK, ATARD0_N_MARK, MSIOF2_RXD_MARK, EX_WAIT2_MARK, +	EX_CS5_N_MARK, ATACS00_N_MARK, MSIOF2_SS1_MARK, HRX1_B_MARK, +	SCIFB1_RXD_B_MARK, PWM1_MARK, TPU_TO1_MARK, +	BS_N_MARK, ATACS10_N_MARK, MSIOF2_SS2_MARK, HTX1_B_MARK, +	SCIFB1_TXD_B_MARK, PWM2_MARK, TPU_TO2_MARK, +	RD_WR_N_MARK, HRX2_B_MARK, FMIN_B_MARK, +	SCIFB0_RXD_B_MARK, DREQ1_D_MARK, +	WE0_N_MARK, HCTS2_N_B_MARK, SCIFB0_TXD_B_MARK, +	WE1_N_MARK, ATARD0_N_B_MARK, HTX2_B_MARK, SCIFB0_RTS_N_B_MARK, +	EX_WAIT0_MARK, HRTS2_N_B_MARK, SCIFB0_CTS_N_B_MARK, +	DREQ0_MARK, PWM3_MARK, TPU_TO3_MARK, +	DACK0_MARK, DRACK0_MARK, REMOCON_MARK, +	SPEEDIN_MARK, HSCK0_C_MARK, HSCK2_C_MARK, SCIFB0_SCK_B_MARK, +	SCIFB2_SCK_B_MARK, DREQ2_C_MARK, HTX2_D_MARK, +	SSI_SCK0129_MARK, HRX0_C_MARK, HRX2_C_MARK, +	SCIFB0_RXD_C_MARK, SCIFB2_RXD_C_MARK, +	SSI_WS0129_MARK, HTX0_C_MARK, HTX2_C_MARK, +	SCIFB0_TXD_C_MARK, SCIFB2_TXD_C_MARK, + +	/* IPSR4 */ +	SSI_SDATA0_MARK, SCL0_B_MARK, SCL7_B_MARK, MSIOF2_SCK_C_MARK, +	SSI_SCK1_MARK, SDA0_B_MARK, SDA7_B_MARK, +	MSIOF2_SYNC_C_MARK, GLO_I0_D_MARK, +	SSI_WS1_MARK, SCL1_B_MARK, SCL8_B_MARK, +	MSIOF2_TXD_C_MARK, GLO_I1_D_MARK, +	SSI_SDATA1_MARK, SDA1_B_MARK, SDA8_B_MARK, MSIOF2_RXD_C_MARK, +	SSI_SCK2_MARK, SCL2_MARK, GPS_CLK_B_MARK, GLO_Q0_D_MARK, HSCK1_E_MARK, +	SSI_WS2_MARK, SDA2_MARK, GPS_SIGN_B_MARK, RX2_E_MARK, +	GLO_Q1_D_MARK, HCTS1_N_E_MARK, +	SSI_SDATA2_MARK, GPS_MAG_B_MARK, TX2_E_MARK, HRTS1_N_E_MARK, +	SSI_SCK34_MARK, SSI_WS34_MARK, SSI_SDATA3_MARK, +	SSI_SCK4_MARK, GLO_SS_D_MARK, +	SSI_WS4_MARK, GLO_RFON_D_MARK, +	SSI_SDATA4_MARK, MSIOF2_SCK_D_MARK, +	SSI_SCK5_MARK, MSIOF1_SCK_C_MARK, TS_SDATA0_MARK, GLO_I0_MARK, +	MSIOF2_SYNC_D_MARK, VI1_R2_B_MARK, + +	/* IPSR5 */ +	SSI_WS5_MARK, MSIOF1_SYNC_C_MARK, TS_SCK0_MARK, GLO_I1_MARK, +	MSIOF2_TXD_D_MARK, VI1_R3_B_MARK, +	SSI_SDATA5_MARK, MSIOF1_TXD_C_MARK, TS_SDEN0_MARK, GLO_Q0_MARK, +	MSIOF2_SS1_D_MARK, VI1_R4_B_MARK, +	SSI_SCK6_MARK, MSIOF1_RXD_C_MARK, TS_SPSYNC0_MARK, GLO_Q1_MARK, +	MSIOF2_RXD_D_MARK, VI1_R5_B_MARK, +	SSI_WS6_MARK, GLO_SCLK_MARK, MSIOF2_SS2_D_MARK, VI1_R6_B_MARK, +	SSI_SDATA6_MARK, STP_IVCXO27_0_B_MARK, GLO_SDATA_MARK, VI1_R7_B_MARK, +	SSI_SCK78_MARK, STP_ISCLK_0_B_MARK, GLO_SS_MARK, +	SSI_WS78_MARK, TX0_D_MARK, STP_ISD_0_B_MARK, GLO_RFON_MARK, +	SSI_SDATA7_MARK, RX0_D_MARK, STP_ISEN_0_B_MARK, +	SSI_SDATA8_MARK, TX1_D_MARK, STP_ISSYNC_0_B_MARK, +	SSI_SCK9_MARK, RX1_D_MARK, GLO_SCLK_D_MARK, +	SSI_WS9_MARK, TX3_D_MARK, CAN0_TX_D_MARK, GLO_SDATA_D_MARK, +	SSI_SDATA9_MARK, RX3_D_MARK, CAN0_RX_D_MARK, + +	/* IPSR6 */ +	AUDIO_CLKB_MARK, STP_OPWM_0_B_MARK, MSIOF1_SCK_B_MARK, +	SCIF_CLK_MARK, BPFCLK_E_MARK, +	AUDIO_CLKC_MARK, SCIFB0_SCK_C_MARK, MSIOF1_SYNC_B_MARK, RX2_MARK, +	SCIFA2_RXD_MARK, FMIN_E_MARK, +	AUDIO_CLKOUT_MARK, MSIOF1_SS1_B_MARK, TX2_MARK, SCIFA2_TXD_MARK, +	IRQ0_MARK, SCIFB1_RXD_D_MARK, INTC_IRQ0_N_MARK, +	IRQ1_MARK, SCIFB1_SCK_C_MARK, INTC_IRQ1_N_MARK, +	IRQ2_MARK, SCIFB1_TXD_D_MARK, INTC_IRQ2_N_MARK, +	IRQ3_MARK, SCL4_C_MARK, MSIOF2_TXD_E_MARK, INTC_IRQ3_N_MARK, +	IRQ4_MARK, HRX1_C_MARK, SDA4_C_MARK, +	MSIOF2_RXD_E_MARK, INTC_IRQ4_N_MARK, +	IRQ5_MARK, HTX1_C_MARK, SCL1_E_MARK, MSIOF2_SCK_E_MARK, +	IRQ6_MARK, HSCK1_C_MARK, MSIOF1_SS2_B_MARK, +	SDA1_E_MARK, MSIOF2_SYNC_E_MARK, +	IRQ7_MARK, HCTS1_N_C_MARK, MSIOF1_TXD_B_MARK, +	GPS_CLK_C_MARK, GPS_CLK_D_MARK, +	IRQ8_MARK, HRTS1_N_C_MARK, MSIOF1_RXD_B_MARK, +	GPS_SIGN_C_MARK, GPS_SIGN_D_MARK, + +	/* IPSR7 */ +	IRQ9_MARK, DU1_DOTCLKIN_B_MARK, CAN_CLK_D_MARK, GPS_MAG_C_MARK, +	SCIF_CLK_B_MARK, GPS_MAG_D_MARK, +	DU1_DR0_MARK, LCDOUT0_MARK, VI1_DATA0_B_MARK, TX0_B_MARK, +	SCIFA0_TXD_B_MARK, MSIOF2_SCK_B_MARK, +	DU1_DR1_MARK, LCDOUT1_MARK, VI1_DATA1_B_MARK, RX0_B_MARK, +	SCIFA0_RXD_B_MARK, MSIOF2_SYNC_B_MARK, +	DU1_DR2_MARK, LCDOUT2_MARK, SSI_SCK0129_B_MARK, +	DU1_DR3_MARK, LCDOUT3_MARK, SSI_WS0129_B_MARK, +	DU1_DR4_MARK, LCDOUT4_MARK, SSI_SDATA0_B_MARK, +	DU1_DR5_MARK, LCDOUT5_MARK, SSI_SCK1_B_MARK, +	DU1_DR6_MARK, LCDOUT6_MARK, SSI_WS1_B_MARK, +	DU1_DR7_MARK, LCDOUT7_MARK, SSI_SDATA1_B_MARK, +	DU1_DG0_MARK, LCDOUT8_MARK, VI1_DATA2_B_MARK, TX1_B_MARK, +	SCIFA1_TXD_B_MARK, MSIOF2_SS1_B_MARK, +	DU1_DG1_MARK, LCDOUT9_MARK, VI1_DATA3_B_MARK, RX1_B_MARK, +	SCIFA1_RXD_B_MARK, MSIOF2_SS2_B_MARK, +	DU1_DG2_MARK, LCDOUT10_MARK, VI1_DATA4_B_MARK, SCIF1_SCK_B_MARK, +	SCIFA1_SCK_MARK, SSI_SCK78_B_MARK, + +	/* IPSR8 */ +	DU1_DG3_MARK, LCDOUT11_MARK, VI1_DATA5_B_MARK, SSI_WS78_B_MARK, +	DU1_DG4_MARK, LCDOUT12_MARK, VI1_DATA6_B_MARK, HRX0_B_MARK, +	SCIFB2_RXD_B_MARK, SSI_SDATA7_B_MARK, +	DU1_DG5_MARK, LCDOUT13_MARK, VI1_DATA7_B_MARK, HCTS0_N_B_MARK, +	SCIFB2_TXD_B_MARK, SSI_SDATA8_B_MARK, +	DU1_DG6_MARK, LCDOUT14_MARK, HRTS0_N_B_MARK, +	SCIFB2_CTS_N_B_MARK, SSI_SCK9_B_MARK, +	DU1_DG7_MARK, LCDOUT15_MARK, HTX0_B_MARK, +	SCIFB2_RTS_N_B_MARK, SSI_WS9_B_MARK, +	DU1_DB0_MARK, LCDOUT16_MARK, VI1_CLK_B_MARK, TX2_B_MARK, +	SCIFA2_TXD_B_MARK, MSIOF2_TXD_B_MARK, +	DU1_DB1_MARK, LCDOUT17_MARK, VI1_HSYNC_N_B_MARK, RX2_B_MARK, +	SCIFA2_RXD_B_MARK, MSIOF2_RXD_B_MARK, +	DU1_DB2_MARK, LCDOUT18_MARK, VI1_VSYNC_N_B_MARK, SCIF2_SCK_B_MARK, +	SCIFA2_SCK_MARK, SSI_SDATA9_B_MARK, +	DU1_DB3_MARK, LCDOUT19_MARK, VI1_CLKENB_B_MARK, +	DU1_DB4_MARK, LCDOUT20_MARK, VI1_FIELD_B_MARK, CAN1_RX_MARK, +	DU1_DB5_MARK, LCDOUT21_MARK, TX3_MARK, SCIFA3_TXD_MARK, CAN1_TX_MARK, + +	/* IPSR9 */ +	DU1_DB6_MARK, LCDOUT22_MARK, SCL3_C_MARK, RX3_MARK, SCIFA3_RXD_MARK, +	DU1_DB7_MARK, LCDOUT23_MARK, SDA3_C_MARK, +	SCIF3_SCK_MARK, SCIFA3_SCK_MARK, +	DU1_DOTCLKIN_MARK, QSTVA_QVS_MARK, +	DU1_DOTCLKOUT0_MARK, QCLK_MARK, +	DU1_DOTCLKOUT1_MARK, QSTVB_QVE_MARK, CAN0_TX_MARK, +	TX3_B_MARK, SCL2_B_MARK, PWM4_MARK, +	DU1_EXHSYNC_DU1_HSYNC_MARK, QSTH_QHS_MARK, +	DU1_EXVSYNC_DU1_VSYNC_MARK, QSTB_QHE_MARK, +	DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK, QCPV_QDE_MARK, +	CAN0_RX_MARK, RX3_B_MARK, SDA2_B_MARK, +	DU1_DISP_MARK, QPOLA_MARK, +	DU1_CDE_MARK, QPOLB_MARK, PWM4_B_MARK, +	VI0_CLKENB_MARK, TX4_MARK, SCIFA4_TXD_MARK, TS_SDATA0_D_MARK, +	VI0_FIELD_MARK, RX4_MARK, SCIFA4_RXD_MARK, TS_SCK0_D_MARK, +	VI0_HSYNC_N_MARK, TX5_MARK, SCIFA5_TXD_MARK, TS_SDEN0_D_MARK, +	VI0_VSYNC_N_MARK, RX5_MARK, SCIFA5_RXD_MARK, TS_SPSYNC0_D_MARK, +	VI0_DATA3_VI0_B3_MARK, SCIF3_SCK_B_MARK, SCIFA3_SCK_B_MARK, +	VI0_G0_MARK, SCL8_MARK, STP_IVCXO27_0_C_MARK, SCL4_MARK, +	HCTS2_N_MARK, SCIFB2_CTS_N_MARK, ATAWR1_N_MARK, + +	/* IPSR10 */ +	VI0_G1_MARK, SDA8_MARK, STP_ISCLK_0_C_MARK, SDA4_MARK, +	HRTS2_N_MARK, SCIFB2_RTS_N_MARK, ATADIR1_N_MARK, +	VI0_G2_MARK, VI2_HSYNC_N_MARK, STP_ISD_0_C_MARK, SCL3_B_MARK, +	HSCK2_MARK, SCIFB2_SCK_MARK, ATARD1_N_MARK, +	VI0_G3_MARK, VI2_VSYNC_N_MARK, STP_ISEN_0_C_MARK, SDA3_B_MARK, +	HRX2_MARK, SCIFB2_RXD_MARK, ATACS01_N_MARK, +	VI0_G4_MARK, VI2_CLKENB_MARK, STP_ISSYNC_0_C_MARK, +	HTX2_MARK, SCIFB2_TXD_MARK, SCIFB0_SCK_D_MARK, +	VI0_G5_MARK, VI2_FIELD_MARK, STP_OPWM_0_C_MARK, FMCLK_D_MARK, +	CAN0_TX_E_MARK, HTX1_D_MARK, SCIFB0_TXD_D_MARK, +	VI0_G6_MARK, VI2_CLK_MARK, BPFCLK_D_MARK, +	VI0_G7_MARK, VI2_DATA0_MARK, FMIN_D_MARK, +	VI0_R0_MARK, VI2_DATA1_MARK, GLO_I0_B_MARK, +	TS_SDATA0_C_MARK, ATACS11_N_MARK, +	VI0_R1_MARK, VI2_DATA2_MARK, GLO_I1_B_MARK, +	TS_SCK0_C_MARK, ATAG1_N_MARK, +	VI0_R2_MARK, VI2_DATA3_MARK, GLO_Q0_B_MARK, TS_SDEN0_C_MARK, +	VI0_R3_MARK, VI2_DATA4_MARK, GLO_Q1_B_MARK, TS_SPSYNC0_C_MARK, +	VI0_R4_MARK, VI2_DATA5_MARK, GLO_SCLK_B_MARK, TX0_C_MARK, SCL1_D_MARK, + +	/* IPSR11 */ +	VI0_R5_MARK, VI2_DATA6_MARK, GLO_SDATA_B_MARK, RX0_C_MARK, SDA1_D_MARK, +	VI0_R6_MARK, VI2_DATA7_MARK, GLO_SS_B_MARK, TX1_C_MARK, SCL4_B_MARK, +	VI0_R7_MARK, GLO_RFON_B_MARK, RX1_C_MARK, CAN0_RX_E_MARK, +	SDA4_B_MARK, HRX1_D_MARK, SCIFB0_RXD_D_MARK, +	VI1_HSYNC_N_MARK, AVB_RXD0_MARK, TS_SDATA0_B_MARK, +	TX4_B_MARK, SCIFA4_TXD_B_MARK, +	VI1_VSYNC_N_MARK, AVB_RXD1_MARK, TS_SCK0_B_MARK, +	RX4_B_MARK, SCIFA4_RXD_B_MARK, +	VI1_CLKENB_MARK, AVB_RXD2_MARK, TS_SDEN0_B_MARK, +	VI1_FIELD_MARK, AVB_RXD3_MARK, TS_SPSYNC0_B_MARK, +	VI1_CLK_MARK, AVB_RXD4_MARK, VI1_DATA0_MARK, AVB_RXD5_MARK, +	VI1_DATA1_MARK, AVB_RXD6_MARK, VI1_DATA2_MARK, AVB_RXD7_MARK, +	VI1_DATA3_MARK, AVB_RX_ER_MARK, VI1_DATA4_MARK, AVB_MDIO_MARK, +	VI1_DATA5_MARK, AVB_RX_DV_MARK, VI1_DATA6_MARK, AVB_MAGIC_MARK, +	VI1_DATA7_MARK, AVB_MDC_MARK, +	ETH_MDIO_MARK, AVB_RX_CLK_MARK, SCL2_C_MARK, +	ETH_CRS_DV_MARK, AVB_LINK_MARK, SDA2_C_MARK, + +	/* IPSR12 */ +	ETH_RX_ER_MARK, AVB_CRS_MARK, SCL3_MARK, SCL7_MARK, +	ETH_RXD0_MARK, AVB_PHY_INT_MARK, SDA3_MARK, SDA7_MARK, +	ETH_RXD1_MARK, AVB_GTXREFCLK_MARK, CAN0_TX_C_MARK, +	SCL2_D_MARK, MSIOF1_RXD_E_MARK, +	ETH_LINK_MARK, AVB_TXD0_MARK, CAN0_RX_C_MARK, +	SDA2_D_MARK, MSIOF1_SCK_E_MARK, +	ETH_REFCLK_MARK, AVB_TXD1_MARK, SCIFA3_RXD_B_MARK, +	CAN1_RX_C_MARK, MSIOF1_SYNC_E_MARK, +	ETH_TXD1_MARK, AVB_TXD2_MARK, SCIFA3_TXD_B_MARK, +	CAN1_TX_C_MARK, MSIOF1_TXD_E_MARK, +	ETH_TX_EN_MARK, AVB_TXD3_MARK, TCLK1_B_MARK, CAN_CLK_B_MARK, +	ETH_MAGIC_MARK, AVB_TXD4_MARK, IETX_C_MARK, +	ETH_TXD0_MARK, AVB_TXD5_MARK, IECLK_C_MARK, +	ETH_MDC_MARK, AVB_TXD6_MARK, IERX_C_MARK, +	STP_IVCXO27_0_MARK, AVB_TXD7_MARK, SCIFB2_TXD_D_MARK, +	ADIDATA_B_MARK, MSIOF0_SYNC_C_MARK, +	STP_ISCLK_0_MARK, AVB_TX_EN_MARK, SCIFB2_RXD_D_MARK, +	ADICS_SAMP_B_MARK, MSIOF0_SCK_C_MARK, + +	/* IPSR13 */ +	STP_ISD_0_MARK, AVB_TX_ER_MARK, SCIFB2_SCK_C_MARK, +	ADICLK_B_MARK, MSIOF0_SS1_C_MARK, +	STP_ISEN_0_MARK, AVB_TX_CLK_MARK, ADICHS0_B_MARK, MSIOF0_SS2_C_MARK, +	STP_ISSYNC_0_MARK, AVB_COL_MARK, ADICHS1_B_MARK, MSIOF0_RXD_C_MARK, +	STP_OPWM_0_MARK, AVB_GTX_CLK_MARK, PWM0_B_MARK, +	ADICHS2_B_MARK, MSIOF0_TXD_C_MARK, +	SD0_CLK_MARK, SPCLK_B_MARK, SD0_CMD_MARK, MOSI_IO0_B_MARK, +	SD0_DATA0_MARK, MISO_IO1_B_MARK, SD0_DATA1_MARK, IO2_B_MARK, +	SD0_DATA2_MARK, IO3_B_MARK, SD0_DATA3_MARK, SSL_B_MARK, +	SD0_CD_MARK, MMC_D6_B_MARK, SIM0_RST_B_MARK, CAN0_RX_F_MARK, +	SCIFA5_TXD_B_MARK, TX3_C_MARK, +	SD0_WP_MARK, MMC_D7_B_MARK, SIM0_D_B_MARK, CAN0_TX_F_MARK, +	SCIFA5_RXD_B_MARK, RX3_C_MARK, +	SD1_CMD_MARK, REMOCON_B_MARK, SD1_DATA0_MARK, SPEEDIN_B_MARK, +	SD1_DATA1_MARK, IETX_B_MARK, SD1_DATA2_MARK, IECLK_B_MARK, +	SD1_DATA3_MARK, IERX_B_MARK, +	SD1_CD_MARK, PWM0_MARK, TPU_TO0_MARK, SCL1_C_MARK, + +	/* IPSR14 */ +	SD1_WP_MARK, PWM1_B_MARK, SDA1_C_MARK, +	SD2_CLK_MARK, MMC_CLK_MARK, SD2_CMD_MARK, MMC_CMD_MARK, +	SD2_DATA0_MARK, MMC_D0_MARK, SD2_DATA1_MARK, MMC_D1_MARK, +	SD2_DATA2_MARK, MMC_D2_MARK, SD2_DATA3_MARK, MMC_D3_MARK, +	SD2_CD_MARK, MMC_D4_MARK, SCL8_C_MARK, TX5_B_MARK, SCIFA5_TXD_C_MARK, +	SD2_WP_MARK, MMC_D5_MARK, SDA8_C_MARK, RX5_B_MARK, SCIFA5_RXD_C_MARK, +	MSIOF0_SCK_MARK, RX2_C_MARK, ADIDATA_MARK, +	VI1_CLK_C_MARK, VI1_G0_B_MARK, +	MSIOF0_SYNC_MARK, TX2_C_MARK, ADICS_SAMP_MARK, +	VI1_CLKENB_C_MARK, VI1_G1_B_MARK, +	MSIOF0_TXD_MARK, ADICLK_MARK, VI1_FIELD_C_MARK, VI1_G2_B_MARK, +	MSIOF0_RXD_MARK, ADICHS0_MARK, VI1_DATA0_C_MARK, VI1_G3_B_MARK, +	MSIOF0_SS1_MARK, MMC_D6_MARK, ADICHS1_MARK, TX0_E_MARK, +	VI1_HSYNC_N_C_MARK, SCL7_C_MARK, VI1_G4_B_MARK, +	MSIOF0_SS2_MARK, MMC_D7_MARK, ADICHS2_MARK, RX0_E_MARK, +	VI1_VSYNC_N_C_MARK, SDA7_C_MARK, VI1_G5_B_MARK, + +	/* IPSR15 */ +	SIM0_RST_MARK, IETX_MARK, CAN1_TX_D_MARK, +	SIM0_CLK_MARK, IECLK_MARK, CAN_CLK_C_MARK, +	SIM0_D_MARK, IERX_MARK, CAN1_RX_D_MARK, +	GPS_CLK_MARK, DU1_DOTCLKIN_C_MARK, AUDIO_CLKB_B_MARK, +	PWM5_B_MARK, SCIFA3_TXD_C_MARK, +	GPS_SIGN_MARK, TX4_C_MARK, SCIFA4_TXD_C_MARK, PWM5_MARK, +	VI1_G6_B_MARK, SCIFA3_RXD_C_MARK, +	GPS_MAG_MARK, RX4_C_MARK, SCIFA4_RXD_C_MARK, PWM6_MARK, +	VI1_G7_B_MARK, SCIFA3_SCK_C_MARK, +	HCTS0_N_MARK, SCIFB0_CTS_N_MARK, GLO_I0_C_MARK, +	TCLK1_MARK, VI1_DATA1_C_MARK, +	HRTS0_N_MARK, SCIFB0_RTS_N_MARK, GLO_I1_C_MARK, VI1_DATA2_C_MARK, +	HSCK0_MARK, SCIFB0_SCK_MARK, GLO_Q0_C_MARK, CAN_CLK_MARK, +	TCLK2_MARK, VI1_DATA3_C_MARK, +	HRX0_MARK, SCIFB0_RXD_MARK, GLO_Q1_C_MARK, +	CAN0_RX_B_MARK, VI1_DATA4_C_MARK, +	HTX0_MARK, SCIFB0_TXD_MARK, GLO_SCLK_C_MARK, +	CAN0_TX_B_MARK, VI1_DATA5_C_MARK, + +	/* IPSR16 */ +	HRX1_MARK, SCIFB1_RXD_MARK, VI1_R0_B_MARK, +	GLO_SDATA_C_MARK, VI1_DATA6_C_MARK, +	HTX1_MARK, SCIFB1_TXD_MARK, VI1_R1_B_MARK, +	GLO_SS_C_MARK, VI1_DATA7_C_MARK, +	HSCK1_MARK, SCIFB1_SCK_MARK, MLB_CK_MARK, GLO_RFON_C_MARK, +	HCTS1_N_MARK, SCIFB1_CTS_N_MARK, MLB_SIG_MARK, CAN1_TX_B_MARK, +	HRTS1_N_MARK, SCIFB1_RTS_N_MARK, MLB_DAT_MARK, CAN1_RX_B_MARK, +	PINMUX_MARK_END, +}; + +static const u16 pinmux_data[] = { +	PINMUX_DATA_GP_ALL(), /* PINMUX_DATA(GP_M_N_DATA, GP_M_N_FN...), */ + +	PINMUX_DATA(EX_CS0_N_MARK, FN_EX_CS0_N), +	PINMUX_DATA(RD_N_MARK, FN_RD_N), +	PINMUX_DATA(AUDIO_CLKA_MARK, FN_AUDIO_CLKA), +	PINMUX_DATA(VI0_CLK_MARK, FN_VI0_CLK), +	PINMUX_DATA(VI0_DATA0_VI0_B0_MARK, FN_VI0_DATA0_VI0_B0), +	PINMUX_DATA(VI0_DATA1_VI0_B1_MARK, FN_VI0_DATA1_VI0_B1), +	PINMUX_DATA(VI0_DATA2_VI0_B2_MARK, FN_VI0_DATA2_VI0_B2), +	PINMUX_DATA(VI0_DATA4_VI0_B4_MARK, FN_VI0_DATA4_VI0_B4), +	PINMUX_DATA(VI0_DATA5_VI0_B5_MARK, FN_VI0_DATA5_VI0_B5), +	PINMUX_DATA(VI0_DATA6_VI0_B6_MARK, FN_VI0_DATA6_VI0_B6), +	PINMUX_DATA(VI0_DATA7_VI0_B7_MARK, FN_VI0_DATA7_VI0_B7), +	PINMUX_DATA(USB0_PWEN_MARK, FN_USB0_PWEN), +	PINMUX_DATA(USB0_OVC_MARK, FN_USB0_OVC), +	PINMUX_DATA(USB1_PWEN_MARK, FN_USB1_PWEN), +	PINMUX_DATA(USB1_OVC_MARK, FN_USB1_OVC), +	PINMUX_DATA(DU0_DOTCLKIN_MARK, FN_DU0_DOTCLKIN), +	PINMUX_DATA(SD1_CLK_MARK, FN_SD1_CLK), + +	/* IPSR0 */ +	PINMUX_IPSR_DATA(IP0_0, D0), +	PINMUX_IPSR_DATA(IP0_1, D1), +	PINMUX_IPSR_DATA(IP0_2, D2), +	PINMUX_IPSR_DATA(IP0_3, D3), +	PINMUX_IPSR_DATA(IP0_4, D4), +	PINMUX_IPSR_DATA(IP0_5, D5), +	PINMUX_IPSR_DATA(IP0_6, D6), +	PINMUX_IPSR_DATA(IP0_7, D7), +	PINMUX_IPSR_DATA(IP0_8, D8), +	PINMUX_IPSR_DATA(IP0_9, D9), +	PINMUX_IPSR_DATA(IP0_10, D10), +	PINMUX_IPSR_DATA(IP0_11, D11), +	PINMUX_IPSR_DATA(IP0_12, D12), +	PINMUX_IPSR_DATA(IP0_13, D13), +	PINMUX_IPSR_DATA(IP0_14, D14), +	PINMUX_IPSR_DATA(IP0_15, D15), +	PINMUX_IPSR_DATA(IP0_18_16, A0), +	PINMUX_IPSR_MODSEL_DATA(IP0_18_16, ATAWR0_N_C, SEL_LBS_2), +	PINMUX_IPSR_MODSEL_DATA(IP0_18_16, MSIOF0_SCK_B, SEL_SOF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP0_18_16, SCL0_C, SEL_IIC0_2), +	PINMUX_IPSR_DATA(IP0_18_16, PWM2_B), +	PINMUX_IPSR_DATA(IP0_20_19, A1), +	PINMUX_IPSR_MODSEL_DATA(IP0_20_19, MSIOF0_SYNC_B, SEL_SOF0_1), +	PINMUX_IPSR_DATA(IP0_22_21, A2), +	PINMUX_IPSR_MODSEL_DATA(IP0_22_21, MSIOF0_SS1_B, SEL_SOF0_1), +	PINMUX_IPSR_DATA(IP0_24_23, A3), +	PINMUX_IPSR_MODSEL_DATA(IP0_24_23, MSIOF0_SS2_B, SEL_SOF0_1), +	PINMUX_IPSR_DATA(IP0_26_25, A4), +	PINMUX_IPSR_MODSEL_DATA(IP0_26_25, MSIOF0_TXD_B, SEL_SOF0_1), +	PINMUX_IPSR_DATA(IP0_28_27, A5), +	PINMUX_IPSR_MODSEL_DATA(IP0_28_27, MSIOF0_RXD_B, SEL_SOF0_1), +	PINMUX_IPSR_DATA(IP0_30_29, A6), +	PINMUX_IPSR_MODSEL_DATA(IP0_30_29, MSIOF1_SCK, SEL_SOF1_0), + +	/* IPSR1 */ +	PINMUX_IPSR_DATA(IP1_1_0, A7), +	PINMUX_IPSR_MODSEL_DATA(IP1_1_0, MSIOF1_SYNC, SEL_SOF1_0), +	PINMUX_IPSR_DATA(IP1_3_2, A8), +	PINMUX_IPSR_MODSEL_DATA(IP1_3_2, MSIOF1_SS1, SEL_SOF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_3_2, SCL0, SEL_IIC0_0), +	PINMUX_IPSR_DATA(IP1_5_4, A9), +	PINMUX_IPSR_MODSEL_DATA(IP1_5_4, MSIOF1_SS2, SEL_SOF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_5_4, SDA0, SEL_IIC0_0), +	PINMUX_IPSR_DATA(IP1_7_6, A10), +	PINMUX_IPSR_MODSEL_DATA(IP1_7_6, MSIOF1_TXD, SEL_SOF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_7_6, MSIOF1_TXD_D, SEL_SOF1_3), +	PINMUX_IPSR_DATA(IP1_10_8, A11), +	PINMUX_IPSR_MODSEL_DATA(IP1_10_8, MSIOF1_RXD, SEL_SOF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_10_8, SCL3_D, SEL_IIC3_3), +	PINMUX_IPSR_MODSEL_DATA(IP1_10_8, MSIOF1_RXD_D, SEL_SOF1_3), +	PINMUX_IPSR_DATA(IP1_13_11, A12), +	PINMUX_IPSR_MODSEL_DATA(IP1_13_11, FMCLK, SEL_FM_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_13_11, SDA3_D, SEL_IIC3_3), +	PINMUX_IPSR_MODSEL_DATA(IP1_13_11, MSIOF1_SCK_D, SEL_SOF1_3), +	PINMUX_IPSR_DATA(IP1_16_14, A13), +	PINMUX_IPSR_MODSEL_DATA(IP1_16_14, ATAG0_N_C, SEL_LBS_2), +	PINMUX_IPSR_MODSEL_DATA(IP1_16_14, BPFCLK, SEL_FM_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_16_14, MSIOF1_SS1_D, SEL_SOF1_3), +	PINMUX_IPSR_DATA(IP1_19_17, A14), +	PINMUX_IPSR_MODSEL_DATA(IP1_19_17, ATADIR0_N_C, SEL_LBS_2), +	PINMUX_IPSR_MODSEL_DATA(IP1_19_17, FMIN, SEL_FM_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_19_17, FMIN_C, SEL_FM_2), +	PINMUX_IPSR_MODSEL_DATA(IP1_19_17, MSIOF1_SYNC_D, SEL_SOF1_3), +	PINMUX_IPSR_DATA(IP1_22_20, A15), +	PINMUX_IPSR_MODSEL_DATA(IP1_22_20, BPFCLK_C, SEL_FM_2), +	PINMUX_IPSR_DATA(IP1_25_23, A16), +	PINMUX_IPSR_MODSEL_DATA(IP1_25_23, DREQ2_B, SEL_LBS_1), +	PINMUX_IPSR_MODSEL_DATA(IP1_25_23, FMCLK_C, SEL_FM_2), +	PINMUX_IPSR_MODSEL_DATA(IP1_25_23, SCIFA1_SCK_B, SEL_SCIFA1_1), +	PINMUX_IPSR_DATA(IP1_28_26, A17), +	PINMUX_IPSR_MODSEL_DATA(IP1_28_26, DACK2_B, SEL_LBS_1), +	PINMUX_IPSR_MODSEL_DATA(IP1_28_26, SDA0_C, SEL_IIC0_2), +	PINMUX_IPSR_DATA(IP1_31_29, A18), +	PINMUX_IPSR_MODSEL_DATA(IP1_31_29, DREQ1, SEL_LBS_0), +	PINMUX_IPSR_MODSEL_DATA(IP1_31_29, SCIFA1_RXD_C, SEL_SCIFA1_2), +	PINMUX_IPSR_MODSEL_DATA(IP1_31_29, SCIFB1_RXD_C, SEL_SCIFB1_2), + +	/* IPSR2 */ +	PINMUX_IPSR_DATA(IP2_2_0, A19), +	PINMUX_IPSR_DATA(IP2_2_0, DACK1), +	PINMUX_IPSR_MODSEL_DATA(IP2_2_0, SCIFA1_TXD_C, SEL_SCIFA1_2), +	PINMUX_IPSR_MODSEL_DATA(IP2_2_0, SCIFB1_TXD_C, SEL_SCIFB1_2), +	PINMUX_IPSR_MODSEL_DATA(IP2_2_0, SCIFB1_SCK_B, SEL_SCIFB1_0), +	PINMUX_IPSR_DATA(IP2_2_0, A20), +	PINMUX_IPSR_MODSEL_DATA(IP2_4_3, SPCLK, SEL_QSP_0), +	PINMUX_IPSR_DATA(IP2_6_5, A21), +	PINMUX_IPSR_MODSEL_DATA(IP2_6_5, ATAWR0_N_B, SEL_LBS_1), +	PINMUX_IPSR_MODSEL_DATA(IP2_6_5, MOSI_IO0, SEL_QSP_0), +	PINMUX_IPSR_DATA(IP2_9_7, A22), +	PINMUX_IPSR_MODSEL_DATA(IP2_9_7, MISO_IO1, SEL_QSP_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_9_7, FMCLK_B, SEL_FM_1), +	PINMUX_IPSR_MODSEL_DATA(IP2_9_7, TX0, SEL_SCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_9_7, SCIFA0_TXD, SEL_SCFA_0), +	PINMUX_IPSR_DATA(IP2_12_10, A23), +	PINMUX_IPSR_MODSEL_DATA(IP2_12_10, IO2, SEL_QSP_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_12_10, BPFCLK_B, SEL_FM_1), +	PINMUX_IPSR_MODSEL_DATA(IP2_12_10, RX0, SEL_SCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_12_10, SCIFA0_RXD, SEL_SCFA_0), +	PINMUX_IPSR_DATA(IP2_15_13, A24), +	PINMUX_IPSR_MODSEL_DATA(IP2_15_13, DREQ2, SEL_LBS_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_15_13, IO3, SEL_QSP_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_15_13, TX1, SEL_SCIF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_15_13, SCIFA1_TXD, SEL_SCIFA1_0), +	PINMUX_IPSR_DATA(IP2_18_16, A25), +	PINMUX_IPSR_MODSEL_DATA(IP2_18_16, DACK2, SEL_LBS_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_18_16, SSL, SEL_QSP_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_18_16, DREQ1_C, SEL_LBS_2), +	PINMUX_IPSR_MODSEL_DATA(IP2_18_16, RX1, SEL_SCIF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_18_16, SCIFA1_RXD, SEL_SCIFA1_0), +	PINMUX_IPSR_DATA(IP2_20_19, CS0_N), +	PINMUX_IPSR_MODSEL_DATA(IP2_20_19, ATAG0_N_B, SEL_LBS_1), +	PINMUX_IPSR_MODSEL_DATA(IP2_20_19, SCL1, SEL_IIC1_0), +	PINMUX_IPSR_DATA(IP2_22_21, CS1_N_A26), +	PINMUX_IPSR_MODSEL_DATA(IP2_22_21, ATADIR0_N_B, SEL_LBS_1), +	PINMUX_IPSR_MODSEL_DATA(IP2_22_21, SDA1, SEL_IIC1_0), +	PINMUX_IPSR_DATA(IP2_24_23, EX_CS1_N), +	PINMUX_IPSR_MODSEL_DATA(IP2_24_23, MSIOF2_SCK, SEL_SOF2_0), +	PINMUX_IPSR_DATA(IP2_26_25, EX_CS2_N), +	PINMUX_IPSR_MODSEL_DATA(IP2_26_25, ATAWR0_N, SEL_LBS_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_26_25, MSIOF2_SYNC, SEL_SOF2_0), +	PINMUX_IPSR_DATA(IP2_29_27, EX_CS3_N), +	PINMUX_IPSR_MODSEL_DATA(IP2_29_27, ATADIR0_N, SEL_LBS_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_29_27, MSIOF2_TXD, SEL_SOF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP2_29_27, ATAG0_N, SEL_LBS_0), +	PINMUX_IPSR_DATA(IP2_29_27, EX_WAIT1), + +	/* IPSR3 */ +	PINMUX_IPSR_DATA(IP3_2_0, EX_CS4_N), +	PINMUX_IPSR_MODSEL_DATA(IP3_2_0, ATARD0_N, SEL_LBS_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_2_0, MSIOF2_RXD, SEL_SOF2_0), +	PINMUX_IPSR_DATA(IP3_2_0, EX_WAIT2), +	PINMUX_IPSR_DATA(IP3_5_3, EX_CS5_N), +	PINMUX_IPSR_DATA(IP3_5_3, ATACS00_N), +	PINMUX_IPSR_MODSEL_DATA(IP3_5_3, MSIOF2_SS1, SEL_SOF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_5_3, HRX1_B, SEL_HSCIF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_5_3, SCIFB1_RXD_B, SEL_SCIFB1_1), +	PINMUX_IPSR_DATA(IP3_5_3, PWM1), +	PINMUX_IPSR_DATA(IP3_5_3, TPU_TO1), +	PINMUX_IPSR_DATA(IP3_8_6, BS_N), +	PINMUX_IPSR_DATA(IP3_8_6, ATACS10_N), +	PINMUX_IPSR_MODSEL_DATA(IP3_8_6, MSIOF2_SS2, SEL_SOF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_8_6, HTX1_B, SEL_HSCIF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_8_6, SCIFB1_TXD_B, SEL_SCIFB1_1), +	PINMUX_IPSR_DATA(IP3_8_6, PWM2), +	PINMUX_IPSR_DATA(IP3_8_6, TPU_TO2), +	PINMUX_IPSR_DATA(IP3_11_9, RD_WR_N), +	PINMUX_IPSR_MODSEL_DATA(IP3_11_9, HRX2_B, SEL_HSCIF2_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_11_9, FMIN_B, SEL_FM_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_11_9, SCIFB0_RXD_B, SEL_SCIFB_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_11_9, DREQ1_D, SEL_LBS_1), +	PINMUX_IPSR_DATA(IP3_13_12, WE0_N), +	PINMUX_IPSR_MODSEL_DATA(IP3_13_12, HCTS2_N_B, SEL_HSCIF2_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_13_12, SCIFB0_TXD_B, SEL_SCIFB_1), +	PINMUX_IPSR_DATA(IP3_15_14, WE1_N), +	PINMUX_IPSR_MODSEL_DATA(IP3_15_14, ATARD0_N_B, SEL_LBS_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_15_14, HTX2_B, SEL_HSCIF2_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_15_14, SCIFB0_RTS_N_B, SEL_SCIFB_1), +	PINMUX_IPSR_DATA(IP3_17_16, EX_WAIT0), +	PINMUX_IPSR_MODSEL_DATA(IP3_17_16, HRTS2_N_B, SEL_HSCIF2_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_17_16, SCIFB0_CTS_N_B, SEL_SCIFB_1), +	PINMUX_IPSR_DATA(IP3_19_18, DREQ0), +	PINMUX_IPSR_DATA(IP3_19_18, PWM3), +	PINMUX_IPSR_DATA(IP3_19_18, TPU_TO3), +	PINMUX_IPSR_DATA(IP3_21_20, DACK0), +	PINMUX_IPSR_DATA(IP3_21_20, DRACK0), +	PINMUX_IPSR_MODSEL_DATA(IP3_21_20, REMOCON, SEL_RCN_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_24_22, SPEEDIN, SEL_RSP_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_24_22, HSCK0_C, SEL_HSCIF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_24_22, HSCK2_C, SEL_HSCIF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_24_22, SCIFB0_SCK_B, SEL_SCIFB_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_24_22, SCIFB2_SCK_B, SEL_SCIFB2_1), +	PINMUX_IPSR_MODSEL_DATA(IP3_24_22, DREQ2_C, SEL_LBS_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_30_28, HTX2_C, SEL_HSCIF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_27_25, SSI_SCK0129, SEL_SSI0_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_27_25, HRX0_C, SEL_HSCIF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_27_25, HRX2_C, SEL_HSCIF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_27_25, SCIFB0_RXD_C, SEL_SCIFB_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_27_25, SCIFB2_RXD_C, SEL_SCIFB2_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_30_28, SSI_WS0129, SEL_SSI0_0), +	PINMUX_IPSR_MODSEL_DATA(IP3_30_28, HTX0_C, SEL_HSCIF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_30_28, HTX2_C, SEL_HSCIF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_30_28, SCIFB0_TXD_C, SEL_SCIFB_2), +	PINMUX_IPSR_MODSEL_DATA(IP3_30_28, SCIFB2_TXD_C, SEL_SCIFB2_2), + +	/* IPSR4 */ +	PINMUX_IPSR_MODSEL_DATA(IP4_1_0, SSI_SDATA0, SEL_SSI0_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_1_0, SCL0_B, SEL_IIC0_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_1_0, SCL7_B, SEL_IIC7_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_1_0, MSIOF2_SCK_C, SEL_SOF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP4_4_2, SSI_SCK1, SEL_SSI1_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_4_2, SDA0_B, SEL_IIC0_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_4_2, SDA7_B, SEL_IIC7_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_4_2, MSIOF2_SYNC_C, SEL_SOF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP4_4_2, GLO_I0_D, SEL_GPS_3), +	PINMUX_IPSR_MODSEL_DATA(IP4_7_5, SSI_WS1, SEL_SSI1_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_7_5, SCL1_B, SEL_IIC1_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_7_5, SCL8_B, SEL_IIC8_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_7_5, MSIOF2_TXD_C, SEL_SOF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP4_7_5, GLO_I1_D, SEL_GPS_3), +	PINMUX_IPSR_MODSEL_DATA(IP4_9_8, SSI_SDATA1, SEL_SSI1_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_9_8, SDA1_B, SEL_IIC1_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_9_8, SDA8_B, SEL_IIC8_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_9_8, MSIOF2_RXD_C, SEL_SOF2_2), +	PINMUX_IPSR_DATA(IP4_12_10, SSI_SCK2), +	PINMUX_IPSR_MODSEL_DATA(IP4_12_10, SCL2, SEL_IIC2_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_12_10, GPS_CLK_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_12_10, GLO_Q0_D, SEL_GPS_3), +	PINMUX_IPSR_DATA(IP4_15_13, SSI_WS2), +	PINMUX_IPSR_MODSEL_DATA(IP4_15_13, SDA2, SEL_IIC2_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_15_13, GPS_SIGN_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_15_13, RX2_E, SEL_SCIF2_4), +	PINMUX_IPSR_MODSEL_DATA(IP4_15_13, GLO_Q1_D, SEL_GPS_3), +	PINMUX_IPSR_DATA(IP4_18_16, SSI_SDATA2), +	PINMUX_IPSR_MODSEL_DATA(IP4_18_16, GPS_MAG_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP4_18_16, TX2_E, SEL_SCIF2_4), +	PINMUX_IPSR_DATA(IP4_19, SSI_SCK34), +	PINMUX_IPSR_DATA(IP4_20, SSI_WS34), +	PINMUX_IPSR_DATA(IP4_21, SSI_SDATA3), +	PINMUX_IPSR_DATA(IP4_23_22, SSI_SCK4), +	PINMUX_IPSR_MODSEL_DATA(IP4_23_22, GLO_SS_D, SEL_GPS_3), +	PINMUX_IPSR_DATA(IP4_25_24, SSI_WS4), +	PINMUX_IPSR_MODSEL_DATA(IP4_25_24, GLO_RFON_D, SEL_GPS_3), +	PINMUX_IPSR_DATA(IP4_27_26, SSI_SDATA4), +	PINMUX_IPSR_MODSEL_DATA(IP4_27_26, MSIOF2_SCK_D, SEL_SOF2_3), +	PINMUX_IPSR_DATA(IP4_30_28, SSI_SCK5), +	PINMUX_IPSR_MODSEL_DATA(IP4_30_28, MSIOF1_SCK_C, SEL_SOF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP4_30_28, TS_SDATA0, SEL_TSIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_30_28, GLO_I0, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP4_30_28, MSIOF2_SYNC_D, SEL_SOF2_3), +	PINMUX_IPSR_DATA(IP4_30_28, VI1_R2_B), + +	/* IPSR5 */ +	PINMUX_IPSR_DATA(IP5_2_0, SSI_WS5), +	PINMUX_IPSR_MODSEL_DATA(IP5_2_0, MSIOF1_SYNC_C, SEL_SOF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP5_2_0, TS_SCK0, SEL_TSIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_2_0, GLO_I1, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_2_0, MSIOF2_TXD_D, SEL_SOF2_3), +	PINMUX_IPSR_DATA(IP5_2_0, VI1_R3_B), +	PINMUX_IPSR_DATA(IP5_5_3, SSI_SDATA5), +	PINMUX_IPSR_MODSEL_DATA(IP5_5_3, MSIOF1_TXD_C, SEL_SOF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP5_5_3, TS_SDEN0, SEL_TSIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_5_3, GLO_Q0, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_5_3, MSIOF2_SS1_D, SEL_SOF2_3), +	PINMUX_IPSR_DATA(IP5_5_3, VI1_R4_B), +	PINMUX_IPSR_DATA(IP5_8_6, SSI_SCK6), +	PINMUX_IPSR_MODSEL_DATA(IP5_8_6, MSIOF1_RXD_C, SEL_SOF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP5_8_6, TS_SPSYNC0, SEL_TSIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_8_6, GLO_Q1, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_8_6, MSIOF2_RXD_D, SEL_SOF2_3), +	PINMUX_IPSR_DATA(IP5_8_6, VI1_R5_B), +	PINMUX_IPSR_DATA(IP5_11_9, SSI_WS6), +	PINMUX_IPSR_MODSEL_DATA(IP5_11_9, GLO_SCLK, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_11_9, MSIOF2_SS2_D, SEL_SOF2_3), +	PINMUX_IPSR_DATA(IP5_11_9, VI1_R6_B), +	PINMUX_IPSR_DATA(IP5_14_12, SSI_SDATA6), +	PINMUX_IPSR_MODSEL_DATA(IP5_14_12, STP_IVCXO27_0_B, SEL_SSP_1), +	PINMUX_IPSR_MODSEL_DATA(IP5_14_12, GLO_SDATA, SEL_GPS_0), +	PINMUX_IPSR_DATA(IP5_14_12, VI1_R7_B), +	PINMUX_IPSR_MODSEL_DATA(IP5_16_15, SSI_SCK78, SEL_SSI7_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_16_15, STP_ISCLK_0_B, SEL_SSP_1), +	PINMUX_IPSR_MODSEL_DATA(IP5_16_15, GLO_SS, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_19_17, SSI_WS78, SEL_SSI7_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_19_17, TX0_D, SEL_SCIF0_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_19_17, STP_ISD_0_B, SEL_SSP_1), +	PINMUX_IPSR_MODSEL_DATA(IP5_19_17, GLO_RFON, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_21_20, SSI_SDATA7, SEL_SSI7_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_21_20, RX0_D, SEL_SCIF0_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_21_20, STP_ISEN_0_B, SEL_SSP_1), +	PINMUX_IPSR_MODSEL_DATA(IP5_23_22, SSI_SDATA8, SEL_SSI8_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_23_22, TX1_D, SEL_SCIF1_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_23_22, STP_ISSYNC_0_B, SEL_SSP_1), +	PINMUX_IPSR_MODSEL_DATA(IP5_25_24, SSI_SCK9, SEL_SSI9_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_25_24, RX1_D, SEL_SCIF1_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_25_24, GLO_SCLK_D, SEL_GPS_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_28_26, SSI_WS9, SEL_SSI9_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_28_26, TX3_D, SEL_SCIF3_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_28_26, CAN0_TX_D, SEL_CAN0_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_28_26, GLO_SDATA_D, SEL_GPS_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_31_29, SSI_SDATA9, SEL_SSI9_0), +	PINMUX_IPSR_MODSEL_DATA(IP5_31_29, RX3_D, SEL_SCIF3_3), +	PINMUX_IPSR_MODSEL_DATA(IP5_31_29, CAN0_RX_D, SEL_CAN0_3), + +	/* IPSR6 */ +	PINMUX_IPSR_MODSEL_DATA(IP6_2_0, AUDIO_CLKB, SEL_ADG_0), +	PINMUX_IPSR_MODSEL_DATA(IP6_2_0, STP_OPWM_0_B, SEL_SSP_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_2_0, MSIOF1_SCK_B, SEL_SOF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_2_0, SCIF_CLK, SEL_SCIF_0), +	PINMUX_IPSR_MODSEL_DATA(IP6_2_0, BPFCLK_E, SEL_FM_4), +	PINMUX_IPSR_DATA(IP6_5_3, AUDIO_CLKC), +	PINMUX_IPSR_MODSEL_DATA(IP6_5_3, SCIFB0_SCK_C, SEL_SCIFB_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_5_3, MSIOF1_SYNC_B, SEL_SOF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_5_3, RX2, SEL_SCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP6_5_3, SCIFA2_RXD, SEL_SCIFA2_0), +	PINMUX_IPSR_MODSEL_DATA(IP6_5_3, FMIN_E, SEL_FM_4), +	PINMUX_IPSR_DATA(IP6_7_6, AUDIO_CLKOUT), +	PINMUX_IPSR_MODSEL_DATA(IP6_7_6, MSIOF1_SS1_B, SEL_SOF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_5_3, TX2, SEL_SCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP6_7_6, SCIFA2_TXD, SEL_SCIFA2_0), +	PINMUX_IPSR_DATA(IP6_9_8, IRQ0), +	PINMUX_IPSR_MODSEL_DATA(IP6_9_8, SCIFB1_RXD_D, SEL_SCIFB1_3), +	PINMUX_IPSR_DATA(IP6_9_8, INTC_IRQ0_N), +	PINMUX_IPSR_DATA(IP6_11_10, IRQ1), +	PINMUX_IPSR_MODSEL_DATA(IP6_11_10, SCIFB1_SCK_C, SEL_SCIFB1_2), +	PINMUX_IPSR_DATA(IP6_11_10, INTC_IRQ1_N), +	PINMUX_IPSR_DATA(IP6_13_12, IRQ2), +	PINMUX_IPSR_MODSEL_DATA(IP6_13_12, SCIFB1_TXD_D, SEL_SCIFB1_3), +	PINMUX_IPSR_DATA(IP6_13_12, INTC_IRQ2_N), +	PINMUX_IPSR_DATA(IP6_15_14, IRQ3), +	PINMUX_IPSR_MODSEL_DATA(IP6_15_14, SCL4_C, SEL_IIC4_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_15_14, MSIOF2_TXD_E, SEL_SOF2_4), +	PINMUX_IPSR_DATA(IP6_15_14, INTC_IRQ4_N), +	PINMUX_IPSR_DATA(IP6_18_16, IRQ4), +	PINMUX_IPSR_MODSEL_DATA(IP6_18_16, HRX1_C, SEL_HSCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_18_16, SDA4_C, SEL_IIC4_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_18_16, MSIOF2_RXD_E, SEL_SOF2_4), +	PINMUX_IPSR_DATA(IP6_18_16, INTC_IRQ4_N), +	PINMUX_IPSR_DATA(IP6_20_19, IRQ5), +	PINMUX_IPSR_MODSEL_DATA(IP6_20_19, HTX1_C, SEL_HSCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_20_19, SCL1_E, SEL_IIC1_4), +	PINMUX_IPSR_MODSEL_DATA(IP6_20_19, MSIOF2_SCK_E, SEL_SOF2_4), +	PINMUX_IPSR_DATA(IP6_23_21, IRQ6), +	PINMUX_IPSR_MODSEL_DATA(IP6_23_21, HSCK1_C, SEL_HSCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_23_21, MSIOF1_SS2_B, SEL_SOF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_23_21, SDA1_E, SEL_IIC1_4), +	PINMUX_IPSR_MODSEL_DATA(IP6_23_21, MSIOF2_SYNC_E, SEL_SOF2_4), +	PINMUX_IPSR_DATA(IP6_26_24, IRQ7), +	PINMUX_IPSR_MODSEL_DATA(IP6_26_24, HCTS1_N_C, SEL_HSCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_26_24, MSIOF1_TXD_B, SEL_SOF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_26_24, GPS_CLK_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_26_24, GPS_CLK_D, SEL_GPS_3), +	PINMUX_IPSR_DATA(IP6_29_27, IRQ8), +	PINMUX_IPSR_MODSEL_DATA(IP6_29_27, HRTS1_N_C, SEL_HSCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_29_27, MSIOF1_RXD_B, SEL_SOF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP6_29_27, GPS_SIGN_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP6_29_27, GPS_SIGN_D, SEL_GPS_3), + +	/* IPSR7 */ +	PINMUX_IPSR_DATA(IP7_2_0, IRQ9), +	PINMUX_IPSR_MODSEL_DATA(IP7_2_0, DU1_DOTCLKIN_B, SEL_DIS_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_2_0, CAN_CLK_D, SEL_CANCLK_3), +	PINMUX_IPSR_MODSEL_DATA(IP7_2_0, GPS_MAG_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP7_2_0, SCIF_CLK_B, SEL_SCIF_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_2_0, GPS_MAG_D, SEL_GPS_3), +	PINMUX_IPSR_DATA(IP7_5_3, DU1_DR0), +	PINMUX_IPSR_DATA(IP7_5_3, LCDOUT0), +	PINMUX_IPSR_MODSEL_DATA(IP7_5_3, VI1_DATA0_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_5_3, TX0_B, SEL_SCIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_5_3, SCIFA0_TXD_B, SEL_SCFA_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_5_3, MSIOF2_SCK_B, SEL_SOF2_1), +	PINMUX_IPSR_DATA(IP7_8_6, DU1_DR1), +	PINMUX_IPSR_DATA(IP7_8_6, LCDOUT1), +	PINMUX_IPSR_MODSEL_DATA(IP7_8_6, VI1_DATA1_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_8_6, RX0_B, SEL_SCIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_8_6, SCIFA0_RXD_B, SEL_SCFA_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_8_6, MSIOF2_SYNC_B, SEL_SOF2_1), +	PINMUX_IPSR_DATA(IP7_10_9, DU1_DR2), +	PINMUX_IPSR_DATA(IP7_10_9, LCDOUT2), +	PINMUX_IPSR_MODSEL_DATA(IP7_10_9, SSI_SCK0129_B, SEL_SSI0_1), +	PINMUX_IPSR_DATA(IP7_12_11, DU1_DR3), +	PINMUX_IPSR_DATA(IP7_12_11, LCDOUT3), +	PINMUX_IPSR_MODSEL_DATA(IP7_12_11, SSI_WS0129_B, SEL_SSI0_1), +	PINMUX_IPSR_DATA(IP7_14_13, DU1_DR4), +	PINMUX_IPSR_DATA(IP7_14_13, LCDOUT4), +	PINMUX_IPSR_MODSEL_DATA(IP7_14_13, SSI_SDATA0_B, SEL_SSI0_1), +	PINMUX_IPSR_DATA(IP7_16_15, DU1_DR5), +	PINMUX_IPSR_DATA(IP7_16_15, LCDOUT5), +	PINMUX_IPSR_MODSEL_DATA(IP7_16_15, SSI_SCK1_B, SEL_SSI1_1), +	PINMUX_IPSR_DATA(IP7_18_17, DU1_DR6), +	PINMUX_IPSR_DATA(IP7_18_17, LCDOUT6), +	PINMUX_IPSR_MODSEL_DATA(IP7_18_17, SSI_WS1_B, SEL_SSI1_1), +	PINMUX_IPSR_DATA(IP7_20_19, DU1_DR7), +	PINMUX_IPSR_DATA(IP7_20_19, LCDOUT7), +	PINMUX_IPSR_MODSEL_DATA(IP7_20_19, SSI_SDATA1_B, SEL_SSI1_1), +	PINMUX_IPSR_DATA(IP7_23_21, DU1_DG0), +	PINMUX_IPSR_DATA(IP7_23_21, LCDOUT8), +	PINMUX_IPSR_MODSEL_DATA(IP7_23_21, VI1_DATA2_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_23_21, TX1_B, SEL_SCIF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_23_21, SCIFA1_TXD_B, SEL_SCIFA1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_23_21, MSIOF2_SS1_B, SEL_SOF2_1), +	PINMUX_IPSR_DATA(IP7_26_24, DU1_DG1), +	PINMUX_IPSR_DATA(IP7_26_24, LCDOUT9), +	PINMUX_IPSR_MODSEL_DATA(IP7_26_24, VI1_DATA3_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_26_24, RX1_B, SEL_SCIF1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_26_24, SCIFA1_RXD_B, SEL_SCIFA1_1), +	PINMUX_IPSR_MODSEL_DATA(IP7_26_24, MSIOF2_SS2_B, SEL_SOF2_1), +	PINMUX_IPSR_DATA(IP7_29_27, DU1_DG2), +	PINMUX_IPSR_DATA(IP7_29_27, LCDOUT10), +	PINMUX_IPSR_MODSEL_DATA(IP7_29_27, VI1_DATA4_B, SEL_VI1_1), +	PINMUX_IPSR_DATA(IP7_29_27, SCIF1_SCK_B), +	PINMUX_IPSR_MODSEL_DATA(IP7_29_27, SCIFA1_SCK, SEL_SCIFA1_0), +	PINMUX_IPSR_MODSEL_DATA(IP7_29_27, SSI_SCK78_B, SEL_SSI7_1), + +	/* IPSR8 */ +	PINMUX_IPSR_DATA(IP8_2_0, DU1_DG3), +	PINMUX_IPSR_DATA(IP8_2_0, LCDOUT11), +	PINMUX_IPSR_MODSEL_DATA(IP8_2_0, VI1_DATA5_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_2_0, SSI_WS78_B, SEL_SSI7_1), +	PINMUX_IPSR_DATA(IP8_5_3, DU1_DG4), +	PINMUX_IPSR_DATA(IP8_5_3, LCDOUT12), +	PINMUX_IPSR_MODSEL_DATA(IP8_5_3, VI1_DATA6_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_5_3, HRX0_B, SEL_HSCIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_5_3, SCIFB2_RXD_B, SEL_SCIFB2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_5_3, SSI_SDATA7_B, SEL_SSI7_1), +	PINMUX_IPSR_DATA(IP8_8_6, DU1_DG5), +	PINMUX_IPSR_DATA(IP8_8_6, LCDOUT13), +	PINMUX_IPSR_MODSEL_DATA(IP8_8_6, VI1_DATA7_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_8_6, HCTS0_N_B, SEL_HSCIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_8_6, SCIFB2_TXD_B, SEL_SCIFB2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_8_6, SSI_SDATA8_B, SEL_SSI8_1), +	PINMUX_IPSR_DATA(IP8_11_9, DU1_DG6), +	PINMUX_IPSR_DATA(IP8_11_9, LCDOUT14), +	PINMUX_IPSR_MODSEL_DATA(IP8_11_9, HRTS0_N_B, SEL_HSCIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_11_9, SCIFB2_CTS_N_B, SEL_SCIFB2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_11_9, SSI_SCK9_B, SEL_SSI9_1), +	PINMUX_IPSR_DATA(IP8_14_12, DU1_DG7), +	PINMUX_IPSR_DATA(IP8_14_12, LCDOUT15), +	PINMUX_IPSR_MODSEL_DATA(IP8_14_12, HTX0_B, SEL_HSCIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_14_12, SCIFB2_RTS_N_B, SEL_SCIFB2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_14_12, SSI_WS9_B, SEL_SSI9_1), +	PINMUX_IPSR_DATA(IP8_17_15, DU1_DB0), +	PINMUX_IPSR_DATA(IP8_17_15, LCDOUT16), +	PINMUX_IPSR_MODSEL_DATA(IP8_17_15, VI1_CLK_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_17_15, TX2_B, SEL_SCIF2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_17_15, SCIFA2_TXD_B, SEL_SCIFA2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_17_15, MSIOF2_TXD_B, SEL_SOF2_1), +	PINMUX_IPSR_DATA(IP8_20_18, DU1_DB1), +	PINMUX_IPSR_DATA(IP8_20_18, LCDOUT17), +	PINMUX_IPSR_MODSEL_DATA(IP8_20_18, VI1_HSYNC_N_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_20_18, RX2_B, SEL_SCIF2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_20_18, SCIFA2_RXD_B, SEL_SCIFA2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_20_18, MSIOF2_RXD_B, SEL_SOF2_1), +	PINMUX_IPSR_DATA(IP8_23_21, DU1_DB2), +	PINMUX_IPSR_DATA(IP8_23_21, LCDOUT18), +	PINMUX_IPSR_MODSEL_DATA(IP8_23_21, VI1_VSYNC_N_B, SEL_VI1_1), +	PINMUX_IPSR_DATA(IP8_23_21, SCIF2_SCK_B), +	PINMUX_IPSR_MODSEL_DATA(IP8_23_21, SCIFA2_SCK, SEL_SCIFA2_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_23_21, SSI_SDATA9_B, SEL_SSI9_1), +	PINMUX_IPSR_DATA(IP8_25_24, DU1_DB3), +	PINMUX_IPSR_DATA(IP8_25_24, LCDOUT19), +	PINMUX_IPSR_MODSEL_DATA(IP8_25_24, VI1_CLKENB_B, SEL_VI1_1), +	PINMUX_IPSR_DATA(IP8_27_26, DU1_DB4), +	PINMUX_IPSR_DATA(IP8_27_26, LCDOUT20), +	PINMUX_IPSR_MODSEL_DATA(IP8_27_26, VI1_FIELD_B, SEL_VI1_1), +	PINMUX_IPSR_MODSEL_DATA(IP8_27_26, CAN1_RX, SEL_CAN1_0), +	PINMUX_IPSR_DATA(IP8_30_28, DU1_DB5), +	PINMUX_IPSR_DATA(IP8_30_28, LCDOUT21), +	PINMUX_IPSR_MODSEL_DATA(IP8_30_28, TX3, SEL_SCIF3_0), +	PINMUX_IPSR_MODSEL_DATA(IP8_30_28, SCIFA3_TXD, SEL_SCIFA3_0), +	PINMUX_IPSR_MODSEL_DATA(IP8_30_28, CAN1_TX, SEL_CAN1_0), + +	/* IPSR9 */ +	PINMUX_IPSR_DATA(IP9_2_0, DU1_DB6), +	PINMUX_IPSR_DATA(IP9_2_0, LCDOUT22), +	PINMUX_IPSR_MODSEL_DATA(IP9_2_0, SCL3_C, SEL_IIC3_2), +	PINMUX_IPSR_MODSEL_DATA(IP9_2_0, RX3, SEL_SCIF3_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_2_0, SCIFA3_RXD, SEL_SCIFA3_0), +	PINMUX_IPSR_DATA(IP9_5_3, DU1_DB7), +	PINMUX_IPSR_DATA(IP9_5_3, LCDOUT23), +	PINMUX_IPSR_MODSEL_DATA(IP9_5_3, SDA3_C, SEL_IIC3_2), +	PINMUX_IPSR_MODSEL_DATA(IP9_5_3, SCIF3_SCK, SEL_SCIF3_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_5_3, SCIFA3_SCK, SEL_SCIFA3_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_6, DU1_DOTCLKIN, SEL_DIS_0), +	PINMUX_IPSR_DATA(IP9_6, QSTVA_QVS), +	PINMUX_IPSR_DATA(IP9_7, DU1_DOTCLKOUT0), +	PINMUX_IPSR_DATA(IP9_7, QCLK), +	PINMUX_IPSR_DATA(IP9_10_8, DU1_DOTCLKOUT1), +	PINMUX_IPSR_DATA(IP9_10_8, QSTVB_QVE), +	PINMUX_IPSR_MODSEL_DATA(IP9_10_8, CAN0_TX, SEL_CAN0_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_10_8, TX3_B, SEL_SCIF3_1), +	PINMUX_IPSR_MODSEL_DATA(IP9_10_8, SCL2_B, SEL_IIC2_1), +	PINMUX_IPSR_DATA(IP9_10_8, PWM4), +	PINMUX_IPSR_DATA(IP9_11, DU1_EXHSYNC_DU1_HSYNC), +	PINMUX_IPSR_DATA(IP9_11, QSTH_QHS), +	PINMUX_IPSR_DATA(IP9_12, DU1_EXVSYNC_DU1_VSYNC), +	PINMUX_IPSR_DATA(IP9_12, QSTB_QHE), +	PINMUX_IPSR_DATA(IP9_15_13, DU1_EXODDF_DU1_ODDF_DISP_CDE), +	PINMUX_IPSR_DATA(IP9_15_13, QCPV_QDE), +	PINMUX_IPSR_MODSEL_DATA(IP9_15_13, CAN0_RX, SEL_CAN0_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_15_13, RX3_B, SEL_SCIF3_1), +	PINMUX_IPSR_MODSEL_DATA(IP9_15_13, SDA2_B, SEL_IIC2_1), +	PINMUX_IPSR_DATA(IP9_16, DU1_DISP), +	PINMUX_IPSR_DATA(IP9_16, QPOLA), +	PINMUX_IPSR_DATA(IP9_18_17, DU1_CDE), +	PINMUX_IPSR_DATA(IP9_18_17, QPOLB), +	PINMUX_IPSR_DATA(IP9_18_17, PWM4_B), +	PINMUX_IPSR_DATA(IP9_20_19, VI0_CLKENB), +	PINMUX_IPSR_MODSEL_DATA(IP9_20_19, TX4, SEL_SCIF4_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_20_19, SCIFA4_TXD, SEL_SCIFA4_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_20_19, TS_SDATA0_D, SEL_TSIF0_3), +	PINMUX_IPSR_DATA(IP9_22_21, VI0_FIELD), +	PINMUX_IPSR_MODSEL_DATA(IP9_22_21, RX4, SEL_SCIF4_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_22_21, SCIFA4_RXD, SEL_SCIFA4_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_22_21, TS_SCK0_D, SEL_TSIF0_3), +	PINMUX_IPSR_DATA(IP9_24_23, VI0_HSYNC_N), +	PINMUX_IPSR_MODSEL_DATA(IP9_24_23, TX5, SEL_SCIF5_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_24_23, SCIFA5_TXD, SEL_SCIFA5_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_24_23, TS_SDEN0_D, SEL_TSIF0_3), +	PINMUX_IPSR_DATA(IP9_26_25, VI0_VSYNC_N), +	PINMUX_IPSR_MODSEL_DATA(IP9_26_25, RX5, SEL_SCIF5_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_26_25, SCIFA5_RXD, SEL_SCIFA5_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_26_25, TS_SPSYNC0_D, SEL_TSIF0_3), +	PINMUX_IPSR_DATA(IP9_28_27, VI0_DATA3_VI0_B3), +	PINMUX_IPSR_MODSEL_DATA(IP9_28_27, SCIF3_SCK_B, SEL_SCIF3_1), +	PINMUX_IPSR_MODSEL_DATA(IP9_28_27, SCIFA3_SCK_B, SEL_SCIFA3_1), +	PINMUX_IPSR_DATA(IP9_31_29, VI0_G0), +	PINMUX_IPSR_MODSEL_DATA(IP9_31_29, SCL8, SEL_IIC8_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_31_29, STP_IVCXO27_0_C, SEL_SSP_2), +	PINMUX_IPSR_MODSEL_DATA(IP9_31_29, SCL4, SEL_IIC4_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_31_29, HCTS2_N, SEL_HSCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP9_31_29, SCIFB2_CTS_N, SEL_SCIFB2_0), +	PINMUX_IPSR_DATA(IP9_31_29, ATAWR1_N), + +	/* IPSR10 */ +	PINMUX_IPSR_DATA(IP10_2_0, VI0_G1), +	PINMUX_IPSR_MODSEL_DATA(IP10_2_0, SDA8, SEL_IIC8_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_2_0, STP_ISCLK_0_C, SEL_SSP_2), +	PINMUX_IPSR_MODSEL_DATA(IP10_2_0, SDA4, SEL_IIC4_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_2_0, HRTS2_N, SEL_HSCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_2_0, SCIFB2_RTS_N, SEL_SCIFB2_0), +	PINMUX_IPSR_DATA(IP10_2_0, ATADIR1_N), +	PINMUX_IPSR_DATA(IP10_5_3, VI0_G2), +	PINMUX_IPSR_DATA(IP10_5_3, VI2_HSYNC_N), +	PINMUX_IPSR_MODSEL_DATA(IP10_5_3, STP_ISD_0_C, SEL_SSP_2), +	PINMUX_IPSR_MODSEL_DATA(IP10_5_3, SCL3_B, SEL_IIC3_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_5_3, HSCK2, SEL_HSCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_5_3, SCIFB2_SCK, SEL_SCIFB2_0), +	PINMUX_IPSR_DATA(IP10_5_3, ATARD1_N), +	PINMUX_IPSR_DATA(IP10_8_6, VI0_G3), +	PINMUX_IPSR_DATA(IP10_8_6, VI2_VSYNC_N), +	PINMUX_IPSR_MODSEL_DATA(IP10_8_6, STP_ISEN_0_C, SEL_SSP_2), +	PINMUX_IPSR_MODSEL_DATA(IP10_8_6, SDA3_B, SEL_IIC3_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_8_6, HRX2, SEL_HSCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_8_6, SCIFB2_RXD, SEL_SCIFB2_0), +	PINMUX_IPSR_DATA(IP10_8_6, ATACS01_N), +	PINMUX_IPSR_DATA(IP10_11_9, VI0_G4), +	PINMUX_IPSR_DATA(IP10_11_9, VI2_CLKENB), +	PINMUX_IPSR_MODSEL_DATA(IP10_11_9, STP_ISSYNC_0_C, SEL_SSP_2), +	PINMUX_IPSR_MODSEL_DATA(IP10_11_9, HTX2, SEL_HSCIF2_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_11_9, SCIFB2_TXD, SEL_SCIFB2_0), +	PINMUX_IPSR_MODSEL_DATA(IP10_11_9, SCIFB0_SCK_D, SEL_SCIFB_3), +	PINMUX_IPSR_DATA(IP10_14_12, VI0_G5), +	PINMUX_IPSR_DATA(IP10_14_12, VI2_FIELD), +	PINMUX_IPSR_MODSEL_DATA(IP10_14_12, STP_OPWM_0_C, SEL_SSP_2), +	PINMUX_IPSR_MODSEL_DATA(IP10_14_12, FMCLK_D, SEL_FM_3), +	PINMUX_IPSR_MODSEL_DATA(IP10_14_12, CAN0_TX_E, SEL_CAN0_4), +	PINMUX_IPSR_MODSEL_DATA(IP10_14_12, HTX1_D, SEL_HSCIF1_3), +	PINMUX_IPSR_MODSEL_DATA(IP10_14_12, SCIFB0_TXD_D, SEL_SCIFB_3), +	PINMUX_IPSR_DATA(IP10_16_15, VI0_G6), +	PINMUX_IPSR_DATA(IP10_16_15, VI2_CLK), +	PINMUX_IPSR_MODSEL_DATA(IP10_16_15, BPFCLK_D, SEL_FM_3), +	PINMUX_IPSR_DATA(IP10_18_17, VI0_G7), +	PINMUX_IPSR_DATA(IP10_18_17, VI2_DATA0), +	PINMUX_IPSR_MODSEL_DATA(IP10_18_17, FMIN_D, SEL_FM_3), +	PINMUX_IPSR_DATA(IP10_21_19, VI0_R0), +	PINMUX_IPSR_DATA(IP10_21_19, VI2_DATA1), +	PINMUX_IPSR_MODSEL_DATA(IP10_21_19, GLO_I0_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_21_19, TS_SDATA0_C, SEL_TSIF0_2), +	PINMUX_IPSR_DATA(IP10_21_19, ATACS11_N), +	PINMUX_IPSR_DATA(IP10_24_22, VI0_R1), +	PINMUX_IPSR_DATA(IP10_24_22, VI2_DATA2), +	PINMUX_IPSR_MODSEL_DATA(IP10_24_22, GLO_I1_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_24_22, TS_SCK0_C, SEL_TSIF0_2), +	PINMUX_IPSR_DATA(IP10_24_22, ATAG1_N), +	PINMUX_IPSR_DATA(IP10_26_25, VI0_R2), +	PINMUX_IPSR_DATA(IP10_26_25, VI2_DATA3), +	PINMUX_IPSR_MODSEL_DATA(IP10_26_25, GLO_Q0_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_26_25, TS_SDEN0_C, SEL_TSIF0_2), +	PINMUX_IPSR_DATA(IP10_28_27, VI0_R3), +	PINMUX_IPSR_DATA(IP10_28_27, VI2_DATA4), +	PINMUX_IPSR_MODSEL_DATA(IP10_28_27, GLO_Q1_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_28_27, TS_SPSYNC0_C, SEL_TSIF0_2), +	PINMUX_IPSR_DATA(IP10_31_29, VI0_R4), +	PINMUX_IPSR_DATA(IP10_31_29, VI2_DATA5), +	PINMUX_IPSR_MODSEL_DATA(IP10_31_29, GLO_SCLK_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP10_31_29, TX0_C, SEL_SCIF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP10_31_29, SCL1_D, SEL_IIC1_3), + +	/* IPSR11 */ +	PINMUX_IPSR_DATA(IP11_2_0, VI0_R5), +	PINMUX_IPSR_DATA(IP11_2_0, VI2_DATA6), +	PINMUX_IPSR_MODSEL_DATA(IP11_2_0, GLO_SDATA_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_2_0, RX0_C, SEL_SCIF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP11_2_0, SDA1_D, SEL_IIC1_3), +	PINMUX_IPSR_DATA(IP11_5_3, VI0_R6), +	PINMUX_IPSR_DATA(IP11_5_3, VI2_DATA7), +	PINMUX_IPSR_MODSEL_DATA(IP11_5_3, GLO_SS_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_5_3, TX1_C, SEL_SCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP11_5_3, SCL4_B, SEL_IIC4_1), +	PINMUX_IPSR_DATA(IP11_8_6, VI0_R7), +	PINMUX_IPSR_MODSEL_DATA(IP11_8_6, GLO_RFON_B, SEL_GPS_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_8_6, RX1_C, SEL_SCIF1_2), +	PINMUX_IPSR_MODSEL_DATA(IP11_8_6, CAN0_RX_E, SEL_CAN0_4), +	PINMUX_IPSR_MODSEL_DATA(IP11_8_6, SDA4_B, SEL_IIC4_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_8_6, HRX1_D, SEL_HSCIF1_3), +	PINMUX_IPSR_MODSEL_DATA(IP11_8_6, SCIFB0_RXD_D, SEL_SCIFB_3), +	PINMUX_IPSR_MODSEL_DATA(IP11_11_9, VI1_HSYNC_N, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_11_9, AVB_RXD0), +	PINMUX_IPSR_MODSEL_DATA(IP11_11_9, TS_SDATA0_B, SEL_TSIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_11_9, TX4_B, SEL_SCIF4_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_11_9, SCIFA4_TXD_B, SEL_SCIFA4_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_14_12, VI1_VSYNC_N, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_14_12, AVB_RXD1), +	PINMUX_IPSR_MODSEL_DATA(IP11_14_12, TS_SCK0_B, SEL_TSIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_14_12, RX4_B, SEL_SCIF4_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_14_12, SCIFA4_RXD_B, SEL_SCIFA4_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_16_15, VI1_CLKENB, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_16_15, AVB_RXD2), +	PINMUX_IPSR_MODSEL_DATA(IP11_16_15, TS_SDEN0_B, SEL_TSIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_18_17, VI1_FIELD, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_18_17, AVB_RXD3), +	PINMUX_IPSR_MODSEL_DATA(IP11_18_17, TS_SPSYNC0_B, SEL_TSIF0_1), +	PINMUX_IPSR_MODSEL_DATA(IP11_19, VI1_CLK, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_19, AVB_RXD4), +	PINMUX_IPSR_MODSEL_DATA(IP11_20, VI1_DATA0, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_20, AVB_RXD5), +	PINMUX_IPSR_MODSEL_DATA(IP11_21, VI1_DATA1, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_21, AVB_RXD6), +	PINMUX_IPSR_MODSEL_DATA(IP11_22, VI1_DATA2, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_22, AVB_RXD7), +	PINMUX_IPSR_MODSEL_DATA(IP11_23, VI1_DATA3, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_23, AVB_RX_ER), +	PINMUX_IPSR_MODSEL_DATA(IP11_24, VI1_DATA4, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_24, AVB_MDIO), +	PINMUX_IPSR_MODSEL_DATA(IP11_25, VI1_DATA5, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_25, AVB_RX_DV), +	PINMUX_IPSR_MODSEL_DATA(IP11_26, VI1_DATA6, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_26, AVB_MAGIC), +	PINMUX_IPSR_MODSEL_DATA(IP11_27, VI1_DATA7, SEL_VI1_0), +	PINMUX_IPSR_DATA(IP11_27, AVB_MDC), +	PINMUX_IPSR_DATA(IP11_29_28, ETH_MDIO), +	PINMUX_IPSR_DATA(IP11_29_28, AVB_RX_CLK), +	PINMUX_IPSR_MODSEL_DATA(IP11_29_28, SCL2_C, SEL_IIC2_2), +	PINMUX_IPSR_DATA(IP11_31_30, ETH_CRS_DV), +	PINMUX_IPSR_DATA(IP11_31_30, AVB_LINK), +	PINMUX_IPSR_MODSEL_DATA(IP11_31_30, SDA2_C, SEL_IIC2_2), + +	/* IPSR12 */ +	PINMUX_IPSR_DATA(IP12_1_0, ETH_RX_ER), +	PINMUX_IPSR_DATA(IP12_1_0, AVB_CRS), +	PINMUX_IPSR_MODSEL_DATA(IP12_1_0, SCL3, SEL_IIC3_0), +	PINMUX_IPSR_MODSEL_DATA(IP12_1_0, SCL7, SEL_IIC7_0), +	PINMUX_IPSR_DATA(IP12_3_2, ETH_RXD0), +	PINMUX_IPSR_DATA(IP12_3_2, AVB_PHY_INT), +	PINMUX_IPSR_MODSEL_DATA(IP12_3_2, SDA3, SEL_IIC3_0), +	PINMUX_IPSR_MODSEL_DATA(IP12_3_2, SDA7, SEL_IIC7_0), +	PINMUX_IPSR_DATA(IP12_6_4, ETH_RXD1), +	PINMUX_IPSR_DATA(IP12_6_4, AVB_GTXREFCLK), +	PINMUX_IPSR_MODSEL_DATA(IP12_6_4, CAN0_TX_C, SEL_CAN0_2), +	PINMUX_IPSR_MODSEL_DATA(IP12_6_4, SCL2_D, SEL_IIC2_3), +	PINMUX_IPSR_MODSEL_DATA(IP12_6_4, MSIOF1_RXD_E, SEL_SOF1_4), +	PINMUX_IPSR_DATA(IP12_9_7, ETH_LINK), +	PINMUX_IPSR_DATA(IP12_9_7, AVB_TXD0), +	PINMUX_IPSR_MODSEL_DATA(IP12_9_7, CAN0_RX_C, SEL_CAN0_2), +	PINMUX_IPSR_MODSEL_DATA(IP12_9_7, SDA2_D, SEL_IIC2_3), +	PINMUX_IPSR_MODSEL_DATA(IP12_9_7, MSIOF1_SCK_E, SEL_SOF1_4), +	PINMUX_IPSR_DATA(IP12_12_10, ETH_REFCLK), +	PINMUX_IPSR_DATA(IP12_12_10, AVB_TXD1), +	PINMUX_IPSR_MODSEL_DATA(IP12_12_10, SCIFA3_RXD_B, SEL_SCIFA3_1), +	PINMUX_IPSR_MODSEL_DATA(IP12_12_10, CAN1_RX_C, SEL_CAN1_2), +	PINMUX_IPSR_MODSEL_DATA(IP12_12_10, MSIOF1_SYNC_E, SEL_SOF1_4), +	PINMUX_IPSR_DATA(IP12_15_13, ETH_TXD1), +	PINMUX_IPSR_DATA(IP12_15_13, AVB_TXD2), +	PINMUX_IPSR_MODSEL_DATA(IP12_15_13, SCIFA3_TXD_B, SEL_SCIFA3_1), +	PINMUX_IPSR_MODSEL_DATA(IP12_15_13, CAN1_TX_C, SEL_CAN1_2), +	PINMUX_IPSR_MODSEL_DATA(IP12_15_13, MSIOF1_TXD_E, SEL_SOF1_4), +	PINMUX_IPSR_DATA(IP12_17_16, ETH_TX_EN), +	PINMUX_IPSR_DATA(IP12_17_16, AVB_TXD3), +	PINMUX_IPSR_MODSEL_DATA(IP12_17_16, TCLK1_B, SEL_TMU1_0), +	PINMUX_IPSR_MODSEL_DATA(IP12_17_16, CAN_CLK_B, SEL_CANCLK_1), +	PINMUX_IPSR_DATA(IP12_19_18, ETH_MAGIC), +	PINMUX_IPSR_DATA(IP12_19_18, AVB_TXD4), +	PINMUX_IPSR_MODSEL_DATA(IP12_19_18, IETX_C, SEL_IEB_2), +	PINMUX_IPSR_DATA(IP12_21_20, ETH_TXD0), +	PINMUX_IPSR_DATA(IP12_21_20, AVB_TXD5), +	PINMUX_IPSR_MODSEL_DATA(IP12_21_20, IECLK_C, SEL_IEB_2), +	PINMUX_IPSR_DATA(IP12_23_22, ETH_MDC), +	PINMUX_IPSR_DATA(IP12_23_22, AVB_TXD6), +	PINMUX_IPSR_MODSEL_DATA(IP12_23_22, IERX_C, SEL_IEB_2), +	PINMUX_IPSR_MODSEL_DATA(IP12_26_24, STP_IVCXO27_0, SEL_SSP_0), +	PINMUX_IPSR_DATA(IP12_26_24, AVB_TXD7), +	PINMUX_IPSR_MODSEL_DATA(IP12_26_24, SCIFB2_TXD_D, SEL_SCIFB2_3), +	PINMUX_IPSR_MODSEL_DATA(IP12_26_24, ADIDATA_B, SEL_RAD_1), +	PINMUX_IPSR_MODSEL_DATA(IP12_26_24, MSIOF0_SYNC_C, SEL_SOF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP12_29_27, STP_ISCLK_0, SEL_SSP_0), +	PINMUX_IPSR_DATA(IP12_29_27, AVB_TX_EN), +	PINMUX_IPSR_MODSEL_DATA(IP12_29_27, SCIFB2_RXD_D, SEL_SCIFB2_3), +	PINMUX_IPSR_MODSEL_DATA(IP12_29_27, ADICS_SAMP_B, SEL_RAD_1), +	PINMUX_IPSR_MODSEL_DATA(IP12_29_27, MSIOF0_SCK_C, SEL_SOF0_2), + +	/* IPSR13 */ +	PINMUX_IPSR_MODSEL_DATA(IP13_2_0, STP_ISD_0, SEL_SSP_0), +	PINMUX_IPSR_DATA(IP13_2_0, AVB_TX_ER), +	PINMUX_IPSR_MODSEL_DATA(IP13_2_0, SCIFB2_SCK_C, SEL_SCIFB2_2), +	PINMUX_IPSR_MODSEL_DATA(IP13_2_0, ADICLK_B, SEL_RAD_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_2_0, MSIOF0_SS1_C, SEL_SOF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP13_4_3, STP_ISEN_0, SEL_SSP_0), +	PINMUX_IPSR_DATA(IP13_4_3, AVB_TX_CLK), +	PINMUX_IPSR_MODSEL_DATA(IP13_4_3, ADICHS0_B, SEL_RAD_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_4_3, MSIOF0_SS2_C, SEL_SOF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP13_6_5, STP_ISSYNC_0, SEL_SSP_0), +	PINMUX_IPSR_DATA(IP13_6_5, AVB_COL), +	PINMUX_IPSR_MODSEL_DATA(IP13_6_5, ADICHS1_B, SEL_RAD_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_6_5, MSIOF0_RXD_C, SEL_SOF0_2), +	PINMUX_IPSR_MODSEL_DATA(IP13_9_7, STP_OPWM_0, SEL_SSP_0), +	PINMUX_IPSR_DATA(IP13_9_7, AVB_GTX_CLK), +	PINMUX_IPSR_DATA(IP13_9_7, PWM0_B), +	PINMUX_IPSR_MODSEL_DATA(IP13_9_7, ADICHS2_B, SEL_RAD_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_9_7, MSIOF0_TXD_C, SEL_SOF0_2), +	PINMUX_IPSR_DATA(IP13_10, SD0_CLK), +	PINMUX_IPSR_MODSEL_DATA(IP13_10, SPCLK_B, SEL_QSP_1), +	PINMUX_IPSR_DATA(IP13_11, SD0_CMD), +	PINMUX_IPSR_MODSEL_DATA(IP13_11, MOSI_IO0_B, SEL_QSP_1), +	PINMUX_IPSR_DATA(IP13_12, SD0_DATA0), +	PINMUX_IPSR_MODSEL_DATA(IP13_12, MISO_IO1_B, SEL_QSP_1), +	PINMUX_IPSR_DATA(IP13_13, SD0_DATA1), +	PINMUX_IPSR_MODSEL_DATA(IP13_13, IO2_B, SEL_QSP_1), +	PINMUX_IPSR_DATA(IP13_14, SD0_DATA2), +	PINMUX_IPSR_MODSEL_DATA(IP13_14, IO3_B, SEL_QSP_1), +	PINMUX_IPSR_DATA(IP13_15, SD0_DATA3), +	PINMUX_IPSR_MODSEL_DATA(IP13_15, SSL_B, SEL_QSP_1), +	PINMUX_IPSR_DATA(IP13_18_16, SD0_CD), +	PINMUX_IPSR_MODSEL_DATA(IP13_18_16, MMC_D6_B, SEL_MMC_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_18_16, SIM0_RST_B, SEL_SIM_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_18_16, CAN0_RX_F, SEL_CAN0_5), +	PINMUX_IPSR_MODSEL_DATA(IP13_18_16, SCIFA5_TXD_B, SEL_SCIFA5_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_18_16, TX3_C, SEL_SCIF3_2), +	PINMUX_IPSR_DATA(IP13_21_19, SD0_WP), +	PINMUX_IPSR_MODSEL_DATA(IP13_21_19, MMC_D7_B, SEL_MMC_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_21_19, SIM0_D_B, SEL_SIM_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_21_19, CAN0_TX_F, SEL_CAN0_5), +	PINMUX_IPSR_MODSEL_DATA(IP13_21_19, SCIFA5_RXD_B, SEL_SCIFA5_1), +	PINMUX_IPSR_MODSEL_DATA(IP13_21_19, RX3_C, SEL_SCIF3_2), +	PINMUX_IPSR_DATA(IP13_22, SD1_CMD), +	PINMUX_IPSR_MODSEL_DATA(IP13_22, REMOCON_B, SEL_RCN_1), +	PINMUX_IPSR_DATA(IP13_24_23, SD1_DATA0), +	PINMUX_IPSR_MODSEL_DATA(IP13_24_23, SPEEDIN_B, SEL_RSP_1), +	PINMUX_IPSR_DATA(IP13_25, SD1_DATA1), +	PINMUX_IPSR_MODSEL_DATA(IP13_25, IETX_B, SEL_IEB_1), +	PINMUX_IPSR_DATA(IP13_26, SD1_DATA2), +	PINMUX_IPSR_MODSEL_DATA(IP13_26, IECLK_B, SEL_IEB_1), +	PINMUX_IPSR_DATA(IP13_27, SD1_DATA3), +	PINMUX_IPSR_MODSEL_DATA(IP13_27, IERX_B, SEL_IEB_1), +	PINMUX_IPSR_DATA(IP13_30_28, SD1_CD), +	PINMUX_IPSR_DATA(IP13_30_28, PWM0), +	PINMUX_IPSR_DATA(IP13_30_28, TPU_TO0), +	PINMUX_IPSR_MODSEL_DATA(IP13_30_28, SCL1_C, SEL_IIC1_2), + +	/* IPSR14 */ +	PINMUX_IPSR_DATA(IP14_1_0, SD1_WP), +	PINMUX_IPSR_DATA(IP14_1_0, PWM1_B), +	PINMUX_IPSR_MODSEL_DATA(IP14_1_0, SDA1_C, SEL_IIC1_2), +	PINMUX_IPSR_DATA(IP14_2, SD2_CLK), +	PINMUX_IPSR_DATA(IP14_2, MMC_CLK), +	PINMUX_IPSR_DATA(IP14_3, SD2_CMD), +	PINMUX_IPSR_DATA(IP14_3, MMC_CMD), +	PINMUX_IPSR_DATA(IP14_4, SD2_DATA0), +	PINMUX_IPSR_DATA(IP14_4, MMC_D0), +	PINMUX_IPSR_DATA(IP14_5, SD2_DATA1), +	PINMUX_IPSR_DATA(IP14_5, MMC_D1), +	PINMUX_IPSR_DATA(IP14_6, SD2_DATA2), +	PINMUX_IPSR_DATA(IP14_6, MMC_D2), +	PINMUX_IPSR_DATA(IP14_7, SD2_DATA3), +	PINMUX_IPSR_DATA(IP14_7, MMC_D3), +	PINMUX_IPSR_DATA(IP14_10_8, SD2_CD), +	PINMUX_IPSR_DATA(IP14_10_8, MMC_D4), +	PINMUX_IPSR_MODSEL_DATA(IP14_10_8, SCL8_C, SEL_IIC8_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_10_8, TX5_B, SEL_SCIF5_1), +	PINMUX_IPSR_MODSEL_DATA(IP14_10_8, SCIFA5_TXD_C, SEL_SCIFA5_2), +	PINMUX_IPSR_DATA(IP14_13_11, SD2_WP), +	PINMUX_IPSR_DATA(IP14_13_11, MMC_D5), +	PINMUX_IPSR_MODSEL_DATA(IP14_13_11, SDA8_C, SEL_IIC8_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_13_11, RX5_B, SEL_SCIF5_1), +	PINMUX_IPSR_MODSEL_DATA(IP14_13_11, SCIFA5_RXD_C, SEL_SCIFA5_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_16_14, MSIOF0_SCK, SEL_SOF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_16_14, RX2_C, SEL_SCIF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_16_14, ADIDATA, SEL_RAD_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_16_14, VI1_CLK_C, SEL_VI1_2), +	PINMUX_IPSR_DATA(IP14_16_14, VI1_G0_B), +	PINMUX_IPSR_MODSEL_DATA(IP14_19_17, MSIOF0_SYNC, SEL_SOF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_19_17, TX2_C, SEL_SCIF2_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_19_17, ADICS_SAMP, SEL_RAD_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_19_17, VI1_CLKENB_C, SEL_VI1_2), +	PINMUX_IPSR_DATA(IP14_19_17, VI1_G1_B), +	PINMUX_IPSR_MODSEL_DATA(IP14_22_20, MSIOF0_TXD, SEL_SOF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_22_20, ADICLK, SEL_RAD_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_22_20, VI1_FIELD_C, SEL_VI1_2), +	PINMUX_IPSR_DATA(IP14_22_20, VI1_G2_B), +	PINMUX_IPSR_MODSEL_DATA(IP14_25_23, MSIOF0_RXD, SEL_SOF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_25_23, ADICHS0, SEL_RAD_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_25_23, VI1_DATA0_C, SEL_VI1_2), +	PINMUX_IPSR_DATA(IP14_25_23, VI1_G3_B), +	PINMUX_IPSR_MODSEL_DATA(IP14_28_26, MSIOF0_SS1, SEL_SOF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_28_26, MMC_D6, SEL_MMC_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_28_26, ADICHS1, SEL_RAD_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_28_26, TX0_E, SEL_SCIF0_4), +	PINMUX_IPSR_MODSEL_DATA(IP14_28_26, VI1_HSYNC_N_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_28_26, SCL7_C, SEL_IIC7_2), +	PINMUX_IPSR_DATA(IP14_28_26, VI1_G4_B), +	PINMUX_IPSR_MODSEL_DATA(IP14_31_29, MSIOF0_SS2, SEL_SOF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_31_29, MMC_D7, SEL_MMC_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_31_29, ADICHS2, SEL_RAD_0), +	PINMUX_IPSR_MODSEL_DATA(IP14_31_29, RX0_E, SEL_SCIF0_4), +	PINMUX_IPSR_MODSEL_DATA(IP14_31_29, VI1_VSYNC_N_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP14_31_29, SDA7_C, SEL_IIC7_2), +	PINMUX_IPSR_DATA(IP14_31_29, VI1_G5_B), + +	/* IPSR15 */ +	PINMUX_IPSR_MODSEL_DATA(IP15_1_0, SIM0_RST, SEL_SIM_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_1_0, IETX, SEL_IEB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_1_0, CAN1_TX_D, SEL_CAN1_3), +	PINMUX_IPSR_DATA(IP15_3_2, SIM0_CLK), +	PINMUX_IPSR_MODSEL_DATA(IP15_3_2, IECLK, SEL_IEB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_3_2, CAN_CLK_C, SEL_CANCLK_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_5_4, SIM0_D, SEL_SIM_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_5_4, IERX, SEL_IEB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_5_4, CAN1_RX_D, SEL_CAN1_3), +	PINMUX_IPSR_MODSEL_DATA(IP15_8_6, GPS_CLK, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_8_6, DU1_DOTCLKIN_C, SEL_DIS_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_8_6, AUDIO_CLKB_B, SEL_ADG_1), +	PINMUX_IPSR_DATA(IP15_8_6, PWM5_B), +	PINMUX_IPSR_MODSEL_DATA(IP15_8_6, SCIFA3_TXD_C, SEL_SCIFA3_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_11_9, GPS_SIGN, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_11_9, TX4_C, SEL_SCIF4_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_11_9, SCIFA4_TXD_C, SEL_SCIFA4_2), +	PINMUX_IPSR_DATA(IP15_11_9, PWM5), +	PINMUX_IPSR_DATA(IP15_11_9, VI1_G6_B), +	PINMUX_IPSR_MODSEL_DATA(IP15_11_9, SCIFA3_RXD_C, SEL_SCIFA3_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_14_12, GPS_MAG, SEL_GPS_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_14_12, RX4_C, SEL_SCIF4_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_14_12, SCIFA4_RXD_C, SEL_SCIFA4_2), +	PINMUX_IPSR_DATA(IP15_14_12, PWM6), +	PINMUX_IPSR_DATA(IP15_14_12, VI1_G7_B), +	PINMUX_IPSR_MODSEL_DATA(IP15_14_12, SCIFA3_SCK_C, SEL_SCIFA3_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_17_15, HCTS0_N, SEL_HSCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_17_15, SCIFB0_CTS_N, SEL_SCIFB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_17_15, GLO_I0_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_17_15, TCLK1, SEL_TMU1_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_17_15, VI1_DATA1_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_20_18, HRTS0_N, SEL_HSCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_20_18, SCIFB0_RTS_N, SEL_SCIFB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_20_18, GLO_I1_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_20_18, VI1_DATA2_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_23_21, HSCK0, SEL_HSCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_23_21, SCIFB0_SCK, SEL_SCIFB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_23_21, GLO_Q0_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_23_21, CAN_CLK, SEL_CANCLK_0), +	PINMUX_IPSR_DATA(IP15_23_21, TCLK2), +	PINMUX_IPSR_MODSEL_DATA(IP15_23_21, VI1_DATA3_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_26_24, HRX0, SEL_HSCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_26_24, SCIFB0_RXD, SEL_SCIFB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_26_24, GLO_Q1_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_26_24, CAN0_RX_B, SEL_CAN0_1), +	PINMUX_IPSR_MODSEL_DATA(IP15_26_24, VI1_DATA4_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_29_27, HTX0, SEL_HSCIF0_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_29_27, SCIFB0_TXD, SEL_SCIFB_0), +	PINMUX_IPSR_MODSEL_DATA(IP15_29_27, GLO_SCLK_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP15_29_27, CAN0_TX_B, SEL_CAN0_1), +	PINMUX_IPSR_MODSEL_DATA(IP15_29_27, VI1_DATA5_C, SEL_VI1_2), + +	/* IPSR16 */ +	PINMUX_IPSR_MODSEL_DATA(IP16_2_0, HRX1, SEL_HSCIF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP16_2_0, SCIFB1_RXD, SEL_SCIFB1_0), +	PINMUX_IPSR_DATA(IP16_2_0, VI1_R0_B), +	PINMUX_IPSR_MODSEL_DATA(IP16_2_0, GLO_SDATA_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP16_2_0, VI1_DATA6_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP16_5_3, HTX1, SEL_HSCIF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP16_5_3, SCIFB1_TXD, SEL_SCIFB1_0), +	PINMUX_IPSR_DATA(IP16_5_3, VI1_R1_B), +	PINMUX_IPSR_MODSEL_DATA(IP16_5_3, GLO_SS_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP16_5_3, VI1_DATA7_C, SEL_VI1_2), +	PINMUX_IPSR_MODSEL_DATA(IP16_7_6, HSCK1, SEL_HSCIF1_0), +	PINMUX_IPSR_MODSEL_DATA(IP16_7_6, SCIFB1_SCK, SEL_SCIFB1_0), +	PINMUX_IPSR_DATA(IP16_7_6, MLB_CK), +	PINMUX_IPSR_MODSEL_DATA(IP16_7_6, GLO_RFON_C, SEL_GPS_2), +	PINMUX_IPSR_MODSEL_DATA(IP16_9_8, HCTS1_N, SEL_HSCIF1_0), +	PINMUX_IPSR_DATA(IP16_9_8, SCIFB1_CTS_N), +	PINMUX_IPSR_DATA(IP16_9_8, MLB_SIG), +	PINMUX_IPSR_MODSEL_DATA(IP16_9_8, CAN1_TX_B, SEL_CAN1_1), +	PINMUX_IPSR_MODSEL_DATA(IP16_11_10, HRTS1_N, SEL_HSCIF1_0), +	PINMUX_IPSR_DATA(IP16_11_10, SCIFB1_RTS_N), +	PINMUX_IPSR_DATA(IP16_11_10, MLB_DAT), +	PINMUX_IPSR_MODSEL_DATA(IP16_11_10, CAN1_RX_B, SEL_CAN1_1), +}; + +static const struct sh_pfc_pin pinmux_pins[] = { +	PINMUX_GPIO_GP_ALL(), +}; + +/* - Audio Clock ------------------------------------------------------------ */ +static const unsigned int audio_clk_a_pins[] = { +	/* CLK */ +	RCAR_GP_PIN(2, 28), +}; + +static const unsigned int audio_clk_a_mux[] = { +	AUDIO_CLKA_MARK, +}; + +static const unsigned int audio_clk_b_pins[] = { +	/* CLK */ +	RCAR_GP_PIN(2, 29), +}; + +static const unsigned int audio_clk_b_mux[] = { +	AUDIO_CLKB_MARK, +}; + +static const unsigned int audio_clk_b_b_pins[] = { +	/* CLK */ +	RCAR_GP_PIN(7, 20), +}; + +static const unsigned int audio_clk_b_b_mux[] = { +	AUDIO_CLKB_B_MARK, +}; + +static const unsigned int audio_clk_c_pins[] = { +	/* CLK */ +	RCAR_GP_PIN(2, 30), +}; + +static const unsigned int audio_clk_c_mux[] = { +	AUDIO_CLKC_MARK, +}; + +static const unsigned int audio_clkout_pins[] = { +	/* CLK */ +	RCAR_GP_PIN(2, 31), +}; + +static const unsigned int audio_clkout_mux[] = { +	AUDIO_CLKOUT_MARK, +}; + + +/* - DU --------------------------------------------------------------------- */ +static const unsigned int du_rgb666_pins[] = { +	/* R[7:2], G[7:2], B[7:2] */ +	RCAR_GP_PIN(3, 7),  RCAR_GP_PIN(3, 6),  RCAR_GP_PIN(3, 5), +	RCAR_GP_PIN(3, 4),  RCAR_GP_PIN(3, 3),  RCAR_GP_PIN(3, 2), +	RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 13), +	RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 11), RCAR_GP_PIN(3, 10), +	RCAR_GP_PIN(3, 23), RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), +	RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 19), RCAR_GP_PIN(3, 18), +}; +static const unsigned int du_rgb666_mux[] = { +	DU1_DR7_MARK, DU1_DR6_MARK, DU1_DR5_MARK, DU1_DR4_MARK, +	DU1_DR3_MARK, DU1_DR2_MARK, +	DU1_DG7_MARK, DU1_DG6_MARK, DU1_DG5_MARK, DU1_DG4_MARK, +	DU1_DG3_MARK, DU1_DG2_MARK, +	DU1_DB7_MARK, DU1_DB6_MARK, DU1_DB5_MARK, DU1_DB4_MARK, +	DU1_DB3_MARK, DU1_DB2_MARK, +}; +static const unsigned int du_rgb888_pins[] = { +	/* R[7:0], G[7:0], B[7:0] */ +	RCAR_GP_PIN(3, 7),  RCAR_GP_PIN(3, 6),  RCAR_GP_PIN(3, 5), +	RCAR_GP_PIN(3, 4),  RCAR_GP_PIN(3, 3),  RCAR_GP_PIN(3, 2), +	RCAR_GP_PIN(3, 1),  RCAR_GP_PIN(3, 0), +	RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 13), +	RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 11), RCAR_GP_PIN(3, 10), +	RCAR_GP_PIN(3, 9),  RCAR_GP_PIN(3, 8), +	RCAR_GP_PIN(3, 23), RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), +	RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 19), RCAR_GP_PIN(3, 18), +	RCAR_GP_PIN(3, 17), RCAR_GP_PIN(3, 16), +}; +static const unsigned int du_rgb888_mux[] = { +	DU1_DR7_MARK, DU1_DR6_MARK, DU1_DR5_MARK, DU1_DR4_MARK, +	DU1_DR3_MARK, DU1_DR2_MARK, DU1_DR1_MARK, DU1_DR0_MARK, +	DU1_DG7_MARK, DU1_DG6_MARK, DU1_DG5_MARK, DU1_DG4_MARK, +	DU1_DG3_MARK, DU1_DG2_MARK, DU1_DG1_MARK, DU1_DG0_MARK, +	DU1_DB7_MARK, DU1_DB6_MARK, DU1_DB5_MARK, DU1_DB4_MARK, +	DU1_DB3_MARK, DU1_DB2_MARK, DU1_DB1_MARK, DU1_DB0_MARK, +}; +static const unsigned int du_clk_out_0_pins[] = { +	/* CLKOUT */ +	RCAR_GP_PIN(3, 25), +}; +static const unsigned int du_clk_out_0_mux[] = { +	DU1_DOTCLKOUT0_MARK +}; +static const unsigned int du_clk_out_1_pins[] = { +	/* CLKOUT */ +	RCAR_GP_PIN(3, 26), +}; +static const unsigned int du_clk_out_1_mux[] = { +	DU1_DOTCLKOUT1_MARK +}; +static const unsigned int du_sync_pins[] = { +	/* EXVSYNC/VSYNC, EXHSYNC/HSYNC */ +	RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 27), +}; +static const unsigned int du_sync_mux[] = { +	DU1_EXVSYNC_DU1_VSYNC_MARK, DU1_EXHSYNC_DU1_HSYNC_MARK +}; +static const unsigned int du_oddf_pins[] = { +	/* EXDISP/EXODDF/EXCDE */ +	RCAR_GP_PIN(3, 29), +}; +static const unsigned int du_oddf_mux[] = { +	DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK, +}; +static const unsigned int du_cde_pins[] = { +	/* CDE */ +	RCAR_GP_PIN(3, 31), +}; +static const unsigned int du_cde_mux[] = { +	DU1_CDE_MARK, +}; +static const unsigned int du_disp_pins[] = { +	/* DISP */ +	RCAR_GP_PIN(3, 30), +}; +static const unsigned int du_disp_mux[] = { +	DU1_DISP_MARK, +}; +static const unsigned int du0_clk_in_pins[] = { +	/* CLKIN */ +	RCAR_GP_PIN(6, 31), +}; +static const unsigned int du0_clk_in_mux[] = { +	DU0_DOTCLKIN_MARK +}; +static const unsigned int du1_clk_in_pins[] = { +	/* CLKIN */ +	RCAR_GP_PIN(3, 24), +}; +static const unsigned int du1_clk_in_mux[] = { +	DU1_DOTCLKIN_MARK +}; +static const unsigned int du1_clk_in_b_pins[] = { +	/* CLKIN */ +	RCAR_GP_PIN(7, 19), +}; +static const unsigned int du1_clk_in_b_mux[] = { +	DU1_DOTCLKIN_B_MARK, +}; +static const unsigned int du1_clk_in_c_pins[] = { +	/* CLKIN */ +	RCAR_GP_PIN(7, 20), +}; +static const unsigned int du1_clk_in_c_mux[] = { +	DU1_DOTCLKIN_C_MARK, +}; +/* - ETH -------------------------------------------------------------------- */ +static const unsigned int eth_link_pins[] = { +	/* LINK */ +	RCAR_GP_PIN(5, 18), +}; +static const unsigned int eth_link_mux[] = { +	ETH_LINK_MARK, +}; +static const unsigned int eth_magic_pins[] = { +	/* MAGIC */ +	RCAR_GP_PIN(5, 22), +}; +static const unsigned int eth_magic_mux[] = { +	ETH_MAGIC_MARK, +}; +static const unsigned int eth_mdio_pins[] = { +	/* MDC, MDIO */ +	RCAR_GP_PIN(5, 24), RCAR_GP_PIN(5, 13), +}; +static const unsigned int eth_mdio_mux[] = { +	ETH_MDC_MARK, ETH_MDIO_MARK, +}; +static const unsigned int eth_rmii_pins[] = { +	/* RXD[0:1], RX_ER, CRS_DV, TXD[0:1], TX_EN, REF_CLK */ +	RCAR_GP_PIN(5, 16), RCAR_GP_PIN(5, 17), RCAR_GP_PIN(5, 15), +	RCAR_GP_PIN(5, 14), RCAR_GP_PIN(5, 23), RCAR_GP_PIN(5, 20), +	RCAR_GP_PIN(5, 21), RCAR_GP_PIN(5, 19), +}; +static const unsigned int eth_rmii_mux[] = { +	ETH_RXD0_MARK, ETH_RXD1_MARK, ETH_RX_ER_MARK, ETH_CRS_DV_MARK, +	ETH_TXD0_MARK, ETH_TXD1_MARK, ETH_TX_EN_MARK, ETH_REFCLK_MARK, +}; +/* - I2C0 ------------------------------------------------------------------- */ +static const unsigned int i2c0_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 25), +}; +static const unsigned int i2c0_mux[] = { +	SCL0_MARK, SDA0_MARK, +}; +static const unsigned int i2c0_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 3), +}; +static const unsigned int i2c0_b_mux[] = { +	SCL0_B_MARK, SDA0_B_MARK, +}; +static const unsigned int i2c0_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(0, 16), RCAR_GP_PIN(1, 1), +}; +static const unsigned int i2c0_c_mux[] = { +	SCL0_C_MARK, SDA0_C_MARK, +}; +/* - I2C1 ------------------------------------------------------------------- */ +static const unsigned int i2c1_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 11), +}; +static const unsigned int i2c1_mux[] = { +	SCL1_MARK, SDA1_MARK, +}; +static const unsigned int i2c1_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5), +}; +static const unsigned int i2c1_b_mux[] = { +	SCL1_B_MARK, SDA1_B_MARK, +}; +static const unsigned int i2c1_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(6, 14), RCAR_GP_PIN(6, 15), +}; +static const unsigned int i2c1_c_mux[] = { +	SCL1_C_MARK, SDA1_C_MARK, +}; +static const unsigned int i2c1_d_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 25), RCAR_GP_PIN(4, 26), +}; +static const unsigned int i2c1_d_mux[] = { +	SCL1_D_MARK, SDA1_D_MARK, +}; +static const unsigned int i2c1_e_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(7, 15), RCAR_GP_PIN(7, 16), +}; +static const unsigned int i2c1_e_mux[] = { +	SCL1_E_MARK, SDA1_E_MARK, +}; +/* - I2C2 ------------------------------------------------------------------- */ +static const unsigned int i2c2_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7), +}; +static const unsigned int i2c2_mux[] = { +	SCL2_MARK, SDA2_MARK, +}; +static const unsigned int i2c2_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 29), +}; +static const unsigned int i2c2_b_mux[] = { +	SCL2_B_MARK, SDA2_B_MARK, +}; +static const unsigned int i2c2_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(5, 13), RCAR_GP_PIN(5, 14), +}; +static const unsigned int i2c2_c_mux[] = { +	SCL2_C_MARK, SDA2_C_MARK, +}; +static const unsigned int i2c2_d_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(5, 17), RCAR_GP_PIN(5, 18), +}; +static const unsigned int i2c2_d_mux[] = { +	SCL2_D_MARK, SDA2_D_MARK, +}; +/* - I2C3 ------------------------------------------------------------------- */ +static const unsigned int i2c3_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(5, 15), RCAR_GP_PIN(5, 16), +}; +static const unsigned int i2c3_mux[] = { +	SCL3_MARK, SDA3_MARK, +}; +static const unsigned int i2c3_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 15), RCAR_GP_PIN(4, 16), +}; +static const unsigned int i2c3_b_mux[] = { +	SCL3_B_MARK, SDA3_B_MARK, +}; +static const unsigned int i2c3_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 23), +}; +static const unsigned int i2c3_c_mux[] = { +	SCL3_C_MARK, SDA3_C_MARK, +}; +static const unsigned int i2c3_d_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(0, 27), RCAR_GP_PIN(0, 28), +}; +static const unsigned int i2c3_d_mux[] = { +	SCL3_D_MARK, SDA3_D_MARK, +}; +/* - I2C4 ------------------------------------------------------------------- */ +static const unsigned int i2c4_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 13), RCAR_GP_PIN(4, 14), +}; +static const unsigned int i2c4_mux[] = { +	SCL4_MARK, SDA4_MARK, +}; +static const unsigned int i2c4_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 27), RCAR_GP_PIN(4, 28), +}; +static const unsigned int i2c4_b_mux[] = { +	SCL4_B_MARK, SDA4_B_MARK, +}; +static const unsigned int i2c4_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(7, 13), RCAR_GP_PIN(7, 14), +}; +static const unsigned int i2c4_c_mux[] = { +	SCL4_C_MARK, SDA4_C_MARK, +}; +/* - I2C7 ------------------------------------------------------------------- */ +static const unsigned int i2c7_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(5, 15), RCAR_GP_PIN(5, 16), +}; +static const unsigned int i2c7_mux[] = { +	SCL7_MARK, SDA7_MARK, +}; +static const unsigned int i2c7_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 2), RCAR_GP_PIN(2, 3), +}; +static const unsigned int i2c7_b_mux[] = { +	SCL7_B_MARK, SDA7_B_MARK, +}; +static const unsigned int i2c7_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29), +}; +static const unsigned int i2c7_c_mux[] = { +	SCL7_C_MARK, SDA7_C_MARK, +}; +/* - I2C8 ------------------------------------------------------------------- */ +static const unsigned int i2c8_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(4, 13), RCAR_GP_PIN(4, 14), +}; +static const unsigned int i2c8_mux[] = { +	SCL8_MARK, SDA8_MARK, +}; +static const unsigned int i2c8_b_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5), +}; +static const unsigned int i2c8_b_mux[] = { +	SCL8_B_MARK, SDA8_B_MARK, +}; +static const unsigned int i2c8_c_pins[] = { +	/* SCL, SDA */ +	RCAR_GP_PIN(6, 22), RCAR_GP_PIN(6, 23), +}; +static const unsigned int i2c8_c_mux[] = { +	SCL8_C_MARK, SDA8_C_MARK, +}; +/* - INTC ------------------------------------------------------------------- */ +static const unsigned int intc_irq0_pins[] = { +	/* IRQ */ +	RCAR_GP_PIN(7, 10), +}; +static const unsigned int intc_irq0_mux[] = { +	IRQ0_MARK, +}; +static const unsigned int intc_irq1_pins[] = { +	/* IRQ */ +	RCAR_GP_PIN(7, 11), +}; +static const unsigned int intc_irq1_mux[] = { +	IRQ1_MARK, +}; +static const unsigned int intc_irq2_pins[] = { +	/* IRQ */ +	RCAR_GP_PIN(7, 12), +}; +static const unsigned int intc_irq2_mux[] = { +	IRQ2_MARK, +}; +static const unsigned int intc_irq3_pins[] = { +	/* IRQ */ +	RCAR_GP_PIN(7, 13), +}; +static const unsigned int intc_irq3_mux[] = { +	IRQ3_MARK, +}; +/* - MMCIF ------------------------------------------------------------------ */ +static const unsigned int mmc_data1_pins[] = { +	/* D[0] */ +	RCAR_GP_PIN(6, 18), +}; +static const unsigned int mmc_data1_mux[] = { +	MMC_D0_MARK, +}; +static const unsigned int mmc_data4_pins[] = { +	/* D[0:3] */ +	RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19), +	RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 21), +}; +static const unsigned int mmc_data4_mux[] = { +	MMC_D0_MARK, MMC_D1_MARK, MMC_D2_MARK, MMC_D3_MARK, +}; +static const unsigned int mmc_data8_pins[] = { +	/* D[0:7] */ +	RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19), +	RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 21), +	RCAR_GP_PIN(6, 22), RCAR_GP_PIN(6, 23), +	RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29), +}; +static const unsigned int mmc_data8_mux[] = { +	MMC_D0_MARK, MMC_D1_MARK, MMC_D2_MARK, MMC_D3_MARK, +	MMC_D4_MARK, MMC_D5_MARK, MMC_D6_MARK, MMC_D7_MARK, +}; +static const unsigned int mmc_ctrl_pins[] = { +	/* CLK, CMD */ +	RCAR_GP_PIN(6, 16), RCAR_GP_PIN(6, 17), +}; +static const unsigned int mmc_ctrl_mux[] = { +	MMC_CLK_MARK, MMC_CMD_MARK, +}; +/* - MSIOF0 ----------------------------------------------------------------- */ +static const unsigned int msiof0_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(6, 24), +}; +static const unsigned int msiof0_clk_mux[] = { +	MSIOF0_SCK_MARK, +}; +static const unsigned int msiof0_sync_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(6, 25), +}; +static const unsigned int msiof0_sync_mux[] = { +	MSIOF0_SYNC_MARK, +}; +static const unsigned int msiof0_ss1_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(6, 28), +}; +static const unsigned int msiof0_ss1_mux[] = { +	MSIOF0_SS1_MARK, +}; +static const unsigned int msiof0_ss2_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(6, 29), +}; +static const unsigned int msiof0_ss2_mux[] = { +	MSIOF0_SS2_MARK, +}; +static const unsigned int msiof0_rx_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(6, 27), +}; +static const unsigned int msiof0_rx_mux[] = { +	MSIOF0_RXD_MARK, +}; +static const unsigned int msiof0_tx_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(6, 26), +}; +static const unsigned int msiof0_tx_mux[] = { +	MSIOF0_TXD_MARK, +}; + +static const unsigned int msiof0_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(0, 16), +}; +static const unsigned int msiof0_clk_b_mux[] = { +	MSIOF0_SCK_B_MARK, +}; +static const unsigned int msiof0_sync_b_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(0, 17), +}; +static const unsigned int msiof0_sync_b_mux[] = { +	MSIOF0_SYNC_B_MARK, +}; +static const unsigned int msiof0_ss1_b_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(0, 18), +}; +static const unsigned int msiof0_ss1_b_mux[] = { +	MSIOF0_SS1_B_MARK, +}; +static const unsigned int msiof0_ss2_b_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(0, 19), +}; +static const unsigned int msiof0_ss2_b_mux[] = { +	MSIOF0_SS2_B_MARK, +}; +static const unsigned int msiof0_rx_b_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(0, 21), +}; +static const unsigned int msiof0_rx_b_mux[] = { +	MSIOF0_RXD_B_MARK, +}; +static const unsigned int msiof0_tx_b_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(0, 20), +}; +static const unsigned int msiof0_tx_b_mux[] = { +	MSIOF0_TXD_B_MARK, +}; + +static const unsigned int msiof0_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(5, 26), +}; +static const unsigned int msiof0_clk_c_mux[] = { +	MSIOF0_SCK_C_MARK, +}; +static const unsigned int msiof0_sync_c_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(5, 25), +}; +static const unsigned int msiof0_sync_c_mux[] = { +	MSIOF0_SYNC_C_MARK, +}; +static const unsigned int msiof0_ss1_c_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(5, 27), +}; +static const unsigned int msiof0_ss1_c_mux[] = { +	MSIOF0_SS1_C_MARK, +}; +static const unsigned int msiof0_ss2_c_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(5, 28), +}; +static const unsigned int msiof0_ss2_c_mux[] = { +	MSIOF0_SS2_C_MARK, +}; +static const unsigned int msiof0_rx_c_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(5, 29), +}; +static const unsigned int msiof0_rx_c_mux[] = { +	MSIOF0_RXD_C_MARK, +}; +static const unsigned int msiof0_tx_c_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(5, 30), +}; +static const unsigned int msiof0_tx_c_mux[] = { +	MSIOF0_TXD_C_MARK, +}; +/* - MSIOF1 ----------------------------------------------------------------- */ +static const unsigned int msiof1_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(0, 22), +}; +static const unsigned int msiof1_clk_mux[] = { +	MSIOF1_SCK_MARK, +}; +static const unsigned int msiof1_sync_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(0, 23), +}; +static const unsigned int msiof1_sync_mux[] = { +	MSIOF1_SYNC_MARK, +}; +static const unsigned int msiof1_ss1_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(0, 24), +}; +static const unsigned int msiof1_ss1_mux[] = { +	MSIOF1_SS1_MARK, +}; +static const unsigned int msiof1_ss2_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(0, 25), +}; +static const unsigned int msiof1_ss2_mux[] = { +	MSIOF1_SS2_MARK, +}; +static const unsigned int msiof1_rx_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(0, 27), +}; +static const unsigned int msiof1_rx_mux[] = { +	MSIOF1_RXD_MARK, +}; +static const unsigned int msiof1_tx_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(0, 26), +}; +static const unsigned int msiof1_tx_mux[] = { +	MSIOF1_TXD_MARK, +}; + +static const unsigned int msiof1_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(2, 29), +}; +static const unsigned int msiof1_clk_b_mux[] = { +	MSIOF1_SCK_B_MARK, +}; +static const unsigned int msiof1_sync_b_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(2, 30), +}; +static const unsigned int msiof1_sync_b_mux[] = { +	MSIOF1_SYNC_B_MARK, +}; +static const unsigned int msiof1_ss1_b_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(2, 31), +}; +static const unsigned int msiof1_ss1_b_mux[] = { +	MSIOF1_SS1_B_MARK, +}; +static const unsigned int msiof1_ss2_b_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(7, 16), +}; +static const unsigned int msiof1_ss2_b_mux[] = { +	MSIOF1_SS2_B_MARK, +}; +static const unsigned int msiof1_rx_b_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(7, 18), +}; +static const unsigned int msiof1_rx_b_mux[] = { +	MSIOF1_RXD_B_MARK, +}; +static const unsigned int msiof1_tx_b_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(7, 17), +}; +static const unsigned int msiof1_tx_b_mux[] = { +	MSIOF1_TXD_B_MARK, +}; + +static const unsigned int msiof1_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(2, 15), +}; +static const unsigned int msiof1_clk_c_mux[] = { +	MSIOF1_SCK_C_MARK, +}; +static const unsigned int msiof1_sync_c_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(2, 16), +}; +static const unsigned int msiof1_sync_c_mux[] = { +	MSIOF1_SYNC_C_MARK, +}; +static const unsigned int msiof1_rx_c_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(2, 18), +}; +static const unsigned int msiof1_rx_c_mux[] = { +	MSIOF1_RXD_C_MARK, +}; +static const unsigned int msiof1_tx_c_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(2, 17), +}; +static const unsigned int msiof1_tx_c_mux[] = { +	MSIOF1_TXD_C_MARK, +}; + +static const unsigned int msiof1_clk_d_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(0, 28), +}; +static const unsigned int msiof1_clk_d_mux[] = { +	MSIOF1_SCK_D_MARK, +}; +static const unsigned int msiof1_sync_d_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(0, 30), +}; +static const unsigned int msiof1_sync_d_mux[] = { +	MSIOF1_SYNC_D_MARK, +}; +static const unsigned int msiof1_ss1_d_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(0, 29), +}; +static const unsigned int msiof1_ss1_d_mux[] = { +	MSIOF1_SS1_D_MARK, +}; +static const unsigned int msiof1_rx_d_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(0, 27), +}; +static const unsigned int msiof1_rx_d_mux[] = { +	MSIOF1_RXD_D_MARK, +}; +static const unsigned int msiof1_tx_d_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(0, 26), +}; +static const unsigned int msiof1_tx_d_mux[] = { +	MSIOF1_TXD_D_MARK, +}; + +static const unsigned int msiof1_clk_e_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(5, 18), +}; +static const unsigned int msiof1_clk_e_mux[] = { +	MSIOF1_SCK_E_MARK, +}; +static const unsigned int msiof1_sync_e_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(5, 19), +}; +static const unsigned int msiof1_sync_e_mux[] = { +	MSIOF1_SYNC_E_MARK, +}; +static const unsigned int msiof1_rx_e_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(5, 17), +}; +static const unsigned int msiof1_rx_e_mux[] = { +	MSIOF1_RXD_E_MARK, +}; +static const unsigned int msiof1_tx_e_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(5, 20), +}; +static const unsigned int msiof1_tx_e_mux[] = { +	MSIOF1_TXD_E_MARK, +}; +/* - MSIOF2 ----------------------------------------------------------------- */ +static const unsigned int msiof2_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(1, 13), +}; +static const unsigned int msiof2_clk_mux[] = { +	MSIOF2_SCK_MARK, +}; +static const unsigned int msiof2_sync_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(1, 14), +}; +static const unsigned int msiof2_sync_mux[] = { +	MSIOF2_SYNC_MARK, +}; +static const unsigned int msiof2_ss1_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(1, 17), +}; +static const unsigned int msiof2_ss1_mux[] = { +	MSIOF2_SS1_MARK, +}; +static const unsigned int msiof2_ss2_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(1, 18), +}; +static const unsigned int msiof2_ss2_mux[] = { +	MSIOF2_SS2_MARK, +}; +static const unsigned int msiof2_rx_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(1, 16), +}; +static const unsigned int msiof2_rx_mux[] = { +	MSIOF2_RXD_MARK, +}; +static const unsigned int msiof2_tx_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(1, 15), +}; +static const unsigned int msiof2_tx_mux[] = { +	MSIOF2_TXD_MARK, +}; + +static const unsigned int msiof2_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 0), +}; +static const unsigned int msiof2_clk_b_mux[] = { +	MSIOF2_SCK_B_MARK, +}; +static const unsigned int msiof2_sync_b_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(3, 1), +}; +static const unsigned int msiof2_sync_b_mux[] = { +	MSIOF2_SYNC_B_MARK, +}; +static const unsigned int msiof2_ss1_b_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(3, 8), +}; +static const unsigned int msiof2_ss1_b_mux[] = { +	MSIOF2_SS1_B_MARK, +}; +static const unsigned int msiof2_ss2_b_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(3, 9), +}; +static const unsigned int msiof2_ss2_b_mux[] = { +	MSIOF2_SS2_B_MARK, +}; +static const unsigned int msiof2_rx_b_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(3, 17), +}; +static const unsigned int msiof2_rx_b_mux[] = { +	MSIOF2_RXD_B_MARK, +}; +static const unsigned int msiof2_tx_b_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(3, 16), +}; +static const unsigned int msiof2_tx_b_mux[] = { +	MSIOF2_TXD_B_MARK, +}; + +static const unsigned int msiof2_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(2, 2), +}; +static const unsigned int msiof2_clk_c_mux[] = { +	MSIOF2_SCK_C_MARK, +}; +static const unsigned int msiof2_sync_c_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(2, 3), +}; +static const unsigned int msiof2_sync_c_mux[] = { +	MSIOF2_SYNC_C_MARK, +}; +static const unsigned int msiof2_rx_c_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(2, 5), +}; +static const unsigned int msiof2_rx_c_mux[] = { +	MSIOF2_RXD_C_MARK, +}; +static const unsigned int msiof2_tx_c_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(2, 4), +}; +static const unsigned int msiof2_tx_c_mux[] = { +	MSIOF2_TXD_C_MARK, +}; + +static const unsigned int msiof2_clk_d_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(2, 14), +}; +static const unsigned int msiof2_clk_d_mux[] = { +	MSIOF2_SCK_D_MARK, +}; +static const unsigned int msiof2_sync_d_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(2, 15), +}; +static const unsigned int msiof2_sync_d_mux[] = { +	MSIOF2_SYNC_D_MARK, +}; +static const unsigned int msiof2_ss1_d_pins[] = { +	/* SS1 */ +	RCAR_GP_PIN(2, 17), +}; +static const unsigned int msiof2_ss1_d_mux[] = { +	MSIOF2_SS1_D_MARK, +}; +static const unsigned int msiof2_ss2_d_pins[] = { +	/* SS2 */ +	RCAR_GP_PIN(2, 19), +}; +static const unsigned int msiof2_ss2_d_mux[] = { +	MSIOF2_SS2_D_MARK, +}; +static const unsigned int msiof2_rx_d_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(2, 18), +}; +static const unsigned int msiof2_rx_d_mux[] = { +	MSIOF2_RXD_D_MARK, +}; +static const unsigned int msiof2_tx_d_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(2, 16), +}; +static const unsigned int msiof2_tx_d_mux[] = { +	MSIOF2_TXD_D_MARK, +}; + +static const unsigned int msiof2_clk_e_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(7, 15), +}; +static const unsigned int msiof2_clk_e_mux[] = { +	MSIOF2_SCK_E_MARK, +}; +static const unsigned int msiof2_sync_e_pins[] = { +	/* SYNC */ +	RCAR_GP_PIN(7, 16), +}; +static const unsigned int msiof2_sync_e_mux[] = { +	MSIOF2_SYNC_E_MARK, +}; +static const unsigned int msiof2_rx_e_pins[] = { +	/* RXD */ +	RCAR_GP_PIN(7, 14), +}; +static const unsigned int msiof2_rx_e_mux[] = { +	MSIOF2_RXD_E_MARK, +}; +static const unsigned int msiof2_tx_e_pins[] = { +	/* TXD */ +	RCAR_GP_PIN(7, 13), +}; +static const unsigned int msiof2_tx_e_mux[] = { +	MSIOF2_TXD_E_MARK, +}; +/* - QSPI ------------------------------------------------------------------- */ +static const unsigned int qspi_ctrl_pins[] = { +	/* SPCLK, SSL */ +	RCAR_GP_PIN(1, 4), RCAR_GP_PIN(1, 9), +}; +static const unsigned int qspi_ctrl_mux[] = { +	SPCLK_MARK, SSL_MARK, +}; +static const unsigned int qspi_data2_pins[] = { +	/* MOSI_IO0, MISO_IO1 */ +	RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6), +}; +static const unsigned int qspi_data2_mux[] = { +	MOSI_IO0_MARK, MISO_IO1_MARK, +}; +static const unsigned int qspi_data4_pins[] = { +	/* MOSI_IO0, MISO_IO1, IO2, IO3 */ +	RCAR_GP_PIN(1, 5), RCAR_GP_PIN(1, 6), RCAR_GP_PIN(1, 7), +	RCAR_GP_PIN(1, 8), +}; +static const unsigned int qspi_data4_mux[] = { +	MOSI_IO0_MARK, MISO_IO1_MARK, IO2_MARK, IO3_MARK, +}; + +static const unsigned int qspi_ctrl_b_pins[] = { +	/* SPCLK, SSL */ +	RCAR_GP_PIN(6, 0), RCAR_GP_PIN(6, 5), +}; +static const unsigned int qspi_ctrl_b_mux[] = { +	SPCLK_B_MARK, SSL_B_MARK, +}; +static const unsigned int qspi_data2_b_pins[] = { +	/* MOSI_IO0, MISO_IO1 */ +	RCAR_GP_PIN(6, 1), RCAR_GP_PIN(6, 2), +}; +static const unsigned int qspi_data2_b_mux[] = { +	MOSI_IO0_B_MARK, MISO_IO1_B_MARK, +}; +static const unsigned int qspi_data4_b_pins[] = { +	/* MOSI_IO0, MISO_IO1, IO2, IO3 */ +	RCAR_GP_PIN(6, 1), RCAR_GP_PIN(6, 2), RCAR_GP_PIN(6, 3), +	RCAR_GP_PIN(6, 4), +}; +static const unsigned int qspi_data4_b_mux[] = { +	SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK, +	IO2_B_MARK, IO3_B_MARK, SSL_B_MARK, +}; +/* - SCIF0 ------------------------------------------------------------------ */ +static const unsigned int scif0_data_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6), +}; +static const unsigned int scif0_data_mux[] = { +	RX0_MARK, TX0_MARK, +}; +static const unsigned int scif0_data_b_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 0), +}; +static const unsigned int scif0_data_b_mux[] = { +	RX0_B_MARK, TX0_B_MARK, +}; +static const unsigned int scif0_data_c_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(4, 26), RCAR_GP_PIN(4, 25), +}; +static const unsigned int scif0_data_c_mux[] = { +	RX0_C_MARK, TX0_C_MARK, +}; +static const unsigned int scif0_data_d_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(2, 23), RCAR_GP_PIN(2, 22), +}; +static const unsigned int scif0_data_d_mux[] = { +	RX0_D_MARK, TX0_D_MARK, +}; +static const unsigned int scif0_data_e_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(6, 29), RCAR_GP_PIN(6, 28), +}; +static const unsigned int scif0_data_e_mux[] = { +	RX0_E_MARK, TX0_E_MARK, +}; +/* - SCIF1 ------------------------------------------------------------------ */ +static const unsigned int scif1_data_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 8), +}; +static const unsigned int scif1_data_mux[] = { +	RX1_MARK, TX1_MARK, +}; +static const unsigned int scif1_data_b_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(3, 9), RCAR_GP_PIN(3, 8), +}; +static const unsigned int scif1_data_b_mux[] = { +	RX1_B_MARK, TX1_B_MARK, +}; +static const unsigned int scif1_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 10), +}; +static const unsigned int scif1_clk_b_mux[] = { +	SCIF1_SCK_B_MARK, +}; +static const unsigned int scif1_data_c_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 27), +}; +static const unsigned int scif1_data_c_mux[] = { +	RX1_C_MARK, TX1_C_MARK, +}; +static const unsigned int scif1_data_d_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(2, 25), RCAR_GP_PIN(2, 24), +}; +static const unsigned int scif1_data_d_mux[] = { +	RX1_D_MARK, TX1_D_MARK, +}; +/* - SCIF2 ------------------------------------------------------------------ */ +static const unsigned int scif2_data_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(2, 30), RCAR_GP_PIN(2, 31), +}; +static const unsigned int scif2_data_mux[] = { +	RX2_MARK, TX2_MARK, +}; +static const unsigned int scif2_data_b_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(3, 17), RCAR_GP_PIN(3, 16), +}; +static const unsigned int scif2_data_b_mux[] = { +	RX2_B_MARK, TX2_B_MARK, +}; +static const unsigned int scif2_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 18), +}; +static const unsigned int scif2_clk_b_mux[] = { +	SCIF2_SCK_B_MARK, +}; +static const unsigned int scif2_data_c_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(6, 24), RCAR_GP_PIN(6, 25), +}; +static const unsigned int scif2_data_c_mux[] = { +	RX2_C_MARK, TX2_C_MARK, +}; +static const unsigned int scif2_data_e_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8), +}; +static const unsigned int scif2_data_e_mux[] = { +	RX2_E_MARK, TX2_E_MARK, +}; +/* - SCIF3 ------------------------------------------------------------------ */ +static const unsigned int scif3_data_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), +}; +static const unsigned int scif3_data_mux[] = { +	RX3_MARK, TX3_MARK, +}; +static const unsigned int scif3_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 23), +}; +static const unsigned int scif3_clk_mux[] = { +	SCIF3_SCK_MARK, +}; +static const unsigned int scif3_data_b_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(3, 29), RCAR_GP_PIN(3, 26), +}; +static const unsigned int scif3_data_b_mux[] = { +	RX3_B_MARK, TX3_B_MARK, +}; +static const unsigned int scif3_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(4, 8), +}; +static const unsigned int scif3_clk_b_mux[] = { +	SCIF3_SCK_B_MARK, +}; +static const unsigned int scif3_data_c_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(6, 7), RCAR_GP_PIN(6, 6), +}; +static const unsigned int scif3_data_c_mux[] = { +	RX3_C_MARK, TX3_C_MARK, +}; +static const unsigned int scif3_data_d_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(2, 27), RCAR_GP_PIN(2, 26), +}; +static const unsigned int scif3_data_d_mux[] = { +	RX3_D_MARK, TX3_D_MARK, +}; +/* - SCIF4 ------------------------------------------------------------------ */ +static const unsigned int scif4_data_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(4, 2), RCAR_GP_PIN(4, 1), +}; +static const unsigned int scif4_data_mux[] = { +	RX4_MARK, TX4_MARK, +}; +static const unsigned int scif4_data_b_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 0), +}; +static const unsigned int scif4_data_b_mux[] = { +	RX4_B_MARK, TX4_B_MARK, +}; +static const unsigned int scif4_data_c_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(7, 22), RCAR_GP_PIN(7, 21), +}; +static const unsigned int scif4_data_c_mux[] = { +	RX4_C_MARK, TX4_C_MARK, +}; +/* - SCIF5 ------------------------------------------------------------------ */ +static const unsigned int scif5_data_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(4, 4), RCAR_GP_PIN(4, 3), +}; +static const unsigned int scif5_data_mux[] = { +	RX5_MARK, TX5_MARK, +}; +static const unsigned int scif5_data_b_pins[] = { +	/* RX, TX */ +	RCAR_GP_PIN(6, 23), RCAR_GP_PIN(6, 22), +}; +static const unsigned int scif5_data_b_mux[] = { +	RX5_B_MARK, TX5_B_MARK, +}; +/* - SCIFA0 ----------------------------------------------------------------- */ +static const unsigned int scifa0_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6), +}; +static const unsigned int scifa0_data_mux[] = { +	SCIFA0_RXD_MARK, SCIFA0_TXD_MARK, +}; +static const unsigned int scifa0_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 0), +}; +static const unsigned int scifa0_data_b_mux[] = { +	SCIFA0_RXD_B_MARK, SCIFA0_TXD_B_MARK +}; +/* - SCIFA1 ----------------------------------------------------------------- */ +static const unsigned int scifa1_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 8), +}; +static const unsigned int scifa1_data_mux[] = { +	SCIFA1_RXD_MARK, SCIFA1_TXD_MARK, +}; +static const unsigned int scifa1_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 10), +}; +static const unsigned int scifa1_clk_mux[] = { +	SCIFA1_SCK_MARK, +}; +static const unsigned int scifa1_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(3, 9), RCAR_GP_PIN(3, 8), +}; +static const unsigned int scifa1_data_b_mux[] = { +	SCIFA1_RXD_B_MARK, SCIFA1_TXD_B_MARK, +}; +static const unsigned int scifa1_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(1, 0), +}; +static const unsigned int scifa1_clk_b_mux[] = { +	SCIFA1_SCK_B_MARK, +}; +static const unsigned int scifa1_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3), +}; +static const unsigned int scifa1_data_c_mux[] = { +	SCIFA1_RXD_C_MARK, SCIFA1_TXD_C_MARK, +}; +/* - SCIFA2 ----------------------------------------------------------------- */ +static const unsigned int scifa2_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(2, 30), RCAR_GP_PIN(2, 31), +}; +static const unsigned int scifa2_data_mux[] = { +	SCIFA2_RXD_MARK, SCIFA2_TXD_MARK, +}; +static const unsigned int scifa2_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 18), +}; +static const unsigned int scifa2_clk_mux[] = { +	SCIFA2_SCK_MARK, +}; +static const unsigned int scifa2_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(3, 17), RCAR_GP_PIN(3, 16), +}; +static const unsigned int scifa2_data_b_mux[] = { +	SCIFA2_RXD_B_MARK, SCIFA2_TXD_B_MARK, +}; +/* - SCIFA3 ----------------------------------------------------------------- */ +static const unsigned int scifa3_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), +}; +static const unsigned int scifa3_data_mux[] = { +	SCIFA3_RXD_MARK, SCIFA3_TXD_MARK, +}; +static const unsigned int scifa3_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(3, 23), +}; +static const unsigned int scifa3_clk_mux[] = { +	SCIFA3_SCK_MARK, +}; +static const unsigned int scifa3_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(5, 19), RCAR_GP_PIN(5, 20), +}; +static const unsigned int scifa3_data_b_mux[] = { +	SCIFA3_RXD_B_MARK, SCIFA3_TXD_B_MARK, +}; +static const unsigned int scifa3_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(4, 8), +}; +static const unsigned int scifa3_clk_b_mux[] = { +	SCIFA3_SCK_B_MARK, +}; +static const unsigned int scifa3_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(7, 21), RCAR_GP_PIN(7, 20), +}; +static const unsigned int scifa3_data_c_mux[] = { +	SCIFA3_RXD_C_MARK, SCIFA3_TXD_C_MARK, +}; +static const unsigned int scifa3_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(7, 22), +}; +static const unsigned int scifa3_clk_c_mux[] = { +	SCIFA3_SCK_C_MARK, +}; +/* - SCIFA4 ----------------------------------------------------------------- */ +static const unsigned int scifa4_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(4, 2), RCAR_GP_PIN(4, 1), +}; +static const unsigned int scifa4_data_mux[] = { +	SCIFA4_RXD_MARK, SCIFA4_TXD_MARK, +}; +static const unsigned int scifa4_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 0), +}; +static const unsigned int scifa4_data_b_mux[] = { +	SCIFA4_RXD_B_MARK, SCIFA4_TXD_B_MARK, +}; +static const unsigned int scifa4_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(7, 22), RCAR_GP_PIN(7, 21), +}; +static const unsigned int scifa4_data_c_mux[] = { +	SCIFA4_RXD_C_MARK, SCIFA4_TXD_C_MARK, +}; +/* - SCIFA5 ----------------------------------------------------------------- */ +static const unsigned int scifa5_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(4, 4), RCAR_GP_PIN(4, 3), +}; +static const unsigned int scifa5_data_mux[] = { +	SCIFA5_RXD_MARK, SCIFA5_TXD_MARK, +}; +static const unsigned int scifa5_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(6, 7), RCAR_GP_PIN(6, 6), +}; +static const unsigned int scifa5_data_b_mux[] = { +	SCIFA5_RXD_B_MARK, SCIFA5_TXD_B_MARK, +}; +static const unsigned int scifa5_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(6, 23), RCAR_GP_PIN(6, 22), +}; +static const unsigned int scifa5_data_c_mux[] = { +	SCIFA5_RXD_C_MARK, SCIFA5_TXD_C_MARK, +}; +/* - SCIFB0 ----------------------------------------------------------------- */ +static const unsigned int scifb0_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(7, 3), RCAR_GP_PIN(7, 4), +}; +static const unsigned int scifb0_data_mux[] = { +	SCIFB0_RXD_MARK, SCIFB0_TXD_MARK, +}; +static const unsigned int scifb0_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(7, 2), +}; +static const unsigned int scifb0_clk_mux[] = { +	SCIFB0_SCK_MARK, +}; +static const unsigned int scifb0_ctrl_pins[] = { +	/* RTS, CTS */ +	RCAR_GP_PIN(7, 1), RCAR_GP_PIN(7, 0), +}; +static const unsigned int scifb0_ctrl_mux[] = { +	SCIFB0_RTS_N_MARK, SCIFB0_CTS_N_MARK, +}; +static const unsigned int scifb0_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(1, 20), RCAR_GP_PIN(1, 21), +}; +static const unsigned int scifb0_data_b_mux[] = { +	SCIFB0_RXD_B_MARK, SCIFB0_TXD_B_MARK, +}; +static const unsigned int scifb0_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(5, 31), +}; +static const unsigned int scifb0_clk_b_mux[] = { +	SCIFB0_SCK_B_MARK, +}; +static const unsigned int scifb0_ctrl_b_pins[] = { +	/* RTS, CTS */ +	RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 23), +}; +static const unsigned int scifb0_ctrl_b_mux[] = { +	SCIFB0_RTS_N_B_MARK, SCIFB0_CTS_N_B_MARK, +}; +static const unsigned int scifb0_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1), +}; +static const unsigned int scifb0_data_c_mux[] = { +	SCIFB0_RXD_C_MARK, SCIFB0_TXD_C_MARK, +}; +static const unsigned int scifb0_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(2, 30), +}; +static const unsigned int scifb0_clk_c_mux[] = { +	SCIFB0_SCK_C_MARK, +}; +static const unsigned int scifb0_data_d_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 18), +}; +static const unsigned int scifb0_data_d_mux[] = { +	SCIFB0_RXD_D_MARK, SCIFB0_TXD_D_MARK, +}; +static const unsigned int scifb0_clk_d_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(4, 17), +}; +static const unsigned int scifb0_clk_d_mux[] = { +	SCIFB0_SCK_D_MARK, +}; +/* - SCIFB1 ----------------------------------------------------------------- */ +static const unsigned int scifb1_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(7, 5), RCAR_GP_PIN(7, 6), +}; +static const unsigned int scifb1_data_mux[] = { +	SCIFB1_RXD_MARK, SCIFB1_TXD_MARK, +}; +static const unsigned int scifb1_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(7, 7), +}; +static const unsigned int scifb1_clk_mux[] = { +	SCIFB1_SCK_MARK, +}; +static const unsigned int scifb1_ctrl_pins[] = { +	/* RTS, CTS */ +	RCAR_GP_PIN(7, 9), RCAR_GP_PIN(7, 8), +}; +static const unsigned int scifb1_ctrl_mux[] = { +	SCIFB1_RTS_N_MARK, SCIFB1_CTS_N_MARK, +}; +static const unsigned int scifb1_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18), +}; +static const unsigned int scifb1_data_b_mux[] = { +	SCIFB1_RXD_B_MARK, SCIFB1_TXD_B_MARK, +}; +static const unsigned int scifb1_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(1, 3), +}; +static const unsigned int scifb1_clk_b_mux[] = { +	SCIFB1_SCK_B_MARK, +}; +static const unsigned int scifb1_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3), +}; +static const unsigned int scifb1_data_c_mux[] = { +	SCIFB1_RXD_C_MARK, SCIFB1_TXD_C_MARK, +}; +static const unsigned int scifb1_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(7, 11), +}; +static const unsigned int scifb1_clk_c_mux[] = { +	SCIFB1_SCK_C_MARK, +}; +static const unsigned int scifb1_data_d_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(7, 10), RCAR_GP_PIN(7, 12), +}; +static const unsigned int scifb1_data_d_mux[] = { +	SCIFB1_RXD_D_MARK, SCIFB1_TXD_D_MARK, +}; +/* - SCIFB2 ----------------------------------------------------------------- */ +static const unsigned int scifb2_data_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(4, 16), RCAR_GP_PIN(4, 17), +}; +static const unsigned int scifb2_data_mux[] = { +	SCIFB2_RXD_MARK, SCIFB2_TXD_MARK, +}; +static const unsigned int scifb2_clk_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(4, 15), +}; +static const unsigned int scifb2_clk_mux[] = { +	SCIFB2_SCK_MARK, +}; +static const unsigned int scifb2_ctrl_pins[] = { +	/* RTS, CTS */ +	RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 13), +}; +static const unsigned int scifb2_ctrl_mux[] = { +	SCIFB2_RTS_N_MARK, SCIFB2_CTS_N_MARK, +}; +static const unsigned int scifb2_data_b_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13), +}; +static const unsigned int scifb2_data_b_mux[] = { +	SCIFB2_RXD_B_MARK, SCIFB2_TXD_B_MARK, +}; +static const unsigned int scifb2_clk_b_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(5, 31), +}; +static const unsigned int scifb2_clk_b_mux[] = { +	SCIFB2_SCK_B_MARK, +}; +static const unsigned int scifb2_ctrl_b_pins[] = { +	/* RTS, CTS */ +	RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14), +}; +static const unsigned int scifb2_ctrl_b_mux[] = { +	SCIFB2_RTS_N_B_MARK, SCIFB2_CTS_N_B_MARK, +}; +static const unsigned int scifb2_data_c_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1), +}; +static const unsigned int scifb2_data_c_mux[] = { +	SCIFB2_RXD_C_MARK, SCIFB2_TXD_C_MARK, +}; +static const unsigned int scifb2_clk_c_pins[] = { +	/* SCK */ +	RCAR_GP_PIN(5, 27), +}; +static const unsigned int scifb2_clk_c_mux[] = { +	SCIFB2_SCK_C_MARK, +}; +static const unsigned int scifb2_data_d_pins[] = { +	/* RXD, TXD */ +	RCAR_GP_PIN(5, 26), RCAR_GP_PIN(5, 25), +}; +static const unsigned int scifb2_data_d_mux[] = { +	SCIFB2_RXD_D_MARK, SCIFB2_TXD_D_MARK, +}; +/* - SDHI0 ------------------------------------------------------------------ */ +static const unsigned int sdhi0_data1_pins[] = { +	/* D0 */ +	RCAR_GP_PIN(6, 2), +}; +static const unsigned int sdhi0_data1_mux[] = { +	SD0_DATA0_MARK, +}; +static const unsigned int sdhi0_data4_pins[] = { +	/* D[0:3] */ +	RCAR_GP_PIN(6, 2), RCAR_GP_PIN(6, 3), +	RCAR_GP_PIN(6, 4), RCAR_GP_PIN(6, 5), +}; +static const unsigned int sdhi0_data4_mux[] = { +	SD0_DATA0_MARK, SD0_DATA1_MARK, SD0_DATA2_MARK, SD0_DATA3_MARK, +}; +static const unsigned int sdhi0_ctrl_pins[] = { +	/* CLK, CMD */ +	RCAR_GP_PIN(6, 0), RCAR_GP_PIN(6, 1), +}; +static const unsigned int sdhi0_ctrl_mux[] = { +	SD0_CLK_MARK, SD0_CMD_MARK, +}; +static const unsigned int sdhi0_cd_pins[] = { +	/* CD */ +	RCAR_GP_PIN(6, 6), +}; +static const unsigned int sdhi0_cd_mux[] = { +	SD0_CD_MARK, +}; +static const unsigned int sdhi0_wp_pins[] = { +	/* WP */ +	RCAR_GP_PIN(6, 7), +}; +static const unsigned int sdhi0_wp_mux[] = { +	SD0_WP_MARK, +}; +/* - SDHI1 ------------------------------------------------------------------ */ +static const unsigned int sdhi1_data1_pins[] = { +	/* D0 */ +	RCAR_GP_PIN(6, 10), +}; +static const unsigned int sdhi1_data1_mux[] = { +	SD1_DATA0_MARK, +}; +static const unsigned int sdhi1_data4_pins[] = { +	/* D[0:3] */ +	RCAR_GP_PIN(6, 10), RCAR_GP_PIN(6, 11), +	RCAR_GP_PIN(6, 12), RCAR_GP_PIN(6, 13), +}; +static const unsigned int sdhi1_data4_mux[] = { +	SD1_DATA0_MARK, SD1_DATA1_MARK, SD1_DATA2_MARK, SD1_DATA3_MARK, +}; +static const unsigned int sdhi1_ctrl_pins[] = { +	/* CLK, CMD */ +	RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), +}; +static const unsigned int sdhi1_ctrl_mux[] = { +	SD1_CLK_MARK, SD1_CMD_MARK, +}; +static const unsigned int sdhi1_cd_pins[] = { +	/* CD */ +	RCAR_GP_PIN(6, 14), +}; +static const unsigned int sdhi1_cd_mux[] = { +	SD1_CD_MARK, +}; +static const unsigned int sdhi1_wp_pins[] = { +	/* WP */ +	RCAR_GP_PIN(6, 15), +}; +static const unsigned int sdhi1_wp_mux[] = { +	SD1_WP_MARK, +}; +/* - SDHI2 ------------------------------------------------------------------ */ +static const unsigned int sdhi2_data1_pins[] = { +	/* D0 */ +	RCAR_GP_PIN(6, 18), +}; +static const unsigned int sdhi2_data1_mux[] = { +	SD2_DATA0_MARK, +}; +static const unsigned int sdhi2_data4_pins[] = { +	/* D[0:3] */ +	RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19), +	RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 21), +}; +static const unsigned int sdhi2_data4_mux[] = { +	SD2_DATA0_MARK, SD2_DATA1_MARK, SD2_DATA2_MARK, SD2_DATA3_MARK, +}; +static const unsigned int sdhi2_ctrl_pins[] = { +	/* CLK, CMD */ +	RCAR_GP_PIN(6, 16), RCAR_GP_PIN(6, 17), +}; +static const unsigned int sdhi2_ctrl_mux[] = { +	SD2_CLK_MARK, SD2_CMD_MARK, +}; +static const unsigned int sdhi2_cd_pins[] = { +	/* CD */ +	RCAR_GP_PIN(6, 22), +}; +static const unsigned int sdhi2_cd_mux[] = { +	SD2_CD_MARK, +}; +static const unsigned int sdhi2_wp_pins[] = { +	/* WP */ +	RCAR_GP_PIN(6, 23), +}; +static const unsigned int sdhi2_wp_mux[] = { +	SD2_WP_MARK, +}; + +/* - SSI -------------------------------------------------------------------- */ +static const unsigned int ssi0_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 2), +}; + +static const unsigned int ssi0_data_mux[] = { +	SSI_SDATA0_MARK, +}; + +static const unsigned int ssi0_data_b_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(3, 4), +}; + +static const unsigned int ssi0_data_b_mux[] = { +	SSI_SDATA0_B_MARK, +}; + +static const unsigned int ssi0129_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1), +}; + +static const unsigned int ssi0129_ctrl_mux[] = { +	SSI_SCK0129_MARK, SSI_WS0129_MARK, +}; + +static const unsigned int ssi0129_ctrl_b_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3), +}; + +static const unsigned int ssi0129_ctrl_b_mux[] = { +	SSI_SCK0129_B_MARK, SSI_WS0129_B_MARK, +}; + +static const unsigned int ssi1_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 5), +}; + +static const unsigned int ssi1_data_mux[] = { +	SSI_SDATA1_MARK, +}; + +static const unsigned int ssi1_data_b_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(3, 7), +}; + +static const unsigned int ssi1_data_b_mux[] = { +	SSI_SDATA1_B_MARK, +}; + +static const unsigned int ssi1_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 3), RCAR_GP_PIN(2, 4), +}; + +static const unsigned int ssi1_ctrl_mux[] = { +	SSI_SCK1_MARK, SSI_WS1_MARK, +}; + +static const unsigned int ssi1_ctrl_b_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(3, 5), RCAR_GP_PIN(3, 6), +}; + +static const unsigned int ssi1_ctrl_b_mux[] = { +	SSI_SCK1_B_MARK, SSI_WS1_B_MARK, +}; + +static const unsigned int ssi2_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 8), +}; + +static const unsigned int ssi2_data_mux[] = { +	SSI_SDATA2_MARK, +}; + +static const unsigned int ssi2_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 7), +}; + +static const unsigned int ssi2_ctrl_mux[] = { +	SSI_SCK2_MARK, SSI_WS2_MARK, +}; + +static const unsigned int ssi3_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 11), +}; + +static const unsigned int ssi3_data_mux[] = { +	SSI_SDATA3_MARK, +}; + +static const unsigned int ssi34_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 9), RCAR_GP_PIN(2, 10), +}; + +static const unsigned int ssi34_ctrl_mux[] = { +	SSI_SCK34_MARK, SSI_WS34_MARK, +}; + +static const unsigned int ssi4_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 14), +}; + +static const unsigned int ssi4_data_mux[] = { +	SSI_SDATA4_MARK, +}; + +static const unsigned int ssi4_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13), +}; + +static const unsigned int ssi4_ctrl_mux[] = { +	SSI_SCK4_MARK, SSI_WS4_MARK, +}; + +static const unsigned int ssi5_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 17), +}; + +static const unsigned int ssi5_data_mux[] = { +	SSI_SDATA5_MARK, +}; + +static const unsigned int ssi5_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 15), RCAR_GP_PIN(2, 16), +}; + +static const unsigned int ssi5_ctrl_mux[] = { +	SSI_SCK5_MARK, SSI_WS5_MARK, +}; + +static const unsigned int ssi6_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 20), +}; + +static const unsigned int ssi6_data_mux[] = { +	SSI_SDATA6_MARK, +}; + +static const unsigned int ssi6_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 18), RCAR_GP_PIN(2, 19), +}; + +static const unsigned int ssi6_ctrl_mux[] = { +	SSI_SCK6_MARK, SSI_WS6_MARK, +}; + +static const unsigned int ssi7_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 23), +}; + +static const unsigned int ssi7_data_mux[] = { +	SSI_SDATA7_MARK, +}; + +static const unsigned int ssi7_data_b_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(3, 12), +}; + +static const unsigned int ssi7_data_b_mux[] = { +	SSI_SDATA7_B_MARK, +}; + +static const unsigned int ssi78_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 21), RCAR_GP_PIN(2, 22), +}; + +static const unsigned int ssi78_ctrl_mux[] = { +	SSI_SCK78_MARK, SSI_WS78_MARK, +}; + +static const unsigned int ssi78_ctrl_b_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11), +}; + +static const unsigned int ssi78_ctrl_b_mux[] = { +	SSI_SCK78_B_MARK, SSI_WS78_B_MARK, +}; + +static const unsigned int ssi8_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 24), +}; + +static const unsigned int ssi8_data_mux[] = { +	SSI_SDATA8_MARK, +}; + +static const unsigned int ssi8_data_b_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(3, 13), +}; + +static const unsigned int ssi8_data_b_mux[] = { +	SSI_SDATA8_B_MARK, +}; + +static const unsigned int ssi9_data_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(2, 27), +}; + +static const unsigned int ssi9_data_mux[] = { +	SSI_SDATA9_MARK, +}; + +static const unsigned int ssi9_data_b_pins[] = { +	/* SDATA */ +	RCAR_GP_PIN(3, 18), +}; + +static const unsigned int ssi9_data_b_mux[] = { +	SSI_SDATA9_B_MARK, +}; + +static const unsigned int ssi9_ctrl_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(2, 25), RCAR_GP_PIN(2, 26), +}; + +static const unsigned int ssi9_ctrl_mux[] = { +	SSI_SCK9_MARK, SSI_WS9_MARK, +}; + +static const unsigned int ssi9_ctrl_b_pins[] = { +	/* SCK, WS */ +	RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15), +}; + +static const unsigned int ssi9_ctrl_b_mux[] = { +	SSI_SCK9_B_MARK, SSI_WS9_B_MARK, +}; + +/* - USB0 ------------------------------------------------------------------- */ +static const unsigned int usb0_pins[] = { +	RCAR_GP_PIN(7, 23), /* PWEN */ +	RCAR_GP_PIN(7, 24), /* OVC */ +}; +static const unsigned int usb0_mux[] = { +	USB0_PWEN_MARK, +	USB0_OVC_MARK, +}; +/* - USB1 ------------------------------------------------------------------- */ +static const unsigned int usb1_pins[] = { +	RCAR_GP_PIN(7, 25), /* PWEN */ +	RCAR_GP_PIN(6, 30), /* OVC */ +}; +static const unsigned int usb1_mux[] = { +	USB1_PWEN_MARK, +	USB1_OVC_MARK, +}; + +union vin_data { +	unsigned int data24[24]; +	unsigned int data20[20]; +	unsigned int data16[16]; +	unsigned int data12[12]; +	unsigned int data10[10]; +	unsigned int data8[8]; +}; + +#define VIN_DATA_PIN_GROUP(n, s)				\ +	{							\ +		.name = #n#s,					\ +		.pins = n##_pins.data##s,			\ +		.mux = n##_mux.data##s,				\ +		.nr_pins = ARRAY_SIZE(n##_pins.data##s),	\ +	} + +/* - VIN0 ------------------------------------------------------------------- */ +static const union vin_data vin0_data_pins = { +	.data24 = { +		/* B */ +		RCAR_GP_PIN(4, 5), RCAR_GP_PIN(4, 6), +		RCAR_GP_PIN(4, 7), RCAR_GP_PIN(4, 8), +		RCAR_GP_PIN(4, 9), RCAR_GP_PIN(4, 10), +		RCAR_GP_PIN(4, 11), RCAR_GP_PIN(4, 12), +		/* G */ +		RCAR_GP_PIN(4, 13), RCAR_GP_PIN(4, 14), +		RCAR_GP_PIN(4, 15), RCAR_GP_PIN(4, 16), +		RCAR_GP_PIN(4, 17), RCAR_GP_PIN(4, 18), +		RCAR_GP_PIN(4, 19), RCAR_GP_PIN(4, 20), +		/* R */ +		RCAR_GP_PIN(4, 21), RCAR_GP_PIN(4, 22), +		RCAR_GP_PIN(4, 23), RCAR_GP_PIN(4, 24), +		RCAR_GP_PIN(4, 25), RCAR_GP_PIN(4, 26), +		RCAR_GP_PIN(4, 27), RCAR_GP_PIN(4, 28), +	}, +}; +static const union vin_data vin0_data_mux = { +	.data24 = { +		/* B */ +		VI0_DATA0_VI0_B0_MARK, VI0_DATA1_VI0_B1_MARK, +		VI0_DATA2_VI0_B2_MARK, VI0_DATA3_VI0_B3_MARK, +		VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK, +		VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK, +		/* G */ +		VI0_G0_MARK, VI0_G1_MARK, +		VI0_G2_MARK, VI0_G3_MARK, +		VI0_G4_MARK, VI0_G5_MARK, +		VI0_G6_MARK, VI0_G7_MARK, +		/* R */ +		VI0_R0_MARK, VI0_R1_MARK, +		VI0_R2_MARK, VI0_R3_MARK, +		VI0_R4_MARK, VI0_R5_MARK, +		VI0_R6_MARK, VI0_R7_MARK, +	}, +}; +static const unsigned int vin0_data18_pins[] = { +	/* B */ +	RCAR_GP_PIN(4, 7), RCAR_GP_PIN(4, 8), +	RCAR_GP_PIN(4, 9), RCAR_GP_PIN(4, 10), +	RCAR_GP_PIN(4, 11), RCAR_GP_PIN(4, 12), +	/* G */ +	RCAR_GP_PIN(4, 15), RCAR_GP_PIN(4, 16), +	RCAR_GP_PIN(4, 17), RCAR_GP_PIN(4, 18), +	RCAR_GP_PIN(4, 19), RCAR_GP_PIN(4, 20), +	/* R */ +	RCAR_GP_PIN(4, 23), RCAR_GP_PIN(4, 24), +	RCAR_GP_PIN(4, 25), RCAR_GP_PIN(4, 26), +	RCAR_GP_PIN(4, 27), RCAR_GP_PIN(4, 28), +}; +static const unsigned int vin0_data18_mux[] = { +	/* B */ +	VI0_DATA2_VI0_B2_MARK, VI0_DATA3_VI0_B3_MARK, +	VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK, +	VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK, +	/* G */ +	VI0_G2_MARK, VI0_G3_MARK, +	VI0_G4_MARK, VI0_G5_MARK, +	VI0_G6_MARK, VI0_G7_MARK, +	/* R */ +	VI0_R2_MARK, VI0_R3_MARK, +	VI0_R4_MARK, VI0_R5_MARK, +	VI0_R6_MARK, VI0_R7_MARK, +}; +static const unsigned int vin0_sync_pins[] = { +	RCAR_GP_PIN(4, 3), /* HSYNC */ +	RCAR_GP_PIN(4, 4), /* VSYNC */ +}; +static const unsigned int vin0_sync_mux[] = { +	VI0_HSYNC_N_MARK, +	VI0_VSYNC_N_MARK, +}; +static const unsigned int vin0_field_pins[] = { +	RCAR_GP_PIN(4, 2), +}; +static const unsigned int vin0_field_mux[] = { +	VI0_FIELD_MARK, +}; +static const unsigned int vin0_clkenb_pins[] = { +	RCAR_GP_PIN(4, 1), +}; +static const unsigned int vin0_clkenb_mux[] = { +	VI0_CLKENB_MARK, +}; +static const unsigned int vin0_clk_pins[] = { +	RCAR_GP_PIN(4, 0), +}; +static const unsigned int vin0_clk_mux[] = { +	VI0_CLK_MARK, +}; +/* - VIN1 ----------------------------------------------------------------- */ +static const unsigned int vin1_data8_pins[] = { +	RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6), +	RCAR_GP_PIN(5, 7), RCAR_GP_PIN(5, 8), +	RCAR_GP_PIN(5, 9), RCAR_GP_PIN(5, 10), +	RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 12), +}; +static const unsigned int vin1_data8_mux[] = { +	VI1_DATA0_MARK, VI1_DATA1_MARK, +	VI1_DATA2_MARK, VI1_DATA3_MARK, +	VI1_DATA4_MARK, VI1_DATA5_MARK, +	VI1_DATA6_MARK, VI1_DATA7_MARK, +}; +static const unsigned int vin1_sync_pins[] = { +	RCAR_GP_PIN(5, 0), /* HSYNC */ +	RCAR_GP_PIN(5, 1), /* VSYNC */ +}; +static const unsigned int vin1_sync_mux[] = { +	VI1_HSYNC_N_MARK, +	VI1_VSYNC_N_MARK, +}; +static const unsigned int vin1_field_pins[] = { +	RCAR_GP_PIN(5, 3), +}; +static const unsigned int vin1_field_mux[] = { +	VI1_FIELD_MARK, +}; +static const unsigned int vin1_clkenb_pins[] = { +	RCAR_GP_PIN(5, 2), +}; +static const unsigned int vin1_clkenb_mux[] = { +	VI1_CLKENB_MARK, +}; +static const unsigned int vin1_clk_pins[] = { +	RCAR_GP_PIN(5, 4), +}; +static const unsigned int vin1_clk_mux[] = { +	VI1_CLK_MARK, +}; +static const union vin_data vin1_b_data_pins = { +	.data24 = { +		/* B */ +		RCAR_GP_PIN(3, 0), RCAR_GP_PIN(3, 1), +		RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9), +		RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11), +		RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13), +		/* G */ +		RCAR_GP_PIN(6, 24), RCAR_GP_PIN(6, 25), +		RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27), +		RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29), +		RCAR_GP_PIN(7, 21), RCAR_GP_PIN(7, 22), +		/* R */ +		RCAR_GP_PIN(7, 5), RCAR_GP_PIN(7, 6), +		RCAR_GP_PIN(2, 15), RCAR_GP_PIN(2, 16), +		RCAR_GP_PIN(2, 17), RCAR_GP_PIN(2, 18), +		RCAR_GP_PIN(2, 19), RCAR_GP_PIN(2, 20), +	}, +}; +static const union vin_data vin1_b_data_mux = { +	.data24 = { +		/* B */ +		VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, +		VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, +		VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, +		VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, +		/* G */ +		VI1_G0_B_MARK, VI1_G1_B_MARK, +		VI1_G2_B_MARK, VI1_G3_B_MARK, +		VI1_G4_B_MARK, VI1_G5_B_MARK, +		VI1_G6_B_MARK, VI1_G7_B_MARK, +		/* R */ +		VI1_R0_B_MARK, VI1_R1_B_MARK, +		VI1_R2_B_MARK, VI1_R3_B_MARK, +		VI1_R4_B_MARK, VI1_R5_B_MARK, +		VI1_R6_B_MARK, VI1_R7_B_MARK, +	}, +}; +static const unsigned int vin1_b_data18_pins[] = { +	/* B */ +	RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9), +	RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11), +	RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13), +	/* G */ +	RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27), +	RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29), +	RCAR_GP_PIN(7, 21), RCAR_GP_PIN(7, 22), +	/* R */ +	RCAR_GP_PIN(2, 15), RCAR_GP_PIN(2, 16), +	RCAR_GP_PIN(2, 17), RCAR_GP_PIN(2, 18), +	RCAR_GP_PIN(2, 19), RCAR_GP_PIN(2, 20), +}; +static const unsigned int vin1_b_data18_mux[] = { +	/* B */ +	VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, +	VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, +	VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, +	VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, +	/* G */ +	VI1_G0_B_MARK, VI1_G1_B_MARK, +	VI1_G2_B_MARK, VI1_G3_B_MARK, +	VI1_G4_B_MARK, VI1_G5_B_MARK, +	VI1_G6_B_MARK, VI1_G7_B_MARK, +	/* R */ +	VI1_R0_B_MARK, VI1_R1_B_MARK, +	VI1_R2_B_MARK, VI1_R3_B_MARK, +	VI1_R4_B_MARK, VI1_R5_B_MARK, +	VI1_R6_B_MARK, VI1_R7_B_MARK, +}; +static const unsigned int vin1_b_sync_pins[] = { +	RCAR_GP_PIN(3, 17), /* HSYNC */ +	RCAR_GP_PIN(3, 18), /* VSYNC */ +}; +static const unsigned int vin1_b_sync_mux[] = { +	VI1_HSYNC_N_B_MARK, +	VI1_VSYNC_N_B_MARK, +}; +static const unsigned int vin1_b_field_pins[] = { +	RCAR_GP_PIN(3, 20), +}; +static const unsigned int vin1_b_field_mux[] = { +	VI1_FIELD_B_MARK, +}; +static const unsigned int vin1_b_clkenb_pins[] = { +	RCAR_GP_PIN(3, 19), +}; +static const unsigned int vin1_b_clkenb_mux[] = { +	VI1_CLKENB_B_MARK, +}; +static const unsigned int vin1_b_clk_pins[] = { +	RCAR_GP_PIN(3, 16), +}; +static const unsigned int vin1_b_clk_mux[] = { +	VI1_CLK_B_MARK, +}; +/* - VIN2 ----------------------------------------------------------------- */ +static const unsigned int vin2_data8_pins[] = { +	RCAR_GP_PIN(4, 20), RCAR_GP_PIN(4, 21), +	RCAR_GP_PIN(4, 22), RCAR_GP_PIN(4, 23), +	RCAR_GP_PIN(4, 24), RCAR_GP_PIN(4, 25), +	RCAR_GP_PIN(4, 26), RCAR_GP_PIN(4, 27), +}; +static const unsigned int vin2_data8_mux[] = { +	VI2_DATA0_MARK, VI2_DATA1_MARK, +	VI2_DATA2_MARK, VI2_DATA3_MARK, +	VI2_DATA4_MARK, VI2_DATA5_MARK, +	VI2_DATA6_MARK, VI2_DATA7_MARK, +}; +static const unsigned int vin2_sync_pins[] = { +	RCAR_GP_PIN(4, 15), /* HSYNC */ +	RCAR_GP_PIN(4, 16), /* VSYNC */ +}; +static const unsigned int vin2_sync_mux[] = { +	VI2_HSYNC_N_MARK, +	VI2_VSYNC_N_MARK, +}; +static const unsigned int vin2_field_pins[] = { +	RCAR_GP_PIN(4, 18), +}; +static const unsigned int vin2_field_mux[] = { +	VI2_FIELD_MARK, +}; +static const unsigned int vin2_clkenb_pins[] = { +	RCAR_GP_PIN(4, 17), +}; +static const unsigned int vin2_clkenb_mux[] = { +	VI2_CLKENB_MARK, +}; +static const unsigned int vin2_clk_pins[] = { +	RCAR_GP_PIN(4, 19), +}; +static const unsigned int vin2_clk_mux[] = { +	VI2_CLK_MARK, +}; + +static const struct sh_pfc_pin_group pinmux_groups[] = { +	SH_PFC_PIN_GROUP(audio_clk_a), +	SH_PFC_PIN_GROUP(audio_clk_b), +	SH_PFC_PIN_GROUP(audio_clk_b_b), +	SH_PFC_PIN_GROUP(audio_clk_c), +	SH_PFC_PIN_GROUP(audio_clkout), +	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(du0_clk_in), +	SH_PFC_PIN_GROUP(du1_clk_in), +	SH_PFC_PIN_GROUP(du1_clk_in_b), +	SH_PFC_PIN_GROUP(du1_clk_in_c), +	SH_PFC_PIN_GROUP(eth_link), +	SH_PFC_PIN_GROUP(eth_magic), +	SH_PFC_PIN_GROUP(eth_mdio), +	SH_PFC_PIN_GROUP(eth_rmii), +	SH_PFC_PIN_GROUP(i2c0), +	SH_PFC_PIN_GROUP(i2c0_b), +	SH_PFC_PIN_GROUP(i2c0_c), +	SH_PFC_PIN_GROUP(i2c1), +	SH_PFC_PIN_GROUP(i2c1_b), +	SH_PFC_PIN_GROUP(i2c1_c), +	SH_PFC_PIN_GROUP(i2c1_d), +	SH_PFC_PIN_GROUP(i2c1_e), +	SH_PFC_PIN_GROUP(i2c2), +	SH_PFC_PIN_GROUP(i2c2_b), +	SH_PFC_PIN_GROUP(i2c2_c), +	SH_PFC_PIN_GROUP(i2c2_d), +	SH_PFC_PIN_GROUP(i2c3), +	SH_PFC_PIN_GROUP(i2c3_b), +	SH_PFC_PIN_GROUP(i2c3_c), +	SH_PFC_PIN_GROUP(i2c3_d), +	SH_PFC_PIN_GROUP(i2c4), +	SH_PFC_PIN_GROUP(i2c4_b), +	SH_PFC_PIN_GROUP(i2c4_c), +	SH_PFC_PIN_GROUP(i2c7), +	SH_PFC_PIN_GROUP(i2c7_b), +	SH_PFC_PIN_GROUP(i2c7_c), +	SH_PFC_PIN_GROUP(i2c8), +	SH_PFC_PIN_GROUP(i2c8_b), +	SH_PFC_PIN_GROUP(i2c8_c), +	SH_PFC_PIN_GROUP(intc_irq0), +	SH_PFC_PIN_GROUP(intc_irq1), +	SH_PFC_PIN_GROUP(intc_irq2), +	SH_PFC_PIN_GROUP(intc_irq3), +	SH_PFC_PIN_GROUP(mmc_data1), +	SH_PFC_PIN_GROUP(mmc_data4), +	SH_PFC_PIN_GROUP(mmc_data8), +	SH_PFC_PIN_GROUP(mmc_ctrl), +	SH_PFC_PIN_GROUP(msiof0_clk), +	SH_PFC_PIN_GROUP(msiof0_sync), +	SH_PFC_PIN_GROUP(msiof0_ss1), +	SH_PFC_PIN_GROUP(msiof0_ss2), +	SH_PFC_PIN_GROUP(msiof0_rx), +	SH_PFC_PIN_GROUP(msiof0_tx), +	SH_PFC_PIN_GROUP(msiof0_clk_b), +	SH_PFC_PIN_GROUP(msiof0_sync_b), +	SH_PFC_PIN_GROUP(msiof0_ss1_b), +	SH_PFC_PIN_GROUP(msiof0_ss2_b), +	SH_PFC_PIN_GROUP(msiof0_rx_b), +	SH_PFC_PIN_GROUP(msiof0_tx_b), +	SH_PFC_PIN_GROUP(msiof0_clk_c), +	SH_PFC_PIN_GROUP(msiof0_sync_c), +	SH_PFC_PIN_GROUP(msiof0_ss1_c), +	SH_PFC_PIN_GROUP(msiof0_ss2_c), +	SH_PFC_PIN_GROUP(msiof0_rx_c), +	SH_PFC_PIN_GROUP(msiof0_tx_c), +	SH_PFC_PIN_GROUP(msiof1_clk), +	SH_PFC_PIN_GROUP(msiof1_sync), +	SH_PFC_PIN_GROUP(msiof1_ss1), +	SH_PFC_PIN_GROUP(msiof1_ss2), +	SH_PFC_PIN_GROUP(msiof1_rx), +	SH_PFC_PIN_GROUP(msiof1_tx), +	SH_PFC_PIN_GROUP(msiof1_clk_b), +	SH_PFC_PIN_GROUP(msiof1_sync_b), +	SH_PFC_PIN_GROUP(msiof1_ss1_b), +	SH_PFC_PIN_GROUP(msiof1_ss2_b), +	SH_PFC_PIN_GROUP(msiof1_rx_b), +	SH_PFC_PIN_GROUP(msiof1_tx_b), +	SH_PFC_PIN_GROUP(msiof1_clk_c), +	SH_PFC_PIN_GROUP(msiof1_sync_c), +	SH_PFC_PIN_GROUP(msiof1_rx_c), +	SH_PFC_PIN_GROUP(msiof1_tx_c), +	SH_PFC_PIN_GROUP(msiof1_clk_d), +	SH_PFC_PIN_GROUP(msiof1_sync_d), +	SH_PFC_PIN_GROUP(msiof1_ss1_d), +	SH_PFC_PIN_GROUP(msiof1_rx_d), +	SH_PFC_PIN_GROUP(msiof1_tx_d), +	SH_PFC_PIN_GROUP(msiof1_clk_e), +	SH_PFC_PIN_GROUP(msiof1_sync_e), +	SH_PFC_PIN_GROUP(msiof1_rx_e), +	SH_PFC_PIN_GROUP(msiof1_tx_e), +	SH_PFC_PIN_GROUP(msiof2_clk), +	SH_PFC_PIN_GROUP(msiof2_sync), +	SH_PFC_PIN_GROUP(msiof2_ss1), +	SH_PFC_PIN_GROUP(msiof2_ss2), +	SH_PFC_PIN_GROUP(msiof2_rx), +	SH_PFC_PIN_GROUP(msiof2_tx), +	SH_PFC_PIN_GROUP(msiof2_clk_b), +	SH_PFC_PIN_GROUP(msiof2_sync_b), +	SH_PFC_PIN_GROUP(msiof2_ss1_b), +	SH_PFC_PIN_GROUP(msiof2_ss2_b), +	SH_PFC_PIN_GROUP(msiof2_rx_b), +	SH_PFC_PIN_GROUP(msiof2_tx_b), +	SH_PFC_PIN_GROUP(msiof2_clk_c), +	SH_PFC_PIN_GROUP(msiof2_sync_c), +	SH_PFC_PIN_GROUP(msiof2_rx_c), +	SH_PFC_PIN_GROUP(msiof2_tx_c), +	SH_PFC_PIN_GROUP(msiof2_clk_d), +	SH_PFC_PIN_GROUP(msiof2_sync_d), +	SH_PFC_PIN_GROUP(msiof2_ss1_d), +	SH_PFC_PIN_GROUP(msiof2_ss2_d), +	SH_PFC_PIN_GROUP(msiof2_rx_d), +	SH_PFC_PIN_GROUP(msiof2_tx_d), +	SH_PFC_PIN_GROUP(msiof2_clk_e), +	SH_PFC_PIN_GROUP(msiof2_sync_e), +	SH_PFC_PIN_GROUP(msiof2_rx_e), +	SH_PFC_PIN_GROUP(msiof2_tx_e), +	SH_PFC_PIN_GROUP(qspi_ctrl), +	SH_PFC_PIN_GROUP(qspi_data2), +	SH_PFC_PIN_GROUP(qspi_data4), +	SH_PFC_PIN_GROUP(qspi_ctrl_b), +	SH_PFC_PIN_GROUP(qspi_data2_b), +	SH_PFC_PIN_GROUP(qspi_data4_b), +	SH_PFC_PIN_GROUP(scif0_data), +	SH_PFC_PIN_GROUP(scif0_data_b), +	SH_PFC_PIN_GROUP(scif0_data_c), +	SH_PFC_PIN_GROUP(scif0_data_d), +	SH_PFC_PIN_GROUP(scif0_data_e), +	SH_PFC_PIN_GROUP(scif1_data), +	SH_PFC_PIN_GROUP(scif1_data_b), +	SH_PFC_PIN_GROUP(scif1_clk_b), +	SH_PFC_PIN_GROUP(scif1_data_c), +	SH_PFC_PIN_GROUP(scif1_data_d), +	SH_PFC_PIN_GROUP(scif2_data), +	SH_PFC_PIN_GROUP(scif2_data_b), +	SH_PFC_PIN_GROUP(scif2_clk_b), +	SH_PFC_PIN_GROUP(scif2_data_c), +	SH_PFC_PIN_GROUP(scif2_data_e), +	SH_PFC_PIN_GROUP(scif3_data), +	SH_PFC_PIN_GROUP(scif3_clk), +	SH_PFC_PIN_GROUP(scif3_data_b), +	SH_PFC_PIN_GROUP(scif3_clk_b), +	SH_PFC_PIN_GROUP(scif3_data_c), +	SH_PFC_PIN_GROUP(scif3_data_d), +	SH_PFC_PIN_GROUP(scif4_data), +	SH_PFC_PIN_GROUP(scif4_data_b), +	SH_PFC_PIN_GROUP(scif4_data_c), +	SH_PFC_PIN_GROUP(scif5_data), +	SH_PFC_PIN_GROUP(scif5_data_b), +	SH_PFC_PIN_GROUP(scifa0_data), +	SH_PFC_PIN_GROUP(scifa0_data_b), +	SH_PFC_PIN_GROUP(scifa1_data), +	SH_PFC_PIN_GROUP(scifa1_clk), +	SH_PFC_PIN_GROUP(scifa1_data_b), +	SH_PFC_PIN_GROUP(scifa1_clk_b), +	SH_PFC_PIN_GROUP(scifa1_data_c), +	SH_PFC_PIN_GROUP(scifa2_data), +	SH_PFC_PIN_GROUP(scifa2_clk), +	SH_PFC_PIN_GROUP(scifa2_data_b), +	SH_PFC_PIN_GROUP(scifa3_data), +	SH_PFC_PIN_GROUP(scifa3_clk), +	SH_PFC_PIN_GROUP(scifa3_data_b), +	SH_PFC_PIN_GROUP(scifa3_clk_b), +	SH_PFC_PIN_GROUP(scifa3_data_c), +	SH_PFC_PIN_GROUP(scifa3_clk_c), +	SH_PFC_PIN_GROUP(scifa4_data), +	SH_PFC_PIN_GROUP(scifa4_data_b), +	SH_PFC_PIN_GROUP(scifa4_data_c), +	SH_PFC_PIN_GROUP(scifa5_data), +	SH_PFC_PIN_GROUP(scifa5_data_b), +	SH_PFC_PIN_GROUP(scifa5_data_c), +	SH_PFC_PIN_GROUP(scifb0_data), +	SH_PFC_PIN_GROUP(scifb0_clk), +	SH_PFC_PIN_GROUP(scifb0_ctrl), +	SH_PFC_PIN_GROUP(scifb0_data_b), +	SH_PFC_PIN_GROUP(scifb0_clk_b), +	SH_PFC_PIN_GROUP(scifb0_ctrl_b), +	SH_PFC_PIN_GROUP(scifb0_data_c), +	SH_PFC_PIN_GROUP(scifb0_clk_c), +	SH_PFC_PIN_GROUP(scifb0_data_d), +	SH_PFC_PIN_GROUP(scifb0_clk_d), +	SH_PFC_PIN_GROUP(scifb1_data), +	SH_PFC_PIN_GROUP(scifb1_clk), +	SH_PFC_PIN_GROUP(scifb1_ctrl), +	SH_PFC_PIN_GROUP(scifb1_data_b), +	SH_PFC_PIN_GROUP(scifb1_clk_b), +	SH_PFC_PIN_GROUP(scifb1_data_c), +	SH_PFC_PIN_GROUP(scifb1_clk_c), +	SH_PFC_PIN_GROUP(scifb1_data_d), +	SH_PFC_PIN_GROUP(scifb2_data), +	SH_PFC_PIN_GROUP(scifb2_clk), +	SH_PFC_PIN_GROUP(scifb2_ctrl), +	SH_PFC_PIN_GROUP(scifb2_data_b), +	SH_PFC_PIN_GROUP(scifb2_clk_b), +	SH_PFC_PIN_GROUP(scifb2_ctrl_b), +	SH_PFC_PIN_GROUP(scifb2_data_c), +	SH_PFC_PIN_GROUP(scifb2_clk_c), +	SH_PFC_PIN_GROUP(scifb2_data_d), +	SH_PFC_PIN_GROUP(sdhi0_data1), +	SH_PFC_PIN_GROUP(sdhi0_data4), +	SH_PFC_PIN_GROUP(sdhi0_ctrl), +	SH_PFC_PIN_GROUP(sdhi0_cd), +	SH_PFC_PIN_GROUP(sdhi0_wp), +	SH_PFC_PIN_GROUP(sdhi1_data1), +	SH_PFC_PIN_GROUP(sdhi1_data4), +	SH_PFC_PIN_GROUP(sdhi1_ctrl), +	SH_PFC_PIN_GROUP(sdhi1_cd), +	SH_PFC_PIN_GROUP(sdhi1_wp), +	SH_PFC_PIN_GROUP(sdhi2_data1), +	SH_PFC_PIN_GROUP(sdhi2_data4), +	SH_PFC_PIN_GROUP(sdhi2_ctrl), +	SH_PFC_PIN_GROUP(sdhi2_cd), +	SH_PFC_PIN_GROUP(sdhi2_wp), +	SH_PFC_PIN_GROUP(ssi0_data), +	SH_PFC_PIN_GROUP(ssi0_data_b), +	SH_PFC_PIN_GROUP(ssi0129_ctrl), +	SH_PFC_PIN_GROUP(ssi0129_ctrl_b), +	SH_PFC_PIN_GROUP(ssi1_data), +	SH_PFC_PIN_GROUP(ssi1_data_b), +	SH_PFC_PIN_GROUP(ssi1_ctrl), +	SH_PFC_PIN_GROUP(ssi1_ctrl_b), +	SH_PFC_PIN_GROUP(ssi2_data), +	SH_PFC_PIN_GROUP(ssi2_ctrl), +	SH_PFC_PIN_GROUP(ssi3_data), +	SH_PFC_PIN_GROUP(ssi34_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(ssi7_data_b), +	SH_PFC_PIN_GROUP(ssi78_ctrl), +	SH_PFC_PIN_GROUP(ssi78_ctrl_b), +	SH_PFC_PIN_GROUP(ssi8_data), +	SH_PFC_PIN_GROUP(ssi8_data_b), +	SH_PFC_PIN_GROUP(ssi9_data), +	SH_PFC_PIN_GROUP(ssi9_data_b), +	SH_PFC_PIN_GROUP(ssi9_ctrl), +	SH_PFC_PIN_GROUP(ssi9_ctrl_b), +	SH_PFC_PIN_GROUP(usb0), +	SH_PFC_PIN_GROUP(usb1), +	VIN_DATA_PIN_GROUP(vin0_data, 24), +	VIN_DATA_PIN_GROUP(vin0_data, 20), +	SH_PFC_PIN_GROUP(vin0_data18), +	VIN_DATA_PIN_GROUP(vin0_data, 16), +	VIN_DATA_PIN_GROUP(vin0_data, 12), +	VIN_DATA_PIN_GROUP(vin0_data, 10), +	VIN_DATA_PIN_GROUP(vin0_data, 8), +	SH_PFC_PIN_GROUP(vin0_sync), +	SH_PFC_PIN_GROUP(vin0_field), +	SH_PFC_PIN_GROUP(vin0_clkenb), +	SH_PFC_PIN_GROUP(vin0_clk), +	SH_PFC_PIN_GROUP(vin1_data8), +	SH_PFC_PIN_GROUP(vin1_sync), +	SH_PFC_PIN_GROUP(vin1_field), +	SH_PFC_PIN_GROUP(vin1_clkenb), +	SH_PFC_PIN_GROUP(vin1_clk), +	VIN_DATA_PIN_GROUP(vin1_b_data, 24), +	VIN_DATA_PIN_GROUP(vin1_b_data, 20), +	SH_PFC_PIN_GROUP(vin1_b_data18), +	VIN_DATA_PIN_GROUP(vin1_b_data, 16), +	VIN_DATA_PIN_GROUP(vin1_b_data, 12), +	VIN_DATA_PIN_GROUP(vin1_b_data, 10), +	VIN_DATA_PIN_GROUP(vin1_b_data, 8), +	SH_PFC_PIN_GROUP(vin1_b_sync), +	SH_PFC_PIN_GROUP(vin1_b_field), +	SH_PFC_PIN_GROUP(vin1_b_clkenb), +	SH_PFC_PIN_GROUP(vin1_b_clk), +	SH_PFC_PIN_GROUP(vin2_data8), +	SH_PFC_PIN_GROUP(vin2_sync), +	SH_PFC_PIN_GROUP(vin2_field), +	SH_PFC_PIN_GROUP(vin2_clkenb), +	SH_PFC_PIN_GROUP(vin2_clk), +}; + +static const char * const audio_clk_groups[] = { +	"audio_clk_a", +	"audio_clk_b", +	"audio_clk_b_b", +	"audio_clk_c", +	"audio_clkout", +}; + +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 du0_groups[] = { +	"du0_clk_in", +}; + +static const char * const du1_groups[] = { +	"du1_clk_in", +	"du1_clk_in_b", +	"du1_clk_in_c", +}; + +static const char * const eth_groups[] = { +	"eth_link", +	"eth_magic", +	"eth_mdio", +	"eth_rmii", +}; + +static const char * const i2c0_groups[] = { +	"i2c0", +	"i2c0_b", +	"i2c0_c", +}; + +static const char * const i2c1_groups[] = { +	"i2c1", +	"i2c1_b", +	"i2c1_c", +	"i2c1_d", +	"i2c1_e", +}; + +static const char * const i2c2_groups[] = { +	"i2c2", +	"i2c2_b", +	"i2c2_c", +	"i2c2_d", +}; + +static const char * const i2c3_groups[] = { +	"i2c3", +	"i2c3_b", +	"i2c3_c", +	"i2c3_d", +}; + +static const char * const i2c4_groups[] = { +	"i2c4", +	"i2c4_b", +	"i2c4_c", +}; + +static const char * const i2c7_groups[] = { +	"i2c7", +	"i2c7_b", +	"i2c7_c", +}; + +static const char * const i2c8_groups[] = { +	"i2c8", +	"i2c8_b", +	"i2c8_c", +}; + +static const char * const intc_groups[] = { +	"intc_irq0", +	"intc_irq1", +	"intc_irq2", +	"intc_irq3", +}; + +static const char * const mmc_groups[] = { +	"mmc_data1", +	"mmc_data4", +	"mmc_data8", +	"mmc_ctrl", +}; + +static const char * const msiof0_groups[] = { +	"msiof0_clk", +	"msiof0_sync", +	"msiof0_ss1", +	"msiof0_ss2", +	"msiof0_rx", +	"msiof0_tx", +	"msiof0_clk_b", +	"msiof0_sync_b", +	"msiof0_ss1_b", +	"msiof0_ss2_b", +	"msiof0_rx_b", +	"msiof0_tx_b", +	"msiof0_clk_c", +	"msiof0_sync_c", +	"msiof0_ss1_c", +	"msiof0_ss2_c", +	"msiof0_rx_c", +	"msiof0_tx_c", +}; + +static const char * const msiof1_groups[] = { +	"msiof1_clk", +	"msiof1_sync", +	"msiof1_ss1", +	"msiof1_ss2", +	"msiof1_rx", +	"msiof1_tx", +	"msiof1_clk_b", +	"msiof1_sync_b", +	"msiof1_ss1_b", +	"msiof1_ss2_b", +	"msiof1_rx_b", +	"msiof1_tx_b", +	"msiof1_clk_c", +	"msiof1_sync_c", +	"msiof1_rx_c", +	"msiof1_tx_c", +	"msiof1_clk_d", +	"msiof1_sync_d", +	"msiof1_ss1_d", +	"msiof1_rx_d", +	"msiof1_tx_d", +	"msiof1_clk_e", +	"msiof1_sync_e", +	"msiof1_rx_e", +	"msiof1_tx_e", +}; + +static const char * const msiof2_groups[] = { +	"msiof2_clk", +	"msiof2_sync", +	"msiof2_ss1", +	"msiof2_ss2", +	"msiof2_rx", +	"msiof2_tx", +	"msiof2_clk_b", +	"msiof2_sync_b", +	"msiof2_ss1_b", +	"msiof2_ss2_b", +	"msiof2_rx_b", +	"msiof2_tx_b", +	"msiof2_clk_c", +	"msiof2_sync_c", +	"msiof2_rx_c", +	"msiof2_tx_c", +	"msiof2_clk_d", +	"msiof2_sync_d", +	"msiof2_ss1_d", +	"msiof2_ss2_d", +	"msiof2_rx_d", +	"msiof2_tx_d", +	"msiof2_clk_e", +	"msiof2_sync_e", +	"msiof2_rx_e", +	"msiof2_tx_e", +}; + +static const char * const qspi_groups[] = { +	"qspi_ctrl", +	"qspi_data2", +	"qspi_data4", +	"qspi_ctrl_b", +	"qspi_data2_b", +	"qspi_data4_b", +}; + +static const char * const scif0_groups[] = { +	"scif0_data", +	"scif0_data_b", +	"scif0_data_c", +	"scif0_data_d", +	"scif0_data_e", +}; + +static const char * const scif1_groups[] = { +	"scif1_data", +	"scif1_data_b", +	"scif1_clk_b", +	"scif1_data_c", +	"scif1_data_d", +}; + +static const char * const scif2_groups[] = { +	"scif2_data", +	"scif2_data_b", +	"scif2_clk_b", +	"scif2_data_c", +	"scif2_data_e", +}; +static const char * const scif3_groups[] = { +	"scif3_data", +	"scif3_clk", +	"scif3_data_b", +	"scif3_clk_b", +	"scif3_data_c", +	"scif3_data_d", +}; +static const char * const scif4_groups[] = { +	"scif4_data", +	"scif4_data_b", +	"scif4_data_c", +}; +static const char * const scif5_groups[] = { +	"scif5_data", +	"scif5_data_b", +}; +static const char * const scifa0_groups[] = { +	"scifa0_data", +	"scifa0_data_b", +}; +static const char * const scifa1_groups[] = { +	"scifa1_data", +	"scifa1_clk", +	"scifa1_data_b", +	"scifa1_clk_b", +	"scifa1_data_c", +}; +static const char * const scifa2_groups[] = { +	"scifa2_data", +	"scifa2_clk", +	"scifa2_data_b", +}; +static const char * const scifa3_groups[] = { +	"scifa3_data", +	"scifa3_clk", +	"scifa3_data_b", +	"scifa3_clk_b", +	"scifa3_data_c", +	"scifa3_clk_c", +}; +static const char * const scifa4_groups[] = { +	"scifa4_data", +	"scifa4_data_b", +	"scifa4_data_c", +}; +static const char * const scifa5_groups[] = { +	"scifa5_data", +	"scifa5_data_b", +	"scifa5_data_c", +}; +static const char * const scifb0_groups[] = { +	"scifb0_data", +	"scifb0_clk", +	"scifb0_ctrl", +	"scifb0_data_b", +	"scifb0_clk_b", +	"scifb0_ctrl_b", +	"scifb0_data_c", +	"scifb0_clk_c", +	"scifb0_data_d", +	"scifb0_clk_d", +}; +static const char * const scifb1_groups[] = { +	"scifb1_data", +	"scifb1_clk", +	"scifb1_ctrl", +	"scifb1_data_b", +	"scifb1_clk_b", +	"scifb1_data_c", +	"scifb1_clk_c", +	"scifb1_data_d", +}; +static const char * const scifb2_groups[] = { +	"scifb2_data", +	"scifb2_clk", +	"scifb2_ctrl", +	"scifb2_data_b", +	"scifb2_clk_b", +	"scifb2_ctrl_b", +	"scifb0_data_c", +	"scifb2_clk_c", +	"scifb2_data_d", +}; + +static const char * const sdhi0_groups[] = { +	"sdhi0_data1", +	"sdhi0_data4", +	"sdhi0_ctrl", +	"sdhi0_cd", +	"sdhi0_wp", +}; + +static const char * const sdhi1_groups[] = { +	"sdhi1_data1", +	"sdhi1_data4", +	"sdhi1_ctrl", +	"sdhi1_cd", +	"sdhi1_wp", +}; + +static const char * const sdhi2_groups[] = { +	"sdhi2_data1", +	"sdhi2_data4", +	"sdhi2_ctrl", +	"sdhi2_cd", +	"sdhi2_wp", +}; + +static const char * const ssi_groups[] = { +	"ssi0_data", +	"ssi0_data_b", +	"ssi0129_ctrl", +	"ssi0129_ctrl_b", +	"ssi1_data", +	"ssi1_data_b", +	"ssi1_ctrl", +	"ssi1_ctrl_b", +	"ssi2_data", +	"ssi2_ctrl", +	"ssi3_data", +	"ssi34_ctrl", +	"ssi4_data", +	"ssi4_ctrl", +	"ssi5_data", +	"ssi5_ctrl", +	"ssi6_data", +	"ssi6_ctrl", +	"ssi7_data", +	"ssi7_data_b", +	"ssi78_ctrl", +	"ssi78_ctrl_b", +	"ssi8_data", +	"ssi8_data_b", +	"ssi9_data", +	"ssi9_data_b", +	"ssi9_ctrl", +	"ssi9_ctrl_b", +}; + +static const char * const usb0_groups[] = { +	"usb0", +}; +static const char * const usb1_groups[] = { +	"usb1", +}; + +static const char * const vin0_groups[] = { +	"vin0_data24", +	"vin0_data20", +	"vin0_data18", +	"vin0_data16", +	"vin0_data12", +	"vin0_data10", +	"vin0_data8", +	"vin0_sync", +	"vin0_field", +	"vin0_clkenb", +	"vin0_clk", +}; + +static const char * const vin1_groups[] = { +	"vin1_data8", +	"vin1_sync", +	"vin1_field", +	"vin1_clkenb", +	"vin1_clk", +	"vin1_b_data24", +	"vin1_b_data20", +	"vin1_b_data18", +	"vin1_b_data16", +	"vin1_b_data12", +	"vin1_b_data10", +	"vin1_b_data8", +	"vin1_b_sync", +	"vin1_b_field", +	"vin1_b_clkenb", +	"vin1_b_clk", +}; + +static const char * const vin2_groups[] = { +	"vin2_data8", +	"vin2_sync", +	"vin2_field", +	"vin2_clkenb", +	"vin2_clk", +}; + +static const struct sh_pfc_function pinmux_functions[] = { +	SH_PFC_FUNCTION(audio_clk), +	SH_PFC_FUNCTION(du), +	SH_PFC_FUNCTION(du0), +	SH_PFC_FUNCTION(du1), +	SH_PFC_FUNCTION(eth), +	SH_PFC_FUNCTION(i2c0), +	SH_PFC_FUNCTION(i2c1), +	SH_PFC_FUNCTION(i2c2), +	SH_PFC_FUNCTION(i2c3), +	SH_PFC_FUNCTION(i2c4), +	SH_PFC_FUNCTION(i2c7), +	SH_PFC_FUNCTION(i2c8), +	SH_PFC_FUNCTION(intc), +	SH_PFC_FUNCTION(mmc), +	SH_PFC_FUNCTION(msiof0), +	SH_PFC_FUNCTION(msiof1), +	SH_PFC_FUNCTION(msiof2), +	SH_PFC_FUNCTION(qspi), +	SH_PFC_FUNCTION(scif0), +	SH_PFC_FUNCTION(scif1), +	SH_PFC_FUNCTION(scif2), +	SH_PFC_FUNCTION(scif3), +	SH_PFC_FUNCTION(scif4), +	SH_PFC_FUNCTION(scif5), +	SH_PFC_FUNCTION(scifa0), +	SH_PFC_FUNCTION(scifa1), +	SH_PFC_FUNCTION(scifa2), +	SH_PFC_FUNCTION(scifa3), +	SH_PFC_FUNCTION(scifa4), +	SH_PFC_FUNCTION(scifa5), +	SH_PFC_FUNCTION(scifb0), +	SH_PFC_FUNCTION(scifb1), +	SH_PFC_FUNCTION(scifb2), +	SH_PFC_FUNCTION(sdhi0), +	SH_PFC_FUNCTION(sdhi1), +	SH_PFC_FUNCTION(sdhi2), +	SH_PFC_FUNCTION(ssi), +	SH_PFC_FUNCTION(usb0), +	SH_PFC_FUNCTION(usb1), +	SH_PFC_FUNCTION(vin0), +	SH_PFC_FUNCTION(vin1), +	SH_PFC_FUNCTION(vin2), +}; + +static const struct pinmux_cfg_reg pinmux_config_regs[] = { +	{ PINMUX_CFG_REG("GPSR0", 0xE6060004, 32, 1) { +		GP_0_31_FN, FN_IP1_22_20, +		GP_0_30_FN, FN_IP1_19_17, +		GP_0_29_FN, FN_IP1_16_14, +		GP_0_28_FN, FN_IP1_13_11, +		GP_0_27_FN, FN_IP1_10_8, +		GP_0_26_FN, FN_IP1_7_6, +		GP_0_25_FN, FN_IP1_5_4, +		GP_0_24_FN, FN_IP1_3_2, +		GP_0_23_FN, FN_IP1_1_0, +		GP_0_22_FN, FN_IP0_30_29, +		GP_0_21_FN, FN_IP0_28_27, +		GP_0_20_FN, FN_IP0_26_25, +		GP_0_19_FN, FN_IP0_24_23, +		GP_0_18_FN, FN_IP0_22_21, +		GP_0_17_FN, FN_IP0_20_19, +		GP_0_16_FN, FN_IP0_18_16, +		GP_0_15_FN, FN_IP0_15, +		GP_0_14_FN, FN_IP0_14, +		GP_0_13_FN, FN_IP0_13, +		GP_0_12_FN, FN_IP0_12, +		GP_0_11_FN, FN_IP0_11, +		GP_0_10_FN, FN_IP0_10, +		GP_0_9_FN, FN_IP0_9, +		GP_0_8_FN, FN_IP0_8, +		GP_0_7_FN, FN_IP0_7, +		GP_0_6_FN, FN_IP0_6, +		GP_0_5_FN, FN_IP0_5, +		GP_0_4_FN, FN_IP0_4, +		GP_0_3_FN, FN_IP0_3, +		GP_0_2_FN, FN_IP0_2, +		GP_0_1_FN, FN_IP0_1, +		GP_0_0_FN, FN_IP0_0, } +	}, +	{ PINMUX_CFG_REG("GPSR1", 0xE6060008, 32, 1) { +		0, 0, +		0, 0, +		0, 0, +		0, 0, +		0, 0, +		0, 0, +		GP_1_25_FN, FN_IP3_21_20, +		GP_1_24_FN, FN_IP3_19_18, +		GP_1_23_FN, FN_IP3_17_16, +		GP_1_22_FN, FN_IP3_15_14, +		GP_1_21_FN, FN_IP3_13_12, +		GP_1_20_FN, FN_IP3_11_9, +		GP_1_19_FN, FN_RD_N, +		GP_1_18_FN, FN_IP3_8_6, +		GP_1_17_FN, FN_IP3_5_3, +		GP_1_16_FN, FN_IP3_2_0, +		GP_1_15_FN, FN_IP2_29_27, +		GP_1_14_FN, FN_IP2_26_25, +		GP_1_13_FN, FN_IP2_24_23, +		GP_1_12_FN, FN_EX_CS0_N, +		GP_1_11_FN, FN_IP2_22_21, +		GP_1_10_FN, FN_IP2_20_19, +		GP_1_9_FN, FN_IP2_18_16, +		GP_1_8_FN, FN_IP2_15_13, +		GP_1_7_FN, FN_IP2_12_10, +		GP_1_6_FN, FN_IP2_9_7, +		GP_1_5_FN, FN_IP2_6_5, +		GP_1_4_FN, FN_IP2_4_3, +		GP_1_3_FN, FN_IP2_2_0, +		GP_1_2_FN, FN_IP1_31_29, +		GP_1_1_FN, FN_IP1_28_26, +		GP_1_0_FN, FN_IP1_25_23, } +	}, +	{ PINMUX_CFG_REG("GPSR2", 0xE606000C, 32, 1) { +		GP_2_31_FN, FN_IP6_7_6, +		GP_2_30_FN, FN_IP6_5_3, +		GP_2_29_FN, FN_IP6_2_0, +		GP_2_28_FN, FN_AUDIO_CLKA, +		GP_2_27_FN, FN_IP5_31_29, +		GP_2_26_FN, FN_IP5_28_26, +		GP_2_25_FN, FN_IP5_25_24, +		GP_2_24_FN, FN_IP5_23_22, +		GP_2_23_FN, FN_IP5_21_20, +		GP_2_22_FN, FN_IP5_19_17, +		GP_2_21_FN, FN_IP5_16_15, +		GP_2_20_FN, FN_IP5_14_12, +		GP_2_19_FN, FN_IP5_11_9, +		GP_2_18_FN, FN_IP5_8_6, +		GP_2_17_FN, FN_IP5_5_3, +		GP_2_16_FN, FN_IP5_2_0, +		GP_2_15_FN, FN_IP4_30_28, +		GP_2_14_FN, FN_IP4_27_26, +		GP_2_13_FN, FN_IP4_25_24, +		GP_2_12_FN, FN_IP4_23_22, +		GP_2_11_FN, FN_IP4_21, +		GP_2_10_FN, FN_IP4_20, +		GP_2_9_FN, FN_IP4_19, +		GP_2_8_FN, FN_IP4_18_16, +		GP_2_7_FN, FN_IP4_15_13, +		GP_2_6_FN, FN_IP4_12_10, +		GP_2_5_FN, FN_IP4_9_8, +		GP_2_4_FN, FN_IP4_7_5, +		GP_2_3_FN, FN_IP4_4_2, +		GP_2_2_FN, FN_IP4_1_0, +		GP_2_1_FN, FN_IP3_30_28, +		GP_2_0_FN, FN_IP3_27_25 } +	}, +	{ PINMUX_CFG_REG("GPSR3", 0xE6060010, 32, 1) { +		GP_3_31_FN, FN_IP9_18_17, +		GP_3_30_FN, FN_IP9_16, +		GP_3_29_FN, FN_IP9_15_13, +		GP_3_28_FN, FN_IP9_12, +		GP_3_27_FN, FN_IP9_11, +		GP_3_26_FN, FN_IP9_10_8, +		GP_3_25_FN, FN_IP9_7, +		GP_3_24_FN, FN_IP9_6, +		GP_3_23_FN, FN_IP9_5_3, +		GP_3_22_FN, FN_IP9_2_0, +		GP_3_21_FN, FN_IP8_30_28, +		GP_3_20_FN, FN_IP8_27_26, +		GP_3_19_FN, FN_IP8_25_24, +		GP_3_18_FN, FN_IP8_23_21, +		GP_3_17_FN, FN_IP8_20_18, +		GP_3_16_FN, FN_IP8_17_15, +		GP_3_15_FN, FN_IP8_14_12, +		GP_3_14_FN, FN_IP8_11_9, +		GP_3_13_FN, FN_IP8_8_6, +		GP_3_12_FN, FN_IP8_5_3, +		GP_3_11_FN, FN_IP8_2_0, +		GP_3_10_FN, FN_IP7_29_27, +		GP_3_9_FN, FN_IP7_26_24, +		GP_3_8_FN, FN_IP7_23_21, +		GP_3_7_FN, FN_IP7_20_19, +		GP_3_6_FN, FN_IP7_18_17, +		GP_3_5_FN, FN_IP7_16_15, +		GP_3_4_FN, FN_IP7_14_13, +		GP_3_3_FN, FN_IP7_12_11, +		GP_3_2_FN, FN_IP7_10_9, +		GP_3_1_FN, FN_IP7_8_6, +		GP_3_0_FN, FN_IP7_5_3 } +	}, +	{ PINMUX_CFG_REG("GPSR4", 0xE6060014, 32, 1) { +		GP_4_31_FN, FN_IP15_5_4, +		GP_4_30_FN, FN_IP15_3_2, +		GP_4_29_FN, FN_IP15_1_0, +		GP_4_28_FN, FN_IP11_8_6, +		GP_4_27_FN, FN_IP11_5_3, +		GP_4_26_FN, FN_IP11_2_0, +		GP_4_25_FN, FN_IP10_31_29, +		GP_4_24_FN, FN_IP10_28_27, +		GP_4_23_FN, FN_IP10_26_25, +		GP_4_22_FN, FN_IP10_24_22, +		GP_4_21_FN, FN_IP10_21_19, +		GP_4_20_FN, FN_IP10_18_17, +		GP_4_19_FN, FN_IP10_16_15, +		GP_4_18_FN, FN_IP10_14_12, +		GP_4_17_FN, FN_IP10_11_9, +		GP_4_16_FN, FN_IP10_8_6, +		GP_4_15_FN, FN_IP10_5_3, +		GP_4_14_FN, FN_IP10_2_0, +		GP_4_13_FN, FN_IP9_31_29, +		GP_4_12_FN, FN_VI0_DATA7_VI0_B7, +		GP_4_11_FN, FN_VI0_DATA6_VI0_B6, +		GP_4_10_FN, FN_VI0_DATA5_VI0_B5, +		GP_4_9_FN, FN_VI0_DATA4_VI0_B4, +		GP_4_8_FN, FN_IP9_28_27, +		GP_4_7_FN, FN_VI0_DATA2_VI0_B2, +		GP_4_6_FN, FN_VI0_DATA1_VI0_B1, +		GP_4_5_FN, FN_VI0_DATA0_VI0_B0, +		GP_4_4_FN, FN_IP9_26_25, +		GP_4_3_FN, FN_IP9_24_23, +		GP_4_2_FN, FN_IP9_22_21, +		GP_4_1_FN, FN_IP9_20_19, +		GP_4_0_FN, FN_VI0_CLK } +	}, +	{ PINMUX_CFG_REG("GPSR5", 0xE6060018, 32, 1) { +		GP_5_31_FN, FN_IP3_24_22, +		GP_5_30_FN, FN_IP13_9_7, +		GP_5_29_FN, FN_IP13_6_5, +		GP_5_28_FN, FN_IP13_4_3, +		GP_5_27_FN, FN_IP13_2_0, +		GP_5_26_FN, FN_IP12_29_27, +		GP_5_25_FN, FN_IP12_26_24, +		GP_5_24_FN, FN_IP12_23_22, +		GP_5_23_FN, FN_IP12_21_20, +		GP_5_22_FN, FN_IP12_19_18, +		GP_5_21_FN, FN_IP12_17_16, +		GP_5_20_FN, FN_IP12_15_13, +		GP_5_19_FN, FN_IP12_12_10, +		GP_5_18_FN, FN_IP12_9_7, +		GP_5_17_FN, FN_IP12_6_4, +		GP_5_16_FN, FN_IP12_3_2, +		GP_5_15_FN, FN_IP12_1_0, +		GP_5_14_FN, FN_IP11_31_30, +		GP_5_13_FN, FN_IP11_29_28, +		GP_5_12_FN, FN_IP11_27, +		GP_5_11_FN, FN_IP11_26, +		GP_5_10_FN, FN_IP11_25, +		GP_5_9_FN, FN_IP11_24, +		GP_5_8_FN, FN_IP11_23, +		GP_5_7_FN, FN_IP11_22, +		GP_5_6_FN, FN_IP11_21, +		GP_5_5_FN, FN_IP11_20, +		GP_5_4_FN, FN_IP11_19, +		GP_5_3_FN, FN_IP11_18_17, +		GP_5_2_FN, FN_IP11_16_15, +		GP_5_1_FN, FN_IP11_14_12, +		GP_5_0_FN, FN_IP11_11_9 } +	}, +	{ PINMUX_CFG_REG("GPSR6", 0xE606001C, 32, 1) { +		GP_6_31_FN, FN_DU0_DOTCLKIN, +		GP_6_30_FN, FN_USB1_OVC, +		GP_6_29_FN, FN_IP14_31_29, +		GP_6_28_FN, FN_IP14_28_26, +		GP_6_27_FN, FN_IP14_25_23, +		GP_6_26_FN, FN_IP14_22_20, +		GP_6_25_FN, FN_IP14_19_17, +		GP_6_24_FN, FN_IP14_16_14, +		GP_6_23_FN, FN_IP14_13_11, +		GP_6_22_FN, FN_IP14_10_8, +		GP_6_21_FN, FN_IP14_7, +		GP_6_20_FN, FN_IP14_6, +		GP_6_19_FN, FN_IP14_5, +		GP_6_18_FN, FN_IP14_4, +		GP_6_17_FN, FN_IP14_3, +		GP_6_16_FN, FN_IP14_2, +		GP_6_15_FN, FN_IP14_1_0, +		GP_6_14_FN, FN_IP13_30_28, +		GP_6_13_FN, FN_IP13_27, +		GP_6_12_FN, FN_IP13_26, +		GP_6_11_FN, FN_IP13_25, +		GP_6_10_FN, FN_IP13_24_23, +		GP_6_9_FN, FN_IP13_22, +		GP_6_8_FN, FN_SD1_CLK, +		GP_6_7_FN, FN_IP13_21_19, +		GP_6_6_FN, FN_IP13_18_16, +		GP_6_5_FN, FN_IP13_15, +		GP_6_4_FN, FN_IP13_14, +		GP_6_3_FN, FN_IP13_13, +		GP_6_2_FN, FN_IP13_12, +		GP_6_1_FN, FN_IP13_11, +		GP_6_0_FN, FN_IP13_10 } +	}, +	{ PINMUX_CFG_REG("GPSR7", 0xE6060074, 32, 1) { +		0, 0, +		0, 0, +		0, 0, +		0, 0, +		0, 0, +		0, 0, +		GP_7_25_FN, FN_USB1_PWEN, +		GP_7_24_FN, FN_USB0_OVC, +		GP_7_23_FN, FN_USB0_PWEN, +		GP_7_22_FN, FN_IP15_14_12, +		GP_7_21_FN, FN_IP15_11_9, +		GP_7_20_FN, FN_IP15_8_6, +		GP_7_19_FN, FN_IP7_2_0, +		GP_7_18_FN, FN_IP6_29_27, +		GP_7_17_FN, FN_IP6_26_24, +		GP_7_16_FN, FN_IP6_23_21, +		GP_7_15_FN, FN_IP6_20_19, +		GP_7_14_FN, FN_IP6_18_16, +		GP_7_13_FN, FN_IP6_15_14, +		GP_7_12_FN, FN_IP6_13_12, +		GP_7_11_FN, FN_IP6_11_10, +		GP_7_10_FN, FN_IP6_9_8, +		GP_7_9_FN, FN_IP16_11_10, +		GP_7_8_FN, FN_IP16_9_8, +		GP_7_7_FN, FN_IP16_7_6, +		GP_7_6_FN, FN_IP16_5_3, +		GP_7_5_FN, FN_IP16_2_0, +		GP_7_4_FN, FN_IP15_29_27, +		GP_7_3_FN, FN_IP15_26_24, +		GP_7_2_FN, FN_IP15_23_21, +		GP_7_1_FN, FN_IP15_20_18, +		GP_7_0_FN, FN_IP15_17_15 } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR0", 0xE6060020, 32, +			     1, 2, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, +			     1, 1, 1, 1, 1, 1, 1, 1) { +		/* IP0_31 [1] */ +		0, 0, +		/* IP0_30_29 [2] */ +		FN_A6, FN_MSIOF1_SCK, +		0, 0, +		/* IP0_28_27 [2] */ +		FN_A5, FN_MSIOF0_RXD_B, +		0, 0, +		/* IP0_26_25 [2] */ +		FN_A4, FN_MSIOF0_TXD_B, +		0, 0, +		/* IP0_24_23 [2] */ +		FN_A3, FN_MSIOF0_SS2_B, +		0, 0, +		/* IP0_22_21 [2] */ +		FN_A2, FN_MSIOF0_SS1_B, +		0, 0, +		/* IP0_20_19 [2] */ +		FN_A1, FN_MSIOF0_SYNC_B, +		0, 0, +		/* IP0_18_16 [3] */ +		FN_A0, FN_ATAWR0_N_C, FN_MSIOF0_SCK_B, FN_SCL0_C, FN_PWM2_B, +		0, 0, 0, +		/* IP0_15 [1] */ +		FN_D15, 0, +		/* IP0_14 [1] */ +		FN_D14, 0, +		/* IP0_13 [1] */ +		FN_D13, 0, +		/* IP0_12 [1] */ +		FN_D12, 0, +		/* IP0_11 [1] */ +		FN_D11, 0, +		/* IP0_10 [1] */ +		FN_D10, 0, +		/* IP0_9 [1] */ +		FN_D9, 0, +		/* IP0_8 [1] */ +		FN_D8, 0, +		/* IP0_7 [1] */ +		FN_D7, 0, +		/* IP0_6 [1] */ +		FN_D6, 0, +		/* IP0_5 [1] */ +		FN_D5, 0, +		/* IP0_4 [1] */ +		FN_D4, 0, +		/* IP0_3 [1] */ +		FN_D3, 0, +		/* IP0_2 [1] */ +		FN_D2, 0, +		/* IP0_1 [1] */ +		FN_D1, 0, +		/* IP0_0 [1] */ +		FN_D0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR1", 0xE6060024, 32, +			     3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2) { +		/* IP1_31_29 [3] */ +		FN_A18, FN_DREQ1, FN_SCIFA1_RXD_C, 0, FN_SCIFB1_RXD_C, +		0, 0, 0, +		/* IP1_28_26 [3] */ +		FN_A17, FN_DACK2_B, 0, FN_SDA0_C, +		0, 0, 0, 0, +		/* IP1_25_23 [3] */ +		FN_A16, FN_DREQ2_B, FN_FMCLK_C, 0, FN_SCIFA1_SCK_B, +		0, 0, 0, +		/* IP1_22_20 [3] */ +		FN_A15, FN_BPFCLK_C, +		0, 0, 0, 0, 0, 0, +		/* IP1_19_17 [3] */ +		FN_A14, FN_ATADIR0_N_C, FN_FMIN, FN_FMIN_C, FN_MSIOF1_SYNC_D, +		0, 0, 0, +		/* IP1_16_14 [3] */ +		FN_A13, FN_ATAG0_N_C, FN_BPFCLK, FN_MSIOF1_SS1_D, +		0, 0, 0, 0, +		/* IP1_13_11 [3] */ +		FN_A12, FN_FMCLK, FN_SDA3_D, FN_MSIOF1_SCK_D, +		0, 0, 0, 0, +		/* IP1_10_8 [3] */ +		FN_A11, FN_MSIOF1_RXD, FN_SCL3_D, FN_MSIOF1_RXD_D, +		0, 0, 0, 0, +		/* IP1_7_6 [2] */ +		FN_A10, FN_MSIOF1_TXD, 0, FN_MSIOF1_TXD_D, +		/* IP1_5_4 [2] */ +		FN_A9, FN_MSIOF1_SS2, FN_SDA0, 0, +		/* IP1_3_2 [2] */ +		FN_A8, FN_MSIOF1_SS1, FN_SCL0, 0, +		/* IP1_1_0 [2] */ +		FN_A7, FN_MSIOF1_SYNC, +		0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR2", 0xE6060028, 32, +			     2, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 3) { +		/* IP2_31_20 [2] */ +		0, 0, 0, 0, +		/* IP2_29_27 [3] */ +		FN_EX_CS3_N, FN_ATADIR0_N, FN_MSIOF2_TXD, +		FN_ATAG0_N, 0, FN_EX_WAIT1, +		0, 0, +		/* IP2_26_25 [2] */ +		FN_EX_CS2_N, FN_ATAWR0_N, FN_MSIOF2_SYNC, 0, +		/* IP2_24_23 [2] */ +		FN_EX_CS1_N, FN_MSIOF2_SCK, 0, 0, +		/* IP2_22_21 [2] */ +		FN_CS1_N_A26, FN_ATADIR0_N_B, FN_SDA1, 0, +		/* IP2_20_19 [2] */ +		FN_CS0_N, FN_ATAG0_N_B, FN_SCL1, 0, +		/* IP2_18_16 [3] */ +		FN_A25, FN_DACK2, FN_SSL, FN_DREQ1_C, FN_RX1, FN_SCIFA1_RXD, +		0, 0, +		/* IP2_15_13 [3] */ +		FN_A24, FN_DREQ2, FN_IO3, FN_TX1, FN_SCIFA1_TXD, +		0, 0, 0, +		/* IP2_12_0 [3] */ +		FN_A23, FN_IO2, FN_BPFCLK_B, FN_RX0, FN_SCIFA0_RXD, +		0, 0, 0, +		/* IP2_9_7 [3] */ +		FN_A22, FN_MISO_IO1, FN_FMCLK_B, FN_TX0, FN_SCIFA0_TXD, +		0, 0, 0, +		/* IP2_6_5 [2] */ +		FN_A21, FN_ATAWR0_N_B, FN_MOSI_IO0, 0, +		/* IP2_4_3 [2] */ +		FN_A20, FN_SPCLK, 0, 0, +		/* IP2_2_0 [3] */ +		FN_A19, FN_DACK1, FN_SCIFA1_TXD_C, 0, +		FN_SCIFB1_TXD_C, 0, FN_SCIFB1_SCK_B, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR3", 0xE606002C, 32, +			     1, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3) { +		/* IP3_31 [1] */ +		0, 0, +		/* IP3_30_28 [3] */ +		FN_SSI_WS0129, FN_HTX0_C, FN_HTX2_C, +		FN_SCIFB0_TXD_C, FN_SCIFB2_TXD_C, +		0, 0, 0, +		/* IP3_27_25 [3] */ +		FN_SSI_SCK0129, FN_HRX0_C, FN_HRX2_C, +		FN_SCIFB0_RXD_C, FN_SCIFB2_RXD_C, +		0, 0, 0, +		/* IP3_24_22 [3] */ +		FN_SPEEDIN, 0, FN_HSCK0_C, FN_HSCK2_C, FN_SCIFB0_SCK_B, +		FN_SCIFB2_SCK_B, FN_DREQ2_C, FN_HTX2_D, +		/* IP3_21_20 [2] */ +		FN_DACK0, FN_DRACK0, FN_REMOCON, 0, +		/* IP3_19_18 [2] */ +		FN_DREQ0, FN_PWM3, FN_TPU_TO3, 0, +		/* IP3_17_16 [2] */ +		FN_EX_WAIT0, FN_HRTS2_N_B, FN_SCIFB0_CTS_N_B, 0, +		/* IP3_15_14 [2] */ +		FN_WE1_N, FN_ATARD0_N_B, FN_HTX2_B, FN_SCIFB0_RTS_N_B, +		/* IP3_13_12 [2] */ +		FN_WE0_N, FN_HCTS2_N_B, FN_SCIFB0_TXD_B, 0, +		/* IP3_11_9 [3] */ +		FN_RD_WR_N, FN_HRX2_B, FN_FMIN_B, FN_SCIFB0_RXD_B, FN_DREQ1_D, +		0, 0, 0, +		/* IP3_8_6 [3] */ +		FN_BS_N, FN_ATACS10_N, FN_MSIOF2_SS2, FN_HTX1_B, +		FN_SCIFB1_TXD_B, FN_PWM2, FN_TPU_TO2, 0, +		/* IP3_5_3 [3] */ +		FN_EX_CS5_N, FN_ATACS00_N, FN_MSIOF2_SS1, FN_HRX1_B, +		FN_SCIFB1_RXD_B, FN_PWM1, FN_TPU_TO1, 0, +		/* IP3_2_0 [3] */ +		FN_EX_CS4_N, FN_ATARD0_N, FN_MSIOF2_RXD, 0, FN_EX_WAIT2, +		0, 0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR4", 0xE6060030, 32, +			     1, 3, 2, 2, 2, 1, 1, 1, 3, 3, 3, 2, 3, 3, 2) { +		/* IP4_31 [1] */ +		0, 0, +		/* IP4_30_28 [3] */ +		FN_SSI_SCK5, FN_MSIOF1_SCK_C, FN_TS_SDATA0, FN_GLO_I0, +		FN_MSIOF2_SYNC_D, FN_VI1_R2_B, +		0, 0, +		/* IP4_27_26 [2] */ +		FN_SSI_SDATA4, FN_MSIOF2_SCK_D, 0, 0, +		/* IP4_25_24 [2] */ +		FN_SSI_WS4, FN_GLO_RFON_D, 0, 0, +		/* IP4_23_22 [2] */ +		FN_SSI_SCK4, FN_GLO_SS_D, 0, 0, +		/* IP4_21 [1] */ +		FN_SSI_SDATA3, 0, +		/* IP4_20 [1] */ +		FN_SSI_WS34, 0, +		/* IP4_19 [1] */ +		FN_SSI_SCK34, 0, +		/* IP4_18_16 [3] */ +		FN_SSI_SDATA2, FN_GPS_MAG_B, FN_TX2_E, FN_HRTS1_N_E, +		0, 0, 0, 0, +		/* IP4_15_13 [3] */ +		FN_SSI_WS2, FN_SDA2, FN_GPS_SIGN_B, FN_RX2_E, +		FN_GLO_Q1_D, FN_HCTS1_N_E, +		0, 0, +		/* IP4_12_10 [3] */ +		FN_SSI_SCK2, FN_SCL2, FN_GPS_CLK_B, FN_GLO_Q0_D, FN_HSCK1_E, +		0, 0, 0, +		/* IP4_9_8 [2] */ +		FN_SSI_SDATA1, FN_SDA1_B, FN_SDA8_B, FN_MSIOF2_RXD_C, +		/* IP4_7_5 [3] */ +		FN_SSI_WS1, FN_SCL1_B, FN_SCL8_B, FN_MSIOF2_TXD_C, FN_GLO_I1_D, +		0, 0, 0, +		/* IP4_4_2 [3] */ +		FN_SSI_SCK1, FN_SDA0_B, FN_SDA7_B, +		FN_MSIOF2_SYNC_C, FN_GLO_I0_D, +		0, 0, 0, +		/* IP4_1_0 [2] */ +		FN_SSI_SDATA0, FN_SCL0_B, FN_SCL7_B, FN_MSIOF2_SCK_C, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR5", 0xE6060034, 32, +			     3, 3, 2, 2, 2, 3, 2, 3, 3, 3, 3, 3) { +		/* IP5_31_29 [3] */ +		FN_SSI_SDATA9, FN_RX3_D, FN_CAN0_RX_D, +		0, 0, 0, 0, 0, +		/* IP5_28_26 [3] */ +		FN_SSI_WS9, FN_TX3_D, FN_CAN0_TX_D, FN_GLO_SDATA_D, +		0, 0, 0, 0, +		/* IP5_25_24 [2] */ +		FN_SSI_SCK9, FN_RX1_D, FN_GLO_SCLK_D, 0, +		/* IP5_23_22 [2] */ +		FN_SSI_SDATA8, FN_TX1_D, FN_STP_ISSYNC_0_B, 0, +		/* IP5_21_20 [2] */ +		FN_SSI_SDATA7, FN_RX0_D, FN_STP_ISEN_0_B, 0, +		/* IP5_19_17 [3] */ +		FN_SSI_WS78, FN_TX0_D, FN_STP_ISD_0_B, FN_GLO_RFON, +		0, 0, 0, 0, +		/* IP5_16_15 [2] */ +		FN_SSI_SCK78, FN_STP_ISCLK_0_B, FN_GLO_SS, 0, +		/* IP5_14_12 [3] */ +		FN_SSI_SDATA6, FN_STP_IVCXO27_0_B, FN_GLO_SDATA, FN_VI1_R7_B, +		0, 0, 0, 0, +		/* IP5_11_9 [3] */ +		FN_SSI_WS6, FN_GLO_SCLK, FN_MSIOF2_SS2_D, FN_VI1_R6_B, +		0, 0, 0, 0, +		/* IP5_8_6 [3] */ +		FN_SSI_SCK6, FN_MSIOF1_RXD_C, FN_TS_SPSYNC0, FN_GLO_Q1, +		FN_MSIOF2_RXD_D, FN_VI1_R5_B, +		0, 0, +		/* IP5_5_3 [3] */ +		FN_SSI_SDATA5, FN_MSIOF1_TXD_C, FN_TS_SDEN0, FN_GLO_Q0, +		FN_MSIOF2_SS1_D, FN_VI1_R4_B, +		0, 0, +		/* IP5_2_0 [3] */ +		FN_SSI_WS5, FN_MSIOF1_SYNC_C, FN_TS_SCK0, FN_GLO_I1, +		FN_MSIOF2_TXD_D, FN_VI1_R3_B, +		0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR6", 0xE6060038, 32, +			     2, 3, 3, 3, 2, 3, 2, 2, 2, 2, 2, 3, 3) { +		/* IP6_31_30 [2] */ +		0, 0, 0, 0, +		/* IP6_29_27 [3] */ +		FN_IRQ8, FN_HRTS1_N_C, FN_MSIOF1_RXD_B, +		FN_GPS_SIGN_C, FN_GPS_SIGN_D, +		0, 0, 0, +		/* IP6_26_24 [3] */ +		FN_IRQ7, FN_HCTS1_N_C, FN_MSIOF1_TXD_B, +		FN_GPS_CLK_C, FN_GPS_CLK_D, +		0, 0, 0, +		/* IP6_23_21 [3] */ +		FN_IRQ6, FN_HSCK1_C, FN_MSIOF1_SS2_B, +		FN_SDA1_E, FN_MSIOF2_SYNC_E, +		0, 0, 0, +		/* IP6_20_19 [2] */ +		FN_IRQ5, FN_HTX1_C, FN_SCL1_E, FN_MSIOF2_SCK_E, +		/* IP6_18_16 [3] */ +		FN_IRQ4, FN_HRX1_C, FN_SDA4_C, FN_MSIOF2_RXD_E, FN_INTC_IRQ4_N, +		0, 0, 0, +		/* IP6_15_14 [2] */ +		FN_IRQ3, FN_SCL4_C, FN_MSIOF2_TXD_E, FN_INTC_IRQ3_N, +		/* IP6_13_12 [2] */ +		FN_IRQ2, FN_SCIFB1_TXD_D, FN_INTC_IRQ2_N, 0, +		/* IP6_11_10 [2] */ +		FN_IRQ1, FN_SCIFB1_SCK_C, FN_INTC_IRQ1_N, 0, +		/* IP6_9_8 [2] */ +		FN_IRQ0, FN_SCIFB1_RXD_D, FN_INTC_IRQ0_N, 0, +		/* IP6_7_6 [2] */ +		FN_AUDIO_CLKOUT, FN_MSIOF1_SS1_B, FN_TX2, FN_SCIFA2_TXD, +		/* IP6_5_3 [3] */ +		FN_AUDIO_CLKC, FN_SCIFB0_SCK_C, FN_MSIOF1_SYNC_B, FN_RX2, +		FN_SCIFA2_RXD, FN_FMIN_E, +		0, 0, +		/* IP6_2_0 [3] */ +		FN_AUDIO_CLKB, FN_STP_OPWM_0_B, FN_MSIOF1_SCK_B, +		FN_SCIF_CLK, 0, FN_BPFCLK_E, +		0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR7", 0xE606003C, 32, +			     2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3) { +		/* IP7_31_30 [2] */ +		0, 0, 0, 0, +		/* IP7_29_27 [3] */ +		FN_DU1_DG2, FN_LCDOUT10, FN_VI1_DATA4_B, FN_SCIF1_SCK_B, +		FN_SCIFA1_SCK, FN_SSI_SCK78_B, +		0, 0, +		/* IP7_26_24 [3] */ +		FN_DU1_DG1, FN_LCDOUT9, FN_VI1_DATA3_B, FN_RX1_B, +		FN_SCIFA1_RXD_B, FN_MSIOF2_SS2_B, +		0, 0, +		/* IP7_23_21 [3] */ +		FN_DU1_DG0, FN_LCDOUT8, FN_VI1_DATA2_B, FN_TX1_B, +		FN_SCIFA1_TXD_B, FN_MSIOF2_SS1_B, +		0, 0, +		/* IP7_20_19 [2] */ +		FN_DU1_DR7, FN_LCDOUT7, FN_SSI_SDATA1_B, 0, +		/* IP7_18_17 [2] */ +		FN_DU1_DR6, FN_LCDOUT6, FN_SSI_WS1_B, 0, +		/* IP7_16_15 [2] */ +		FN_DU1_DR5, FN_LCDOUT5, FN_SSI_SCK1_B, 0, +		/* IP7_14_13 [2] */ +		FN_DU1_DR4, FN_LCDOUT4, FN_SSI_SDATA0_B, 0, +		/* IP7_12_11 [2] */ +		FN_DU1_DR3, FN_LCDOUT3, FN_SSI_WS0129_B, 0, +		/* IP7_10_9 [2] */ +		FN_DU1_DR2, FN_LCDOUT2, FN_SSI_SCK0129_B, 0, +		/* IP7_8_6 [3] */ +		FN_DU1_DR1, FN_LCDOUT1, FN_VI1_DATA1_B, FN_RX0_B, +		FN_SCIFA0_RXD_B, FN_MSIOF2_SYNC_B, +		0, 0, +		/* IP7_5_3 [3] */ +		FN_DU1_DR0, FN_LCDOUT0, FN_VI1_DATA0_B, FN_TX0_B, +		FN_SCIFA0_TXD_B, FN_MSIOF2_SCK_B, +		0, 0, +		/* IP7_2_0 [3] */ +		FN_IRQ9, FN_DU1_DOTCLKIN_B, FN_CAN_CLK_D, FN_GPS_MAG_C, +		FN_SCIF_CLK_B, FN_GPS_MAG_D, +		0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR8", 0xE6060040, 32, +			     1, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3) { +		/* IP8_31 [1] */ +		0, 0, +		/* IP8_30_28 [3] */ +		FN_DU1_DB5, FN_LCDOUT21, FN_TX3, FN_SCIFA3_TXD, FN_CAN1_TX, +		0, 0, 0, +		/* IP8_27_26 [2] */ +		FN_DU1_DB4, FN_LCDOUT20, FN_VI1_FIELD_B, FN_CAN1_RX, +		/* IP8_25_24 [2] */ +		FN_DU1_DB3, FN_LCDOUT19, FN_VI1_CLKENB_B, 0, +		/* IP8_23_21 [3] */ +		FN_DU1_DB2, FN_LCDOUT18, FN_VI1_VSYNC_N_B, FN_SCIF2_SCK_B, +		FN_SCIFA2_SCK, FN_SSI_SDATA9_B, +		0, 0, +		/* IP8_20_18 [3] */ +		FN_DU1_DB1, FN_LCDOUT17, FN_VI1_HSYNC_N_B, FN_RX2_B, +		FN_SCIFA2_RXD_B, FN_MSIOF2_RXD_B, +		0, 0, +		/* IP8_17_15 [3] */ +		FN_DU1_DB0, FN_LCDOUT16, FN_VI1_CLK_B, FN_TX2_B, +		FN_SCIFA2_TXD_B, FN_MSIOF2_TXD_B, +		0, 0, +		/* IP8_14_12 [3] */ +		FN_DU1_DG7, FN_LCDOUT15, FN_HTX0_B, +		FN_SCIFB2_RTS_N_B, FN_SSI_WS9_B, +		0, 0, 0, +		/* IP8_11_9 [3] */ +		FN_DU1_DG6, FN_LCDOUT14, FN_HRTS0_N_B, +		FN_SCIFB2_CTS_N_B, FN_SSI_SCK9_B, +		0, 0, 0, +		/* IP8_8_6 [3] */ +		FN_DU1_DG5, FN_LCDOUT13, FN_VI1_DATA7_B, FN_HCTS0_N_B, +		FN_SCIFB2_TXD_B, FN_SSI_SDATA8_B, +		0, 0, +		/* IP8_5_3 [3] */ +		FN_DU1_DG4, FN_LCDOUT12, FN_VI1_DATA6_B, FN_HRX0_B, +		FN_SCIFB2_RXD_B, FN_SSI_SDATA7_B, +		0, 0, +		/* IP8_2_0 [3] */ +		FN_DU1_DG3, FN_LCDOUT11, FN_VI1_DATA5_B, 0, FN_SSI_WS78_B, +		0, 0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, +			     3, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 1, 1, 3, 3) { +		/* IP9_31_29 [3] */ +		FN_VI0_G0, FN_SCL8, FN_STP_IVCXO27_0_C, FN_SCL4, +		FN_HCTS2_N, FN_SCIFB2_CTS_N, FN_ATAWR1_N, 0, +		/* IP9_28_27 [2] */ +		FN_VI0_DATA3_VI0_B3, FN_SCIF3_SCK_B, FN_SCIFA3_SCK_B, 0, +		/* IP9_26_25 [2] */ +		FN_VI0_VSYNC_N, FN_RX5, FN_SCIFA5_RXD, FN_TS_SPSYNC0_D, +		/* IP9_24_23 [2] */ +		FN_VI0_HSYNC_N, FN_TX5, FN_SCIFA5_TXD, FN_TS_SDEN0_D, +		/* IP9_22_21 [2] */ +		FN_VI0_FIELD, FN_RX4, FN_SCIFA4_RXD, FN_TS_SCK0_D, +		/* IP9_20_19 [2] */ +		FN_VI0_CLKENB, FN_TX4, FN_SCIFA4_TXD, FN_TS_SDATA0_D, +		/* IP9_18_17 [2] */ +		FN_DU1_CDE, FN_QPOLB, FN_PWM4_B, 0, +		/* IP9_16 [1] */ +		FN_DU1_DISP, FN_QPOLA, +		/* IP9_15_13 [3] */ +		FN_DU1_EXODDF_DU1_ODDF_DISP_CDE, FN_QCPV_QDE, +		FN_CAN0_RX, FN_RX3_B, FN_SDA2_B, +		0, 0, 0, +		/* IP9_12 [1] */ +		FN_DU1_EXVSYNC_DU1_VSYNC, FN_QSTB_QHE, +		/* IP9_11 [1] */ +		FN_DU1_EXHSYNC_DU1_HSYNC, FN_QSTH_QHS, +		/* IP9_10_8 [3] */ +		FN_DU1_DOTCLKOUT1, FN_QSTVB_QVE, FN_CAN0_TX, +		FN_TX3_B, FN_SCL2_B, FN_PWM4, +		0, 0, +		/* IP9_7 [1] */ +		FN_DU1_DOTCLKOUT0, FN_QCLK, +		/* IP9_6 [1] */ +		FN_DU1_DOTCLKIN, FN_QSTVA_QVS, +		/* IP9_5_3 [3] */ +		FN_DU1_DB7, FN_LCDOUT23, FN_SDA3_C, +		FN_SCIF3_SCK, FN_SCIFA3_SCK, +		0, 0, 0, +		/* IP9_2_0 [3] */ +		FN_DU1_DB6, FN_LCDOUT22, FN_SCL3_C, FN_RX3, FN_SCIFA3_RXD, +		0, 0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR10", 0xE6060048, 32, +			     3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 3, 3) { +		/* IP10_31_29 [3] */ +		FN_VI0_R4, FN_VI2_DATA5, FN_GLO_SCLK_B, FN_TX0_C, FN_SCL1_D, +		0, 0, 0, +		/* IP10_28_27 [2] */ +		FN_VI0_R3, FN_VI2_DATA4, FN_GLO_Q1_B, FN_TS_SPSYNC0_C, +		/* IP10_26_25 [2] */ +		FN_VI0_R2, FN_VI2_DATA3, FN_GLO_Q0_B, FN_TS_SDEN0_C, +		/* IP10_24_22 [3] */ +		FN_VI0_R1, FN_VI2_DATA2, FN_GLO_I1_B, FN_TS_SCK0_C, FN_ATAG1_N, +		0, 0, 0, +		/* IP10_21_29 [3] */ +		FN_VI0_R0, FN_VI2_DATA1, FN_GLO_I0_B, +		FN_TS_SDATA0_C, FN_ATACS11_N, +		0, 0, 0, +		/* IP10_18_17 [2] */ +		FN_VI0_G7, FN_VI2_DATA0, FN_FMIN_D, 0, +		/* IP10_16_15 [2] */ +		FN_VI0_G6, FN_VI2_CLK, FN_BPFCLK_D, 0, +		/* IP10_14_12 [3] */ +		FN_VI0_G5, FN_VI2_FIELD, FN_STP_OPWM_0_C, FN_FMCLK_D, +		FN_CAN0_TX_E, FN_HTX1_D, FN_SCIFB0_TXD_D, 0, +		/* IP10_11_9 [3] */ +		FN_VI0_G4, FN_VI2_CLKENB, FN_STP_ISSYNC_0_C, +		FN_HTX2, FN_SCIFB2_TXD, FN_SCIFB0_SCK_D, +		0, 0, +		/* IP10_8_6 [3] */ +		FN_VI0_G3, FN_VI2_VSYNC_N, FN_STP_ISEN_0_C, FN_SDA3_B, +		FN_HRX2, FN_SCIFB2_RXD, FN_ATACS01_N, 0, +		/* IP10_5_3 [3] */ +		FN_VI0_G2, FN_VI2_HSYNC_N, FN_STP_ISD_0_C, FN_SCL3_B, +		FN_HSCK2, FN_SCIFB2_SCK, FN_ATARD1_N, 0, +		/* IP10_2_0 [3] */ +		FN_VI0_G1, FN_SDA8, FN_STP_ISCLK_0_C, FN_SDA4, +		FN_HRTS2_N, FN_SCIFB2_RTS_N, FN_ATADIR1_N, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR11", 0xE606004C, 32, +			     2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, +			     3, 3, 3, 3, 3) { +		/* IP11_31_30 [2] */ +		FN_ETH_CRS_DV, FN_AVB_LINK, FN_SDA2_C, 0, +		/* IP11_29_28 [2] */ +		FN_ETH_MDIO, FN_AVB_RX_CLK, FN_SCL2_C, 0, +		/* IP11_27 [1] */ +		FN_VI1_DATA7, FN_AVB_MDC, +		/* IP11_26 [1] */ +		FN_VI1_DATA6, FN_AVB_MAGIC, +		/* IP11_25 [1] */ +		FN_VI1_DATA5, FN_AVB_RX_DV, +		/* IP11_24 [1] */ +		FN_VI1_DATA4, FN_AVB_MDIO, +		/* IP11_23 [1] */ +		FN_VI1_DATA3, FN_AVB_RX_ER, +		/* IP11_22 [1] */ +		FN_VI1_DATA2, FN_AVB_RXD7, +		/* IP11_21 [1] */ +		FN_VI1_DATA1, FN_AVB_RXD6, +		/* IP11_20 [1] */ +		FN_VI1_DATA0, FN_AVB_RXD5, +		/* IP11_19 [1] */ +		FN_VI1_CLK, FN_AVB_RXD4, +		/* IP11_18_17 [2] */ +		FN_VI1_FIELD, FN_AVB_RXD3, FN_TS_SPSYNC0_B, 0, +		/* IP11_16_15 [2] */ +		FN_VI1_CLKENB, FN_AVB_RXD2, FN_TS_SDEN0_B, 0, +		/* IP11_14_12 [3] */ +		FN_VI1_VSYNC_N, FN_AVB_RXD1, FN_TS_SCK0_B, +		FN_RX4_B, FN_SCIFA4_RXD_B, +		0, 0, 0, +		/* IP11_11_9 [3] */ +		FN_VI1_HSYNC_N, FN_AVB_RXD0, FN_TS_SDATA0_B, +		FN_TX4_B, FN_SCIFA4_TXD_B, +		0, 0, 0, +		/* IP11_8_6 [3] */ +		FN_VI0_R7, FN_GLO_RFON_B, FN_RX1_C, FN_CAN0_RX_E, +		FN_SDA4_B, FN_HRX1_D, FN_SCIFB0_RXD_D, 0, +		/* IP11_5_3 [3] */ +		FN_VI0_R6, FN_VI2_DATA7, FN_GLO_SS_B, FN_TX1_C, FN_SCL4_B, +		0, 0, 0, +		/* IP11_2_0 [3] */ +		FN_VI0_R5, FN_VI2_DATA6, FN_GLO_SDATA_B, FN_RX0_C, FN_SDA1_D, +		0, 0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR12", 0xE6060050, 32, +			     2, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2) { +		/* IP12_31_30 [2] */ +		0, 0, 0, 0, +		/* IP12_29_27 [3] */ +		FN_STP_ISCLK_0, FN_AVB_TX_EN, FN_SCIFB2_RXD_D, +		FN_ADICS_SAMP_B, FN_MSIOF0_SCK_C, +		0, 0, 0, +		/* IP12_26_24 [3] */ +		FN_STP_IVCXO27_0, FN_AVB_TXD7, FN_SCIFB2_TXD_D, +		FN_ADIDATA_B, FN_MSIOF0_SYNC_C, +		0, 0, 0, +		/* IP12_23_22 [2] */ +		FN_ETH_MDC, FN_AVB_TXD6, FN_IERX_C, 0, +		/* IP12_21_20 [2] */ +		FN_ETH_TXD0, FN_AVB_TXD5, FN_IECLK_C, 0, +		/* IP12_19_18 [2] */ +		FN_ETH_MAGIC, FN_AVB_TXD4, FN_IETX_C, 0, +		/* IP12_17_16 [2] */ +		FN_ETH_TX_EN, FN_AVB_TXD3, FN_TCLK1_B, FN_CAN_CLK_B, +		/* IP12_15_13 [3] */ +		FN_ETH_TXD1, FN_AVB_TXD2, FN_SCIFA3_TXD_B, +		FN_CAN1_TX_C, FN_MSIOF1_TXD_E, +		0, 0, 0, +		/* IP12_12_10 [3] */ +		FN_ETH_REFCLK, FN_AVB_TXD1, FN_SCIFA3_RXD_B, +		FN_CAN1_RX_C, FN_MSIOF1_SYNC_E, +		0, 0, 0, +		/* IP12_9_7 [3] */ +		FN_ETH_LINK, FN_AVB_TXD0, FN_CAN0_RX_C, +		FN_SDA2_D, FN_MSIOF1_SCK_E, +		0, 0, 0, +		/* IP12_6_4 [3] */ +		FN_ETH_RXD1, FN_AVB_GTXREFCLK, FN_CAN0_TX_C, +		FN_SCL2_D, FN_MSIOF1_RXD_E, +		0, 0, 0, +		/* IP12_3_2 [2] */ +		FN_ETH_RXD0, FN_AVB_PHY_INT, FN_SDA3, FN_SDA7, +		/* IP12_1_0 [2] */ +		FN_ETH_RX_ER, FN_AVB_CRS, FN_SCL3, FN_SCL7, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR13", 0xE6060054, 32, +			     1, 3, 1, 1, 1, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, +			     3, 2, 2, 3) { +		/* IP13_31 [1] */ +		0, 0, +		/* IP13_30_28 [3] */ +		FN_SD1_CD, FN_PWM0, FN_TPU_TO0, FN_SCL1_C, +		0, 0, 0, 0, +		/* IP13_27 [1] */ +		FN_SD1_DATA3, FN_IERX_B, +		/* IP13_26 [1] */ +		FN_SD1_DATA2, FN_IECLK_B, +		/* IP13_25 [1] */ +		FN_SD1_DATA1, FN_IETX_B, +		/* IP13_24_23 [2] */ +		FN_SD1_DATA0, FN_SPEEDIN_B, 0, 0, +		/* IP13_22 [1] */ +		FN_SD1_CMD, FN_REMOCON_B, +		/* IP13_21_19 [3] */ +		FN_SD0_WP, FN_MMC_D7_B, FN_SIM0_D_B, FN_CAN0_TX_F, +		FN_SCIFA5_RXD_B, FN_RX3_C, +		0, 0, +		/* IP13_18_16 [3] */ +		FN_SD0_CD, FN_MMC_D6_B, FN_SIM0_RST_B, FN_CAN0_RX_F, +		FN_SCIFA5_TXD_B, FN_TX3_C, +		0, 0, +		/* IP13_15 [1] */ +		FN_SD0_DATA3, FN_SSL_B, +		/* IP13_14 [1] */ +		FN_SD0_DATA2, FN_IO3_B, +		/* IP13_13 [1] */ +		FN_SD0_DATA1, FN_IO2_B, +		/* IP13_12 [1] */ +		FN_SD0_DATA0, FN_MISO_IO1_B, +		/* IP13_11 [1] */ +		FN_SD0_CMD, FN_MOSI_IO0_B, +		/* IP13_10 [1] */ +		FN_SD0_CLK, FN_SPCLK_B, +		/* IP13_9_7 [3] */ +		FN_STP_OPWM_0, FN_AVB_GTX_CLK, FN_PWM0_B, +		FN_ADICHS2_B, FN_MSIOF0_TXD_C, +		0, 0, 0, +		/* IP13_6_5 [2] */ +		FN_STP_ISSYNC_0, FN_AVB_COL, FN_ADICHS1_B, FN_MSIOF0_RXD_C, +		/* IP13_4_3 [2] */ +		FN_STP_ISEN_0, FN_AVB_TX_CLK, FN_ADICHS0_B, FN_MSIOF0_SS2_C, +		/* IP13_2_0 [3] */ +		FN_STP_ISD_0, FN_AVB_TX_ER, FN_SCIFB2_SCK_C, +		FN_ADICLK_B, FN_MSIOF0_SS1_C, +		0, 0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR14", 0xE6060058, 32, +			     3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 2) { +		/* IP14_31_29 [3] */ +		FN_MSIOF0_SS2, FN_MMC_D7, FN_ADICHS2, FN_RX0_E, +		FN_VI1_VSYNC_N_C, FN_SDA7_C, FN_VI1_G5_B, 0, +		/* IP14_28_26 [3] */ +		FN_MSIOF0_SS1, FN_MMC_D6, FN_ADICHS1, FN_TX0_E, +		FN_VI1_HSYNC_N_C, FN_SCL7_C, FN_VI1_G4_B, 0, +		/* IP14_25_23 [3] */ +		FN_MSIOF0_RXD, FN_ADICHS0, 0, FN_VI1_DATA0_C, FN_VI1_G3_B, +		0, 0, 0, +		/* IP14_22_20 [3] */ +		FN_MSIOF0_TXD, FN_ADICLK, 0, FN_VI1_FIELD_C, FN_VI1_G2_B, +		0, 0, 0, +		/* IP14_19_17 [3] */ +		FN_MSIOF0_SYNC, FN_TX2_C, FN_ADICS_SAMP, 0, +		FN_VI1_CLKENB_C, FN_VI1_G1_B, +		0, 0, +		/* IP14_16_14 [3] */ +		FN_MSIOF0_SCK, FN_RX2_C, FN_ADIDATA, 0, +		FN_VI1_CLK_C, FN_VI1_G0_B, +		0, 0, +		/* IP14_13_11 [3] */ +		FN_SD2_WP, FN_MMC_D5, FN_SDA8_C, FN_RX5_B, FN_SCIFA5_RXD_C, +		0, 0, 0, +		/* IP14_10_8 [3] */ +		FN_SD2_CD, FN_MMC_D4, FN_SCL8_C, FN_TX5_B, FN_SCIFA5_TXD_C, +		0, 0, 0, +		/* IP14_7 [1] */ +		FN_SD2_DATA3, FN_MMC_D3, +		/* IP14_6 [1] */ +		FN_SD2_DATA2, FN_MMC_D2, +		/* IP14_5 [1] */ +		FN_SD2_DATA1, FN_MMC_D1, +		/* IP14_4 [1] */ +		FN_SD2_DATA0, FN_MMC_D0, +		/* IP14_3 [1] */ +		FN_SD2_CMD, FN_MMC_CMD, +		/* IP14_2 [1] */ +		FN_SD2_CLK, FN_MMC_CLK, +		/* IP14_1_0 [2] */ +		FN_SD1_WP, FN_PWM1_B, FN_SDA1_C, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR15", 0xE606005C, 32, +			     2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2) { +		/* IP15_31_30 [2] */ +		0, 0, 0, 0, +		/* IP15_29_27 [3] */ +		FN_HTX0, FN_SCIFB0_TXD, 0, FN_GLO_SCLK_C, +		FN_CAN0_TX_B, FN_VI1_DATA5_C, +		0, 0, +		/* IP15_26_24 [3] */ +		FN_HRX0, FN_SCIFB0_RXD, 0, FN_GLO_Q1_C, +		FN_CAN0_RX_B, FN_VI1_DATA4_C, +		0, 0, +		/* IP15_23_21 [3] */ +		FN_HSCK0, FN_SCIFB0_SCK, 0, FN_GLO_Q0_C, FN_CAN_CLK, +		FN_TCLK2, FN_VI1_DATA3_C, 0, +		/* IP15_20_18 [3] */ +		FN_HRTS0_N, FN_SCIFB0_RTS_N, 0, FN_GLO_I1_C, FN_VI1_DATA2_C, +		0, 0, 0, +		/* IP15_17_15 [3] */ +		FN_HCTS0_N, FN_SCIFB0_CTS_N, 0, FN_GLO_I0_C, +		FN_TCLK1, FN_VI1_DATA1_C, +		0, 0, +		/* IP15_14_12 [3] */ +		FN_GPS_MAG, FN_RX4_C, FN_SCIFA4_RXD_C, FN_PWM6, +		FN_VI1_G7_B, FN_SCIFA3_SCK_C, +		0, 0, +		/* IP15_11_9 [3] */ +		FN_GPS_SIGN, FN_TX4_C, FN_SCIFA4_TXD_C, FN_PWM5, +		FN_VI1_G6_B, FN_SCIFA3_RXD_C, +		0, 0, +		/* IP15_8_6 [3] */ +		FN_GPS_CLK, FN_DU1_DOTCLKIN_C, FN_AUDIO_CLKB_B, +		FN_PWM5_B, FN_SCIFA3_TXD_C, +		0, 0, 0, +		/* IP15_5_4 [2] */ +		FN_SIM0_D, FN_IERX, FN_CAN1_RX_D, 0, +		/* IP15_3_2 [2] */ +		FN_SIM0_CLK, FN_IECLK, FN_CAN_CLK_C, 0, +		/* IP15_1_0 [2] */ +		FN_SIM0_RST, FN_IETX, FN_CAN1_TX_D, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("IPSR16", 0xE6060160, 32, +			     4, 4, 4, 4, 4, 2, 2, 2, 3, 3) { +		/* IP16_31_28 [4] */ +		0, 0, 0, 0, 0, 0, 0, 0, +		0, 0, 0, 0, 0, 0, 0, 0, +		/* IP16_27_24 [4] */ +		0, 0, 0, 0, 0, 0, 0, 0, +		0, 0, 0, 0, 0, 0, 0, 0, +		/* IP16_23_20 [4] */ +		0, 0, 0, 0, 0, 0, 0, 0, +		0, 0, 0, 0, 0, 0, 0, 0, +		/* IP16_19_16 [4] */ +		0, 0, 0, 0, 0, 0, 0, 0, +		0, 0, 0, 0, 0, 0, 0, 0, +		/* IP16_15_12 [4] */ +		0, 0, 0, 0, 0, 0, 0, 0, +		0, 0, 0, 0, 0, 0, 0, 0, +		/* IP16_11_10 [2] */ +		FN_HRTS1_N, FN_SCIFB1_RTS_N, FN_MLB_DAT, FN_CAN1_RX_B, +		/* IP16_9_8 [2] */ +		FN_HCTS1_N, FN_SCIFB1_CTS_N, FN_MLB_SIG, FN_CAN1_TX_B, +		/* IP16_7_6 [2] */ +		FN_HSCK1, FN_SCIFB1_SCK, FN_MLB_CK, FN_GLO_RFON_C, +		/* IP16_5_3 [3] */ +		FN_HTX1, FN_SCIFB1_TXD, FN_VI1_R1_B, +		FN_GLO_SS_C, FN_VI1_DATA7_C, +		0, 0, 0, +		/* IP16_2_0 [3] */ +		FN_HRX1, FN_SCIFB1_RXD, FN_VI1_R0_B, +		FN_GLO_SDATA_C, FN_VI1_DATA6_C, +		0, 0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("MOD_SEL", 0xE6060090, 32, +			     1, 2, 2, 2, 3, 2, 1, 1, 1, 1, +			     3, 2, 2, 2, 1, 2, 2, 2) { +		/* RESEVED [1] */ +		0, 0, +		/* SEL_SCIF1 [2] */ +		FN_SEL_SCIF1_0, FN_SEL_SCIF1_1, FN_SEL_SCIF1_2, FN_SEL_SCIF1_3, +		/* SEL_SCIFB [2] */ +		FN_SEL_SCIFB_0, FN_SEL_SCIFB_1, FN_SEL_SCIFB_2, FN_SEL_SCIFB_3, +		/* SEL_SCIFB2 [2] */ +		FN_SEL_SCIFB2_0, FN_SEL_SCIFB2_1, +		FN_SEL_SCIFB2_2, FN_SEL_SCIFB2_3, +		/* SEL_SCIFB1 [3] */ +		FN_SEL_SCIFB1_0, FN_SEL_SCIFB1_1, +		FN_SEL_SCIFB1_2, FN_SEL_SCIFB1_3, +		0, 0, 0, 0, +		/* SEL_SCIFA1 [2] */ +		FN_SEL_SCIFA1_0, FN_SEL_SCIFA1_1, FN_SEL_SCIFA1_2, 0, +		/* SEL_SSI9 [1] */ +		FN_SEL_SSI9_0, FN_SEL_SSI9_1, +		/* SEL_SCFA [1] */ +		FN_SEL_SCFA_0, FN_SEL_SCFA_1, +		/* SEL_QSP [1] */ +		FN_SEL_QSP_0, FN_SEL_QSP_1, +		/* SEL_SSI7 [1] */ +		FN_SEL_SSI7_0, FN_SEL_SSI7_1, +		/* SEL_HSCIF1 [3] */ +		FN_SEL_HSCIF1_0, FN_SEL_HSCIF1_1, FN_SEL_HSCIF1_2, +		FN_SEL_HSCIF1_3, FN_SEL_HSCIF1_4, +		0, 0, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* SEL_VI1 [2] */ +		FN_SEL_VI1_0, FN_SEL_VI1_1, FN_SEL_VI1_2, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* SEL_TMU [1] */ +		FN_SEL_TMU1_0, FN_SEL_TMU1_1, +		/* SEL_LBS [2] */ +		FN_SEL_LBS_0, FN_SEL_LBS_1, FN_SEL_LBS_2, FN_SEL_LBS_3, +		/* SEL_TSIF0 [2] */ +		FN_SEL_TSIF0_0, FN_SEL_TSIF0_1, FN_SEL_TSIF0_2, FN_SEL_TSIF0_3, +		/* SEL_SOF0 [2] */ +		FN_SEL_SOF0_0, FN_SEL_SOF0_1, FN_SEL_SOF0_2, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("MOD_SEL2", 0xE6060094, 32, +			     3, 1, 1, 3, 2, 1, 1, 2, 2, +			     1, 3, 2, 1, 2, 2, 2, 1, 1, 1) { +		/* SEL_SCIF0 [3] */ +		FN_SEL_SCIF0_0, FN_SEL_SCIF0_1, FN_SEL_SCIF0_2, +		FN_SEL_SCIF0_3, FN_SEL_SCIF0_4, +		0, 0, 0, +		/* RESEVED [1] */ +		0, 0, +		/* SEL_SCIF [1] */ +		FN_SEL_SCIF_0, FN_SEL_SCIF_1, +		/* SEL_CAN0 [3] */ +		FN_SEL_CAN0_0, FN_SEL_CAN0_1, FN_SEL_CAN0_2, FN_SEL_CAN0_3, +		FN_SEL_CAN0_4, FN_SEL_CAN0_5, +		0, 0, +		/* SEL_CAN1 [2] */ +		FN_SEL_CAN1_0, FN_SEL_CAN1_1, FN_SEL_CAN1_2, FN_SEL_CAN1_3, +		/* RESEVED [1] */ +		0, 0, +		/* SEL_SCIFA2 [1] */ +		FN_SEL_SCIFA2_0, FN_SEL_SCIFA2_1, +		/* SEL_SCIF4 [2] */ +		FN_SEL_SCIF4_0, FN_SEL_SCIF4_1, FN_SEL_SCIF4_2, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* SEL_ADG [1] */ +		FN_SEL_ADG_0, FN_SEL_ADG_1, +		/* SEL_FM [3] */ +		FN_SEL_FM_0, FN_SEL_FM_1, FN_SEL_FM_2, +		FN_SEL_FM_3, FN_SEL_FM_4, +		0, 0, 0, +		/* SEL_SCIFA5 [2] */ +		FN_SEL_SCIFA5_0, FN_SEL_SCIFA5_1, FN_SEL_SCIFA5_2, 0, +		/* RESEVED [1] */ +		0, 0, +		/* SEL_GPS [2] */ +		FN_SEL_GPS_0, FN_SEL_GPS_1, FN_SEL_GPS_2, FN_SEL_GPS_3, +		/* SEL_SCIFA4 [2] */ +		FN_SEL_SCIFA4_0, FN_SEL_SCIFA4_1, FN_SEL_SCIFA4_2, 0, +		/* SEL_SCIFA3 [2] */ +		FN_SEL_SCIFA3_0, FN_SEL_SCIFA3_1, FN_SEL_SCIFA3_2, 0, +		/* SEL_SIM [1] */ +		FN_SEL_SIM_0, FN_SEL_SIM_1, +		/* RESEVED [1] */ +		0, 0, +		/* SEL_SSI8 [1] */ +		FN_SEL_SSI8_0, FN_SEL_SSI8_1, } +	}, +	{ PINMUX_CFG_REG_VAR("MOD_SEL3", 0xE6060098, 32, +			     2, 2, 2, 2, 2, 2, 2, 2, +			     1, 1, 2, 2, 3, 2, 2, 2, 1) { +		/* SEL_HSCIF2 [2] */ +		FN_SEL_HSCIF2_0, FN_SEL_HSCIF2_1, +		FN_SEL_HSCIF2_2, FN_SEL_HSCIF2_3, +		/* SEL_CANCLK [2] */ +		FN_SEL_CANCLK_0, FN_SEL_CANCLK_1, +		FN_SEL_CANCLK_2, FN_SEL_CANCLK_3, +		/* SEL_IIC8 [2] */ +		FN_SEL_IIC8_0, FN_SEL_IIC8_1, FN_SEL_IIC8_2, 0, +		/* SEL_IIC7 [2] */ +		FN_SEL_IIC7_0, FN_SEL_IIC7_1, FN_SEL_IIC7_2, 0, +		/* SEL_IIC4 [2] */ +		FN_SEL_IIC4_0, FN_SEL_IIC4_1, FN_SEL_IIC4_2, 0, +		/* SEL_IIC3 [2] */ +		FN_SEL_IIC3_0, FN_SEL_IIC3_1, FN_SEL_IIC3_2, FN_SEL_IIC3_3, +		/* SEL_SCIF3 [2] */ +		FN_SEL_SCIF3_0, FN_SEL_SCIF3_1, FN_SEL_SCIF3_2, FN_SEL_SCIF3_3, +		/* SEL_IEB [2] */ +		FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, 0, +		/* SEL_MMC [1] */ +		FN_SEL_MMC_0, FN_SEL_MMC_1, +		/* SEL_SCIF5 [1] */ +		FN_SEL_SCIF5_0, FN_SEL_SCIF5_1, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* SEL_IIC2 [2] */ +		FN_SEL_IIC2_0, FN_SEL_IIC2_1, FN_SEL_IIC2_2, FN_SEL_IIC2_3, +		/* SEL_IIC1 [3] */ +		FN_SEL_IIC1_0, FN_SEL_IIC1_1, FN_SEL_IIC1_2, FN_SEL_IIC1_3, +		FN_SEL_IIC1_4, +		0, 0, 0, +		/* SEL_IIC0 [2] */ +		FN_SEL_IIC0_0, FN_SEL_IIC0_1, FN_SEL_IIC0_2, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* RESEVED [1] */ +		0, 0, } +	}, +	{ PINMUX_CFG_REG_VAR("MOD_SEL4", 0xE606009C, 32, +			     3, 2, 2, 1, 1, 1, 1, 3, 2, +			     2, 3, 1, 1, 1, 2, 2, 2, 2) { +		/* SEL_SOF1 [3] */ +		FN_SEL_SOF1_0, FN_SEL_SOF1_1, FN_SEL_SOF1_2, FN_SEL_SOF1_3, +		FN_SEL_SOF1_4, +		0, 0, 0, +		/* SEL_HSCIF0 [2] */ +		FN_SEL_HSCIF0_0, FN_SEL_HSCIF0_1, FN_SEL_HSCIF0_2, 0, +		/* SEL_DIS [2] */ +		FN_SEL_DIS_0, FN_SEL_DIS_1, FN_SEL_DIS_2, 0, +		/* RESEVED [1] */ +		0, 0, +		/* SEL_RAD [1] */ +		FN_SEL_RAD_0, FN_SEL_RAD_1, +		/* SEL_RCN [1] */ +		FN_SEL_RCN_0, FN_SEL_RCN_1, +		/* SEL_RSP [1] */ +		FN_SEL_RSP_0, FN_SEL_RSP_1, +		/* SEL_SCIF2 [3] */ +		FN_SEL_SCIF2_0, FN_SEL_SCIF2_1, FN_SEL_SCIF2_2, +		FN_SEL_SCIF2_3, FN_SEL_SCIF2_4, +		0, 0, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* SEL_SOF2 [3] */ +		FN_SEL_SOF2_0, FN_SEL_SOF2_1, FN_SEL_SOF2_2, +		FN_SEL_SOF2_3, FN_SEL_SOF2_4, +		0, 0, 0, +		/* RESEVED [1] */ +		0, 0, +		/* SEL_SSI1 [1] */ +		FN_SEL_SSI1_0, FN_SEL_SSI1_1, +		/* SEL_SSI0 [1] */ +		FN_SEL_SSI0_0, FN_SEL_SSI0_1, +		/* SEL_SSP [2] */ +		FN_SEL_SSP_0, FN_SEL_SSP_1, FN_SEL_SSP_2, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, +		/* RESEVED [2] */ +		0, 0, 0, 0, } +	}, +	{ }, +}; + +const struct sh_pfc_soc_info r8a7791_pinmux_info = { +	.name = "r8a77910_pfc", +	.unlock_reg = 0xe6060000, /* PMMR */ + +	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END }, + +	.pins = pinmux_pins, +	.nr_pins = ARRAY_SIZE(pinmux_pins), +	.groups = pinmux_groups, +	.nr_groups = ARRAY_SIZE(pinmux_groups), +	.functions = pinmux_functions, +	.nr_functions = ARRAY_SIZE(pinmux_functions), + +	.cfg_regs = pinmux_config_regs, + +	.gpio_data = pinmux_data, +	.gpio_data_size = ARRAY_SIZE(pinmux_data), +}; diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7203.c b/drivers/pinctrl/sh-pfc/pfc-sh7203.c index bf3d8f28768..3bda7bafd0a 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7203.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7203.c @@ -702,7 +702,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(SSCK0_PF_MARK, PF0MD_11),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PA */  	PINMUX_GPIO(PA7),  	PINMUX_GPIO(PA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7264.c b/drivers/pinctrl/sh-pfc/pfc-sh7264.c index 673a5950322..e1cb6dc0502 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7264.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7264.c @@ -1071,7 +1071,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(SD_D2_MARK, PK0MD_10),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* Port A */  	PINMUX_GPIO(PA3),  	PINMUX_GPIO(PA2), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7269.c b/drivers/pinctrl/sh-pfc/pfc-sh7269.c index a19b60f72b2..7a11320ad96 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7269.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7269.c @@ -1451,7 +1451,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(PWM1A_MARK, PJ0MD_100),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* Port A */  	PINMUX_GPIO(PA1),  	PINMUX_GPIO(PA0), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7372.c b/drivers/pinctrl/sh-pfc/pfc-sh7372.c index 70b522d3482..d9158b3b291 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7372.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7372.c @@ -844,7 +844,7 @@ static const u16 pinmux_data[] = {  #define SH7372_PIN_O(pin)		SH_PFC_PIN_CFG(pin, __O)  #define SH7372_PIN_O_PU_PD(pin)		SH_PFC_PIN_CFG(pin, __O | __PUD) -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* Table 57-1 (I/O and Pull U/D) */  	SH7372_PIN_IO_PD(0),		SH7372_PIN_IO_PD(1),  	SH7372_PIN_O(2),		SH7372_PIN_I_PD(3), @@ -2118,17 +2118,6 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(usb1),  }; -#undef PORTCR -#define PORTCR(nr, reg)							\ -	{								\ -		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\ -			_PCRH(PORT##nr##_IN, 0, 0, PORT##nr##_OUT),     \ -				PORT##nr##_FN0, PORT##nr##_FN1,		\ -				PORT##nr##_FN2, PORT##nr##_FN3,		\ -				PORT##nr##_FN4, PORT##nr##_FN5,		\ -				PORT##nr##_FN6, PORT##nr##_FN7 }	\ -	} -  static const struct pinmux_cfg_reg pinmux_config_regs[] = {  	PORTCR(0,	0xE6051000), /* PORT0CR */  	PORTCR(1,	0xE6051001), /* PORT1CR */ @@ -2584,8 +2573,8 @@ static void __iomem *sh7372_pinmux_portcr(struct sh_pfc *pfc, unsigned int pin)  		const struct sh7372_portcr_group *group =  			&sh7372_portcr_offsets[i]; -		if (i <= group->end_pin) -			return pfc->window->virt + group->offset + pin; +		if (pin <= group->end_pin) +			return pfc->windows->virt + group->offset + pin;  	}  	return NULL; diff --git a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c index 7e278a97e41..ee370de4609 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh73a0.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh73a0.c @@ -26,7 +26,9 @@  #include <linux/regulator/machine.h>  #include <linux/slab.h> +#ifndef CONFIG_ARCH_MULTIPLATFORM  #include <mach/irqs.h> +#endif  #include "core.h"  #include "sh_pfc.h" @@ -1179,7 +1181,7 @@ static const u16 pinmux_data[] = {   */  #define PIN_NUMBER(row, col)		(1000+((row)-1)*34+(col)-1) -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* Table 25-1 (I/O and Pull U/D) */  	SH73A0_PIN_I_PD(0),  	SH73A0_PIN_I_PU(1), @@ -3138,16 +3140,6 @@ static const struct sh_pfc_function pinmux_functions[] = {  	SH_PFC_FUNCTION(usb),  }; -#undef PORTCR -#define PORTCR(nr, reg)							\ -	{								\ -		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\ -			_PCRH(PORT##nr##_IN, 0, 0, PORT##nr##_OUT),	\ -				PORT##nr##_FN0, PORT##nr##_FN1,		\ -				PORT##nr##_FN2, PORT##nr##_FN3,		\ -				PORT##nr##_FN4, PORT##nr##_FN5,		\ -				PORT##nr##_FN6, PORT##nr##_FN7 }	\ -	}  static const struct pinmux_cfg_reg pinmux_config_regs[] = {  	PORTCR(0, 0xe6050000), /* PORT0CR */  	PORTCR(1, 0xe6050001), /* PORT1CR */ @@ -3661,38 +3653,38 @@ static const struct pinmux_data_reg pinmux_data_regs[] = {  };  static const struct pinmux_irq pinmux_irqs[] = { -	PINMUX_IRQ(irq_pin(19), 9), -	PINMUX_IRQ(irq_pin(1), 10),  	PINMUX_IRQ(irq_pin(0), 11), +	PINMUX_IRQ(irq_pin(1), 10), +	PINMUX_IRQ(irq_pin(2), 149), +	PINMUX_IRQ(irq_pin(3), 224), +	PINMUX_IRQ(irq_pin(4), 159), +	PINMUX_IRQ(irq_pin(5), 227), +	PINMUX_IRQ(irq_pin(6), 147), +	PINMUX_IRQ(irq_pin(7), 150), +	PINMUX_IRQ(irq_pin(8), 223), +	PINMUX_IRQ(irq_pin(9), 56, 308), +	PINMUX_IRQ(irq_pin(10), 54), +	PINMUX_IRQ(irq_pin(11), 238), +	PINMUX_IRQ(irq_pin(12), 156), +	PINMUX_IRQ(irq_pin(13), 239), +	PINMUX_IRQ(irq_pin(14), 251), +	PINMUX_IRQ(irq_pin(15), 0), +	PINMUX_IRQ(irq_pin(16), 249), +	PINMUX_IRQ(irq_pin(17), 234),  	PINMUX_IRQ(irq_pin(18), 13), +	PINMUX_IRQ(irq_pin(19), 9),  	PINMUX_IRQ(irq_pin(20), 14),  	PINMUX_IRQ(irq_pin(21), 15), -	PINMUX_IRQ(irq_pin(31), 26), -	PINMUX_IRQ(irq_pin(30), 27), -	PINMUX_IRQ(irq_pin(29), 28),  	PINMUX_IRQ(irq_pin(22), 40),  	PINMUX_IRQ(irq_pin(23), 53), -	PINMUX_IRQ(irq_pin(10), 54), -	PINMUX_IRQ(irq_pin(9), 56), +	PINMUX_IRQ(irq_pin(24), 118), +	PINMUX_IRQ(irq_pin(25), 164),  	PINMUX_IRQ(irq_pin(26), 115),  	PINMUX_IRQ(irq_pin(27), 116),  	PINMUX_IRQ(irq_pin(28), 117), -	PINMUX_IRQ(irq_pin(24), 118), -	PINMUX_IRQ(irq_pin(6), 147), -	PINMUX_IRQ(irq_pin(2), 149), -	PINMUX_IRQ(irq_pin(7), 150), -	PINMUX_IRQ(irq_pin(12), 156), -	PINMUX_IRQ(irq_pin(4), 159), -	PINMUX_IRQ(irq_pin(25), 164), -	PINMUX_IRQ(irq_pin(8), 223), -	PINMUX_IRQ(irq_pin(3), 224), -	PINMUX_IRQ(irq_pin(5), 227), -	PINMUX_IRQ(irq_pin(17), 234), -	PINMUX_IRQ(irq_pin(11), 238), -	PINMUX_IRQ(irq_pin(13), 239), -	PINMUX_IRQ(irq_pin(16), 249), -	PINMUX_IRQ(irq_pin(14), 251), -	PINMUX_IRQ(irq_pin(9), 308), +	PINMUX_IRQ(irq_pin(29), 28), +	PINMUX_IRQ(irq_pin(30), 27), +	PINMUX_IRQ(irq_pin(31), 26),  };  /* ----------------------------------------------------------------------------- @@ -3702,7 +3694,7 @@ static const struct pinmux_irq pinmux_irqs[] = {  static void sh73a0_vccq_mc0_endisable(struct regulator_dev *reg, bool enable)  {  	struct sh_pfc *pfc = reg->reg_data; -	void __iomem *addr = pfc->window[1].virt + 4; +	void __iomem *addr = pfc->windows[1].virt + 4;  	unsigned long flags;  	u32 value; @@ -3735,7 +3727,7 @@ static int sh73a0_vccq_mc0_disable(struct regulator_dev *reg)  static int sh73a0_vccq_mc0_is_enabled(struct regulator_dev *reg)  {  	struct sh_pfc *pfc = reg->reg_data; -	void __iomem *addr = pfc->window[1].virt + 4; +	void __iomem *addr = pfc->windows[1].virt + 4;  	unsigned long flags;  	u32 value; @@ -3794,7 +3786,7 @@ static const unsigned int sh73a0_portcr_offsets[] = {  static unsigned int sh73a0_pinmux_get_bias(struct sh_pfc *pfc, unsigned int pin)  { -	void __iomem *addr = pfc->window->virt +	void __iomem *addr = pfc->windows->virt  			   + sh73a0_portcr_offsets[pin >> 5] + pin;  	u32 value = ioread8(addr) & PORTnCR_PULMD_MASK; @@ -3812,7 +3804,7 @@ static unsigned int sh73a0_pinmux_get_bias(struct sh_pfc *pfc, unsigned int pin)  static void sh73a0_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,  				   unsigned int bias)  { -	void __iomem *addr = pfc->window->virt +	void __iomem *addr = pfc->windows->virt  			   + sh73a0_portcr_offsets[pin >> 5] + pin;  	u32 value = ioread8(addr) & ~PORTnCR_PULMD_MASK; diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7720.c b/drivers/pinctrl/sh-pfc/pfc-sh7720.c index 7a26809eda1..13d05f88bc0 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7720.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7720.c @@ -576,7 +576,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(SIM_CLK_MARK, PSELD_1_0_10, PTV0_FN),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PTA */  	PINMUX_GPIO(PTA7),  	PINMUX_GPIO(PTA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7722.c b/drivers/pinctrl/sh-pfc/pfc-sh7722.c index add309347b0..914d872c37a 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7722.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7722.c @@ -754,7 +754,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(KEYOUT5_IN5_MARK, HIZA14_KEYSC, KEYOUT5_IN5),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PTA */  	PINMUX_GPIO(PTA7),  	PINMUX_GPIO(PTA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7723.c b/drivers/pinctrl/sh-pfc/pfc-sh7723.c index 1cecc9101a5..4eb7eae2e6d 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7723.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7723.c @@ -917,7 +917,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(SIUBISLD_MARK, PSD1_PSD0_FN2, PTZ0_FN),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PTA */  	PINMUX_GPIO(PTA7),  	PINMUX_GPIO(PTA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7724.c b/drivers/pinctrl/sh-pfc/pfc-sh7724.c index 1085ab556b8..74a1a7f1317 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7724.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7724.c @@ -1146,7 +1146,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(SCIF3_I_TXD_MARK,	PSB14_1, PTZ3_FN),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PTA */  	PINMUX_GPIO(PTA7),  	PINMUX_GPIO(PTA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c index ec0c47c4f10..e53dd1cb162 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c @@ -1357,7 +1357,7 @@ static const u16 pinmux_data[] = {  	PINMUX_IPSR_DATA(IP11_28, ST_CLKOUT),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	PINMUX_GPIO_GP_ALL(),  }; diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7757.c b/drivers/pinctrl/sh-pfc/pfc-sh7757.c index 33d75e51091..625661a88c5 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7757.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7757.c @@ -1074,7 +1074,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(ON_DQ0_MARK, PS8_8_FN2, PTZ0_FN),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PTA */  	PINMUX_GPIO(PTA7),  	PINMUX_GPIO(PTA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7785.c b/drivers/pinctrl/sh-pfc/pfc-sh7785.c index 517eb49d76b..b38dd7e3e37 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7785.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7785.c @@ -671,7 +671,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(IRQOUT_MARK, P2MSEL2_1),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PA */  	PINMUX_GPIO(PA7),  	PINMUX_GPIO(PA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7786.c b/drivers/pinctrl/sh-pfc/pfc-sh7786.c index 623345fac93..6cb4e0aaf20 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7786.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7786.c @@ -407,7 +407,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(SSI3_SCK_MARK,	P2MSEL6_1, P2MSEL5_1, PJ1_FN),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PA */  	PINMUX_GPIO(PA7),  	PINMUX_GPIO(PA6), diff --git a/drivers/pinctrl/sh-pfc/pfc-shx3.c b/drivers/pinctrl/sh-pfc/pfc-shx3.c index 55262bd869e..a3fcb2284d9 100644 --- a/drivers/pinctrl/sh-pfc/pfc-shx3.c +++ b/drivers/pinctrl/sh-pfc/pfc-shx3.c @@ -285,7 +285,7 @@ static const u16 pinmux_data[] = {  	PINMUX_DATA(IRQOUT_MARK,	PH0_FN),  }; -static struct sh_pfc_pin pinmux_pins[] = { +static const struct sh_pfc_pin pinmux_pins[] = {  	/* PA */  	PINMUX_GPIO(PA7),  	PINMUX_GPIO(PA6), diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h index 11bd0d970a5..d482c40b012 100644 --- a/drivers/pinctrl/sh-pfc/sh_pfc.h +++ b/drivers/pinctrl/sh-pfc/sh_pfc.h @@ -76,12 +76,13 @@ struct pinmux_cfg_reg {  #define PINMUX_CFG_REG(name, r, r_width, f_width) \  	.reg = r, .reg_width = r_width, .field_width = f_width,		\ -	.enum_ids = (u16 [(r_width / f_width) * (1 << f_width)]) +	.enum_ids = (const u16 [(r_width / f_width) * (1 << f_width)])  #define PINMUX_CFG_REG_VAR(name, r, r_width, var_fw0, var_fwn...) \  	.reg = r, .reg_width = r_width,	\ -	.var_field_width = (unsigned long [r_width]) { var_fw0, var_fwn, 0 }, \ -	.enum_ids = (u16 []) +	.var_field_width = (const unsigned long [r_width]) \ +		{ var_fw0, var_fwn, 0 }, \ +	.enum_ids = (const u16 [])  struct pinmux_data_reg {  	unsigned long reg, reg_width; @@ -90,15 +91,20 @@ struct pinmux_data_reg {  #define PINMUX_DATA_REG(name, r, r_width) \  	.reg = r, .reg_width = r_width,	\ -	.enum_ids = (u16 [r_width]) \ +	.enum_ids = (const u16 [r_width]) \  struct pinmux_irq {  	int irq; -	unsigned short *gpios; +	const short *gpios;  }; +#ifdef CONFIG_ARCH_MULTIPLATFORM  #define PINMUX_IRQ(irq_nr, ids...)			   \ -	{ .irq = irq_nr, .gpios = (unsigned short []) { ids, 0 } }	\ +	{ .gpios = (const short []) { ids, -1 } } +#else +#define PINMUX_IRQ(irq_nr, ids...)			   \ +	{ .irq = irq_nr, .gpios = (const short []) { ids, -1 } } +#endif  struct pinmux_range {  	u16 begin; @@ -254,7 +260,7 @@ struct sh_pfc_soc_info {  #define PINMUX_GPIO(_pin)						\  	[GPIO_##_pin] = {						\  		.pin = (u16)-1,						\ -		.name = __stringify(name),				\ +		.name = __stringify(GPIO_##_pin),			\  		.enum_id = _pin##_DATA,					\  	} @@ -304,8 +310,7 @@ struct sh_pfc_soc_info {  #define PORTCR(nr, reg)							\  	{								\  		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\ -			_PCRH(PORT##nr##_IN, PORT##nr##_IN_PD,		\ -			      PORT##nr##_IN_PU, PORT##nr##_OUT),	\ +			_PCRH(PORT##nr##_IN, 0, 0, PORT##nr##_OUT),	\  				PORT##nr##_FN0, PORT##nr##_FN1,		\  				PORT##nr##_FN2, PORT##nr##_FN3,		\  				PORT##nr##_FN4, PORT##nr##_FN5,		\ diff --git a/drivers/pinctrl/sirf/pinctrl-atlas6.c b/drivers/pinctrl/sirf/pinctrl-atlas6.c index edf45a6940c..c4dd3d5cf9c 100644 --- a/drivers/pinctrl/sirf/pinctrl-atlas6.c +++ b/drivers/pinctrl/sirf/pinctrl-atlas6.c @@ -1,7 +1,8 @@  /*   * pinctrl pads, groups, functions for CSR SiRFatlasVI   * - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * Copyright (c) 2011 - 2014 Cambridge Silicon Radio Limited, a CSR plc group + * company.   *   * Licensed under GPLv2 or later.   */ @@ -122,6 +123,9 @@ static const struct pinctrl_pin_desc sirfsoc_pads[] = {  	PINCTRL_PIN(100, "ac97_dout"),  	PINCTRL_PIN(101, "ac97_din"),  	PINCTRL_PIN(102, "x_rtc_io"), + +	PINCTRL_PIN(103, "x_usb1_dp"), +	PINCTRL_PIN(104, "x_usb1_dn"),  };  static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = { @@ -139,6 +143,7 @@ static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = {  static const struct sirfsoc_padmux lcd_16bits_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcd_16bits_sirfsoc_muxmask),  	.muxmask = lcd_16bits_sirfsoc_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = 0,  }; @@ -164,6 +169,7 @@ static const struct sirfsoc_muxmask lcd_18bits_muxmask[] = {  static const struct sirfsoc_padmux lcd_18bits_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcd_18bits_muxmask),  	.muxmask = lcd_18bits_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4) | BIT(15),  	.funcval = 0,  }; @@ -189,6 +195,7 @@ static const struct sirfsoc_muxmask lcd_24bits_muxmask[] = {  static const struct sirfsoc_padmux lcd_24bits_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcd_24bits_muxmask),  	.muxmask = lcd_24bits_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4) | BIT(15),  	.funcval = 0,  }; @@ -214,6 +221,7 @@ static const struct sirfsoc_muxmask lcdrom_muxmask[] = {  static const struct sirfsoc_padmux lcdrom_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcdrom_muxmask),  	.muxmask = lcdrom_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = BIT(4),  }; @@ -237,6 +245,7 @@ static const struct sirfsoc_muxmask uart0_muxmask[] = {  static const struct sirfsoc_padmux uart0_padmux = {  	.muxmask_counts = ARRAY_SIZE(uart0_muxmask),  	.muxmask = uart0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(9),  	.funcval = BIT(9),  }; @@ -284,6 +293,7 @@ static const struct sirfsoc_muxmask uart2_muxmask[] = {  static const struct sirfsoc_padmux uart2_padmux = {  	.muxmask_counts = ARRAY_SIZE(uart2_muxmask),  	.muxmask = uart2_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(10),  	.funcval = BIT(10),  }; @@ -317,6 +327,7 @@ static const struct sirfsoc_muxmask sdmmc3_muxmask[] = {  static const struct sirfsoc_padmux sdmmc3_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc3_muxmask),  	.muxmask = sdmmc3_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(7),  	.funcval = 0,  }; @@ -336,6 +347,7 @@ static const struct sirfsoc_muxmask spi0_muxmask[] = {  static const struct sirfsoc_padmux spi0_padmux = {  	.muxmask_counts = ARRAY_SIZE(spi0_muxmask),  	.muxmask = spi0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(7),  	.funcval = BIT(7),  }; @@ -352,6 +364,7 @@ static const struct sirfsoc_muxmask cko1_muxmask[] = {  static const struct sirfsoc_padmux cko1_padmux = {  	.muxmask_counts = ARRAY_SIZE(cko1_muxmask),  	.muxmask = cko1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(3),  	.funcval = 0,  }; @@ -371,6 +384,7 @@ static const struct sirfsoc_muxmask i2s_muxmask[] = {  static const struct sirfsoc_padmux i2s_padmux = {  	.muxmask_counts = ARRAY_SIZE(i2s_muxmask),  	.muxmask = i2s_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(3),  	.funcval = BIT(3),  }; @@ -390,6 +404,7 @@ static const struct sirfsoc_muxmask i2s_no_din_muxmask[] = {  static const struct sirfsoc_padmux i2s_no_din_padmux = {  	.muxmask_counts = ARRAY_SIZE(i2s_no_din_muxmask),  	.muxmask = i2s_no_din_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(3),  	.funcval = BIT(3),  }; @@ -409,6 +424,7 @@ static const struct sirfsoc_muxmask i2s_6chn_muxmask[] = {  static const struct sirfsoc_padmux i2s_6chn_padmux = {  	.muxmask_counts = ARRAY_SIZE(i2s_6chn_muxmask),  	.muxmask = i2s_6chn_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(1) | BIT(3) | BIT(9),  	.funcval = BIT(1) | BIT(3) | BIT(9),  }; @@ -439,6 +455,7 @@ static const struct sirfsoc_muxmask spi1_muxmask[] = {  static const struct sirfsoc_padmux spi1_padmux = {  	.muxmask_counts = ARRAY_SIZE(spi1_muxmask),  	.muxmask = spi1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(16),  	.funcval = 0,  }; @@ -455,6 +472,7 @@ static const struct sirfsoc_muxmask sdmmc1_muxmask[] = {  static const struct sirfsoc_padmux sdmmc1_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc1_muxmask),  	.muxmask = sdmmc1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(5),  	.funcval = BIT(5),  }; @@ -471,6 +489,7 @@ static const struct sirfsoc_muxmask gps_muxmask[] = {  static const struct sirfsoc_padmux gps_padmux = {  	.muxmask_counts = ARRAY_SIZE(gps_muxmask),  	.muxmask = gps_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(13),  	.funcval = 0,  }; @@ -487,6 +506,7 @@ static const struct sirfsoc_muxmask sdmmc5_muxmask[] = {  static const struct sirfsoc_padmux sdmmc5_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc5_muxmask),  	.muxmask = sdmmc5_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(13),  	.funcval = BIT(13),  }; @@ -503,12 +523,47 @@ static const struct sirfsoc_muxmask usp0_muxmask[] = {  static const struct sirfsoc_padmux usp0_padmux = {  	.muxmask_counts = ARRAY_SIZE(usp0_muxmask),  	.muxmask = usp0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(1) | BIT(2) | BIT(9),  	.funcval = 0,  };  static const unsigned usp0_pins[] = { 51, 52, 53, 54, 55 }; +static const struct sirfsoc_muxmask usp0_only_utfs_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(19) | BIT(20) | BIT(21) | BIT(22), +	}, +}; + +static const struct sirfsoc_padmux usp0_only_utfs_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp0_only_utfs_muxmask), +	.muxmask = usp0_only_utfs_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX, +	.funcmask = BIT(1) | BIT(2) | BIT(6), +	.funcval = 0, +}; + +static const unsigned usp0_only_utfs_pins[] = { 51, 52, 53, 54 }; + +static const struct sirfsoc_muxmask usp0_only_urfs_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(19) | BIT(20) | BIT(21) | BIT(23), +	}, +}; + +static const struct sirfsoc_padmux usp0_only_urfs_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp0_only_urfs_muxmask), +	.muxmask = usp0_only_urfs_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX, +	.funcmask = BIT(1) | BIT(2) | BIT(9), +	.funcval = 0, +}; + +static const unsigned usp0_only_urfs_pins[] = { 51, 52, 53, 55 }; +  static const struct sirfsoc_muxmask usp0_uart_nostreamctrl_muxmask[] = {  	{  		.group = 1, @@ -535,12 +590,30 @@ static const struct sirfsoc_muxmask usp1_muxmask[] = {  static const struct sirfsoc_padmux usp1_padmux = {  	.muxmask_counts = ARRAY_SIZE(usp1_muxmask),  	.muxmask = usp1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(16),  	.funcval = BIT(16),  };  static const unsigned usp1_pins[] = { 15, 43, 44, 45, 46 }; +static const struct sirfsoc_muxmask usp1_uart_nostreamctrl_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(12) | BIT(13), +	}, +}; + +static const struct sirfsoc_padmux usp1_uart_nostreamctrl_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp1_uart_nostreamctrl_muxmask), +	.muxmask = usp1_uart_nostreamctrl_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX, +	.funcmask = BIT(16), +	.funcval = BIT(16), +}; + +static const unsigned usp1_uart_nostreamctrl_pins[] = { 44, 45 }; +  static const struct sirfsoc_muxmask nand_muxmask[] = {  	{  		.group = 2, @@ -554,6 +627,7 @@ static const struct sirfsoc_muxmask nand_muxmask[] = {  static const struct sirfsoc_padmux nand_padmux = {  	.muxmask_counts = ARRAY_SIZE(nand_muxmask),  	.muxmask = nand_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(5) | BIT(19),  	.funcval = 0,  }; @@ -570,6 +644,7 @@ static const struct sirfsoc_muxmask sdmmc0_muxmask[] = {  static const struct sirfsoc_padmux sdmmc0_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc0_muxmask),  	.muxmask = sdmmc0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(5) | BIT(19),  	.funcval = BIT(19),  }; @@ -586,6 +661,7 @@ static const struct sirfsoc_muxmask sdmmc2_muxmask[] = {  static const struct sirfsoc_padmux sdmmc2_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc2_muxmask),  	.muxmask = sdmmc2_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(11),  	.funcval = 0,  }; @@ -602,6 +678,7 @@ static const struct sirfsoc_muxmask sdmmc2_nowp_muxmask[] = {  static const struct sirfsoc_padmux sdmmc2_nowp_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc2_nowp_muxmask),  	.muxmask = sdmmc2_nowp_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(11),  	.funcval = 0,  }; @@ -634,6 +711,7 @@ static const struct sirfsoc_muxmask vip_muxmask[] = {  static const struct sirfsoc_padmux vip_padmux = {  	.muxmask_counts = ARRAY_SIZE(vip_muxmask),  	.muxmask = vip_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(18),  	.funcval = BIT(18),  }; @@ -654,6 +732,7 @@ static const struct sirfsoc_muxmask vip_noupli_muxmask[] = {  static const struct sirfsoc_padmux vip_noupli_padmux = {  	.muxmask_counts = ARRAY_SIZE(vip_noupli_muxmask),  	.muxmask = vip_noupli_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(15),  	.funcval = BIT(15),  }; @@ -684,6 +763,7 @@ static const struct sirfsoc_muxmask i2c1_muxmask[] = {  static const struct sirfsoc_padmux i2c1_padmux = {  	.muxmask_counts = ARRAY_SIZE(i2c1_muxmask),  	.muxmask = i2c1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(16),  	.funcval = 0,  }; @@ -700,6 +780,7 @@ static const struct sirfsoc_muxmask pwm0_muxmask[] = {  static const struct sirfsoc_padmux pwm0_padmux = {  	.muxmask_counts = ARRAY_SIZE(pwm0_muxmask),  	.muxmask = pwm0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(12),  	.funcval = 0,  }; @@ -772,6 +853,7 @@ static const struct sirfsoc_muxmask warm_rst_muxmask[] = {  static const struct sirfsoc_padmux warm_rst_padmux = {  	.muxmask_counts = ARRAY_SIZE(warm_rst_muxmask),  	.muxmask = warm_rst_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = 0,  }; @@ -789,6 +871,7 @@ static const struct sirfsoc_muxmask usb0_upli_drvbus_muxmask[] = {  static const struct sirfsoc_padmux usb0_upli_drvbus_padmux = {  	.muxmask_counts = ARRAY_SIZE(usb0_upli_drvbus_muxmask),  	.muxmask = usb0_upli_drvbus_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(18),  	.funcval = 0,  }; @@ -805,12 +888,31 @@ static const struct sirfsoc_muxmask usb1_utmi_drvbus_muxmask[] = {  static const struct sirfsoc_padmux usb1_utmi_drvbus_padmux = {  	.muxmask_counts = ARRAY_SIZE(usb1_utmi_drvbus_muxmask),  	.muxmask = usb1_utmi_drvbus_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(11),  	.funcval = BIT(11), /* refer to PAD_UTMI_DRVVBUS1_ENABLE */  };  static const unsigned usb1_utmi_drvbus_pins[] = { 28 }; +static const struct sirfsoc_padmux usb1_dp_dn_padmux = { +	.muxmask_counts = 0, +	.ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, +	.funcmask = BIT(2), +	.funcval = BIT(2), +}; + +static const unsigned usb1_dp_dn_pins[] = { 103, 104 }; + +static const struct sirfsoc_padmux uart1_route_io_usb1_padmux = { +	.muxmask_counts = 0, +	.ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, +	.funcmask = BIT(2), +	.funcval = 0, +}; + +static const unsigned uart1_route_io_usb1_pins[] = { 103, 104 }; +  static const struct sirfsoc_muxmask pulse_count_muxmask[] = {  	{  		.group = 0, @@ -838,7 +940,11 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = {  	SIRFSOC_PIN_GROUP("usp0grp", usp0_pins),  	SIRFSOC_PIN_GROUP("usp0_uart_nostreamctrl_grp",  					usp0_uart_nostreamctrl_pins), +	SIRFSOC_PIN_GROUP("usp0_only_utfs_grp", usp0_only_utfs_pins), +	SIRFSOC_PIN_GROUP("usp0_only_urfs_grp", usp0_only_urfs_pins),  	SIRFSOC_PIN_GROUP("usp1grp", usp1_pins), +	SIRFSOC_PIN_GROUP("usp1_uart_nostreamctrl_grp", +					usp1_uart_nostreamctrl_pins),  	SIRFSOC_PIN_GROUP("i2c0grp", i2c0_pins),  	SIRFSOC_PIN_GROUP("i2c1grp", i2c1_pins),  	SIRFSOC_PIN_GROUP("pwm0grp", pwm0_pins), @@ -859,6 +965,8 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = {  	SIRFSOC_PIN_GROUP("sdmmc5grp", sdmmc5_pins),  	SIRFSOC_PIN_GROUP("usb0_upli_drvbusgrp", usb0_upli_drvbus_pins),  	SIRFSOC_PIN_GROUP("usb1_utmi_drvbusgrp", usb1_utmi_drvbus_pins), +	SIRFSOC_PIN_GROUP("usb1_dp_dngrp", usb1_dp_dn_pins), +	SIRFSOC_PIN_GROUP("uart1_route_io_usb1grp", uart1_route_io_usb1_pins),  	SIRFSOC_PIN_GROUP("pulse_countgrp", pulse_count_pins),  	SIRFSOC_PIN_GROUP("i2sgrp", i2s_pins),  	SIRFSOC_PIN_GROUP("i2s_no_dingrp", i2s_no_din_pins), @@ -882,7 +990,12 @@ static const char * const uart2_nostreamctrlgrp[] = { "uart2_nostreamctrlgrp" };  static const char * const usp0_uart_nostreamctrl_grp[] = {  					"usp0_uart_nostreamctrl_grp" };  static const char * const usp0grp[] = { "usp0grp" }; +static const char * const usp0_only_utfs_grp[] = { "usp0_only_utfs_grp" }; +static const char * const usp0_only_urfs_grp[] = { "usp0_only_urfs_grp" }; +  static const char * const usp1grp[] = { "usp1grp" }; +static const char * const usp1_uart_nostreamctrl_grp[] = { +					"usp1_uart_nostreamctrl_grp" };  static const char * const i2c0grp[] = { "i2c0grp" };  static const char * const i2c1grp[] = { "i2c1grp" };  static const char * const pwm0grp[] = { "pwm0grp" }; @@ -903,6 +1016,8 @@ static const char * const sdmmc5grp[] = { "sdmmc5grp" };  static const char * const sdmmc2_nowpgrp[] = { "sdmmc2_nowpgrp" };  static const char * const usb0_upli_drvbusgrp[] = { "usb0_upli_drvbusgrp" };  static const char * const usb1_utmi_drvbusgrp[] = { "usb1_utmi_drvbusgrp" }; +static const char * const usb1_dp_dngrp[] = { "usb1_dp_dngrp" }; +static const char * const uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" };  static const char * const pulse_countgrp[] = { "pulse_countgrp" };  static const char * const i2sgrp[] = { "i2sgrp" };  static const char * const i2s_no_dingrp[] = { "i2s_no_dingrp" }; @@ -928,7 +1043,14 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {  	SIRFSOC_PMX_FUNCTION("usp0_uart_nostreamctrl",  						usp0_uart_nostreamctrl_grp,  						usp0_uart_nostreamctrl_padmux), +	SIRFSOC_PMX_FUNCTION("usp0_only_utfs", usp0_only_utfs_grp, +						usp0_only_utfs_padmux), +	SIRFSOC_PMX_FUNCTION("usp0_only_urfs", usp0_only_urfs_grp, +						usp0_only_urfs_padmux),  	SIRFSOC_PMX_FUNCTION("usp1", usp1grp, usp1_padmux), +	SIRFSOC_PMX_FUNCTION("usp1_uart_nostreamctrl", +						usp1_uart_nostreamctrl_grp, +						usp1_uart_nostreamctrl_padmux),  	SIRFSOC_PMX_FUNCTION("i2c0", i2c0grp, i2c0_padmux),  	SIRFSOC_PMX_FUNCTION("i2c1", i2c1grp, i2c1_padmux),  	SIRFSOC_PMX_FUNCTION("pwm0", pwm0grp, pwm0_padmux), @@ -949,6 +1071,8 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {  	SIRFSOC_PMX_FUNCTION("sdmmc2_nowp", sdmmc2_nowpgrp, sdmmc2_nowp_padmux),  	SIRFSOC_PMX_FUNCTION("usb0_upli_drvbus", usb0_upli_drvbusgrp, usb0_upli_drvbus_padmux),  	SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus", usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux), +	SIRFSOC_PMX_FUNCTION("usb1_dp_dn", usb1_dp_dngrp, usb1_dp_dn_padmux), +	SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1", uart1_route_io_usb1grp, uart1_route_io_usb1_padmux),  	SIRFSOC_PMX_FUNCTION("pulse_count", pulse_countgrp, pulse_count_padmux),  	SIRFSOC_PMX_FUNCTION("i2s", i2sgrp, i2s_padmux),  	SIRFSOC_PMX_FUNCTION("i2s_no_din", i2s_no_dingrp, i2s_no_din_padmux), diff --git a/drivers/pinctrl/sirf/pinctrl-prima2.c b/drivers/pinctrl/sirf/pinctrl-prima2.c index 1f0ad1ef5a3..8aa76f0776d 100644 --- a/drivers/pinctrl/sirf/pinctrl-prima2.c +++ b/drivers/pinctrl/sirf/pinctrl-prima2.c @@ -1,7 +1,8 @@  /*   * pinctrl pads, groups, functions for CSR SiRFprimaII   * - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * Copyright (c) 2011 - 2014 Cambridge Silicon Radio Limited, a CSR plc group + * company.   *   * Licensed under GPLv2 or later.   */ @@ -126,6 +127,9 @@ static const struct pinctrl_pin_desc sirfsoc_pads[] = {  	PINCTRL_PIN(112, "x_ldd[13]"),  	PINCTRL_PIN(113, "x_ldd[14]"),  	PINCTRL_PIN(114, "x_ldd[15]"), + +	PINCTRL_PIN(115, "x_usb1_dp"), +	PINCTRL_PIN(116, "x_usb1_dn"),  };  static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = { @@ -143,6 +147,7 @@ static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = {  static const struct sirfsoc_padmux lcd_16bits_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcd_16bits_sirfsoc_muxmask),  	.muxmask = lcd_16bits_sirfsoc_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = 0,  }; @@ -168,6 +173,7 @@ static const struct sirfsoc_muxmask lcd_18bits_muxmask[] = {  static const struct sirfsoc_padmux lcd_18bits_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcd_18bits_muxmask),  	.muxmask = lcd_18bits_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = 0,  }; @@ -193,6 +199,7 @@ static const struct sirfsoc_muxmask lcd_24bits_muxmask[] = {  static const struct sirfsoc_padmux lcd_24bits_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcd_24bits_muxmask),  	.muxmask = lcd_24bits_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = 0,  }; @@ -218,6 +225,7 @@ static const struct sirfsoc_muxmask lcdrom_muxmask[] = {  static const struct sirfsoc_padmux lcdrom_padmux = {  	.muxmask_counts = ARRAY_SIZE(lcdrom_muxmask),  	.muxmask = lcdrom_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(4),  	.funcval = BIT(4),  }; @@ -238,6 +246,7 @@ static const struct sirfsoc_muxmask uart0_muxmask[] = {  static const struct sirfsoc_padmux uart0_padmux = {  	.muxmask_counts = ARRAY_SIZE(uart0_muxmask),  	.muxmask = uart0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(9),  	.funcval = BIT(9),  }; @@ -282,6 +291,7 @@ static const struct sirfsoc_muxmask uart2_muxmask[] = {  static const struct sirfsoc_padmux uart2_padmux = {  	.muxmask_counts = ARRAY_SIZE(uart2_muxmask),  	.muxmask = uart2_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(10),  	.funcval = BIT(10),  }; @@ -315,6 +325,7 @@ static const struct sirfsoc_muxmask sdmmc3_muxmask[] = {  static const struct sirfsoc_padmux sdmmc3_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc3_muxmask),  	.muxmask = sdmmc3_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(7),  	.funcval = 0,  }; @@ -331,6 +342,7 @@ static const struct sirfsoc_muxmask spi0_muxmask[] = {  static const struct sirfsoc_padmux spi0_padmux = {  	.muxmask_counts = ARRAY_SIZE(spi0_muxmask),  	.muxmask = spi0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(7),  	.funcval = BIT(7),  }; @@ -361,6 +373,7 @@ static const struct sirfsoc_muxmask cko1_muxmask[] = {  static const struct sirfsoc_padmux cko1_padmux = {  	.muxmask_counts = ARRAY_SIZE(cko1_muxmask),  	.muxmask = cko1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(3),  	.funcval = 0,  }; @@ -379,6 +392,7 @@ static const struct sirfsoc_muxmask i2s_muxmask[] = {  static const struct sirfsoc_padmux i2s_padmux = {  	.muxmask_counts = ARRAY_SIZE(i2s_muxmask),  	.muxmask = i2s_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(3) | BIT(9),  	.funcval = BIT(3),  }; @@ -395,11 +409,12 @@ static const struct sirfsoc_muxmask ac97_muxmask[] = {  static const struct sirfsoc_padmux ac97_padmux = {  	.muxmask_counts = ARRAY_SIZE(ac97_muxmask),  	.muxmask = ac97_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(8),  	.funcval = 0,  }; -static const unsigned ac97_pins[] = { 33, 34, 35, 36 }; +static const unsigned ac97_pins[] = { 43, 44, 45, 46 };  static const struct sirfsoc_muxmask spi1_muxmask[] = {  	{ @@ -411,6 +426,7 @@ static const struct sirfsoc_muxmask spi1_muxmask[] = {  static const struct sirfsoc_padmux spi1_padmux = {  	.muxmask_counts = ARRAY_SIZE(spi1_muxmask),  	.muxmask = spi1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(8),  	.funcval = BIT(8),  }; @@ -441,6 +457,7 @@ static const struct sirfsoc_muxmask gps_muxmask[] = {  static const struct sirfsoc_padmux gps_padmux = {  	.muxmask_counts = ARRAY_SIZE(gps_muxmask),  	.muxmask = gps_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(12) | BIT(13) | BIT(14),  	.funcval = BIT(12),  }; @@ -451,23 +468,18 @@ static const struct sirfsoc_muxmask sdmmc5_muxmask[] = {  	{  		.group = 0,  		.mask = BIT(24) | BIT(25) | BIT(26), -	}, { -		.group = 1, -		.mask = BIT(29), -	}, { -		.group = 2, -		.mask = BIT(0) | BIT(1),  	},  };  static const struct sirfsoc_padmux sdmmc5_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc5_muxmask),  	.muxmask = sdmmc5_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(13) | BIT(14),  	.funcval = BIT(13) | BIT(14),  }; -static const unsigned sdmmc5_pins[] = { 24, 25, 26, 61, 64, 65 }; +static const unsigned sdmmc5_pins[] = { 24, 25, 26 };  static const struct sirfsoc_muxmask usp0_muxmask[] = {  	{ @@ -479,12 +491,61 @@ static const struct sirfsoc_muxmask usp0_muxmask[] = {  static const struct sirfsoc_padmux usp0_padmux = {  	.muxmask_counts = ARRAY_SIZE(usp0_muxmask),  	.muxmask = usp0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(1) | BIT(2) | BIT(6) | BIT(9),  	.funcval = 0,  };  static const unsigned usp0_pins[] = { 51, 52, 53, 54, 55 }; +static const struct sirfsoc_muxmask usp0_only_utfs_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(19) | BIT(20) | BIT(21) | BIT(22), +	}, +}; + +static const struct sirfsoc_padmux usp0_only_utfs_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp0_only_utfs_muxmask), +	.muxmask = usp0_only_utfs_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX, +	.funcmask = BIT(1) | BIT(2) | BIT(6), +	.funcval = 0, +}; + +static const unsigned usp0_only_utfs_pins[] = { 51, 52, 53, 54 }; + +static const struct sirfsoc_muxmask usp0_only_urfs_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(19) | BIT(20) | BIT(21) | BIT(23), +	}, +}; + +static const struct sirfsoc_padmux usp0_only_urfs_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp0_only_urfs_muxmask), +	.muxmask = usp0_only_urfs_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX, +	.funcmask = BIT(1) | BIT(2) | BIT(9), +	.funcval = 0, +}; + +static const unsigned usp0_only_urfs_pins[] = { 51, 52, 53, 55 }; + +static const struct sirfsoc_muxmask usp0_uart_nostreamctrl_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(20) | BIT(21), +	}, +}; + +static const struct sirfsoc_padmux usp0_uart_nostreamctrl_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp0_uart_nostreamctrl_muxmask), +	.muxmask = usp0_uart_nostreamctrl_muxmask, +}; + +static const unsigned usp0_uart_nostreamctrl_pins[] = { 52, 53 }; +  static const struct sirfsoc_muxmask usp1_muxmask[] = {  	{  		.group = 1, @@ -495,12 +556,27 @@ static const struct sirfsoc_muxmask usp1_muxmask[] = {  static const struct sirfsoc_padmux usp1_padmux = {  	.muxmask_counts = ARRAY_SIZE(usp1_muxmask),  	.muxmask = usp1_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(1) | BIT(9) | BIT(10) | BIT(11),  	.funcval = 0,  };  static const unsigned usp1_pins[] = { 56, 57, 58, 59, 60 }; +static const struct sirfsoc_muxmask usp1_uart_nostreamctrl_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(25) | BIT(26), +	}, +}; + +static const struct sirfsoc_padmux usp1_uart_nostreamctrl_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp1_uart_nostreamctrl_muxmask), +	.muxmask = usp1_uart_nostreamctrl_muxmask, +}; + +static const unsigned usp1_uart_nostreamctrl_pins[] = { 57, 58 }; +  static const struct sirfsoc_muxmask usp2_muxmask[] = {  	{  		.group = 1, @@ -514,12 +590,27 @@ static const struct sirfsoc_muxmask usp2_muxmask[] = {  static const struct sirfsoc_padmux usp2_padmux = {  	.muxmask_counts = ARRAY_SIZE(usp2_muxmask),  	.muxmask = usp2_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(13) | BIT(14),  	.funcval = 0,  };  static const unsigned usp2_pins[] = { 61, 62, 63, 64, 65 }; +static const struct sirfsoc_muxmask usp2_uart_nostreamctrl_muxmask[] = { +	{ +		.group = 1, +		.mask = BIT(30) | BIT(31), +	}, +}; + +static const struct sirfsoc_padmux usp2_uart_nostreamctrl_padmux = { +	.muxmask_counts = ARRAY_SIZE(usp2_uart_nostreamctrl_muxmask), +	.muxmask = usp2_uart_nostreamctrl_muxmask, +}; + +static const unsigned usp2_uart_nostreamctrl_pins[] = { 62, 63 }; +  static const struct sirfsoc_muxmask nand_muxmask[] = {  	{  		.group = 2, @@ -530,6 +621,7 @@ static const struct sirfsoc_muxmask nand_muxmask[] = {  static const struct sirfsoc_padmux nand_padmux = {  	.muxmask_counts = ARRAY_SIZE(nand_muxmask),  	.muxmask = nand_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(5),  	.funcval = 0,  }; @@ -538,6 +630,7 @@ static const unsigned nand_pins[] = { 64, 65, 92, 93, 94 };  static const struct sirfsoc_padmux sdmmc0_padmux = {  	.muxmask_counts = 0, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(5),  	.funcval = 0,  }; @@ -554,6 +647,7 @@ static const struct sirfsoc_muxmask sdmmc2_muxmask[] = {  static const struct sirfsoc_padmux sdmmc2_padmux = {  	.muxmask_counts = ARRAY_SIZE(sdmmc2_muxmask),  	.muxmask = sdmmc2_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(5),  	.funcval = BIT(5),  }; @@ -586,6 +680,7 @@ static const struct sirfsoc_muxmask vip_muxmask[] = {  static const struct sirfsoc_padmux vip_padmux = {  	.muxmask_counts = ARRAY_SIZE(vip_muxmask),  	.muxmask = vip_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(0),  	.funcval = 0,  }; @@ -635,6 +730,7 @@ static const struct sirfsoc_muxmask viprom_muxmask[] = {  static const struct sirfsoc_padmux viprom_padmux = {  	.muxmask_counts = ARRAY_SIZE(viprom_muxmask),  	.muxmask = viprom_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(0),  	.funcval = BIT(0),  }; @@ -651,6 +747,7 @@ static const struct sirfsoc_muxmask pwm0_muxmask[] = {  static const struct sirfsoc_padmux pwm0_padmux = {  	.muxmask_counts = ARRAY_SIZE(pwm0_muxmask),  	.muxmask = pwm0_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(12),  	.funcval = 0,  }; @@ -722,6 +819,7 @@ static const struct sirfsoc_muxmask usb0_utmi_drvbus_muxmask[] = {  static const struct sirfsoc_padmux usb0_utmi_drvbus_padmux = {  	.muxmask_counts = ARRAY_SIZE(usb0_utmi_drvbus_muxmask),  	.muxmask = usb0_utmi_drvbus_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(6),  	.funcval = BIT(6), /* refer to PAD_UTMI_DRVVBUS0_ENABLE */  }; @@ -738,12 +836,31 @@ static const struct sirfsoc_muxmask usb1_utmi_drvbus_muxmask[] = {  static const struct sirfsoc_padmux usb1_utmi_drvbus_padmux = {  	.muxmask_counts = ARRAY_SIZE(usb1_utmi_drvbus_muxmask),  	.muxmask = usb1_utmi_drvbus_muxmask, +	.ctrlreg = SIRFSOC_RSC_PIN_MUX,  	.funcmask = BIT(11),  	.funcval = BIT(11), /* refer to PAD_UTMI_DRVVBUS1_ENABLE */  };  static const unsigned usb1_utmi_drvbus_pins[] = { 59 }; +static const struct sirfsoc_padmux usb1_dp_dn_padmux = { +	.muxmask_counts = 0, +	.ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, +	.funcmask = BIT(2), +	.funcval = BIT(2), +}; + +static const unsigned usb1_dp_dn_pins[] = { 115, 116 }; + +static const struct sirfsoc_padmux uart1_route_io_usb1_padmux = { +	.muxmask_counts = 0, +	.ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, +	.funcmask = BIT(2), +	.funcval = 0, +}; + +static const unsigned uart1_route_io_usb1_pins[] = { 115, 116 }; +  static const struct sirfsoc_muxmask pulse_count_muxmask[] = {  	{  		.group = 0, @@ -764,12 +881,21 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = {  	SIRFSOC_PIN_GROUP("lcd_24bitsgrp", lcd_24bits_pins),  	SIRFSOC_PIN_GROUP("lcdrom_grp", lcdrom_pins),  	SIRFSOC_PIN_GROUP("uart0grp", uart0_pins), +	SIRFSOC_PIN_GROUP("uart0_nostreamctrlgrp", uart0_nostreamctrl_pins),  	SIRFSOC_PIN_GROUP("uart1grp", uart1_pins),  	SIRFSOC_PIN_GROUP("uart2grp", uart2_pins),  	SIRFSOC_PIN_GROUP("uart2_nostreamctrlgrp", uart2_nostreamctrl_pins),  	SIRFSOC_PIN_GROUP("usp0grp", usp0_pins), +	SIRFSOC_PIN_GROUP("usp0_uart_nostreamctrl_grp", +					usp0_uart_nostreamctrl_pins), +	SIRFSOC_PIN_GROUP("usp0_only_utfs_grp", usp0_only_utfs_pins), +	SIRFSOC_PIN_GROUP("usp0_only_urfs_grp", usp0_only_urfs_pins),  	SIRFSOC_PIN_GROUP("usp1grp", usp1_pins), +	SIRFSOC_PIN_GROUP("usp1_uart_nostreamctrl_grp", +					usp1_uart_nostreamctrl_pins),  	SIRFSOC_PIN_GROUP("usp2grp", usp2_pins), +	SIRFSOC_PIN_GROUP("usp2_uart_nostreamctrl_grp", +					usp2_uart_nostreamctrl_pins),  	SIRFSOC_PIN_GROUP("i2c0grp", i2c0_pins),  	SIRFSOC_PIN_GROUP("i2c1grp", i2c1_pins),  	SIRFSOC_PIN_GROUP("pwm0grp", pwm0_pins), @@ -789,6 +915,8 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = {  	SIRFSOC_PIN_GROUP("sdmmc5grp", sdmmc5_pins),  	SIRFSOC_PIN_GROUP("usb0_utmi_drvbusgrp", usb0_utmi_drvbus_pins),  	SIRFSOC_PIN_GROUP("usb1_utmi_drvbusgrp", usb1_utmi_drvbus_pins), +	SIRFSOC_PIN_GROUP("usb1_dp_dngrp", usb1_dp_dn_pins), +	SIRFSOC_PIN_GROUP("uart1_route_io_usb1grp", uart1_route_io_usb1_pins),  	SIRFSOC_PIN_GROUP("pulse_countgrp", pulse_count_pins),  	SIRFSOC_PIN_GROUP("i2sgrp", i2s_pins),  	SIRFSOC_PIN_GROUP("ac97grp", ac97_pins), @@ -803,12 +931,21 @@ static const char * const lcd_18bitsgrp[] = { "lcd_18bitsgrp" };  static const char * const lcd_24bitsgrp[] = { "lcd_24bitsgrp" };  static const char * const lcdromgrp[] = { "lcdromgrp" };  static const char * const uart0grp[] = { "uart0grp" }; +static const char * const uart0_nostreamctrlgrp[] = { "uart0_nostreamctrlgrp" };  static const char * const uart1grp[] = { "uart1grp" };  static const char * const uart2grp[] = { "uart2grp" };  static const char * const uart2_nostreamctrlgrp[] = { "uart2_nostreamctrlgrp" };  static const char * const usp0grp[] = { "usp0grp" }; +static const char * const usp0_uart_nostreamctrl_grp[] = +					{ "usp0_uart_nostreamctrl_grp" }; +static const char * const usp0_only_utfs_grp[] = { "usp0_only_utfs_grp" }; +static const char * const usp0_only_urfs_grp[] = { "usp0_only_urfs_grp" };  static const char * const usp1grp[] = { "usp1grp" }; +static const char * const usp1_uart_nostreamctrl_grp[] = +					{ "usp1_uart_nostreamctrl_grp" };  static const char * const usp2grp[] = { "usp2grp" }; +static const char * const usp2_uart_nostreamctrl_grp[] = +					{ "usp2_uart_nostreamctrl_grp" };  static const char * const i2c0grp[] = { "i2c0grp" };  static const char * const i2c1grp[] = { "i2c1grp" };  static const char * const pwm0grp[] = { "pwm0grp" }; @@ -828,6 +965,8 @@ static const char * const sdmmc4grp[] = { "sdmmc4grp" };  static const char * const sdmmc5grp[] = { "sdmmc5grp" };  static const char * const usb0_utmi_drvbusgrp[] = { "usb0_utmi_drvbusgrp" };  static const char * const usb1_utmi_drvbusgrp[] = { "usb1_utmi_drvbusgrp" }; +static const char * const usb1_dp_dngrp[] = { "usb1_dp_dngrp" }; +static const char * const uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" };  static const char * const pulse_countgrp[] = { "pulse_countgrp" };  static const char * const i2sgrp[] = { "i2sgrp" };  static const char * const ac97grp[] = { "ac97grp" }; @@ -842,12 +981,21 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {  	SIRFSOC_PMX_FUNCTION("lcd_24bits", lcd_24bitsgrp, lcd_24bits_padmux),  	SIRFSOC_PMX_FUNCTION("lcdrom", lcdromgrp, lcdrom_padmux),  	SIRFSOC_PMX_FUNCTION("uart0", uart0grp, uart0_padmux), +	SIRFSOC_PMX_FUNCTION("uart0_nostreamctrl", uart0_nostreamctrlgrp, uart0_nostreamctrl_padmux),  	SIRFSOC_PMX_FUNCTION("uart1", uart1grp, uart1_padmux),  	SIRFSOC_PMX_FUNCTION("uart2", uart2grp, uart2_padmux),  	SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl", uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux),  	SIRFSOC_PMX_FUNCTION("usp0", usp0grp, usp0_padmux), +	SIRFSOC_PMX_FUNCTION("usp0_uart_nostreamctrl", +		usp0_uart_nostreamctrl_grp, usp0_uart_nostreamctrl_padmux), +	SIRFSOC_PMX_FUNCTION("usp0_only_utfs", usp0_only_utfs_grp, usp0_only_utfs_padmux), +	SIRFSOC_PMX_FUNCTION("usp0_only_urfs", usp0_only_urfs_grp, usp0_only_urfs_padmux),  	SIRFSOC_PMX_FUNCTION("usp1", usp1grp, usp1_padmux), +	SIRFSOC_PMX_FUNCTION("usp1_uart_nostreamctrl", +		usp1_uart_nostreamctrl_grp, usp1_uart_nostreamctrl_padmux),  	SIRFSOC_PMX_FUNCTION("usp2", usp2grp, usp2_padmux), +	SIRFSOC_PMX_FUNCTION("usp2_uart_nostreamctrl", +		usp2_uart_nostreamctrl_grp, usp2_uart_nostreamctrl_padmux),  	SIRFSOC_PMX_FUNCTION("i2c0", i2c0grp, i2c0_padmux),  	SIRFSOC_PMX_FUNCTION("i2c1", i2c1grp, i2c1_padmux),  	SIRFSOC_PMX_FUNCTION("pwm0", pwm0grp, pwm0_padmux), @@ -867,6 +1015,8 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {  	SIRFSOC_PMX_FUNCTION("sdmmc5", sdmmc5grp, sdmmc5_padmux),  	SIRFSOC_PMX_FUNCTION("usb0_utmi_drvbus", usb0_utmi_drvbusgrp, usb0_utmi_drvbus_padmux),  	SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus", usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux), +	SIRFSOC_PMX_FUNCTION("usb1_dp_dn", usb1_dp_dngrp, usb1_dp_dn_padmux), +	SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1", uart1_route_io_usb1grp, uart1_route_io_usb1_padmux),  	SIRFSOC_PMX_FUNCTION("pulse_count", pulse_countgrp, pulse_count_padmux),  	SIRFSOC_PMX_FUNCTION("i2s", i2sgrp, i2s_padmux),  	SIRFSOC_PMX_FUNCTION("ac97", ac97grp, ac97_padmux), diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c index 26f946af793..014f5b1fee5 100644 --- a/drivers/pinctrl/sirf/pinctrl-sirf.c +++ b/drivers/pinctrl/sirf/pinctrl-sirf.c @@ -1,7 +1,8 @@  /*   * pinmux driver for CSR SiRFprimaII   * - * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. + * Copyright (c) 2011 - 2014 Cambridge Silicon Radio Limited, a CSR plc group + * company.   *   * Licensed under GPLv2 or later.   */ @@ -13,8 +14,6 @@  #include <linux/io.h>  #include <linux/slab.h>  #include <linux/err.h> -#include <linux/irqdomain.h> -#include <linux/irqchip/chained_irq.h>  #include <linux/pinctrl/pinctrl.h>  #include <linux/pinctrl/pinmux.h>  #include <linux/pinctrl/consumer.h> @@ -26,22 +25,23 @@  #include <linux/bitops.h>  #include <linux/gpio.h>  #include <linux/of_gpio.h> -#include <asm/mach/irq.h>  #include "pinctrl-sirf.h"  #define DRIVER_NAME "pinmux-sirf"  struct sirfsoc_gpio_bank { -	struct of_mm_gpio_chip chip; -	struct irq_domain *domain;  	int id;  	int parent_irq;  	spinlock_t lock; +}; + +struct sirfsoc_gpio_chip { +	struct of_mm_gpio_chip chip;  	bool is_marco; /* for marco, some registers are different with prima2 */ +	struct sirfsoc_gpio_bank sgpio_bank[SIRFSOC_GPIO_NO_OF_BANKS];  }; -static struct sirfsoc_gpio_bank sgpio_bank[SIRFSOC_GPIO_NO_OF_BANKS];  static DEFINE_SPINLOCK(sgpio_lock);  static struct sirfsoc_pin_group *sirfsoc_pin_groups; @@ -166,12 +166,12 @@ static void sirfsoc_pinmux_endisable(struct sirfsoc_pmx *spmx, unsigned selector  	if (mux->funcmask && enable) {  		u32 func_en_val; +  		func_en_val = -			readl(spmx->rsc_virtbase + SIRFSOC_RSC_PIN_MUX); +			readl(spmx->rsc_virtbase + mux->ctrlreg);  		func_en_val = -			(func_en_val & ~mux->funcmask) | (mux-> -				funcval); -		writel(func_en_val, spmx->rsc_virtbase + SIRFSOC_RSC_PIN_MUX); +			(func_en_val & ~mux->funcmask) | (mux->funcval); +		writel(func_en_val, spmx->rsc_virtbase + mux->ctrlreg);  	}  } @@ -254,37 +254,6 @@ static struct pinctrl_desc sirfsoc_pinmux_desc = {  	.owner = THIS_MODULE,  }; -/* - * Todo: bind irq_chip to every pinctrl_gpio_range - */ -static struct pinctrl_gpio_range sirfsoc_gpio_ranges[] = { -	{ -		.name = "sirfsoc-gpio*", -		.id = 0, -		.base = 0, -		.pin_base = 0, -		.npins = 32, -	}, { -		.name = "sirfsoc-gpio*", -		.id = 1, -		.base = 32, -		.pin_base = 32, -		.npins = 32, -	}, { -		.name = "sirfsoc-gpio*", -		.id = 2, -		.base = 64, -		.pin_base = 64, -		.npins = 32, -	}, { -		.name = "sirfsoc-gpio*", -		.id = 3, -		.base = 96, -		.pin_base = 96, -		.npins = 19, -	}, -}; -  static void __iomem *sirfsoc_rsc_of_iomap(void)  {  	const struct of_device_id rsc_ids[]  = { @@ -302,19 +271,16 @@ static void __iomem *sirfsoc_rsc_of_iomap(void)  }  static int sirfsoc_gpio_of_xlate(struct gpio_chip *gc, -       const struct of_phandle_args *gpiospec, -       u32 *flags) +	const struct of_phandle_args *gpiospec, +	u32 *flags)  { -       if (gpiospec->args[0] > SIRFSOC_GPIO_NO_OF_BANKS * SIRFSOC_GPIO_BANK_SIZE) -		return -EINVAL; - -       if (gc != &sgpio_bank[gpiospec->args[0] / SIRFSOC_GPIO_BANK_SIZE].chip.gc) +	if (gpiospec->args[0] > SIRFSOC_GPIO_NO_OF_BANKS * SIRFSOC_GPIO_BANK_SIZE)  		return -EINVAL; -       if (flags) +	if (flags)  		*flags = gpiospec->args[1]; -       return gpiospec->args[0] % SIRFSOC_GPIO_BANK_SIZE; +	return gpiospec->args[0];  }  static const struct of_device_id pinmux_ids[] = { @@ -330,7 +296,6 @@ static int sirfsoc_pinmux_probe(struct platform_device *pdev)  	struct sirfsoc_pmx *spmx;  	struct device_node *np = pdev->dev.of_node;  	const struct sirfsoc_pinctrl_data *pdata; -	int i;  	/* Create state holders etc for this driver */  	spmx = devm_kzalloc(&pdev->dev, sizeof(*spmx), GFP_KERNEL); @@ -374,11 +339,6 @@ static int sirfsoc_pinmux_probe(struct platform_device *pdev)  		goto out_no_pmx;  	} -	for (i = 0; i < ARRAY_SIZE(sirfsoc_gpio_ranges); i++) { -		sirfsoc_gpio_ranges[i].gc = &sgpio_bank[i].chip.gc; -		pinctrl_add_gpio_range(spmx->pmx, &sirfsoc_gpio_ranges[i]); -	} -  	dev_info(&pdev->dev, "initialized SIRFSOC pinmux driver\n");  	return 0; @@ -463,33 +423,28 @@ static int __init sirfsoc_pinmux_init(void)  }  arch_initcall(sirfsoc_pinmux_init); -static inline int sirfsoc_gpio_to_irq(struct gpio_chip *chip, unsigned offset) -{ -	struct sirfsoc_gpio_bank *bank = container_of(to_of_mm_gpio_chip(chip), -		struct sirfsoc_gpio_bank, chip); - -	return irq_create_mapping(bank->domain, offset); -} - -static inline int sirfsoc_gpio_to_offset(unsigned int gpio) +static inline struct sirfsoc_gpio_chip *to_sirfsoc_gpio(struct gpio_chip *gc)  { -	return gpio % SIRFSOC_GPIO_BANK_SIZE; +	return container_of(gc, struct sirfsoc_gpio_chip, chip.gc);  } -static inline struct sirfsoc_gpio_bank *sirfsoc_gpio_to_bank(unsigned int gpio) +static inline struct sirfsoc_gpio_bank * +sirfsoc_gpio_to_bank(struct sirfsoc_gpio_chip *sgpio, unsigned int offset)  { -	return &sgpio_bank[gpio / SIRFSOC_GPIO_BANK_SIZE]; +	return &sgpio->sgpio_bank[offset / SIRFSOC_GPIO_BANK_SIZE];  } -static inline struct sirfsoc_gpio_bank *sirfsoc_irqchip_to_bank(struct gpio_chip *chip) +static inline int sirfsoc_gpio_to_bankoff(unsigned int offset)  { -	return container_of(to_of_mm_gpio_chip(chip), struct sirfsoc_gpio_bank, chip); +	return offset % SIRFSOC_GPIO_BANK_SIZE;  }  static void sirfsoc_gpio_irq_ack(struct irq_data *d)  { -	struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); -	int idx = d->hwirq % SIRFSOC_GPIO_BANK_SIZE; +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(gc); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); +	int idx = sirfsoc_gpio_to_bankoff(d->hwirq);  	u32 val, offset;  	unsigned long flags; @@ -497,14 +452,16 @@ static void sirfsoc_gpio_irq_ack(struct irq_data *d)  	spin_lock_irqsave(&sgpio_lock, flags); -	val = readl(bank->chip.regs + offset); +	val = readl(sgpio->chip.regs + offset); -	writel(val, bank->chip.regs + offset); +	writel(val, sgpio->chip.regs + offset);  	spin_unlock_irqrestore(&sgpio_lock, flags);  } -static void __sirfsoc_gpio_irq_mask(struct sirfsoc_gpio_bank *bank, int idx) +static void __sirfsoc_gpio_irq_mask(struct sirfsoc_gpio_chip *sgpio, +				    struct sirfsoc_gpio_bank *bank, +				    int idx)  {  	u32 val, offset;  	unsigned long flags; @@ -513,25 +470,29 @@ static void __sirfsoc_gpio_irq_mask(struct sirfsoc_gpio_bank *bank, int idx)  	spin_lock_irqsave(&sgpio_lock, flags); -	val = readl(bank->chip.regs + offset); +	val = readl(sgpio->chip.regs + offset);  	val &= ~SIRFSOC_GPIO_CTL_INTR_EN_MASK;  	val &= ~SIRFSOC_GPIO_CTL_INTR_STS_MASK; -	writel(val, bank->chip.regs + offset); +	writel(val, sgpio->chip.regs + offset);  	spin_unlock_irqrestore(&sgpio_lock, flags);  }  static void sirfsoc_gpio_irq_mask(struct irq_data *d)  { -	struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(gc); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); -	__sirfsoc_gpio_irq_mask(bank, d->hwirq % SIRFSOC_GPIO_BANK_SIZE); +	__sirfsoc_gpio_irq_mask(sgpio, bank, d->hwirq % SIRFSOC_GPIO_BANK_SIZE);  }  static void sirfsoc_gpio_irq_unmask(struct irq_data *d)  { -	struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); -	int idx = d->hwirq % SIRFSOC_GPIO_BANK_SIZE; +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(gc); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); +	int idx = sirfsoc_gpio_to_bankoff(d->hwirq);  	u32 val, offset;  	unsigned long flags; @@ -539,18 +500,20 @@ static void sirfsoc_gpio_irq_unmask(struct irq_data *d)  	spin_lock_irqsave(&sgpio_lock, flags); -	val = readl(bank->chip.regs + offset); +	val = readl(sgpio->chip.regs + offset);  	val &= ~SIRFSOC_GPIO_CTL_INTR_STS_MASK;  	val |= SIRFSOC_GPIO_CTL_INTR_EN_MASK; -	writel(val, bank->chip.regs + offset); +	writel(val, sgpio->chip.regs + offset);  	spin_unlock_irqrestore(&sgpio_lock, flags);  }  static int sirfsoc_gpio_irq_type(struct irq_data *d, unsigned type)  { -	struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); -	int idx = d->hwirq % SIRFSOC_GPIO_BANK_SIZE; +	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(gc); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, d->hwirq); +	int idx = sirfsoc_gpio_to_bankoff(d->hwirq);  	u32 val, offset;  	unsigned long flags; @@ -558,8 +521,8 @@ static int sirfsoc_gpio_irq_type(struct irq_data *d, unsigned type)  	spin_lock_irqsave(&sgpio_lock, flags); -	val = readl(bank->chip.regs + offset); -	val &= ~SIRFSOC_GPIO_CTL_INTR_STS_MASK; +	val = readl(sgpio->chip.regs + offset); +	val &= ~(SIRFSOC_GPIO_CTL_INTR_STS_MASK | SIRFSOC_GPIO_CTL_OUT_EN_MASK);  	switch (type) {  	case IRQ_TYPE_NONE: @@ -586,7 +549,7 @@ static int sirfsoc_gpio_irq_type(struct irq_data *d, unsigned type)  		break;  	} -	writel(val, bank->chip.regs + offset); +	writel(val, sgpio->chip.regs + offset);  	spin_unlock_irqrestore(&sgpio_lock, flags); @@ -603,14 +566,24 @@ static struct irq_chip sirfsoc_irq_chip = {  static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  { -	struct sirfsoc_gpio_bank *bank = irq_get_handler_data(irq); +	struct gpio_chip *gc = irq_desc_get_handler_data(desc); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(gc); +	struct sirfsoc_gpio_bank *bank;  	u32 status, ctrl;  	int idx = 0;  	struct irq_chip *chip = irq_get_chip(irq); +	int i; + +	for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { +		bank = &sgpio->sgpio_bank[i]; +		if (bank->parent_irq == irq) +			break; +	} +	BUG_ON(i == SIRFSOC_GPIO_NO_OF_BANKS);  	chained_irq_enter(chip, desc); -	status = readl(bank->chip.regs + SIRFSOC_GPIO_INT_STATUS(bank->id)); +	status = readl(sgpio->chip.regs + SIRFSOC_GPIO_INT_STATUS(bank->id));  	if (!status) {  		printk(KERN_WARNING  			"%s: gpio id %d status %#x no interrupt is flaged\n", @@ -620,7 +593,7 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  	}  	while (status) { -		ctrl = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx)); +		ctrl = readl(sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx));  		/*  		 * Here we must check whether the corresponding GPIO's interrupt @@ -629,7 +602,8 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  		if ((status & 0x1) && (ctrl & SIRFSOC_GPIO_CTL_INTR_EN_MASK)) {  			pr_debug("%s: gpio id %d idx %d happens\n",  				__func__, bank->id, idx); -			generic_handle_irq(irq_find_mapping(bank->domain, idx)); +			generic_handle_irq(irq_find_mapping(gc->irqdomain, idx + +					bank->id * SIRFSOC_GPIO_BANK_SIZE));  		}  		idx++; @@ -639,18 +613,20 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)  	chained_irq_exit(chip, desc);  } -static inline void sirfsoc_gpio_set_input(struct sirfsoc_gpio_bank *bank, unsigned ctrl_offset) +static inline void sirfsoc_gpio_set_input(struct sirfsoc_gpio_chip *sgpio, +					  unsigned ctrl_offset)  {  	u32 val; -	val = readl(bank->chip.regs + ctrl_offset); +	val = readl(sgpio->chip.regs + ctrl_offset);  	val &= ~SIRFSOC_GPIO_CTL_OUT_EN_MASK; -	writel(val, bank->chip.regs + ctrl_offset); +	writel(val, sgpio->chip.regs + ctrl_offset);  }  static int sirfsoc_gpio_request(struct gpio_chip *chip, unsigned offset)  { -	struct sirfsoc_gpio_bank *bank = sirfsoc_irqchip_to_bank(chip); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset);  	unsigned long flags;  	if (pinctrl_request_gpio(chip->base + offset)) @@ -662,8 +638,8 @@ static int sirfsoc_gpio_request(struct gpio_chip *chip, unsigned offset)  	 * default status:  	 * set direction as input and mask irq  	 */ -	sirfsoc_gpio_set_input(bank, SIRFSOC_GPIO_CTRL(bank->id, offset)); -	__sirfsoc_gpio_irq_mask(bank, offset); +	sirfsoc_gpio_set_input(sgpio, SIRFSOC_GPIO_CTRL(bank->id, offset)); +	__sirfsoc_gpio_irq_mask(sgpio, bank, offset);  	spin_unlock_irqrestore(&bank->lock, flags); @@ -672,13 +648,14 @@ static int sirfsoc_gpio_request(struct gpio_chip *chip, unsigned offset)  static void sirfsoc_gpio_free(struct gpio_chip *chip, unsigned offset)  { -	struct sirfsoc_gpio_bank *bank = sirfsoc_irqchip_to_bank(chip); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset);  	unsigned long flags;  	spin_lock_irqsave(&bank->lock, flags); -	__sirfsoc_gpio_irq_mask(bank, offset); -	sirfsoc_gpio_set_input(bank, SIRFSOC_GPIO_CTRL(bank->id, offset)); +	__sirfsoc_gpio_irq_mask(sgpio, bank, offset); +	sirfsoc_gpio_set_input(sgpio, SIRFSOC_GPIO_CTRL(bank->id, offset));  	spin_unlock_irqrestore(&bank->lock, flags); @@ -687,8 +664,9 @@ static void sirfsoc_gpio_free(struct gpio_chip *chip, unsigned offset)  static int sirfsoc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)  { -	struct sirfsoc_gpio_bank *bank = sirfsoc_irqchip_to_bank(chip); -	int idx = sirfsoc_gpio_to_offset(gpio); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, gpio); +	int idx = sirfsoc_gpio_to_bankoff(gpio);  	unsigned long flags;  	unsigned offset; @@ -696,22 +674,24 @@ static int sirfsoc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)  	spin_lock_irqsave(&bank->lock, flags); -	sirfsoc_gpio_set_input(bank, offset); +	sirfsoc_gpio_set_input(sgpio, offset);  	spin_unlock_irqrestore(&bank->lock, flags);  	return 0;  } -static inline void sirfsoc_gpio_set_output(struct sirfsoc_gpio_bank *bank, unsigned offset, -	int value) +static inline void sirfsoc_gpio_set_output(struct sirfsoc_gpio_chip *sgpio, +					   struct sirfsoc_gpio_bank *bank, +					   unsigned offset, +					   int value)  {  	u32 out_ctrl;  	unsigned long flags;  	spin_lock_irqsave(&bank->lock, flags); -	out_ctrl = readl(bank->chip.regs + offset); +	out_ctrl = readl(sgpio->chip.regs + offset);  	if (value)  		out_ctrl |= SIRFSOC_GPIO_CTL_DATAOUT_MASK;  	else @@ -719,15 +699,16 @@ static inline void sirfsoc_gpio_set_output(struct sirfsoc_gpio_bank *bank, unsig  	out_ctrl &= ~SIRFSOC_GPIO_CTL_INTR_EN_MASK;  	out_ctrl |= SIRFSOC_GPIO_CTL_OUT_EN_MASK; -	writel(out_ctrl, bank->chip.regs + offset); +	writel(out_ctrl, sgpio->chip.regs + offset);  	spin_unlock_irqrestore(&bank->lock, flags);  }  static int sirfsoc_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value)  { -	struct sirfsoc_gpio_bank *bank = sirfsoc_irqchip_to_bank(chip); -	int idx = sirfsoc_gpio_to_offset(gpio); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, gpio); +	int idx = sirfsoc_gpio_to_bankoff(gpio);  	u32 offset;  	unsigned long flags; @@ -735,7 +716,7 @@ static int sirfsoc_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,  	spin_lock_irqsave(&sgpio_lock, flags); -	sirfsoc_gpio_set_output(bank, offset, value); +	sirfsoc_gpio_set_output(sgpio, bank, offset, value);  	spin_unlock_irqrestore(&sgpio_lock, flags); @@ -744,13 +725,14 @@ static int sirfsoc_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,  static int sirfsoc_gpio_get_value(struct gpio_chip *chip, unsigned offset)  { -	struct sirfsoc_gpio_bank *bank = sirfsoc_irqchip_to_bank(chip); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset);  	u32 val;  	unsigned long flags;  	spin_lock_irqsave(&bank->lock, flags); -	val = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset)); +	val = readl(sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset));  	spin_unlock_irqrestore(&bank->lock, flags); @@ -760,44 +742,25 @@ static int sirfsoc_gpio_get_value(struct gpio_chip *chip, unsigned offset)  static void sirfsoc_gpio_set_value(struct gpio_chip *chip, unsigned offset,  	int value)  { -	struct sirfsoc_gpio_bank *bank = sirfsoc_irqchip_to_bank(chip); +	struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip); +	struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, offset);  	u32 ctrl;  	unsigned long flags;  	spin_lock_irqsave(&bank->lock, flags); -	ctrl = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset)); +	ctrl = readl(sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset));  	if (value)  		ctrl |= SIRFSOC_GPIO_CTL_DATAOUT_MASK;  	else  		ctrl &= ~SIRFSOC_GPIO_CTL_DATAOUT_MASK; -	writel(ctrl, bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset)); +	writel(ctrl, sgpio->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, offset));  	spin_unlock_irqrestore(&bank->lock, flags);  } -static int sirfsoc_gpio_irq_map(struct irq_domain *d, unsigned int irq, -				irq_hw_number_t hwirq) -{ -	struct sirfsoc_gpio_bank *bank = d->host_data; - -	if (!bank) -		return -EINVAL; - -	irq_set_chip(irq, &sirfsoc_irq_chip); -	irq_set_handler(irq, handle_level_irq); -	irq_set_chip_data(irq, bank); -	set_irq_flags(irq, IRQF_VALID); - -	return 0; -} - -static const struct irq_domain_ops sirfsoc_gpio_irq_simple_ops = { -	.map = sirfsoc_gpio_irq_map, -	.xlate = irq_domain_xlate_twocell, -}; - -static void sirfsoc_gpio_set_pullup(const u32 *pullups) +static void sirfsoc_gpio_set_pullup(struct sirfsoc_gpio_chip *sgpio, +				    const u32 *pullups)  {  	int i, n;  	const unsigned long *p = (const unsigned long *)pullups; @@ -805,15 +768,16 @@ static void sirfsoc_gpio_set_pullup(const u32 *pullups)  	for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {  		for_each_set_bit(n, p + i, BITS_PER_LONG) {  			u32 offset = SIRFSOC_GPIO_CTRL(i, n); -			u32 val = readl(sgpio_bank[i].chip.regs + offset); +			u32 val = readl(sgpio->chip.regs + offset);  			val |= SIRFSOC_GPIO_CTL_PULL_MASK;  			val |= SIRFSOC_GPIO_CTL_PULL_HIGH; -			writel(val, sgpio_bank[i].chip.regs + offset); +			writel(val, sgpio->chip.regs + offset);  		}  	}  } -static void sirfsoc_gpio_set_pulldown(const u32 *pulldowns) +static void sirfsoc_gpio_set_pulldown(struct sirfsoc_gpio_chip *sgpio, +				      const u32 *pulldowns)  {  	int i, n;  	const unsigned long *p = (const unsigned long *)pulldowns; @@ -821,10 +785,10 @@ static void sirfsoc_gpio_set_pulldown(const u32 *pulldowns)  	for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {  		for_each_set_bit(n, p + i, BITS_PER_LONG) {  			u32 offset = SIRFSOC_GPIO_CTRL(i, n); -			u32 val = readl(sgpio_bank[i].chip.regs + offset); +			u32 val = readl(sgpio->chip.regs + offset);  			val |= SIRFSOC_GPIO_CTL_PULL_MASK;  			val &= ~SIRFSOC_GPIO_CTL_PULL_HIGH; -			writel(val, sgpio_bank[i].chip.regs + offset); +			writel(val, sgpio->chip.regs + offset);  		}  	}  } @@ -832,6 +796,7 @@ static void sirfsoc_gpio_set_pulldown(const u32 *pulldowns)  static int sirfsoc_gpio_probe(struct device_node *np)  {  	int i, err = 0; +	static struct sirfsoc_gpio_chip *sgpio;  	struct sirfsoc_gpio_bank *bank;  	void __iomem *regs;  	struct platform_device *pdev; @@ -843,6 +808,10 @@ static int sirfsoc_gpio_probe(struct device_node *np)  	if (!pdev)  		return -ENODEV; +	sgpio = devm_kzalloc(&pdev->dev, sizeof(*sgpio), GFP_KERNEL); +	if (!sgpio) +		return -ENOMEM; +  	regs = of_iomap(np, 0);  	if (!regs)  		return -ENOMEM; @@ -850,61 +819,76 @@ static int sirfsoc_gpio_probe(struct device_node *np)  	if (of_device_is_compatible(np, "sirf,marco-pinctrl"))  		is_marco = 1; +	sgpio->chip.gc.request = sirfsoc_gpio_request; +	sgpio->chip.gc.free = sirfsoc_gpio_free; +	sgpio->chip.gc.direction_input = sirfsoc_gpio_direction_input; +	sgpio->chip.gc.get = sirfsoc_gpio_get_value; +	sgpio->chip.gc.direction_output = sirfsoc_gpio_direction_output; +	sgpio->chip.gc.set = sirfsoc_gpio_set_value; +	sgpio->chip.gc.base = 0; +	sgpio->chip.gc.ngpio = SIRFSOC_GPIO_BANK_SIZE * SIRFSOC_GPIO_NO_OF_BANKS; +	sgpio->chip.gc.label = kstrdup(np->full_name, GFP_KERNEL); +	sgpio->chip.gc.of_node = np; +	sgpio->chip.gc.of_xlate = sirfsoc_gpio_of_xlate; +	sgpio->chip.gc.of_gpio_n_cells = 2; +	sgpio->chip.gc.dev = &pdev->dev; +	sgpio->chip.regs = regs; +	sgpio->is_marco = is_marco; + +	err = gpiochip_add(&sgpio->chip.gc); +	if (err) { +		dev_err(&pdev->dev, "%s: error in probe function with status %d\n", +			np->full_name, err); +		goto out; +	} + +	err =  gpiochip_irqchip_add(&sgpio->chip.gc, +		&sirfsoc_irq_chip, +		0, handle_level_irq, +		IRQ_TYPE_NONE); +	if (err) { +		dev_err(&pdev->dev, +			"could not connect irqchip to gpiochip\n"); +		goto out; +	} +  	for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) { -		bank = &sgpio_bank[i]; +		bank = &sgpio->sgpio_bank[i];  		spin_lock_init(&bank->lock); -		bank->chip.gc.request = sirfsoc_gpio_request; -		bank->chip.gc.free = sirfsoc_gpio_free; -		bank->chip.gc.direction_input = sirfsoc_gpio_direction_input; -		bank->chip.gc.get = sirfsoc_gpio_get_value; -		bank->chip.gc.direction_output = sirfsoc_gpio_direction_output; -		bank->chip.gc.set = sirfsoc_gpio_set_value; -		bank->chip.gc.to_irq = sirfsoc_gpio_to_irq; -		bank->chip.gc.base = i * SIRFSOC_GPIO_BANK_SIZE; -		bank->chip.gc.ngpio = SIRFSOC_GPIO_BANK_SIZE; -		bank->chip.gc.label = kstrdup(np->full_name, GFP_KERNEL); -		bank->chip.gc.of_node = np; -		bank->chip.gc.of_xlate = sirfsoc_gpio_of_xlate; -		bank->chip.gc.of_gpio_n_cells = 2; -		bank->chip.regs = regs; -		bank->id = i; -		bank->is_marco = is_marco;  		bank->parent_irq = platform_get_irq(pdev, i);  		if (bank->parent_irq < 0) {  			err = bank->parent_irq; -			goto out; +			goto out_banks;  		} -		err = gpiochip_add(&bank->chip.gc); -		if (err) { -			pr_err("%s: error in probe function with status %d\n", -				np->full_name, err); -			goto out; -		} - -		bank->domain = irq_domain_add_linear(np, SIRFSOC_GPIO_BANK_SIZE, -						&sirfsoc_gpio_irq_simple_ops, bank); - -		if (!bank->domain) { -			pr_err("%s: Failed to create irqdomain\n", np->full_name); -			err = -ENOSYS; -			goto out; -		} +		gpiochip_set_chained_irqchip(&sgpio->chip.gc, +			&sirfsoc_irq_chip, +			bank->parent_irq, +			sirfsoc_gpio_handle_irq); +	} -		irq_set_chained_handler(bank->parent_irq, sirfsoc_gpio_handle_irq); -		irq_set_handler_data(bank->parent_irq, bank); +	err = gpiochip_add_pin_range(&sgpio->chip.gc, dev_name(&pdev->dev), +		0, 0, SIRFSOC_GPIO_BANK_SIZE * SIRFSOC_GPIO_NO_OF_BANKS); +	if (err) { +		dev_err(&pdev->dev, +			"could not add gpiochip pin range\n"); +		goto out_no_range;  	}  	if (!of_property_read_u32_array(np, "sirf,pullups", pullups,  		SIRFSOC_GPIO_NO_OF_BANKS)) -		sirfsoc_gpio_set_pullup(pullups); +		sirfsoc_gpio_set_pullup(sgpio, pullups);  	if (!of_property_read_u32_array(np, "sirf,pulldowns", pulldowns,  		SIRFSOC_GPIO_NO_OF_BANKS)) -		sirfsoc_gpio_set_pulldown(pulldowns); +		sirfsoc_gpio_set_pulldown(sgpio, pulldowns);  	return 0; +out_no_range: +out_banks: +	if (gpiochip_remove(&sgpio->chip.gc)) +		dev_err(&pdev->dev, "could not remove gpio chip\n");  out:  	iounmap(regs);  	return err; diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.h b/drivers/pinctrl/sirf/pinctrl-sirf.h index 17cc108510b..d7f16b499ad 100644 --- a/drivers/pinctrl/sirf/pinctrl-sirf.h +++ b/drivers/pinctrl/sirf/pinctrl-sirf.h @@ -9,8 +9,9 @@  #ifndef __PINMUX_SIRF_H__  #define __PINMUX_SIRF_H__ -#define SIRFSOC_NUM_PADS    622 -#define SIRFSOC_RSC_PIN_MUX 0x4 +#define SIRFSOC_NUM_PADS		622 +#define SIRFSOC_RSC_USB_UART_SHARE	0 +#define SIRFSOC_RSC_PIN_MUX		0x4  #define SIRFSOC_GPIO_PAD_EN(g)		((g)*0x100 + 0x84)  #define SIRFSOC_GPIO_PAD_EN_CLR(g)	((g)*0x100 + 0x90) @@ -61,6 +62,7 @@ struct sirfsoc_padmux {  	unsigned long muxmask_counts;  	const struct sirfsoc_muxmask *muxmask;  	/* RSC_PIN_MUX set */ +	unsigned long ctrlreg;  	unsigned long funcmask;  	unsigned long funcval;  }; diff --git a/drivers/pinctrl/spear/pinctrl-plgpio.c b/drivers/pinctrl/spear/pinctrl-plgpio.c index 0a7f0bdbaa7..ff2940e9f2a 100644 --- a/drivers/pinctrl/spear/pinctrl-plgpio.c +++ b/drivers/pinctrl/spear/pinctrl-plgpio.c @@ -735,7 +735,7 @@ static struct platform_driver plgpio_driver = {  		.owner = THIS_MODULE,  		.name = "spear-plgpio",  		.pm = &plgpio_dev_pm_ops, -		.of_match_table = of_match_ptr(plgpio_of_match), +		.of_match_table = plgpio_of_match,  	},  }; diff --git a/drivers/pinctrl/sunxi/Kconfig b/drivers/pinctrl/sunxi/Kconfig new file mode 100644 index 00000000000..73e0a305ea1 --- /dev/null +++ b/drivers/pinctrl/sunxi/Kconfig @@ -0,0 +1,36 @@ +if ARCH_SUNXI + +config PINCTRL_SUNXI +	bool + +config PINCTRL_SUNXI_COMMON +	bool +	select PINMUX +	select GENERIC_PINCONF + +config PINCTRL_SUN4I_A10 +	def_bool PINCTRL_SUNXI || MACH_SUN4I +	select PINCTRL_SUNXI_COMMON + +config PINCTRL_SUN5I_A10S +	def_bool PINCTRL_SUNXI || MACH_SUN5I +	select PINCTRL_SUNXI_COMMON + +config PINCTRL_SUN5I_A13 +	def_bool PINCTRL_SUNXI || MACH_SUN5I +	select PINCTRL_SUNXI_COMMON + +config PINCTRL_SUN6I_A31 +	def_bool PINCTRL_SUNXI || MACH_SUN6I +	select PINCTRL_SUNXI_COMMON + +config PINCTRL_SUN6I_A31_R +	def_bool PINCTRL_SUNXI || MACH_SUN6I +	depends on RESET_CONTROLLER +	select PINCTRL_SUNXI_COMMON + +config PINCTRL_SUN7I_A20 +	def_bool PINCTRL_SUNXI || MACH_SUN7I +	select PINCTRL_SUNXI_COMMON + +endif diff --git a/drivers/pinctrl/sunxi/Makefile b/drivers/pinctrl/sunxi/Makefile new file mode 100644 index 00000000000..0f4461cbe11 --- /dev/null +++ b/drivers/pinctrl/sunxi/Makefile @@ -0,0 +1,10 @@ +# Core +obj-$(CONFIG_PINCTRL_SUNXI_COMMON)	+= pinctrl-sunxi.o + +# SoC Drivers +obj-$(CONFIG_PINCTRL_SUN4I_A10)		+= pinctrl-sun4i-a10.o +obj-$(CONFIG_PINCTRL_SUN5I_A10S)	+= pinctrl-sun5i-a10s.o +obj-$(CONFIG_PINCTRL_SUN5I_A13)		+= pinctrl-sun5i-a13.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 diff --git a/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c b/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c new file mode 100644 index 00000000000..fa1ff7c7e35 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c @@ -0,0 +1,1039 @@ +/* + * Allwinner A10 SoCs pinctrl driver. + * + * 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/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun4i_a10_pins[] = { +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD3 */ +		  SUNXI_FUNCTION(0x3, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x4, "uart2")),	/* RTS */ +	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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm")),		/* PWM0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0")),		/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0")),		/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* MCLK */ +		  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(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(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(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_PIN(SUNXI_PINCTRL_PIN(B, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s")),		/* DO2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s")),		/* DO3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* DI */ +		  SUNXI_FUNCTION(0x3, "ac97")),		/* DI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2")),		/* CS1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* MS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* CK0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* DO0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* DI0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */ +		  SUNXI_FUNCTION(0x3, "ir1")),		/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */ +		  SUNXI_FUNCTION(0x3, "ir1")),		/* RX */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE# */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NWP */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE4 */ +		  SUNXI_FUNCTION(0x3, "spi2")),		/* CS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE5 */ +		  SUNXI_FUNCTION(0x3, "spi2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE6 */ +		  SUNXI_FUNCTION(0x3, "spi2")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE7 */ +		  SUNXI_FUNCTION(0x3, "spi2")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQS */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VPC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D8 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D9 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VM3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D16 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VPC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D17 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D20 */ +		  SUNXI_FUNCTION(0x3, "csi1")),		/* MCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D21 */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D22 */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPPP */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D23 */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* DET */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* VCCEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* DE */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* RST */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* SDA */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* PCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* ERR */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* CK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* SYNC */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* DVLD */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* VSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "sim")),		/* VPPEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D7 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* MSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* PCK */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* ERR */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* CK */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* SYNC */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* DVLD */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D2 */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D3 */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D13 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D15 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAA0 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 0),		/* EINT0 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAA1 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 1),		/* EINT1 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAA2 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 2),		/* EINT2 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIRQ */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 3),		/* EINT3 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD0 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 4),		/* EINT4 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD1 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 5),		/* EINT5 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD2 */ +		  SUNXI_FUNCTION(0x4, "uart5"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* BS */ +		  SUNXI_FUNCTION_IRQ(0x6, 6),		/* EINT6 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD3 */ +		  SUNXI_FUNCTION(0x4, "uart5"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* CLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 7),		/* EINT7 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D8 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD4 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN0 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 8),		/* EINT8 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D9 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD5 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN1 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 9),		/* EINT9 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD6 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN2 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D2 */ +		  SUNXI_FUNCTION_IRQ(0x6, 10),		/* EINT10 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD7 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN3 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D3 */ +		  SUNXI_FUNCTION_IRQ(0x6, 11),		/* EINT11 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D12 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD8 */ +		  SUNXI_FUNCTION(0x4, "ps2"),		/* SCK1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 12),		/* EINT12 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D13 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD9 */ +		  SUNXI_FUNCTION(0x4, "ps2"),		/* SDA1 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* RST */ +		  SUNXI_FUNCTION_IRQ(0x6, 13),		/* EINT13 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D13 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D14 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD10 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN4 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPEN */ +		  SUNXI_FUNCTION_IRQ(0x6, 14),		/* EINT14 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D15 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD11 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN5 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPPP */ +		  SUNXI_FUNCTION_IRQ(0x6, 15),		/* EINT15 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D15 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D16 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD12 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN6 */ +		  SUNXI_FUNCTION_IRQ(0x6, 16),		/* EINT16 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D16 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D17 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD13 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN7 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* VCCEN */ +		  SUNXI_FUNCTION_IRQ(0x6, 17),		/* EINT17 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D17 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D18 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD14 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT0 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* SCK */ +		  SUNXI_FUNCTION_IRQ(0x6, 18),		/* EINT18 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D18 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D19 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAD15 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT1 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* SDA */ +		  SUNXI_FUNCTION_IRQ(0x6, 19),		/* EINT19 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D19 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D20 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAOE */ +		  SUNXI_FUNCTION(0x4, "can"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 20),		/* EINT20 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D20 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D21 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATADREQ */ +		  SUNXI_FUNCTION(0x4, "can"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 21),		/* EINT21 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D21 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D22 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATADACK */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT2 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CMD */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D23 */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATACS0 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT3 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CLK */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATACS1 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT4 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D0 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* PCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* DE */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIORDY */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT5 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D1 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* FIELD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIOR */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT6 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D2 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x3, "pata"),		/* ATAIOW */ +		  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_PIN(SUNXI_PINCTRL_PIN(I, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm")),		/* PWM1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "uart5"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 22)),		/* EINT22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "uart5"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 23)),		/* EINT23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "uart6"),		/* TX */ +		  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_IRQ(0x6, 25)),		/* EINT25 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS1 */ +		  SUNXI_FUNCTION(0x3, "ps2"),		/* SCK1 */ +		  SUNXI_FUNCTION(0x4, "timer4"),	/* TCLKIN0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 26)),		/* EINT26 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ +		  SUNXI_FUNCTION(0x3, "ps2"),		/* SDA1 */ +		  SUNXI_FUNCTION(0x4, "timer5"),	/* TCLKIN1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 27)),		/* EINT27 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 28)),		/* EINT28 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 29)),		/* EINT29 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 30)),		/* EINT30 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 31)),		/* EINT31 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ps2"),		/* SCK0 */ +		  SUNXI_FUNCTION(0x3, "uart7"),		/* TX */ +		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSCL */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ps2"),		/* SDA0 */ +		  SUNXI_FUNCTION(0x3, "uart7"),		/* RX */ +		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSDA */ +}; + +static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = { +	.pins = sun4i_a10_pins, +	.npins = ARRAY_SIZE(sun4i_a10_pins), +}; + +static int sun4i_a10_pinctrl_probe(struct platform_device *pdev) +{ +	return sunxi_pinctrl_init(pdev, +				  &sun4i_a10_pinctrl_data); +} + +static struct of_device_id sun4i_a10_pinctrl_match[] = { +	{ .compatible = "allwinner,sun4i-a10-pinctrl", }, +	{} +}; +MODULE_DEVICE_TABLE(of, sun4i_a10_pinctrl_match); + +static struct platform_driver sun4i_a10_pinctrl_driver = { +	.probe	= sun4i_a10_pinctrl_probe, +	.driver	= { +		.name		= "sun4i-pinctrl", +		.owner		= THIS_MODULE, +		.of_match_table	= sun4i_a10_pinctrl_match, +	}, +}; +module_platform_driver(sun4i_a10_pinctrl_driver); + +MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); +MODULE_DESCRIPTION("Allwinner A10 pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/sunxi/pinctrl-sun5i-a10s.c b/drivers/pinctrl/sunxi/pinctrl-sun5i-a10s.c new file mode 100644 index 00000000000..164d743f526 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun5i-a10s.c @@ -0,0 +1,690 @@ +/* + * Allwinner A10s SoCs pinctrl driver. + * + * 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/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun5i_a10s_pins[] = { +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD3 */ +		  SUNXI_FUNCTION(0x3, "ts0"),		/* CLK */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN0 */ +	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, "ts0"),		/* ERR */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN1 */ +	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, "ts0"),		/* SYNC */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN2 */ +	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, "ts0"),		/* DLVD */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN3 */ +	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, "ts0"),		/* D0 */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN4 */ +	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, "ts0"),		/* D1 */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN5 */ +	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, "ts0"),		/* D2 */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN6 */ +	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, "ts0"),		/* D3 */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* IN7 */ +	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, "ts0"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* DTR */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT0 */ +	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, "ts0"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* DSR */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXDV */ +		  SUNXI_FUNCTION(0x3, "ts0"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* DCD */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "emac"),		/* EMDC */ +		  SUNXI_FUNCTION(0x3, "ts0"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* RING */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT3 */ +	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, "uart1"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT4 */ +	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, "uart1"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT5 */ +	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, "uart1"),		/* CTS */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT6 */ +	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, "uart1"),		/* RTS */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "keypad")),	/* OUT7 */ +	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, "uart2")),	/* TX */ +	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, "uart2"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 31)),		/* EINT31 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm"),		/* PWM0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 16)),		/* EINT16 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 17)),		/* EINT17 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 18)),		/* EINT18 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* MCLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 19)),		/* EINT19 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* BCLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 20)),		/* EINT20 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* LRCK */ +		  SUNXI_FUNCTION_IRQ(0x6, 21)),		/* EINT21 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* DO */ +		  SUNXI_FUNCTION_IRQ(0x6, 22)),		/* EINT22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s"),		/* DI */ +		  SUNXI_FUNCTION_IRQ(0x6, 23)),		/* EINT23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 24)),		/* EINT24 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* MS0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 25)),		/* EINT25 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* CK0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 26)),		/* EINT26 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* DO0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 27)),		/* EINT27 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* DI0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 28)),		/* EINT28 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 29)),		/* EINT29 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 30)),		/* EINT30 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE1 */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ4 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ5 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ6 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ7 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWP */ +		  SUNXI_FUNCTION(0x4, "uart3")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE2 */ +		  SUNXI_FUNCTION(0x4, "uart3")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE3 */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* TX */ +		  SUNXI_FUNCTION(0x4, "uart3")),	/* CTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE4 */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ +		  SUNXI_FUNCTION(0x4, "uart3")),	/* RTS */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "uart2")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "uart2")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "uart2")),	/* CTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "uart2")),	/* RTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ECRS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ECOL */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXD3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXERR */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D16 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D17 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ERXDV */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D20 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D21 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D22 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXD3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D23 */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* DE */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* ETXERR */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* EMDC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x3, "emac")),		/* EMDIO */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* PCK */ +		  SUNXI_FUNCTION(0x4, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 14)),		/* EINT14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* ERR */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* CK */ +		  SUNXI_FUNCTION(0x4, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 15)),		/* EINT15 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* SYNC */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x4, "spi2")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* DVLD */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x4, "spi2")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* MS1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x2, "gps"),		/* CLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 0)),		/* EINT0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x2, "gps"),		/* SIGN */ +		  SUNXI_FUNCTION_IRQ(0x6, 1)),		/* EINT1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x2, "gps"),		/* MAG */ +		  SUNXI_FUNCTION_IRQ(0x6, 2)),		/* EINT2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 3)),		/* EINT3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 4)),		/* EINT4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* DO */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 5)),		/* EINT5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* RTS */ +		  SUNXI_FUNCTION(0x5, "uart2"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 6)),		/* EINT6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D2 */ +		  SUNXI_FUNCTION(0x5, "uart2"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 7)),		/* EINT7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D3 */ +		  SUNXI_FUNCTION(0x5, "uart2"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 8)),		/* EINT8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 9)),		/* EINT9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 10)),		/* EINT10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 11)),		/* EINT11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 12)),		/* EINT12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* PWM1 */ +		  SUNXI_FUNCTION(0x5, "uart2"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 13)),		/* EINT13 */ +}; + +static const struct sunxi_pinctrl_desc sun5i_a10s_pinctrl_data = { +	.pins = sun5i_a10s_pins, +	.npins = ARRAY_SIZE(sun5i_a10s_pins), +}; + +static int sun5i_a10s_pinctrl_probe(struct platform_device *pdev) +{ +	return sunxi_pinctrl_init(pdev, +				  &sun5i_a10s_pinctrl_data); +} + +static struct of_device_id sun5i_a10s_pinctrl_match[] = { +	{ .compatible = "allwinner,sun5i-a10s-pinctrl", }, +	{} +}; +MODULE_DEVICE_TABLE(of, sun5i_a10s_pinctrl_match); + +static struct platform_driver sun5i_a10s_pinctrl_driver = { +	.probe	= sun5i_a10s_pinctrl_probe, +	.driver	= { +		.name		= "sun5i-a10s-pinctrl", +		.owner		= THIS_MODULE, +		.of_match_table	= sun5i_a10s_pinctrl_match, +	}, +}; +module_platform_driver(sun5i_a10s_pinctrl_driver); + +MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); +MODULE_DESCRIPTION("Allwinner A10s pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/sunxi/pinctrl-sun5i-a13.c b/drivers/pinctrl/sunxi/pinctrl-sun5i-a13.c new file mode 100644 index 00000000000..1188a2b7b98 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun5i-a13.c @@ -0,0 +1,411 @@ +/* + * Allwinner A13 SoCs pinctrl driver. + * + * 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/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun5i_a13_pins[] = { +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm"), +		  SUNXI_FUNCTION_IRQ(0x6, 16)),		/* EINT16 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 17)),		/* EINT17 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 18)),		/* EINT18 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 24)),		/* EINT24 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE1 */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ4 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ5 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ6 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ7 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D7 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQS */ +		  SUNXI_FUNCTION(0x4, "uart3")),	/* RTS */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D7 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D13 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D15 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D18 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D19 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D20 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D21 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* DE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* VSYNC */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* PCLK */ +		  SUNXI_FUNCTION(0x4, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 14)),		/* EINT14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* MCLK */ +		  SUNXI_FUNCTION(0x4, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 15)),		/* EINT15 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x4, "spi2")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x4, "spi2")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0")),		/* D2 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ(0x6, 0)),		/* EINT0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ(0x6, 1)),		/* EINT1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION_IRQ(0x6, 2)),		/* EINT2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 3)),		/* EINT3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "uart1"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 4)),		/* EINT4 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 9)),		/* EINT9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 10)),		/* EINT10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 11)),		/* EINT11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 12)),		/* EINT12 */ +}; + +static const struct sunxi_pinctrl_desc sun5i_a13_pinctrl_data = { +	.pins = sun5i_a13_pins, +	.npins = ARRAY_SIZE(sun5i_a13_pins), +}; + +static int sun5i_a13_pinctrl_probe(struct platform_device *pdev) +{ +	return sunxi_pinctrl_init(pdev, +				  &sun5i_a13_pinctrl_data); +} + +static struct of_device_id sun5i_a13_pinctrl_match[] = { +	{ .compatible = "allwinner,sun5i-a13-pinctrl", }, +	{} +}; +MODULE_DEVICE_TABLE(of, sun5i_a13_pinctrl_match); + +static struct platform_driver sun5i_a13_pinctrl_driver = { +	.probe	= sun5i_a13_pinctrl_probe, +	.driver	= { +		.name		= "sun5i-a13-pinctrl", +		.owner		= THIS_MODULE, +		.of_match_table	= sun5i_a13_pinctrl_match, +	}, +}; +module_platform_driver(sun5i_a13_pinctrl_driver); + +MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); +MODULE_DESCRIPTION("Allwinner A13 pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c b/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c new file mode 100644 index 00000000000..8fcba48e0a4 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c @@ -0,0 +1,141 @@ +/* + * Allwinner A31 SoCs special pins pinctrl driver. + * + * 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/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> +#include <linux/reset.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun6i_a31_r_pins[] = { +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_twi"),		/* SCK */ +		  SUNXI_FUNCTION(0x3, "s_p2wi")),	/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_twi"),		/* SDA */ +		  SUNXI_FUNCTION(0x3, "s_p2wi")),	/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_uart")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_uart")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "s_ir")),		/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "s_jtag")),	/* MS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "s_jtag")),	/* CK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "s_jtag")),	/* DO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "s_jtag")),	/* DI */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "1wire")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(M, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "rtc")),		/* CLKO */ +}; + +static const struct sunxi_pinctrl_desc sun6i_a31_r_pinctrl_data = { +	.pins = sun6i_a31_r_pins, +	.npins = ARRAY_SIZE(sun6i_a31_r_pins), +	.pin_base = PL_BASE, +}; + +static int sun6i_a31_r_pinctrl_probe(struct platform_device *pdev) +{ +	struct reset_control *rstc; +	int ret; + +	rstc = devm_reset_control_get(&pdev->dev, NULL); +	if (IS_ERR(rstc)) { +		dev_err(&pdev->dev, "Reset controller missing\n"); +		return PTR_ERR(rstc); +	} + +	ret = reset_control_deassert(rstc); +	if (ret) +		return ret; + +	ret = sunxi_pinctrl_init(pdev, +				 &sun6i_a31_r_pinctrl_data); + +	if (ret) +		reset_control_assert(rstc); + +	return ret; +} + +static struct of_device_id sun6i_a31_r_pinctrl_match[] = { +	{ .compatible = "allwinner,sun6i-a31-r-pinctrl", }, +	{} +}; +MODULE_DEVICE_TABLE(of, sun6i_a31_r_pinctrl_match); + +static struct platform_driver sun6i_a31_r_pinctrl_driver = { +	.probe	= sun6i_a31_r_pinctrl_probe, +	.driver	= { +		.name		= "sun6i-a31-r-pinctrl", +		.owner		= THIS_MODULE, +		.of_match_table	= sun6i_a31_r_pinctrl_match, +	}, +}; +module_platform_driver(sun6i_a31_r_pinctrl_driver); + +MODULE_AUTHOR("Boris Brezillon <boris.brezillon@free-electrons.com"); +MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); +MODULE_DESCRIPTION("Allwinner A31 R_PIO pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/sunxi/pinctrl-sun6i-a31.c b/drivers/pinctrl/sunxi/pinctrl-sun6i-a31.c new file mode 100644 index 00000000000..8dea5856458 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun6i-a31.c @@ -0,0 +1,865 @@ +/* + * Allwinner A31 SoCs pinctrl driver. + * + * 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/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun6i_a31_pins[] = { +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD0 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* DTR */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD1 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* DSR */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD2 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* DCD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD3 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* RING */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD4 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD5 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD6 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* RTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXD7 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart1")),	/* CTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXCLK */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXEN */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D9 */ +		  SUNXI_FUNCTION(0x4, "mmc3"),		/* CMD */ +		  SUNXI_FUNCTION(0x5, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* GTXCLK */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D10 */ +		  SUNXI_FUNCTION(0x4, "mmc3"),		/* CLK */ +		  SUNXI_FUNCTION(0x5, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD0 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D11 */ +		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D0 */ +		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD1 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D12 */ +		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D1 */ +		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD2 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D13 */ +		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D2 */ +		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD3 */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D14 */ +		  SUNXI_FUNCTION(0x4, "mmc3"),		/* D3 */ +		  SUNXI_FUNCTION(0x5, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD4 */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D15 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD5 */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D16 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD6 */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D17 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXD7 */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* D18 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXDV */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D19 */ +		  SUNXI_FUNCTION(0x4, "pwm3")),		/* Positive */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXCLK */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D20 */ +		  SUNXI_FUNCTION(0x4, "pwm3")),		/* Negative */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* TXERR */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D21 */ +		  SUNXI_FUNCTION(0x4, "spi3")),		/* CS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* RXERR */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D22 */ +		  SUNXI_FUNCTION(0x4, "spi3")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* COL */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* D23 */ +		  SUNXI_FUNCTION(0x4, "spi3")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* CRS */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "spi3")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* CLKIN */ +		  SUNXI_FUNCTION(0x3, "lcd1"),		/* DE */ +		  SUNXI_FUNCTION(0x4, "spi3")),		/* CS1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* MDC */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "gmac"),		/* MDIO */ +		  SUNXI_FUNCTION(0x3, "lcd1")),		/* VSYNC */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0"),		/* MCLK */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION(0x4, "csi")),		/* MCLK1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0")),		/* BCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0")),		/* LRCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO1 */ +		  SUNXI_FUNCTION(0x3, "uart3")),	/* RTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO2 */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */ +		  SUNXI_FUNCTION(0x4, "i2c3")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DO3 */ +		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */ +		  SUNXI_FUNCTION(0x4, "i2c3")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "i2s0")),		/* DI */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* WE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* ALE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* CLE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* RE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* RB0 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* RB1 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ0 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ1 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ2 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ3 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ4 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ5 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ6 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ7 */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* D7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ8 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ9 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ10 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ11 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ12 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ13 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ14 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ15 */ +		  SUNXI_FUNCTION(0x3, "nand1")),	/* DQ7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQS */ +		  SUNXI_FUNCTION(0x3, "mmc2"),		/* RST */ +		  SUNXI_FUNCTION(0x4, "mmc3")),		/* RST */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* CE3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VPC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D8 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D9 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D16 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VPC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D17 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D20 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D21 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* D23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* DE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0")),		/* VSYNC */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* PCLK */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* MCLK */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* ERR */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* SYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* DVLD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "uart5")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "uart5")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "uart5")),	/* RTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "uart5")),	/* CTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D8 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D9 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "ts")),		/* D7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "csi")),		/* MIPI CSI MCLK */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* MS1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc1")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart2")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart2")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart2")),	/* RTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart2")),	/* CTS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c3"),		/* SCK */ +		  SUNXI_FUNCTION(0x3, "usb")),		/* DP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c3"),		/* SDA */ +		  SUNXI_FUNCTION(0x3, "usb")),		/* DM3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ +		  SUNXI_FUNCTION(0x3, "i2s1")),		/* MCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "i2s1")),		/* BCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "i2s1")),		/* LRCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "i2s1")),		/* DIN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "i2s1")),		/* DOUT */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart4")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart4")),	/* RX */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* WE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* ALE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* CLE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* RE */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* RB0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* RB1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* DQS */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* MS0 */ +		  SUNXI_FUNCTION(0x4, "pwm1")),		/* Positive */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* CK0 */ +		  SUNXI_FUNCTION(0x4, "pwm1")),		/* Negative */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* DO0 */ +		  SUNXI_FUNCTION(0x4, "pwm2")),		/* Positive */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "jtag"),		/* DI0 */ +		  SUNXI_FUNCTION(0x4, "pwm2")),		/* Negative */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm0")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 28), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out")), +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 29), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 30), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand1")),	/* CE3 */ +}; + +static const struct sunxi_pinctrl_desc sun6i_a31_pinctrl_data = { +	.pins = sun6i_a31_pins, +	.npins = ARRAY_SIZE(sun6i_a31_pins), +}; + +static int sun6i_a31_pinctrl_probe(struct platform_device *pdev) +{ +	return sunxi_pinctrl_init(pdev, +				  &sun6i_a31_pinctrl_data); +} + +static struct of_device_id sun6i_a31_pinctrl_match[] = { +	{ .compatible = "allwinner,sun6i-a31-pinctrl", }, +	{} +}; +MODULE_DEVICE_TABLE(of, sun6i_a31_pinctrl_match); + +static struct platform_driver sun6i_a31_pinctrl_driver = { +	.probe	= sun6i_a31_pinctrl_probe, +	.driver	= { +		.name		= "sun6i-a31-pinctrl", +		.owner		= THIS_MODULE, +		.of_match_table	= sun6i_a31_pinctrl_match, +	}, +}; +module_platform_driver(sun6i_a31_pinctrl_driver); + +MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); +MODULE_DESCRIPTION("Allwinner A31 pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c b/drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c new file mode 100644 index 00000000000..d8577ce5f1a --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c @@ -0,0 +1,1065 @@ +/* + * Allwinner A20 SoCs pinctrl driver. + * + * 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/module.h> +#include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/pinctrl/pinctrl.h> + +#include "pinctrl-sunxi.h" + +static const struct sunxi_desc_pin sun7i_a20_pins[] = { +	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "emac"),		/* ERXD3 */ +		  SUNXI_FUNCTION(0x3, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x4, "uart2"),		/* RTS */ +		  SUNXI_FUNCTION(0x5, "gmac")),		/* GRXD3 */ +	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(0x5, "gmac")),		/* GRXD2 */ +	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(0x5, "gmac")),		/* GRXD1 */ +	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(0x5, "gmac")),		/* GRXD0 */ +	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(0x5, "gmac")),		/* GTXD3 */ +	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(0x5, "gmac")),		/* GTXD2 */ +	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(0x5, "gmac")),		/* GTXD1 */ +	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(0x5, "gmac")),		/* GTXD0 */ +	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(0x5, "gmac")),		/* GRXCK */ +	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(0x5, "gmac"),		/* GNULL / ERXERR */ +		  SUNXI_FUNCTION(0x6, "i2s1")),		/* MCLK */ +	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(0x5, "gmac")),		/* GRXCTL / ERXDV */ +	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(0x5, "gmac")),		/* EMDC */ +	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(0x5, "gmac")),		/* EMDIO */ +	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(0x5, "gmac")),		/* GTXCTL / ETXEN */ +	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(0x5, "gmac"),		/* GNULL / ETXCK */ +		  SUNXI_FUNCTION(0x6, "i2s1")),		/* BCLK */ +	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(0x5, "gmac"),		/* GTXCK / ECRS */ +		  SUNXI_FUNCTION(0x6, "i2s1")),		/* LRCK */ +	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(0x5, "gmac"),		/* GCLKIN / ECOL */ +		  SUNXI_FUNCTION(0x6, "i2s1")),		/* DO */ +	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(0x5, "gmac"),		/* GNULL / ETXERR */ +		  SUNXI_FUNCTION(0x6, "i2s1")),		/* LRCK */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c0")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm")),		/* PWM0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0"),		/* TX */ +		  SUNXI_FUNCTION(0x4, "spdif")),	/* MCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ir0")),		/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0"),		/* MCLK */ +		  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, "i2s0"),		/* BCLK */ +		  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, "i2s0"),		/* LRCK */ +		  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, "i2s0"),		/* DO0 */ +		  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, "i2s0")),		/* DO1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0")),		/* DO3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DI */ +		  SUNXI_FUNCTION(0x3, "ac97"),		/* DI */ +		  SUNXI_FUNCTION(0x4, "spdif")),	/* DI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS1 */ +		  SUNXI_FUNCTION(0x4, "spdif")),	/* DO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* MS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* CK0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* DO0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi2"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "jtag")),		/* DI0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c1")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "i2c2")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */ +		  SUNXI_FUNCTION(0x3, "ir1")),		/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */ +		  SUNXI_FUNCTION(0x3, "ir1")),		/* RX */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NWE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NALE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* MISO */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCLE */ +		  SUNXI_FUNCTION(0x3, "spi0")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NRE# */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NRB1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ0 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ1 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ2 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NDQ3 */ +		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQ7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NWP */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NCE3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE4 */ +		  SUNXI_FUNCTION(0x3, "spi2"),		/* CS0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 12)),		/* EINT12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE5 */ +		  SUNXI_FUNCTION(0x3, "spi2"),		/* CLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 13)),		/* EINT13 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE6 */ +		  SUNXI_FUNCTION(0x3, "spi2"),		/* MOSI */ +		  SUNXI_FUNCTION_IRQ(0x6, 14)),		/* EINT14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0"),		/* NCE7 */ +		  SUNXI_FUNCTION(0x3, "spi2"),		/* MISO */ +		  SUNXI_FUNCTION_IRQ(0x6, 15)),		/* EINT15 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "nand0")),	/* NDQS */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VN2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VPC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D8 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D9 */ +		  SUNXI_FUNCTION(0x3, "lvds0")),	/* VM3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D12 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D13 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D14 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D15 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D16 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VPC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D17 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D18 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VP3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D19 */ +		  SUNXI_FUNCTION(0x3, "lvds1")),	/* VN3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D20 */ +		  SUNXI_FUNCTION(0x3, "csi1")),		/* MCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D21 */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D22 */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPPP */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* D23 */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* DET */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* VCCEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* DE */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* RST */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd0"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x3, "sim")),		/* SDA */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* PCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* ERR */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* CK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* SYNC */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* DVLD */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* VSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "csi0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "sim")),		/* VPPEN */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts0"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "csi0")),		/* D7 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* MSI */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DI1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* TX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* DO1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart0")),	/* RX */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "jtag")),		/* CK1 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* PCK */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* ERR */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* CK */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* SYNC */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* DVLD */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x4, "mmc1")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D0 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D2 */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D1 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "mmc1"),		/* D3 */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D2 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D3 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D4 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D5 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D13 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D6 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ts1"),		/* D7 */ +		  SUNXI_FUNCTION(0x3, "csi1"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "csi0")),		/* D15 */ +	/* Hole */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 0), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D0 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 0),		/* EINT0 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D1 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 1),		/* EINT1 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D2 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 2),		/* EINT2 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D3 */ +		  SUNXI_FUNCTION(0x4, "uart3"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x6, 3),		/* EINT3 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D4 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 4),		/* EINT4 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D4 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D5 */ +		  SUNXI_FUNCTION(0x4, "uart4"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 5),		/* EINT5 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D5 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D6 */ +		  SUNXI_FUNCTION(0x4, "uart5"),		/* TX */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* BS */ +		  SUNXI_FUNCTION_IRQ(0x6, 6),		/* EINT6 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D6 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D7 */ +		  SUNXI_FUNCTION(0x4, "uart5"),		/* RX */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* CLK */ +		  SUNXI_FUNCTION_IRQ(0x6, 7),		/* EINT7 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D7 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D8 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD3 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN0 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D0 */ +		  SUNXI_FUNCTION_IRQ(0x6, 8),		/* EINT8 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D8 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D9 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD2 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN1 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 9),		/* EINT9 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D9 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D10 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD1 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN2 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D2 */ +		  SUNXI_FUNCTION_IRQ(0x6, 10),		/* EINT10 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D10 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D11 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXD0 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN3 */ +		  SUNXI_FUNCTION(0x5, "ms"),		/* D3 */ +		  SUNXI_FUNCTION_IRQ(0x6, 11),		/* EINT11 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D11 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D12 */ +		  SUNXI_FUNCTION(0x4, "ps2"),		/* SCK1 */ +		  SUNXI_FUNCTION_IRQ(0x6, 12),		/* EINT12 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D12 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 13), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D13 */ +		  SUNXI_FUNCTION(0x4, "ps2"),		/* SDA1 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* RST */ +		  SUNXI_FUNCTION_IRQ(0x6, 13),		/* EINT13 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D13 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D14 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD3 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN4 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPEN */ +		  SUNXI_FUNCTION_IRQ(0x6, 14),		/* EINT14 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D14 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D15 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD3 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN5 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* VPPPP */ +		  SUNXI_FUNCTION_IRQ(0x6, 15),		/* EINT15 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D15 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D16 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD2 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN6 */ +		  SUNXI_FUNCTION_IRQ(0x6, 16),		/* EINT16 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D16 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D17 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD1 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* IN7 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* VCCEN */ +		  SUNXI_FUNCTION_IRQ(0x6, 17),		/* EINT17 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D17 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D18 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXD0 */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT0 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* SCK */ +		  SUNXI_FUNCTION_IRQ(0x6, 18),		/* EINT18 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D18 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D19 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXERR */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT1 */ +		  SUNXI_FUNCTION(0x5, "sim"),		/* SDA */ +		  SUNXI_FUNCTION_IRQ(0x6, 19),		/* EINT19 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D19 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D20 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ERXDV */ +		  SUNXI_FUNCTION(0x4, "can"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x6, 20),		/* EINT20 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D20 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D21 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* EMDC */ +		  SUNXI_FUNCTION(0x4, "can"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x6, 21),		/* EINT21 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D21 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 22), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D22 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* EMDIO */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT2 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CMD */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 23), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* D23 */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXEN */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT3 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* CLK */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* D23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 24), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXCK */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT4 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D0 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* PCLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 25), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* DE */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ECRS */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT5 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D1 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* FIELD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 26), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* HSYNC */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ECOL */ +		  SUNXI_FUNCTION(0x4, "keypad"),	/* OUT6 */ +		  SUNXI_FUNCTION(0x5, "mmc1"),		/* D2 */ +		  SUNXI_FUNCTION(0x7, "csi1")),		/* HSYNC */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 27), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "lcd1"),		/* VSYNC */ +		  SUNXI_FUNCTION(0x3, "emac"),		/* ETXERR */ +		  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(0x3, "i2c3")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 1), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "i2c3")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 2), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x3, "i2c4")),		/* SCK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 3), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "pwm"),		/* PWM1 */ +		  SUNXI_FUNCTION(0x3, "i2c4")),		/* SDA */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 4), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CMD */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 5), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* CLK */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 6), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D0 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 7), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D1 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 8), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D2 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 9), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "mmc3")),		/* D3 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 10), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "uart5"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x5, 22)),		/* EINT22 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 11), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "uart5"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x5, 23)),		/* EINT23 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 12), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "uart6"),		/* TX */ +		  SUNXI_FUNCTION(0x4, "clk_out_a"),	/* CLK_OUT_A */ +		  SUNXI_FUNCTION_IRQ(0x5, 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(0x4, "clk_out_b"),	/* CLK_OUT_B */ +		  SUNXI_FUNCTION_IRQ(0x5, 25)),		/* EINT25 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 14), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi0"),		/* CS1 */ +		  SUNXI_FUNCTION(0x3, "ps2"),		/* SCK1 */ +		  SUNXI_FUNCTION(0x4, "timer4"),	/* TCLKIN0 */ +		  SUNXI_FUNCTION_IRQ(0x5, 26)),		/* EINT26 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 15), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS1 */ +		  SUNXI_FUNCTION(0x3, "ps2"),		/* SDA1 */ +		  SUNXI_FUNCTION(0x4, "timer5"),	/* TCLKIN1 */ +		  SUNXI_FUNCTION_IRQ(0x5, 27)),		/* EINT27 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 16), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS0 */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* RTS */ +		  SUNXI_FUNCTION_IRQ(0x5, 28)),		/* EINT28 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 17), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* CTS */ +		  SUNXI_FUNCTION_IRQ(0x5, 29)),		/* EINT29 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 18), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* TX */ +		  SUNXI_FUNCTION_IRQ(0x5, 30)),		/* EINT30 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 19), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */ +		  SUNXI_FUNCTION(0x3, "uart2"),		/* RX */ +		  SUNXI_FUNCTION_IRQ(0x5, 31)),		/* EINT31 */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 20), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ps2"),		/* SCK0 */ +		  SUNXI_FUNCTION(0x3, "uart7"),		/* TX */ +		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSCL */ +	SUNXI_PIN(SUNXI_PINCTRL_PIN(I, 21), +		  SUNXI_FUNCTION(0x0, "gpio_in"), +		  SUNXI_FUNCTION(0x1, "gpio_out"), +		  SUNXI_FUNCTION(0x2, "ps2"),		/* SDA0 */ +		  SUNXI_FUNCTION(0x3, "uart7"),		/* RX */ +		  SUNXI_FUNCTION(0x4, "hdmi")),		/* HSDA */ +}; + +static const struct sunxi_pinctrl_desc sun7i_a20_pinctrl_data = { +	.pins = sun7i_a20_pins, +	.npins = ARRAY_SIZE(sun7i_a20_pins), +}; + +static int sun7i_a20_pinctrl_probe(struct platform_device *pdev) +{ +	return sunxi_pinctrl_init(pdev, +				  &sun7i_a20_pinctrl_data); +} + +static struct of_device_id sun7i_a20_pinctrl_match[] = { +	{ .compatible = "allwinner,sun7i-a20-pinctrl", }, +	{} +}; +MODULE_DEVICE_TABLE(of, sun7i_a20_pinctrl_match); + +static struct platform_driver sun7i_a20_pinctrl_driver = { +	.probe	= sun7i_a20_pinctrl_probe, +	.driver	= { +		.name		= "sun7i-a20-pinctrl", +		.owner		= THIS_MODULE, +		.of_match_table	= sun7i_a20_pinctrl_match, +	}, +}; +module_platform_driver(sun7i_a20_pinctrl_driver); + +MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); +MODULE_DESCRIPTION("Allwinner A20 pinctrl driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c index 119d2ddedfe..5f38c7f6783 100644 --- a/drivers/pinctrl/pinctrl-sunxi.c +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c @@ -14,6 +14,7 @@  #include <linux/clk.h>  #include <linux/gpio.h>  #include <linux/irqdomain.h> +#include <linux/irqchip/chained_irq.h>  #include <linux/module.h>  #include <linux/of.h>  #include <linux/of_address.h> @@ -27,9 +28,8 @@  #include <linux/platform_device.h>  #include <linux/slab.h> -#include "core.h" +#include "../core.h"  #include "pinctrl-sunxi.h" -#include "pinctrl-sunxi-pins.h"  static struct sunxi_pinctrl_group *  sunxi_pinctrl_find_group_by_name(struct sunxi_pinctrl *pctl, const char *group) @@ -211,6 +211,10 @@ static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,  			configlen++;  		pinconfig = kzalloc(configlen * sizeof(*pinconfig), GFP_KERNEL); +		if (!pinconfig) { +			kfree(*map); +			return -ENOMEM; +		}  		if (!of_property_read_u32(node, "allwinner,drive", &val)) {  			u16 strength = (val + 1) * 10; @@ -280,6 +284,7 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,  	struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);  	struct sunxi_pinctrl_group *g = &pctl->groups[group];  	unsigned long flags; +	unsigned pin = g->pin - pctl->desc->pin_base;  	u32 val, mask;  	u16 strength;  	u8 dlevel; @@ -303,23 +308,23 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,  			 *   3: 40mA  			 */  			dlevel = strength / 10 - 1; -			val = readl(pctl->membase + sunxi_dlevel_reg(g->pin)); -			mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin); +			val = readl(pctl->membase + sunxi_dlevel_reg(pin)); +			mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(pin);  			writel((val & ~mask) -				| dlevel << sunxi_dlevel_offset(g->pin), -				pctl->membase + sunxi_dlevel_reg(g->pin)); +				| dlevel << sunxi_dlevel_offset(pin), +				pctl->membase + sunxi_dlevel_reg(pin));  			break;  		case PIN_CONFIG_BIAS_PULL_UP: -			val = readl(pctl->membase + sunxi_pull_reg(g->pin)); -			mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); -			writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin), -				pctl->membase + sunxi_pull_reg(g->pin)); +			val = readl(pctl->membase + sunxi_pull_reg(pin)); +			mask = PULL_PINS_MASK << sunxi_pull_offset(pin); +			writel((val & ~mask) | 1 << sunxi_pull_offset(pin), +				pctl->membase + sunxi_pull_reg(pin));  			break;  		case PIN_CONFIG_BIAS_PULL_DOWN: -			val = readl(pctl->membase + sunxi_pull_reg(g->pin)); -			mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); -			writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin), -				pctl->membase + sunxi_pull_reg(g->pin)); +			val = readl(pctl->membase + sunxi_pull_reg(pin)); +			mask = PULL_PINS_MASK << sunxi_pull_offset(pin); +			writel((val & ~mask) | 2 << sunxi_pull_offset(pin), +				pctl->membase + sunxi_pull_reg(pin));  			break;  		default:  			break; @@ -376,6 +381,7 @@ static void sunxi_pmx_set(struct pinctrl_dev *pctldev,  	spin_lock_irqsave(&pctl->lock, flags); +	pin -= pctl->desc->pin_base;  	val = readl(pctl->membase + sunxi_mux_reg(pin));  	mask = MUX_PINS_MASK << sunxi_mux_offset(pin);  	writel((val & ~mask) | config << sunxi_mux_offset(pin), @@ -436,12 +442,6 @@ static const struct pinmux_ops sunxi_pmx_ops = {  	.gpio_set_direction	= sunxi_pmx_gpio_set_direction,  }; -static struct pinctrl_desc sunxi_pctrl_desc = { -	.confops	= &sunxi_pconf_ops, -	.pctlops	= &sunxi_pctrl_ops, -	.pmxops		= &sunxi_pmx_ops, -}; -  static int sunxi_pinctrl_gpio_request(struct gpio_chip *chip, unsigned offset)  {  	return pinctrl_request_gpio(chip->base + offset); @@ -469,12 +469,6 @@ static int sunxi_pinctrl_gpio_get(struct gpio_chip *chip, unsigned offset)  	return val;  } -static int sunxi_pinctrl_gpio_direction_output(struct gpio_chip *chip, -					unsigned offset, int value) -{ -	return pinctrl_gpio_direction_output(chip->base + offset); -} -  static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,  				unsigned offset, int value)  { @@ -498,6 +492,13 @@ static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,  	spin_unlock_irqrestore(&pctl->lock, flags);  } +static int sunxi_pinctrl_gpio_direction_output(struct gpio_chip *chip, +					unsigned offset, int value) +{ +	sunxi_pinctrl_gpio_set(chip, offset, value); +	return pinctrl_gpio_direction_output(chip->base + offset); +} +  static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,  				const struct of_phandle_args *gpiospec,  				u32 *flags) @@ -528,27 +529,12 @@ static int sunxi_pinctrl_gpio_to_irq(struct gpio_chip *chip, unsigned offset)  	if (!desc)  		return -EINVAL; -	pctl->irq_array[desc->irqnum] = offset; -  	dev_dbg(chip->dev, "%s: request IRQ for GPIO %d, return %d\n",  		chip->label, offset + chip->base, desc->irqnum);  	return irq_find_mapping(pctl->domain, desc->irqnum);  } -static struct gpio_chip sunxi_pinctrl_gpio_chip = { -	.owner			= THIS_MODULE, -	.request		= sunxi_pinctrl_gpio_request, -	.free			= sunxi_pinctrl_gpio_free, -	.direction_input	= sunxi_pinctrl_gpio_direction_input, -	.direction_output	= sunxi_pinctrl_gpio_direction_output, -	.get			= sunxi_pinctrl_gpio_get, -	.set			= sunxi_pinctrl_gpio_set, -	.of_xlate		= sunxi_pinctrl_gpio_of_xlate, -	.to_irq			= sunxi_pinctrl_gpio_to_irq, -	.of_gpio_n_cells	= 3, -	.can_sleep		= 0, -};  static int sunxi_pinctrl_irq_set_type(struct irq_data *d,  				      unsigned int type) @@ -583,7 +569,7 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,  	spin_lock_irqsave(&pctl->lock, flags);  	regval = readl(pctl->membase + reg); -	regval &= ~IRQ_CFG_IRQ_MASK; +	regval &= ~(IRQ_CFG_IRQ_MASK << index);  	writel(regval | (mode << index), pctl->membase + reg);  	spin_unlock_irqrestore(&pctl->lock, flags); @@ -664,6 +650,7 @@ static struct irq_chip sunxi_pinctrl_irq_chip = {  static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc)  { +	struct irq_chip *chip = irq_get_chip(irq);  	struct sunxi_pinctrl *pctl = irq_get_handler_data(irq);  	const unsigned long reg = readl(pctl->membase + IRQ_STATUS_REG); @@ -673,23 +660,15 @@ static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc)  	if (reg) {  		int irqoffset; +		chained_irq_enter(chip, desc);  		for_each_set_bit(irqoffset, ®, SUNXI_IRQ_NUMBER) {  			int pin_irq = irq_find_mapping(pctl->domain, irqoffset);  			generic_handle_irq(pin_irq);  		} +		chained_irq_exit(chip, desc);  	}  } -static struct of_device_id sunxi_pinctrl_match[] = { -	{ .compatible = "allwinner,sun4i-a10-pinctrl", .data = (void *)&sun4i_a10_pinctrl_data }, -	{ .compatible = "allwinner,sun5i-a10s-pinctrl", .data = (void *)&sun5i_a10s_pinctrl_data }, -	{ .compatible = "allwinner,sun5i-a13-pinctrl", .data = (void *)&sun5i_a13_pinctrl_data }, -	{ .compatible = "allwinner,sun6i-a31-pinctrl", .data = (void *)&sun6i_a31_pinctrl_data }, -	{ .compatible = "allwinner,sun7i-a20-pinctrl", .data = (void *)&sun7i_a20_pinctrl_data }, -	{} -}; -MODULE_DEVICE_TABLE(of, sunxi_pinctrl_match); -  static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl,  					const char *name)  { @@ -750,6 +729,9 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)  		struct sunxi_desc_function *func = pin->functions;  		while (func->name) { +			/* Create interrupt mapping while we're at it */ +			if (!strcmp(func->name, "irq")) +				pctl->irq_array[func->irqnum] = pin->pin.number;  			sunxi_pinctrl_add_function(pctl, func->name);  			func++;  		} @@ -793,12 +775,14 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)  	return 0;  } -static int sunxi_pinctrl_probe(struct platform_device *pdev) +int sunxi_pinctrl_init(struct platform_device *pdev, +		       const struct sunxi_pinctrl_desc *desc)  {  	struct device_node *node = pdev->dev.of_node; -	const struct of_device_id *device; +	struct pinctrl_desc *pctrl_desc;  	struct pinctrl_pin_desc *pins;  	struct sunxi_pinctrl *pctl; +	struct resource *res;  	int i, ret, last_pin;  	struct clk *clk; @@ -809,15 +793,13 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	spin_lock_init(&pctl->lock); -	pctl->membase = of_iomap(node, 0); -	if (!pctl->membase) -		return -ENOMEM; - -	device = of_match_device(sunxi_pinctrl_match, &pdev->dev); -	if (!device) -		return -ENODEV; +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	pctl->membase = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(pctl->membase)) +		return PTR_ERR(pctl->membase); -	pctl->desc = (struct sunxi_pinctrl_desc *)device->data; +	pctl->dev = &pdev->dev; +	pctl->desc = desc;  	ret = sunxi_pinctrl_build_state(pdev);  	if (ret) { @@ -834,12 +816,21 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	for (i = 0; i < pctl->desc->npins; i++)  		pins[i] = pctl->desc->pins[i].pin; -	sunxi_pctrl_desc.name = dev_name(&pdev->dev); -	sunxi_pctrl_desc.owner = THIS_MODULE; -	sunxi_pctrl_desc.pins = pins; -	sunxi_pctrl_desc.npins = pctl->desc->npins; -	pctl->dev = &pdev->dev; -	pctl->pctl_dev = pinctrl_register(&sunxi_pctrl_desc, +	pctrl_desc = devm_kzalloc(&pdev->dev, +				  sizeof(*pctrl_desc), +				  GFP_KERNEL); +	if (!pctrl_desc) +		return -ENOMEM; + +	pctrl_desc->name = dev_name(&pdev->dev); +	pctrl_desc->owner = THIS_MODULE; +	pctrl_desc->pins = pins; +	pctrl_desc->npins = pctl->desc->npins; +	pctrl_desc->confops = &sunxi_pconf_ops; +	pctrl_desc->pctlops = &sunxi_pctrl_ops; +	pctrl_desc->pmxops =  &sunxi_pmx_ops; + +	pctl->pctl_dev = pinctrl_register(pctrl_desc,  					  &pdev->dev, pctl);  	if (!pctl->pctl_dev) {  		dev_err(&pdev->dev, "couldn't register pinctrl driver\n"); @@ -853,11 +844,22 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	}  	last_pin = pctl->desc->pins[pctl->desc->npins - 1].pin.number; -	pctl->chip = &sunxi_pinctrl_gpio_chip; -	pctl->chip->ngpio = round_up(last_pin, PINS_PER_BANK); +	pctl->chip->owner = THIS_MODULE; +	pctl->chip->request = sunxi_pinctrl_gpio_request, +	pctl->chip->free = sunxi_pinctrl_gpio_free, +	pctl->chip->direction_input = sunxi_pinctrl_gpio_direction_input, +	pctl->chip->direction_output = sunxi_pinctrl_gpio_direction_output, +	pctl->chip->get = sunxi_pinctrl_gpio_get, +	pctl->chip->set = sunxi_pinctrl_gpio_set, +	pctl->chip->of_xlate = sunxi_pinctrl_gpio_of_xlate, +	pctl->chip->to_irq = sunxi_pinctrl_gpio_to_irq, +	pctl->chip->of_gpio_n_cells = 3, +	pctl->chip->can_sleep = false, +	pctl->chip->ngpio = round_up(last_pin, PINS_PER_BANK) - +			    pctl->desc->pin_base;  	pctl->chip->label = dev_name(&pdev->dev);  	pctl->chip->dev = &pdev->dev; -	pctl->chip->base = 0; +	pctl->chip->base = pctl->desc->pin_base;  	ret = gpiochip_add(pctl->chip);  	if (ret) @@ -879,12 +881,14 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  		goto gpiochip_error;  	} -	clk_prepare_enable(clk); +	ret = clk_prepare_enable(clk); +	if (ret) +		goto gpiochip_error;  	pctl->irq = irq_of_parse_and_map(node, 0);  	if (!pctl->irq) {  		ret = -EINVAL; -		goto gpiochip_error; +		goto clk_error;  	}  	pctl->domain = irq_domain_add_linear(node, SUNXI_IRQ_NUMBER, @@ -892,7 +896,7 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	if (!pctl->domain) {  		dev_err(&pdev->dev, "Couldn't register IRQ domain\n");  		ret = -ENOMEM; -		goto gpiochip_error; +		goto clk_error;  	}  	for (i = 0; i < SUNXI_IRQ_NUMBER; i++) { @@ -910,6 +914,8 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	return 0; +clk_error: +	clk_disable_unprepare(clk);  gpiochip_error:  	if (gpiochip_remove(pctl->chip))  		dev_err(&pdev->dev, "failed to remove gpio chip\n"); @@ -917,17 +923,3 @@ pinctrl_error:  	pinctrl_unregister(pctl->pctl_dev);  	return ret;  } - -static struct platform_driver sunxi_pinctrl_driver = { -	.probe = sunxi_pinctrl_probe, -	.driver = { -		.name = "sunxi-pinctrl", -		.owner = THIS_MODULE, -		.of_match_table = sunxi_pinctrl_match, -	}, -}; -module_platform_driver(sunxi_pinctrl_driver); - -MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com"); -MODULE_DESCRIPTION("Allwinner A1X pinctrl driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.h b/drivers/pinctrl/sunxi/pinctrl-sunxi.h new file mode 100644 index 00000000000..8169ba59887 --- /dev/null +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.h @@ -0,0 +1,258 @@ +/* + * Allwinner A1X SoCs pinctrl driver. + * + * Copyright (C) 2012 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. + */ + +#ifndef __PINCTRL_SUNXI_H +#define __PINCTRL_SUNXI_H + +#include <linux/kernel.h> +#include <linux/spinlock.h> + +#define PA_BASE	0 +#define PB_BASE	32 +#define PC_BASE	64 +#define PD_BASE	96 +#define PE_BASE	128 +#define PF_BASE	160 +#define PG_BASE	192 +#define PH_BASE	224 +#define PI_BASE	256 +#define PL_BASE	352 +#define PM_BASE	384 + +#define SUNXI_PINCTRL_PIN(bank, pin)		\ +	PINCTRL_PIN(P ## bank ## _BASE + (pin), "P" #bank #pin) + +#define SUNXI_PIN_NAME_MAX_LEN	5 + +#define BANK_MEM_SIZE		0x24 +#define MUX_REGS_OFFSET		0x0 +#define DATA_REGS_OFFSET	0x10 +#define DLEVEL_REGS_OFFSET	0x14 +#define PULL_REGS_OFFSET	0x1c + +#define PINS_PER_BANK		32 +#define MUX_PINS_PER_REG	8 +#define MUX_PINS_BITS		4 +#define MUX_PINS_MASK		0x0f +#define DATA_PINS_PER_REG	32 +#define DATA_PINS_BITS		1 +#define DATA_PINS_MASK		0x01 +#define DLEVEL_PINS_PER_REG	16 +#define DLEVEL_PINS_BITS	2 +#define DLEVEL_PINS_MASK	0x03 +#define PULL_PINS_PER_REG	16 +#define PULL_PINS_BITS		2 +#define PULL_PINS_MASK		0x03 + +#define SUNXI_IRQ_NUMBER	32 + +#define IRQ_CFG_REG		0x200 +#define IRQ_CFG_IRQ_PER_REG		8 +#define IRQ_CFG_IRQ_BITS		4 +#define IRQ_CFG_IRQ_MASK		((1 << IRQ_CFG_IRQ_BITS) - 1) +#define IRQ_CTRL_REG		0x210 +#define IRQ_CTRL_IRQ_PER_REG		32 +#define IRQ_CTRL_IRQ_BITS		1 +#define IRQ_CTRL_IRQ_MASK		((1 << IRQ_CTRL_IRQ_BITS) - 1) +#define IRQ_STATUS_REG		0x214 +#define IRQ_STATUS_IRQ_PER_REG		32 +#define IRQ_STATUS_IRQ_BITS		1 +#define IRQ_STATUS_IRQ_MASK		((1 << IRQ_STATUS_IRQ_BITS) - 1) + +#define IRQ_EDGE_RISING		0x00 +#define IRQ_EDGE_FALLING	0x01 +#define IRQ_LEVEL_HIGH		0x02 +#define IRQ_LEVEL_LOW		0x03 +#define IRQ_EDGE_BOTH		0x04 + +struct sunxi_desc_function { +	const char	*name; +	u8		muxval; +	u8		irqnum; +}; + +struct sunxi_desc_pin { +	struct pinctrl_pin_desc		pin; +	struct sunxi_desc_function	*functions; +}; + +struct sunxi_pinctrl_desc { +	const struct sunxi_desc_pin	*pins; +	int				npins; +	unsigned			pin_base; +}; + +struct sunxi_pinctrl_function { +	const char	*name; +	const char	**groups; +	unsigned	ngroups; +}; + +struct sunxi_pinctrl_group { +	const char	*name; +	unsigned long	config; +	unsigned	pin; +}; + +struct sunxi_pinctrl { +	void __iomem			*membase; +	struct gpio_chip		*chip; +	const struct sunxi_pinctrl_desc	*desc; +	struct device			*dev; +	struct irq_domain		*domain; +	struct sunxi_pinctrl_function	*functions; +	unsigned			nfunctions; +	struct sunxi_pinctrl_group	*groups; +	unsigned			ngroups; +	int				irq; +	int				irq_array[SUNXI_IRQ_NUMBER]; +	spinlock_t			lock; +	struct pinctrl_dev		*pctl_dev; +}; + +#define SUNXI_PIN(_pin, ...)					\ +	{							\ +		.pin = _pin,					\ +		.functions = (struct sunxi_desc_function[]){	\ +			__VA_ARGS__, { } },			\ +	} + +#define SUNXI_FUNCTION(_val, _name)				\ +	{							\ +		.name = _name,					\ +		.muxval = _val,					\ +	} + +#define SUNXI_FUNCTION_IRQ(_val, _irq)				\ +	{							\ +		.name = "irq",					\ +		.muxval = _val,					\ +		.irqnum = _irq,					\ +	} + +/* + * The sunXi PIO registers are organized as is: + * 0x00 - 0x0c	Muxing values. + *		8 pins per register, each pin having a 4bits value + * 0x10		Pin values + *		32 bits per register, each pin corresponding to one bit + * 0x14 - 0x18	Drive level + *		16 pins per register, each pin having a 2bits value + * 0x1c - 0x20	Pull-Up values + *		16 pins per register, each pin having a 2bits value + * + * This is for the first bank. Each bank will have the same layout, + * with an offset being a multiple of 0x24. + * + * The following functions calculate from the pin number the register + * and the bit offset that we should access. + */ +static inline u32 sunxi_mux_reg(u16 pin) +{ +	u8 bank = pin / PINS_PER_BANK; +	u32 offset = bank * BANK_MEM_SIZE; +	offset += MUX_REGS_OFFSET; +	offset += pin % PINS_PER_BANK / MUX_PINS_PER_REG * 0x04; +	return round_down(offset, 4); +} + +static inline u32 sunxi_mux_offset(u16 pin) +{ +	u32 pin_num = pin % MUX_PINS_PER_REG; +	return pin_num * MUX_PINS_BITS; +} + +static inline u32 sunxi_data_reg(u16 pin) +{ +	u8 bank = pin / PINS_PER_BANK; +	u32 offset = bank * BANK_MEM_SIZE; +	offset += DATA_REGS_OFFSET; +	offset += pin % PINS_PER_BANK / DATA_PINS_PER_REG * 0x04; +	return round_down(offset, 4); +} + +static inline u32 sunxi_data_offset(u16 pin) +{ +	u32 pin_num = pin % DATA_PINS_PER_REG; +	return pin_num * DATA_PINS_BITS; +} + +static inline u32 sunxi_dlevel_reg(u16 pin) +{ +	u8 bank = pin / PINS_PER_BANK; +	u32 offset = bank * BANK_MEM_SIZE; +	offset += DLEVEL_REGS_OFFSET; +	offset += pin % PINS_PER_BANK / DLEVEL_PINS_PER_REG * 0x04; +	return round_down(offset, 4); +} + +static inline u32 sunxi_dlevel_offset(u16 pin) +{ +	u32 pin_num = pin % DLEVEL_PINS_PER_REG; +	return pin_num * DLEVEL_PINS_BITS; +} + +static inline u32 sunxi_pull_reg(u16 pin) +{ +	u8 bank = pin / PINS_PER_BANK; +	u32 offset = bank * BANK_MEM_SIZE; +	offset += PULL_REGS_OFFSET; +	offset += pin % PINS_PER_BANK / PULL_PINS_PER_REG * 0x04; +	return round_down(offset, 4); +} + +static inline u32 sunxi_pull_offset(u16 pin) +{ +	u32 pin_num = pin % PULL_PINS_PER_REG; +	return pin_num * PULL_PINS_BITS; +} + +static inline u32 sunxi_irq_cfg_reg(u16 irq) +{ +	u8 reg = irq / IRQ_CFG_IRQ_PER_REG * 0x04; +	return reg + IRQ_CFG_REG; +} + +static inline u32 sunxi_irq_cfg_offset(u16 irq) +{ +	u32 irq_num = irq % IRQ_CFG_IRQ_PER_REG; +	return irq_num * IRQ_CFG_IRQ_BITS; +} + +static inline u32 sunxi_irq_ctrl_reg(u16 irq) +{ +	u8 reg = irq / IRQ_CTRL_IRQ_PER_REG * 0x04; +	return reg + IRQ_CTRL_REG; +} + +static inline u32 sunxi_irq_ctrl_offset(u16 irq) +{ +	u32 irq_num = irq % IRQ_CTRL_IRQ_PER_REG; +	return irq_num * IRQ_CTRL_IRQ_BITS; +} + +static inline u32 sunxi_irq_status_reg(u16 irq) +{ +	u8 reg = irq / IRQ_STATUS_IRQ_PER_REG * 0x04; +	return reg + IRQ_STATUS_REG; +} + +static inline u32 sunxi_irq_status_offset(u16 irq) +{ +	u32 irq_num = irq % IRQ_STATUS_IRQ_PER_REG; +	return irq_num * IRQ_STATUS_IRQ_BITS; +} + +int sunxi_pinctrl_init(struct platform_device *pdev, +		       const struct sunxi_pinctrl_desc *desc); + +#endif /* __PINCTRL_SUNXI_H */ diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c index 39aec085081..2c61281bebd 100644 --- a/drivers/pinctrl/vt8500/pinctrl-wmt.c +++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c @@ -276,7 +276,20 @@ static int wmt_pctl_dt_node_to_map_pull(struct wmt_pinctrl_data *data,  	if (!configs)  		return -ENOMEM; -	configs[0] = pull; +	switch (pull) { +	case 0: +		configs[0] = PIN_CONFIG_BIAS_DISABLE; +		break; +	case 1: +		configs[0] = PIN_CONFIG_BIAS_PULL_DOWN; +		break; +	case 2: +		configs[0] = PIN_CONFIG_BIAS_PULL_UP; +		break; +	default: +		configs[0] = PIN_CONFIG_BIAS_DISABLE; +		dev_err(data->dev, "invalid pull state %d - disabling\n", pull); +	}  	map->type = PIN_MAP_TYPE_CONFIGS_PIN;  	map->data.configs.group_or_pin = data->groups[group]; @@ -510,17 +523,6 @@ static int wmt_gpio_get_direction(struct gpio_chip *chip, unsigned offset)  		return GPIOF_DIR_IN;  } -static int wmt_gpio_direction_input(struct gpio_chip *chip, unsigned offset) -{ -	return pinctrl_gpio_direction_input(chip->base + offset); -} - -static int wmt_gpio_direction_output(struct gpio_chip *chip, unsigned offset, -				     int value) -{ -	return pinctrl_gpio_direction_output(chip->base + offset); -} -  static int wmt_gpio_get_value(struct gpio_chip *chip, unsigned offset)  {  	struct wmt_pinctrl_data *data = dev_get_drvdata(chip->dev); @@ -555,6 +557,18 @@ static void wmt_gpio_set_value(struct gpio_chip *chip, unsigned offset,  		wmt_clearbits(data, reg_data_out, BIT(bit));  } +static int wmt_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ +	return pinctrl_gpio_direction_input(chip->base + offset); +} + +static int wmt_gpio_direction_output(struct gpio_chip *chip, unsigned offset, +				     int value) +{ +	wmt_gpio_set_value(chip, offset, value); +	return pinctrl_gpio_direction_output(chip->base + offset); +} +  static struct gpio_chip wmt_gpio_chip = {  	.label = "gpio-wmt",  	.owner = THIS_MODULE, @@ -565,7 +579,7 @@ static struct gpio_chip wmt_gpio_chip = {  	.direction_output = wmt_gpio_direction_output,  	.get = wmt_gpio_get_value,  	.set = wmt_gpio_set_value, -	.can_sleep = 0, +	.can_sleep = false,  };  int wmt_pinctrl_probe(struct platform_device *pdev,  | 
